uboot的初体验——uboot的配置编译实践

本文档详细介绍了如何在Ubuntu环境下编译U-Boot,配置过程包括解压源码、执行配置命令和编译命令。编译完成后,通过修改sd_fusing.sh脚本并执行该脚本将U-Boot镜像文件烧录到SD卡。最后,文章提到了如何设置启动模式和检查烧录结果,并展示了启动时的uboot shell界面和环境变量信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。

一、uboot的源码

uboot的源码见uboot的初体验——uboot的源码目录分析

二、配置与编译

以九鼎官方的uboot为例,说明如何对uboot进行编译。

(1)将源码解压在适当的目录下。

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

(2)配置,即在uboot的根目录下执行“make x210_sd_config”。

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#

(3)编译,即在uboot的根目录下执行“make”或“make -j4”。

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烧录至SD卡

假定前面的编译步骤顺利完成,在uboot根目录下得到了u-boot.bin这个镜像文件。

由于S5PV210的特殊启动方式,BL1不能超过16KB,所以需要利用uboot源码中的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?/dev/sdb1是指分区1?)。 

(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已经破坏掉,确认串口已经连接到远离网口的那个串口。

破坏方法见如何破坏开发板iNand中的uboot?-CSDN博客

(2)正确连接SecureCRT。

(3) 将启动拨码开关拨向远离电源按钮的一端(表示SD卡启动方式),将烧录好镜像文件的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 # 

(4)倒计时结束前按下任何按键,会停留在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"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天糊土

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值