嵌入式开发高手实战:深度定制U-Boot的MMC启动流程实现TFTP内核加载
每次修改内核后都要手动通过TFTP加载zImage和dtb文件,再输入bootz命令启动,这种重复操作是否让你感到效率低下?作为嵌入式开发者,我们常常陷入这样的开发循环:编译内核→TFTP传输→手动启动→测试→再修改...今天我将分享如何通过深度定制U-Boot的mmcboot流程,将这一系列操作自动化,让开发效率提升一个量级。
1. 理解U-Boot启动流程的核心机制
1.1 U-Boot环境变量解析
U-Boot的启动行为主要由环境变量控制,这些变量构成了一个简单的脚本系统。通过printenv命令,我们可以看到完整的变量列表,其中几个关键变量决定了启动流程:
bash复制# 典型的环境变量示例
bootcmd=run findfdt; mmc dev ${mmcdev}; if mmc rescan; then if run loadbootscript; then run bootscript; else if run loadimage; then run mmcboot; else run netboot; fi; fi; else run netboot; fi
mmcboot=echo Booting from mmc...; run mmcargs; if test ${boot_fdt} = yes || test ${boot_fdt} = try; then if run loadfdt; then bootz ${loadaddr} - ${fdt_addr}; else if test ${boot_fdt} = try; then bootz; else echo WARN: Cannot load the DT; fi; fi; else bootz; fi
这个逻辑流程可以简化为:
- 尝试从MMC设备加载设备树(fdt)
- 如果MMC设备可用:
- 尝试加载并执行bootscript
- 否则尝试加载内核镜像(loadimage)
- 如果成功,执行mmcboot
- 如果上述步骤失败,回退到netboot
1.2 MMC启动流程的解剖
标准的mmcboot流程通常包含
