3. 案例3

案例3:配置U-Boot环境变量 学习卡片

任务目标

在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指定根文件系统所在分区,需与你的存储布局一致。

运行与验证

  1. 执行完上述命令后,输入reset或直接给开发板重新上电。
  2. 观察串口输出:U-Boot启动后应不再停留在命令行提示符,而是自动打印Starting kernel ...并跳转到内核启动流程。
  3. 若内核成功挂载根文件系统并启动到用户空间(如出现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实际使用的串口及波特率匹配。