取出CPSR寄存器的值,CPSR寄存器保存当前系统状态,
使用比特清除命令清空了CPSR寄存器的中断控制位,表示清除中断。
设置了CPSR寄存器的处理器模式位为管理模式,然后在第117行写入 CPSR的值强制切换处理器为超级保护模式。
定义看门狗控制器有关的变量,
根据平台设置看门狗定时器。
设置时钟分频寄存器的值。
需要根据CONFIG_SKIP_LOWLEVEL_INIT宏的值是否跳转到cpu_init_crit标号执行
===========cpu_init_crit==========
- 228
- 238
- 239
- 240
#ifndef CONFIG_SKIP_LOWLEVEL_INIT - 241
cpu_init_crit: - 242
- 245
mov r0, #0 - 246
mcr p15, 0, r0, c7, c7, 0 // 1.刷新cache - 247
mcr p15, 0, r0, c8, c7, 0 // 2.刷新TLB - 248
- 249
- 252
mrc p15, 0, r0, c1, c0, 0 - 253
bic r0, r0, #0x00002300 @ clear bits 13, 9:8 (--V- --RS) - 254
bic r0, r0, #0x00000087 @ clear bits 7, 2:0 (B--- -CAM) - 255
orr r0, r0, #0x00000002 @ set bit 2 (A) Align - 256
orr r0, r0, #0x00001000 @ set bit 12 (I) I-Cache - 257
mcr p15, 0, r0, c1, c0, 0 - 258
- 259
- 264
mov ip, lr - 265
bl lowlevel_init // 跳转到lowlevel_init - 266
mov lr, ip - 267
mov pc, lr - 268
#endif
==>2.
TLB的作用是在处理器访问内存数据的时候做地址转换。TLB的全称是Translation Lookaside Buffer,可以翻译做旁路缓冲。
TLB中存放了一些页表文件,文件中记录了虚拟地址和物理地址的映射关系。当应用程序访问一个虚拟地址的时候,会从 TLB中查询出对应的物理地址,然后访问物理地址。TLB通常是一个分层结构,使用与Cache类似的原理。处理器使用一定的算法把最常用的页表放在最先访问的层次。
==>3.
程序第252~257行关闭MMU。MMU是内存管理单元(Memory Management Unit)的缩写。在现代计算机体系结构上,MMU被广泛应用。使用MMU技术可以向应用程序提供一个巨大的虚拟地址空间。在U-Boot初始化的时候,程序看到的地址都是物理地址,无须使用MMU。
=========================lowlevel_init=========================
- 133
lowlevel_init: - 134
- 135
- 136
- 137
ldr r0, =SMRDATA // 读取SMRDATA变量地址 - 138
ldr r1, _TEXT_BASE // 读取_TEXT_BASE变量地址 - 139
sub r0, r0, r1 // 得出相对偏移 - 140
ldr r1, =BWSCON // 主要是了解BANK的位宽,16位 - 141
add r2, r0, #13*4 // 得到SMRDATA占用的大小,结尾处的偏移
- 142
0: - 143
ldr r3, [r0], #4 // 加载SMRDATA到内存 ,相当于一个while循环 - 144
str r3, [r1], #4 - 145
cmp r2, r0 - 146
bne 0b // 循环,相当于while循环 - 147
- 148
- 149
mov pc, lr - 152
- 153
- 154
SMRDATA: // 定义SMRDATA值 - 155
.word (0+(B1_BWSCON<<4)+(B2_BWSCON<<8)+(B3_BWSCON<<12)+(B4_BWSCON -
<<16)+(B5_BWSCON<<20)+(B6_BWSCON<<24)+(B7_BWSCON<<28)) - 156
.word ((B0_Tacs<<13)+(B0_Tcos<<11)+(B0_Tacc<<8)+(B0_ Tcoh<<6)+ -
(B0_Tah<<4)+(B0_Tacp<<2)+(B0_PMC)) - 157
.word ((B1_Tacs<<13)+(B1_Tcos<<11)+(B1_Tacc<<8)+(B1_Tcoh<<6)+ -
(B1_Tah<<4)+(B1_Tacp<<2)+(B1_PMC)) - 158
.word ((B2_Tacs<<13)+(B2_Tcos<<11)+(B2_Tacc<<8)+(B2_Tcoh<<6)+ -
(B2_Tah<<4)+(B2_Tacp<<2)+(B2_PMC)) - 159
.word ((B3_Tacs<<13)+(B3_Tcos<<11)+(B3_Tacc<<8)+(B3_Tcoh<<6)+ -
(B3_Tah<<4)+(B3_Tacp<<2)+(B3_PMC)) - 160
.word ((B4_Tacs<<13)+(B4_Tcos<<11)+(B4_Tacc<<8)+(B4_Tcoh<<6)+ -
(B4_Tah<<4)+(B4_Tacp<<2)+(B4_PMC)) - 161
.word ((B5_Tacs<<13)+(B5_Tcos<<11)+(B5_Tacc<<8)+(B5_Tcoh<<6)+ -
(B5_Tah<<4)+(B5_Tacp<<2)+(B5_PMC)) - 162
.word ((B6_MT<<15)+(B6_Trcd<<2)+(B6_SCAN)) - 163
.word ((B7_MT<<15)+(B7_Trcd<<2)+(B7_SCAN)) - 164
.word ((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Trc<<18)+ -
(Tchr<<16)+REFCNT) - 165
.word 0x32 - 166
.word 0x30 - 167
.word 0x30
程序第137~141行计算SMRDATA需要加载的内存地址和大小。首先在137行读取SMRDATA的变量地址,之后计算存放的内存地址并且记录在r0寄存器,然后根据总线宽度计算需要加载的SMRDATA大小,并且把加载结束地址存放在r2寄存器。
程序第142~146行复制SMRDATA到内存。SMRDATA是开发板上内存映射的配置