arm程序代码可以从norflash启动,也可以从nandflash启动。norflash接在arm总线bank0上,程序可以直接在norflash上执行,但这仅仅是RO部分,RW和ZI部分则必须复制到SDRAM上。nandflash上不能直接运行程序,但是arm会把nandflash前4K代码搬移到内部的4Ksdram中,然后从内部4KSDRAM中执行。如果程序在nandflash中,那么前4K代码中必须把RO,RW,ZI都复制到SDRAM中。如果程序在norflash中,则程序必须把RW,ZI复制到SDRAM中,但是,为了提高运行速度,也会把RO段复制到SDRAM中。
ldr r0, =BWSCON
ldr r0, [r0]
ands r0, r0, #6 ;判断是否从norflash启动
bne copy_proc_beg ;若是,跳转到copy_proc_beg
adr r0, ResetEntry ;
cmp r0, #0 ;判断,是从nandflash中启动,还是仿真器启动
bne copy_proc_beg ;若是仿真器,跳转
nand_boot_beg ;若是nandflash,执行RDNF2SDRAM
[ {TRUE}
bl RdNF2SDRAM ;复制代码从nandflash到SDRAM,源代码在Nand.c文件
]
ldr pc, =copy_proc_beg ;绝对地址跳转,然后代码在SDRAM中执行
copy_proc_beg
adr r0, ResetEntry
ldr r2, BaseOfROM
cmp r0, r2 ;判断此时是否在SDRAM中运行,
ldreq r0, TopOfROM ;若是,说明是从nandflash中启动,代码已经复制,直接跳到InitRam去复制RW段
beq InitRam ;若不是,说明从norflash中启动,代码还未复制,则复制RO段代码
ldr r3, TopOfROM
0
ldmia r0!, {r4-r7} ;复制RO段代码
stmia r2!, {r4-r7}
cmp r2, r3
bcc %B0
sub r2, r2, r3 ;考虑RO段代码长度不是4的倍数,调整RW段开始地址
sub r0, r0, r2
InitRam ;复制RW段
ldr r2, BaseOfBSS
ldr r3, BaseOfZero
0
cmp r2, r3
ldrcc r1, [r0], #4
strcc r1, [r2], #4
bcc %B0
mov r0, #0
ldr r3, EndOfBSS ;清零ZI段
1
cmp r2, r3
strcc r0, [r2], #4
bcc %B1
ldr pc, =%F2 ;ldr:跳转到SDRAM
阅读(543) | 评论(1) | 转发(0) |