Banana Pi M2U系列之三:R40上电启动流程

来源:互联网 发布:卫浴包括哪些东西 知乎 编辑:程序博客网 时间:2024/06/05 10:10

写在前头

*.版权声明:本篇文章为原创,可随意转载,转载请注明出处,谢谢!另我创建一个QQ群82642304,欢迎加入!
*.备注:整个系列只是对我所学进行总结,记录我认为是关键的点,另我能力有限,难免出现疏漏错误,如果读者有发现请多指正,以免我误导他人!


上电

上电复位后,PC指针指向0xFFFF0000位置,根据R40的用户手册,0xFFFF0000位置存放的是BROM代码,长度为36K。

BROM

BROM即boot ROM,固化在芯片内部的一段引导代码,源码参考这里,分为两部分

FEL,起始位置为0xFFFF0020eGON.BRM,起始位置为0xFFFF4000

芯片跳转到0xFFFF0000之后,接着就直接跳转到0xFFFF4000(即eGON.BRM)的位置。
在eGON.BRM主要的任务是从SD卡、eMMC、NAND等外设上搜索eGON.BT0引导程序。如果搜索不到则跳转到0xFFFF0020进入FEL模式,具体流程为:
1. 判断BSP(boot select pin)是否被拉低,如果被拉低直接跳转到0xFFFF0020进入FEL模式。
2. 按顺序分别加载SDC0,SPI0 Nor,eMMC2,SDC2,NAND外设固定偏移量的数据到SRAM中,判断是否存在eGON.BT0头部。其中SDC和eMMC的偏移量为8K,其余的未找到资料。
3. 如果存在eGON.BT0头部,则判断此段数据为eGON.BT0引导程序,执行该引导程序,该引导程序会从同一外设上加载eGON.BT1引导程序并执行,最终引导Uboot(此流程存疑)。
4. 如果未存在eGON.BT0头部,则寻找下一个外设,直到所有外设都不存在eGON.BT0引导程序时,跳转到0xFFFF0020进入FEL模式。

FEL模式

在FEL模式下,芯片可以通过USB与PC机通讯,按照FEL协议进行读写CPU寄存器,DDR内存等操作。
可用于出厂时的烧录程序或者线刷镜像等。

Uboot的生成

在编译Uboot时添加参数V=1

make -j V=1 | tee make.log

即可保存编译信息到make.log文件以供分析。
大致流程为:
1. 编译arch/arm/cpu/u-boot.lds文件生成u-boot.lds链接文件
2. 使用u-boot.lds链接文件生成u-boot文件
3. 编译arch/arm/cpu/armv7/sunxi/u-boot-spl.lds文件生成spl/u-boot-spl.lds链接文件
4. 使用spl/u-boot-spl.lds链接文件生成u-boot-spl文件
5. 使用objcopy精简spl/u-boot-spl成spl/u-boot-spl-nodtb.bin并复制为spl/u-boot-spl.bin
6. tools/mksunxiboot在spl/u-boot-spl.bin上打一个eGON.BT0的头生成spl/sunxi-spl.bin
7. 使用objcopy精简u-boot并生成u-boot-nodtb.bin文件
8. 使用cat将u-boot-nodtb.bin和dts/dt.dtb合并成u-boot-dtb.bin文件并且拷贝成u-boot.bin
9. 使用tools/mkimage将u-boot.bin文件格式化成u-boot.img镜像文件,入口地址为0x4a000000
10. 复制dts/dt.dtb为u-boot.dtb文件
11. 使用../tools/binman/binman命令将u-boot.dtb、spl/sunxi-spl.bin和u-boot.img文件合并成u-boot-sunxi-with-spl.bin文件
绕来绕去有点复杂,u-boot-sunxi-with-spl.bin是最终需要的

个人理解

根据上述启动流程,芯片上电时先启动片内的BROM加载片外的eGON.BT0,然后再由eGON.BT0加载eGON.BT1,实际上Uboot中的SPL对应的就是eGON.BT0,生成spl/sunxi-spl.bin文件时有打上一个eGON.BT0的头,当控制权交到eGON.BT0(即SPL)时,由它直接加载Uboot。

参考资料

  1. http://linux-sunxi.org/EGON#eGON.BRM
  2. http://linux-sunxi.org/BROM
  3. http://linux-sunxi.org/R40
原创粉丝点击