3. 案例3
任务目标
在U-Boot中配置bootcmd与bootargs环境变量,使开发板在上电或复位后自动完成内核加载与启动,无需人工干预。
环境与前置条件
- 开发板已烧录U-Boot,并能进入U-Boot命令行(通常通过串口终端访问,波特率115200)。
- 内核镜像(如
zImage或Image)、设备树文件(.dtb)已放置在U-Boot可访问的存储介质上(如SD卡、eMMC、TFTP服务器)。 - 以下示例以SD卡分区1(
mmc 0:1)存放镜像为例,文件系统格式为FAT。
核心实现
在U-Boot命令行中依次执行以下命令,完成环境变量设置并保存。核心逻辑是:先定义加载地址与镜像文件名,再设置bootargs传递内核启动参数,最后设置bootcmd为自动加载并启动内核的命令序列。
# 1. 设置加载地址与镜像文件名(按实际文件名修改)
setenv loadaddr 0x82000000
setenv fdtaddr 0x88000000
setenv kernel_file zImage
setenv fdt_file board.dtb
# 2. 设置bootargs:传递给内核的启动参数(root设备、控制台等按实际修改)
setenv bootargs 'console=ttymxc0,115200 root=/dev/mmcblk0p2 rootwait rw'
# 3. 设置bootcmd:自动执行“加载内核→加载设备树→启动”
setenv bootcmd 'fatload mmc 0:1 ${loadaddr} ${kernel_file}; fatload mmc 0:1 ${fdtaddr} ${fdt_file}; bootz ${loadaddr} - ${fdtaddr}'
# 4. 保存环境变量到存储介质(eMMC/SD卡)
saveenv
# 5. 验证设置
printenv bootcmd bootargs
关键点说明:
fatload mmc 0:1表示从SD卡第0个控制器、分区1加载文件;若使用eMMC或TFTP,需对应修改为mmc 1:0或tftp命令。bootz用于启动ARM 32位内核(zImage);若使用64位内核(Image),改用booti命令。${loadaddr}与${fdtaddr}为内存加载地址,需与U-Boot实际可用内存区域匹配,避免覆盖U-Boot自身或内核解压区域。root=/dev/mmcblk0p2指定根文件系统所在分区,需与你的存储布局一致。
运行与验证
- 执行完上述命令后,输入
reset或直接给开发板重新上电。 - 观察串口输出:U-Boot启动后应不再停留在命令行提示符,而是自动打印
Starting kernel ...并跳转到内核启动流程。 - 若内核成功挂载根文件系统并启动到用户空间(如出现
login:提示符或启动日志),则说明bootcmd与bootargs配置正确。
判定通过条件:开发板在上电后无需手动输入任何U-Boot命令,自动完成内核加载与启动,且内核启动参数(控制台、根文件系统)生效。
常见问题排查
- 启动停在
Hit any key to stop autoboot:说明bootcmd未生效或执行失败。检查printenv bootcmd是否与设置一致,并确认镜像文件名与存储路径正确。 - 提示
FAT: Unable to read file:镜像文件不存在或分区号错误。用ls mmc 0:1查看分区内文件列表确认文件名。 - 内核启动后无控制台输出:检查
bootargs中的console=参数是否与U-Boot实际使用的串口及波特率匹配。