一、拷贝文件
在用户家目录下创建一个工作目录,用于存放测试代码和要用到的工具。
jw@pc:~$ mkdir w
jw@pc:~$ cd w
从windos将要用到的文件拷贝到虚拟机中的linux的工作目录 w 下:
交叉编译器[ arm-linux-gcc-4.5.1-v6-vfp-20120301.tgz ]
友善制作的针对tiny4412的uboot[ uboot_tiny4412-20130729.tgz ]
二、安装交叉编译工具
将刚刚复制过来的交叉编译器[ arm-linux-gcc-4.5.1-v6-vfp-20120301.tgz ]解压,放在当前工作目录即可。
解压后,将该工具链的位置,添加到环境变量PATH中去。
jw@pc:~/w$ tar -xzvf arm-linux-gcc-4.5.1-v6-vfp-20120301.tgz
jw@pc:~/w$ cd opt/
jw@pc:~/w/opt$ ls
FriendlyARM
修改PATH变量有2种形式
- 一种是每次登陆系统时,在终端调用命令:
PATH=$PATH:~/w/opt/FriendlyARM/toolschain/4.5.1/bin/
- 如果觉得每次都要设置一次PATH太麻烦,可以在终端的启动文件中加入该命令,在终端启动时会自动调用。使用该方式时,需要重启终端,才能生效。
vim ~/.bashrc
在文末添加
PATH=$PATH:~/w/opt/FriendlyARM/toolschain/4.5.1/bin/
测试是否安装成功 终端输入arm-linux-gcc -v 可以列出交叉编译器信息就成功了。但是,提示找不到 arm-linux-gcc ,则可能缺少32位库:
sudo apt-get install lib32ncurses5 lib32z1
加装32位库后,可以打印gcc的相关信息
三、编译uboot
无脑操作一通,检查环境是否ok,先解压uboot,再编译。
由于是新装的系统,没有 make 程序,先安装make,再编译。
apt-get install make
jw@pc:~/w$ tar -xzvf uboot_tiny4412-20130729.tgz
jw@pc:~/w$ cd uboot_tiny4412
jw@pc:~/w/uboot_tiny4412$ make clean
jw@pc:~/w/uboot_tiny4412$ make tiny4412_config
make
还好,编译过程没出现什么问题。如果编译出错,可以执行 make clean 清理一下,再重新尝试一遍。
四、烧写uboot到内存卡
使用16GB以下的内存卡,因为要连接到虚拟机,内存卡直接插笔记本的内存口没法被虚拟机识别,所以使用了读卡器,插USB口。然后将内存卡连接到虚拟机上,在插入时就会提示要连接到哪个系统中。
使用linux系统中的fdisk命令,可以查看磁盘情况(fdisk是一个强大的磁盘管理工具)
由于是在虚拟机中,磁盘情况比较复杂,所以只看最后一个项目,就是内存卡的情况
jw@pc:~/w/uboot_tiny4412$ sudo fdisk -l
...
...
Disk /dev/sdb:7.4 GiB,7948206080 字节,15523840 个扇区
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x00000000
设备 启动 起点 末尾 扇区 大小 Id 类型
/dev/sdb1 309248 15523839 15214592 7.3G b W95 FAT32
/dev/sdb 指的就是内存卡
/dev/sdb1 指的是内存卡里的分区1
而这里要烧写的是整个内存卡,而不是某个分区。因为本次uboot烧写需要在内存卡的固定位置烧写,所以会格式化内存,再烧写进去。
jw@pc:~/w/uboot_tiny4412/sd_fuse/tiny4412$ sudo ./sd_fusing.sh /dev/sdb
[sudo] jw 的密码:
/dev/sdb reader is identified.
---------------------------------------
BL1 fusing
记录了16+0 的读入
记录了16+0 的写出
8192 bytes (8.2 kB, 8.0 KiB) copied, 0.145827 s, 56.2 kB/s
---------------------------------------
BL2 fusing
记录了28+0 的读入
记录了28+0 的写出
14336 bytes (14 kB, 14 KiB) copied, 0.258484 s, 55.5 kB/s
---------------------------------------
u-boot fusing
记录了540+1 的读入
记录了540+1 的写出
276932 bytes (277 kB, 270 KiB) copied, 2.26191 s, 122 kB/s
---------------------------------------
TrustZone S/W fusing
记录了184+0 的读入
记录了184+0 的写出
94208 bytes (94 kB, 92 KiB) copied, 0.85161 s, 111 kB/s
---------------------------------------
U-boot image is fused successfully.
Eject SD card and insert it again.
这样就烧写成功了。
五、验证uboot启动
要验证uboot能否启动,需要连接开发板的串口到计算上,在uboot启动时,会从串口发送出数据。
计算机与控制板使用串口线连接,由于笔记本没有串口,所以用了232转USB(坑爹的tiny4412的232串口不能使用普通串口线,还得使用交叉线)。
接好USB转232线,后可以在虚拟机的USB设备中找到:
jw@pc:~/w/uboot_tiny4412/sd_fuse/tiny4412$ lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 005: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port
Bus 002 Device 004: ID 0e0f:0008 VMware, Inc.
Bus 002 Device 003: ID 0e0f:0002 VMware, Inc. Virtual USB Hub
Bus 002 Device 002: ID 0e0f:0003 VMware, Inc. Virtual Mouse
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
第二行显示的就是串口线了,它内部使用了PL2303芯片。
查看终端列表tty:
我的设备是ttyUSB0,好像不需要装驱动,第一次插入232转USB线就能识别出来了。
jw@pc:~$ dmesg|grep tty
[ 0.111085] printk: console [tty0] enabled
[353951.942053] usb 2-3: pl2303 converter now attached to ttyUSB0
接好串口线,还得在linux系统上安装串口终端minicom,与开发板交互。
minicom的安装与配置
要使用 minicom ,通过命令打开:
jw@pc:~$ sudo minicom
Welcome to minicom 2.7.1
OPTIONS: I18n
Compiled on Aug 13 2017, 15:25:34.
Port /dev/ttyUSB0, 22:24:34
Press CTRL-A Z for help on special keys
这个时候,把内存插进开发板,把sd卡旁边的开关拨到SDBOOT,意味着SD卡启动,然后打开电源,观察linux上的minicom的输出:
OK
??????只打印了1个ok????就没了????
经过一系列的百度,找到了一个新的uboot,适用于我的开发板,tiny4412ADK1312C增强版,解决uboot只打印ok的问题。免费下载。
然后可以看到一连串的打印信息。末尾提示没有找到内核镜像,说明uboot已经正常启动了。
OK
U-Boot 2010.12 (May 12 2020 - 23:03:44) for TINY4412
CPU: S5PC220 [Samsung SOC on SMP Platform Base on ARM CortexA9]
APLL = 1400MHz, MPLL = 800MHz
Board: TINY4412
DRAM: 1023 MiB
vdd_arm: 1.2
vdd_int: 1.0
vdd_mif: 1.1
BL1 version: N/A (TrustZone Enabled BSP)
Checking Boot Mode ... SDMMC
REVISION: 1.1
MMC Device 0: 7580 MB
MMC Device 1: 7456 MB
MMC Device 2: N/A
*** Warning - using default environment
Net: No ethernet found.
Hit any key to stop autoboot: 0
reading kernel..device 0 Start 1057, Count 12288
MMC read: dev # 0, block # 1057, count 12288 ... 12288 blocks read: OK
completed
reading RFS..device 0 Count 13345, Start 2048
MMC read: dev # 0, block # 13345, count 2048 ... 2048 blocks read: OK
completed
Wrong Image Format for bootm command
ERROR: can't get kernel image!
TINY4412 #