bootloader研究最后一关(上)

2011-03-12 17:03:17

 

把map文件也仔细看了下。代码及map文件及段分配的关系,可以参考我总结的图。暂时堆栈我就不放在ZI上了。不是今天的重了点

 

今天重点研究2440的nandflash启动后是如何搬运代码的。参考代码如下。
 ldr r0, =BWSCON
 ldr r0, [r0]
 ands r0, r0, #6  ;OM[1:0] != 0, NOR FLash boot
 bne copy_proc_beg  ;do not read nand flash
 adr r0, ResetEntry  ;OM[1:0] == 0, NAND FLash boot
 cmp r0, #0   ;if use Multi-ice,
 bne copy_proc_beg  ;do not read nand flash for boot
 ;nop
;===========================================================
nand_boot_beg                                               跳到c语言RdNF2SDRAM函数段,实现将nandflash中
 [ {TRUE}                                                       代码搬运到SDRAM
  bl RdNF2SDRAM
 ]

 ldr pc, =copy_proc_beg
;===========================================================
copy_proc_beg
 adr r0, ResetEntry
 ldr r2, BaseOfROM
 cmp r0, r2
 ldreq r0, TopOfROM
 beq InitRam 
 ldr r3, TopOfROM
0                             ==========================
 ldmia r0!, {r4-r7}        此段暂时不研究,据说是nor启动用的
 stmia r2!, {r4-r7}
 cmp r2, r3
 bcc %B0
 
 sub r2, r2, r3
 sub r0, r0, r2    
                      ============================
InitRam                             此段是把topofrom上面的RW段数据搬运到正确的地址,即Baseofbss。
 ldr r2, BaseOfBSS             Baseofbss是在ads配置里的RW地址。如果rw地址不填写的话,此段删除
 ldr r3, BaseOfZero             也可以,如果rw地址填写的值正好是topofro的地址那么,此段删除也可以
0                                        r3,baseofzero,即是RW Data段的结尾。     
 cmp r2, r3
 ldrcc r1, [r0], #4
 strcc r1, [r2], #4
 bcc %B0 
                                    ==============================
 mov r0, #0               此段是把baseofzero,一直到rw段的结尾都初始化为0.注意rw段(可读写段)
 ldr r3, EndOfBSS    包括RW Data段及ZI Date段。都是可读写的。RW Data段数据会保持在目标文
1                             件中,而ZI Date段只为数据分配空间,记录空间大小,不保存在目标文件。
 cmp r2, r3              它一般由系统执行时初始化。ZI Data段一般都是自动分配在RW Data段后
 strcc r0, [r2], #4
 bcc %B1

猜你喜欢

转载自www.cnblogs.com/AppleCai/p/10777949.html
今日推荐