UBOOT源码分析的第一阶段start.S分析(2)

本文解析了U-Boot启动过程中的关键代码片段,详细介绍了如何通过特定指令配置ARM处理器,失能MMU及缓存,并读取启动信息。此外,还分析了拨码开关状态读取与启动方式选择的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

继续更新。

看cache_init代码:

mrc指令就是将协处理器寄存器当中的数据传入到arm处理器的寄存器当中

将协处理器P15中C0,C0寄存器的内容传送到ARM处理器的R0寄存器中

然后:

R1=R0+0X00F00000;

R2=R0+0X0000000F

之后

orr r2,r2,r1,lsr #20-4;

r1的内容右移16位,之后r1和r2进行逻辑或运算,赋值给r2

之后比较r2和#0x30的值

然后mrceq p15 ,0 ,r0,c1,c0 //读actlr

下来使能dp1 dp2

然后写actlr

其实这部分代码我也没有仔细研究。

这里暂时不用仔细研究哈。

到时候写一篇文章,专门更新这个内容。

这里给我们一个提醒就是,一定要熟悉arm处理器的指令集哦!

总的来说,上面的代码就是失能(不是使能哈)MMU,caches 让L1 I/D无效

之后是一段测试代码,就是上电的时候我们为了看看uboot是否在工作,我们可以看一下自己开发板上面的led是不是一闪而过。这里我们把它注释掉了。

重点来了哈,read booting information读取启动信息

 

 

 

我们在看看0x10002000这个地址的值

就是OM_STAT(拨码开关)读取拨码开关的状态,这个是硬件置位的,我的4412开发板可以设置成TF卡启动还有eMMC启动。

第242行:将POWER_BASE+OMR_OFFSET当中的值加载到r1当中去,此时r1寄存器当中的值就是那个拨码开关当前状态的值

之后 bic    r2, r1, #0xffffffc1

将r1与0xffffffc1的反码进行逻辑与操作,并且将等到的值保存到r2当中。

之后决定启动方式的代码来了

可见有很多行都被注释掉了,因为我的开发板的启动方式只有TF卡和emmc启动。

所以上面的这些代码很好理解。

我们之前得到了r2的值,对吧,然后cmp(比较)r2和某些立即数的值,如果相等就将启动信息(比如上面的#BOOT_EMMC43,#BOOT_EMMC441,#BOOT_MMCSD)放到r3寄存器当中去。

然后ldr r0 ,=INF_REG_BASE,将地址值给r0寄存器

就是地址对应的寄存器是INFORM0,

然后执行str    r3, [r0, #INF_REG3_OFFSET] 

将r3当中的内容,存到r0+INF_REG3_OFFSET中,

其实就存在INFORM3当中

之后执行b1 lowlevel_init代码了。我们之后分析lowlevel_init代码哈

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值