对boot0的理解

在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镜像加载到重定位的位置直接运行

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值