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

继续更新。

看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代码哈

猜你喜欢

转载自blog.csdn.net/zaqxsw12580/article/details/82315007