目录
- 本篇博文我们要实现什么?
- 读本篇博文所需要的先行知识
- 整个Bootloader的流程详解
- 百问网的烧写工具烧写镜像文件u-boot-dtb.imx的脚本分析
- 利用百问网的烧写工具将u-boot的镜像文件u-boot-dtb.imx烧写到eMMC中
- u-boot在倒计时完后,首先执行的是哪条命令?具体内容是什么?
- 详解u-boot倒计时完成后执行的首条命令相关的环境变量`bootcmd`
- 结合实际对u-boot的相关环境变量进行修改
- 利用以网络形式启动Linux系统将根文件系统写入到eMMC的`User Area`区的第2逻辑分区中
- 利用以网络形式启动Linux系统将内核镜像和设备树文件写到eMMC的`User Area`区的第2逻辑分区的目录/boot中
- 从eMMC启动Linux系统并正常运行
- 保存对环境变量的修改,让开发板能完全自启动Linux系统
- 测试能否挂载网络文件系统
- 通过网络文件系统将蓝牙的固件复制到相应的根文件目录中
- 通过网络文件系统将wifi的固件复制到相应的根文件目录中
- 通过网络文件系统将蓝牙和wifi的驱动模块复制到相应的根文件目录中
- 测试蓝牙模块是否能正常运行
- 测试wifi模块是否能正常运行
- 附相关文件
本篇博文我们要实现什么?
在前面的两篇博文中我们只是把移植修改生成的内核、设备树、根文件通过网络进行的加载,也就是并没有把它们写入到eMMC存储器,当最终修改测试没问题,显然我们应该是把这些东西烧写到eMMC存储器中的。
所以本博文的目标很明确:就是要把我们在前面两篇博文移植修改相关源码生成的u-boot、内核、设备树、根文件写到eMMC存储器中,从而实现从eMMC存储器启动一个完整并且能正常运行的Linux系统。
前面两篇博文是指下面这篇博文:
https://blog.youkuaiyun.com/wenhao_ir/article/details/145662136
https://blog.youkuaiyun.com/wenhao_ir/article/details/145822475
读本篇博文所需要的先行知识
关于芯片内部的ROM的作用、工作原理的介绍,链接如下:
https://blog.youkuaiyun.com/wenhao_ir/article/details/145969584
eMMC存储器详解(存储区域结构、EXT_CSD[179]、各分区介绍、主要引脚、命令格式与类型等)
https://blog.youkuaiyun.com/wenhao_ir/article/details/145967306
IMX6ULL运行Linux系统的Bootloader的三个阶段详解(BootROM、SPL、U-Boot)(SPL和U-Boot合成镜像u-boot-dtb.imx
时需要作填充数据处理)
https://blog.youkuaiyun.com/wenhao_ir/article/details/145999721
百问网(100ask)提供的烧写工具的原理和详解;将自己编译生成的u-boot镜像文件烧写到eMMC中
https://blog.youkuaiyun.com/wenhao_ir/article/details/145653414
运行于u-boot中的Fastboot(FB)协议介绍(快速烧写 eMMC、NAND、UFS 等存储设备的协议)
https://blog.youkuaiyun.com/wenhao_ir/article/details/145985144
u-boot中与eMMC/SD卡相关的功能模块“MMC sub system”的详细介绍
https://blog.youkuaiyun.com/wenhao_ir/article/details/146016551
整个Bootloader的流程详解
如果要了解整个Linux系统的启动流程,首先要搞清楚Bootloader。
Bootloader分为三个部分,即处理器内部 ROM 代码(BootROM)、SPL(Secondary Program Loader)、U-Boot(完整 Bootloader)。
处理器内部 ROM 代码(BootROM)是写死在处理器的内部的,而SPL(Secondary Program Loader)、U-Boot(完整 Bootloader)这是可以由u-boot生成的,通常u-boot的镜像文件u-boot-dtb.imx就包含这两个阶段的代码。
整个流程的详解我已经写在了博文 https://blog.youkuaiyun.com/wenhao_ir/article/details/145999721 中,所以到那篇文章中去看吧。
搞清楚上面这篇博文中关于Bootloader的流程详解后,就要看包含Bootloader的后两个阶段的镜像文件u-boot-dtb.imx是如何烧写到eMMC中的,烧写到eMMC中后,又是怎么装载到内存中的,也就是下面一个目录的内容。
百问网的烧写工具烧写镜像文件u-boot-dtb.imx的脚本分析
百问网提供的烧写工具的相关脚本D:\Program Files\100ask_imx6ull_pro开发板系统烧写工具\scripts\basic\emmc\write_boot.clst
的详细分析见博文 https://blog.youkuaiyun.com/wenhao_ir/article/details/146012950 【搜索"包含SPL和U-Boot的镜像文件u-boot-dtb.imx烧写到eMMC存储器的脚本分析"】
从上面这篇博文对烧写脚本的分析可知:
镜像文件u-boot-dtb.imx是烧写到了 boot partition 1(boot1)中,而不是 boot partition 2(boot2)中的。并且镜像烧写工具在烧写完成后还把 boot partition 1(boot1)设置为了启动分区,即eMMC启动后,首先从boot partition 1(boot1)向内存发送SPL和U-Boot代码。
另外从博文 https://blog.youkuaiyun.com/wenhao_ir/article/details/145999721 中可以知道,镜像文件u-boot-dtb.imx中包含着Bootloader的后两个阶段,即SPL和U-Boot阶段。
利用百问网的烧写工具将u-boot的镜像文件u-boot-dtb.imx烧写到eMMC中
之前已在博文 https://blog.youkuaiyun.com/wenhao_ir/article/details/145662136 将镜像文件u-boot-dtb.imx烧写到了eMMC中,详细的烧写过程请参考那篇博文。
镜像文件u-boot-dtb.imx烧写到eMMC中,把开发板的启动模式设置为eMMC启动后,再打开串口,启动开发板,就可以看到u-boot正常运行了。
接下来我们需要知道“ u-boot在倒计时完后,首先执行的是哪条命令?具体内容是什么?”
u-boot在倒计时完后,首先执行的是哪条命令?具体内容是什么?
现在我需要知道u-boot在启动后,倒计时完后准备加载内核和设备树,那么它倒计时完后首先执行的是哪条命令?
在U-Boot的启动流程中,倒计时结束后,U-Boot会执行环境变量中定义的启动命令。具体来说,它首先执行的是bootcmd
环境变量的内容。
流程分析
-
倒计时阶段:
- 在U-Boot启动时,会显示倒计时,例如:
Hit any key to stop autoboot: 3
- 这个倒计时是由
autoboot_command()
相关代码控制的,主要作用是让用户有机会手动中断自动启动。
- 在U-Boot启动时,会显示倒计时,例如:
-
倒计时完成后:
- 如果用户没有按键中断,U-Boot 会执行:
run_command(env_get("bootcmd"), 0);
- 其中
env_get("bootcmd")
取出bootcmd
环境变量的内容,并将其传递给run_command()
执行。
- 如果用户没有按键中断,U-Boot 会执行:
那么如何查看环境变量 bootcmd
的具体内容呢?
其实之前在博文 https://blog.youkuaiyun.com/wenhao_ir/article/details/145902134 中已经详细叙述了方法,并且连具体的内容我都列出了。
环境变量 bootcmd
的内容如下:
bootcmd=run findfdt;run findtee;mmc dev ${mmcdev};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