在MR813项目中,boot0很小,通常boot0代码也不开源,以下介绍是对boot0的理解: (摘抄自: https://blog.csdn.net/qq_42733114/article/details/118855894)
先介绍下BROM的概念:
ARM CPU刚上电时,它的PC寄存器指针指向IC内嵌的一片ROM的起始位置处,这片ROM称之为BROM(boot rom)。
机器从上电后先运行BROM中一段固定的代码,BROM会读取外部引脚来决定从何种介质来启动系统,
BROM的作用是初始化储存启动系统的介质,如flash,emmc等。然后从启动介质中读取boot0代码到芯片内部的SRAM中,
然后跳到boot0的boot0_entry.S(sunxi_spl/boot0/main/)
boot0_main.c函数分析
此阶段主要完成的工作:
1、初始化串口(sunxi_serial_init);
2、sunxi_key_init()。初始化GPADC0和power按键。
3、通过串口获取键盘的按键状态(set_debugmode_flag)用来判断是否进入烧录模式(按数字2进烧录模式)
4、设置时钟频率(set_pll);
5、读取芯片内部的某个rtc寄存器,主要用来判断是否进入烧录模式(rtc_region_probe_fel_flag);
6、获取GPADC0 + POWERON中的是否有输入,如果有输入则在uboot阶段进烧录模式,(sunxi_key_read);
7、初始化DRAM(init_DRAM),此部分代码未开放;
8、建立MMU映射表(mmu_setup),此处可去除,boot0用不到mmu,直接屏蔽此函数即可,前面已关闭;
9、读取boot_packge_nor.fex的头部信息,此头部信息包含了此固件打包了那几类镜像,比如(optee、dtb、uboot、scp(cpus))等,
是从128个扇区开始的,即0~128个扇区装的是boot0的固件;
10、通过读取出来的头部信息,把各个固件的镜像加载进DRAM内存中。(load_fip(&use_monitor));
10、关闭MMU(mmu_turn_off),boot0阶段可不执行mmu_setup函数则此处可不用关闭,直接跳转到boot1或者kernel;
11、跳转到u-boot执行, boot0_jmp_monitor()。可直接加载kernel来加快启动速度,或者直接把uboot镜像加载到重定位的位置直接运行