您的位置:首页 > 其它

uboot源码分析(2)

2013-04-28 14:14 309 查看
取出CPSR寄存器的值,CPSR寄存器保存当前系统状态,

使用比特清除命令清空了CPSR寄存器的中断控制位,表示清除中断。

设置了CPSR寄存器的处理器模式位为管理模式,然后在第117行写入 CPSR的值强制切换处理器为超级保护模式。

定义看门狗控制器有关的变量,

根据平台设置看门狗定时器。

设置时钟分频寄存器的值。

需要根据CONFIG_SKIP_LOWLEVEL_INIT宏的值是否跳转到cpu_init_crit标号执行

===========cpu_init_crit==========

cpu_init_crit标号处的代码初始化ARM处理器关键的寄存器

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=========================



位于board/smdk2410/lowlevel_init.S文件

开发板相关的初始化配置


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是开发板上内存映射的配置
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: