ARMBoot-1.1.0 在 mini2440 开发板上的移植(六)

2014-11-24 09:02:05 ? 作者: ? 浏览: 4
2440)
258 /* FCLK:HCLK:PCLK = 1:4:8 */
259 ldr r0, =CLKDIVN
260 mov r1, #5
261 str r1, [r0]
262
263 mrc p15, 0, r1, c1, c0, 0
264 orr r1, r1, #0xc0000000
265 mcr p15, 0, r1, c1, c0, 0
266
267 mov r1, #CLK_CTL_BASE
268 mov r2, #MDIV_405 /* MPLL=405MHZ */
269 add r2, r2, #PSDIV_405
270 str r2, [r1, #0x04] /* MPLLCON tekkaman */
/*
* 259~270部分为设定工作时钟频率
*/
271
272 /*
273 * we do sys-critical inits only at reboot,
274 * not when booting from ram!
275 */
276 adr r0, _start /* r0 <- current position of code */ // snallie
277 ldr r1, _TEXT_BASE /* test if we run from flash or RAM */ // snallie
278 cmp r0, r1 /* don't reloc during debug */ // snallie
279 blne cpu_init_crit // snallie
/* 判断代码的执行位置,以确定是否进行CPU的初始化:
* 276行为伪指令,工作是取_start这个标号的运行时的地址,277行取_TEXT_BASE单元中的一个字的数据
* 278行判断二者是否相等,若是不等则跳转到cpu_init_crit,进行CPU的初始化工作。
* 说明:这四条指令主要是为了是代码可以同时适应烧写到Flash运行和下载绝对地址TEXT_BASE处运行:
* (1)当烧写到Flash运行时候,这段代码的运行的起始地址为0x00000000,这时候_TEXT_BASE总是存储
* 常量TEXT_BASE(配置在board/mini2440/config.mk),比较后两者不等,表明是从Flash中启动的
* 所以要进行CPU等的初始化工作。
* (2)当代码是在下载绝对地址TEXT_BASE处运行时,_start的值和_TEXT_BASE中存放的值是相等的,
* 表明是在代码测试阶段时下载运行的,所以不必进行CPU等的初始化工作。
*/

280
281 /* set up the stack */ // snallie
282 ldr r0, _armboot_end // snallie
283 add r0, r0, #CONFIG_STACKSIZE // snallie
284 sub sp, r0, #12 /* leave 3 words for abort-stack */ // snallie
/*
* 在306行要调用C的函数
* int CopyCode2Ram(unsigned long start_addr, unsigned char *buf, int size)
* 进行代码的读出工作,所以282~284设定了一段堆栈,位于代码的下方(即程序代码部分的高地址部分),参见后面的
* 内存映像图。
*/

285
286 relocate:
287 /*
288 * relocate armboot to RAM
289 */
290 adr r0, _start /* r0 <- current position of code */
291 ldr r1, _TEXT_BASE /* r1 <- destination address */
292 cmp r0, r1 /* test if we run from flash or RAM */
293 beq call_start_armboot // snallie
/*
* 290~293行代码:在要搬移代码前,先判断代码是从Flash中开始运行的还是下载绝对地址TEXT_BASE处运行的,若是下载运行的,则
* 不必搬移,直接到call_start_armboot,否则进行代码的搬移。具体原因和对276行的注释相同。
*/

294 ldr r2, _armboot_start
295 ldr r3, _armboot_end
296 sub r2, r3, r2 /* r2 <- size of armboot */
/* 294~296行代码:求一下代码的长度,存放在r2寄存器中 */

297
298 /*
299 * r0 = source address
300 * r1 = target address
301 * r2 = size of armboot
302 */
303 // snallie, CopyCodeFromFlashToRam
304 // int CopyCode2Ram(unsigned long start_addr, unsigned char *buf, int size)
305 /*args:r0:source,r1:dest,r2:size*/
306 bl CopyCode2Ram //snallie, CopyCode2Ram.o must be linked within s3c24x0's steppingzone
/*
* 306行调用C的函数进行代码的搬移,ARM处理器下,汇编程序给C函数传递参数的方式为:参数个数小于4个时候,通过
* r0,r1,r2,r3,分别存放4个参数,若多于4个则其余的通过堆栈传递,这里CopyCode2Ram只有3个参数,分别放到
* r0,r1,r2中,r0存放代码在Flash上的开始地址,这里为0x00000000, r1存放代码
-->

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: