以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。
相关资源
九鼎官方的uboot:uboot_jiuding.tar
三星官方的uboot:uboot_smdkv210.tar
uboot官方的uboot:u-boot-2013.10.tar.bz2
相比九鼎和三星的uboot,uboot官方这个版本的uboot引入了linux kernel的配置体系。
另外九鼎或者三星的uboot的目录下,有相关的将uboot烧写到sd卡的脚本目录sd_fusing。
如何编译
以九鼎官方的uboot为例,说明如何对uboot进行编译。
(1)将源码解压在适当的目录下。
(2)配置,即在uboot的根目录下执行“make x210_sd_config”。
(3)编译,即在uboot的根目录下执行“make”。
root@ubuntu:/home/xjh/iot/embedded_basic/uboot# ls
uboot_jiuding.tar
root@ubuntu:/home/xjh/iot/embedded_basic/uboot# tar -xvf uboot_jiuding.tar
//省略解压输出的内容
root@ubuntu:/home/xjh/iot/embedded_basic/uboot# ls
uboot_jiuding uboot_jiuding.tar
root@ubuntu:/home/xjh/iot/embedded_basic/uboot# cd uboot_jiuding
root@ubuntu:/home/xjh/iot/embedded_basic/uboot/uboot_jiuding# ls
api cpu libfdt onenand_bl1
api_examples CREDITS lib_generic onenand_ipl
arm_config.mk disk MAINTAINERS post
board doc MAKEALL README
CHANGELOG drivers Makefile rules.mk
CHANGELOG-before-U-Boot-1.1.5 examples mk sd_fusing
Changelog_Samsung fs mkconfig tools
common image_split mkmovi
config.mk include nand_spl
COPYING lib_arm net
root@ubuntu:/home/xjh/iot/embedded_basic/uboot/uboot_jiuding# make x210_sd_config
Configuring for x210_sd board...
root@ubuntu:/home/xjh/iot/embedded_basic/uboot/uboot_jiuding# make
//省略编译过程
root@ubuntu:/home/xjh/iot/embedded_basic/uboot/uboot_jiuding# ls
api COPYING include mkmovi System.map
api_examples cpu lib_arm nand_spl tools
arm_config.mk CREDITS libfdt net u-boot
board disk lib_generic onenand_bl1 u-boot.bin//这里
CHANGELOG doc MAINTAINERS onenand_ipl u-boot.dis
CHANGELOG-before-U-Boot-1.1.5 drivers MAKEALL post u-boot.map
Changelog_Samsung examples Makefile README u-boot.srec
common fs mk rules.mk
config.mk image_split mkconfig sd_fusing
root@ubuntu:/home/xjh/iot/embedded_basic/uboot/uboot_jiuding#
这里新生成的u-boot.bin文件,就是编译得到镜像文件,可用于烧写。
如何烧录
假定前面的编译步骤顺利完成,在uboot根目录下得到了u-boot.bin这个镜像文件。
由于S5PV210的特殊启动方式,BL1不能超过16KB,所以需要利用sd_fusing目录里的脚本对这个u-boot.bin文件进行分割,以形成两个镜像文件,然后分别烧录到SD卡的适宜位置。
步骤1:sd_fusing目录里的脚本sd_fusing.sh文件,有几句代码需要修改。
//86行
./mkbl1 ../uboot_inand.bin SD-bl1-8k.bin 8192
//93行
dd iflag=dsync oflag=dsync if=../uboot_inand.bin of=$1 seek=$uboot_position
// 我们需要把这里的 uboot_inand.bin 改为 u-boot.bin
// 或者把编译得到 u-boot.bin 重新命名为 uboot_inand.bin
步骤2:将sd卡接入虚拟机的ubuntu系统中,明确sd卡对应的设备文件。
没有插SD卡之前,linux系统的/dev/sd*内容如下:
root@ubuntu:/dev# ls sd*
sda sda1 sda2 sda5
root@ubuntu:/dev#
将SD卡插入电脑主机后,在虚拟机的菜单中下拉“虚拟机”,选择“可移动设备”,选择SD卡对应的设备,此时linux系统的/dev/sd*内容如下。
root@ubuntu:/dev# ls sd*
sda sda1 sda2 sda5 sdb sdb1
root@ubuntu:/dev# df sdb -h
文件系统 容量 已用 可用 已用% 挂载点
udev 490M 4.0K 490M 1% /dev
root@ubuntu:/dev# df sdb1 -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/sdb1 7.6G 16K 7.6G 1% /media/xjh/2FD6-2155
root@ubuntu:/dev# ls -l sdb1
brw-rw---- 1 root disk 8, 17 Aug 30 17:23 sdb1
root@ubuntu:/dev# ls -l sdb
brw-rw---- 1 root disk 8, 16 Aug 30 17:23 sdb
由此可知,SD卡对应的设备文件是/dev/sdb(为何不是/dev/sdb1?)。?
步骤3:执行命令“ ./sd_fusing.sh /dev/sdb ”。
root@ubuntu:/home/xjh/iot/embedded_basic/uboot/uboot_jiuding/sd_fusing# ./sd_fusing.sh /dev/sdb
/dev/sdb reader is identified.
make sd card partition
./sd_fdisk /dev/sdb
记录了1+0 的读入
记录了1+0 的写出
512字节(512 B)已复制,0.00444522 秒,115 kB/秒
mkfs.vfat -F 32 /dev/sdb1
mkfs.fat 3.0.26 (2014-03-07)
BL1 fusing
记录了16+0 的读入
记录了16+0 的写出
8192字节(8.2 kB)已复制,0.0655536 秒,125 kB/秒
u-boot fusing
记录了768+0 的读入
记录了768+0 的写出
393216字节(393 kB)已复制,2.5684 秒,153 kB/秒
U-boot image is fused successfully.
Eject SD card and insert it again.
root@ubuntu:/home/xjh/iot/embedded_basic/uboot/uboot_jiuding/sd_fusing#
如何运行
之前的裸机实验,或以usb方式启动(拨码开关靠近电源按钮),或以sd卡方式启动(拨码开关远离电源按钮)。注意,以sd卡方式启动时,开发板inand中的uboot已经被破坏了。另外,裸机实验用的是靠近网口的那个串口,uboot启动输出用的是远离网口的那个串口,我们需要更改回来。
步骤1:确认inand已经破坏掉,确认串口已经连接到远离网口的那个串口。
步骤2:正确连接SecureCRT。
步骤3:将烧录好镜像文件的sd卡插进靠近电源按钮的卡槽,将启动拨码开关拨向远离电源按钮的一端,然后启动开发板。
SD checksum Error //这个是inand校验失败输出的
OK //这个是sd中的uboot输出的
U-Boot 1.3.4 (Sep 23 2022 - 23:10:30) for x210
CPU: S5PV210@1000MHz(OK)
APLL = 1000MHz, HclkMsys = 200MHz, PclkMsys = 100MHz
MPLL = 667MHz, EPLL = 96MHz
HclkDsys = 166MHz, PclkDsys = 83MHz
HclkPsys = 133MHz, PclkPsys = 66MHz
SCLKA2M = 200MHz
Serial = CLKUART
Board: X210
DRAM: 512 MB
Flash: 8 MB
SD/MMC: 3728MB
In: serial
Out: serial
Err: serial
[LEFT UP] boot mode
checking mode for fastboot ...
Hit any key to stop autoboot: 0 //倒计时结束前按下任何按键
x210 #
倒计时结束前按下任何按键,会停留在uboot提供的shell界面。
x210 # bdinfo //查看开发板信息
arch_number = 0x00000998
env_t = 0x00000000
boot_params = 0x30000100
DRAM bank = 0x00000000
-> start = 0x30000000
-> size = 0x10000000
DRAM bank = 0x00000001
-> start = 0x40000000
-> size = 0x10000000
ethaddr = 00:40:5C:26:0A:5B
ip_addr = 192.168.1.88
baudrate = 115200 bps
x210 # print //打印环境变量
mtdpart=80000 400000 3000000
bootdelay=3
baudrate=115200
ethaddr=00:40:5c:26:0a:5b
netmask=255.255.255.0
serverip=192.168.1.141
gatewayip=192.168.1.1
ipaddr=192.168.1.88
bootcmd=tftp 30008000 zImage;bootm 30008000
bootargs=root=/dev/nfs nfsroot=192.168.1.141:/home/xjh/iot/embedded_basic/rootfs/rootfs_xjh ip=192.168.1.88:192.168.1.141:192.168.1.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC2,115200
Environment size: 409/16380 bytes
x210 #
注意这个uboot的环境变量之前我修改过,表示内核镜像和根文件系统是通过tftp和nfs形式下载的。但如果内核镜像和根文件系统在inand中存在时,也可以修改成如下: ?
set bootargs console=ttySAC2,115200 root=/dev/mmcblk0p2 rw init=/linuxrc rootfstype=ext3
set bootcmd 'movi read kernel 30008000; movi read rootfs 30B00000 300000; bootm 30008000 30B00000'
|