Nand Flash启动一问
用的是S3C2410.见附件start.s 其中关于nand flash启动的那一段一直百思不得其解,按说从NAND FLASH启动时,应该是前4KB映射到NGCS0,其中的代码将NAND中存放的程序拷贝到RAM中,但该文件提供的程序好象是先从NAND拷贝128K的代码到ResetEntry开始的地方,即地址为0的地方,然后再从ResetEntry处拷到RAM中,但此时NGCS0好象只有4KB的RAM区,怎么能存储128K的代码,一直没想通.望高手指点,谢谢!
.........................................................................................................
bl ReadNandStatus 拷贝128K的代码到ResetEntry开始的地方,即地址为0的地方
mov r8, #0
ldr r9, =ResetEntry
2
ands r0, r8, #0x1f
bne %F3
mov r0, r8
bl CheckBadBlk
cmp r0, #0
addne r8, r8, #32
bne %F4
3
mov r0, r8
mov r1, r9
bl ReadNandPage
add r9, r9, #512
add r8, r8, #1
4
cmp r8, #256 (256页*512=128K)
bcc %B2
................................................................................
................................................................................
从ResetEntry处拷到RAM中
copy_proc_beg
adr r0, ResetEntry
ldr r2, BaseOfROM
cmp r0, r1
ldreq r0, TopOfROM
beq InitRam
ldr r3, TopOfROM
0
ldmia r0!, {r4-r7}
stmia r2!, {r4-r7}
cmp r2, r3
bcc %B0
sub r2, r2, r3
sub r0, r0, r2
用的是S3C2410.见附件start.s 其中关于nand flash启动的那一段一直百思不得其解,按说从NAND FLASH启动时,应该是前4KB映射到NGCS0,其中的代码将NAND中存放的程序拷贝到RAM中,但该文件提供的程序好象是先从NAND拷贝128K的代码到ResetEntry开始的地方,即地址为0的地方,然后再从ResetEntry处拷到RAM中,但此时NGCS0好象只有4KB的RAM区,怎么能存储128K的代码,一直没想通.望高手指点,谢谢!
.........................................................................................................
bl ReadNandStatus 拷贝128K的代码到ResetEntry开始的地方,即地址为0的地方
mov r8, #0
ldr r9, =ResetEntry
2
ands r0, r8, #0x1f
bne %F3
mov r0, r8
bl CheckBadBlk
cmp r0, #0
addne r8, r8, #32
bne %F4
3
mov r0, r8
mov r1, r9
bl ReadNandPage
add r9, r9, #512
add r8, r8, #1
4
cmp r8, #256 (256页*512=128K)
bcc %B2
................................................................................
................................................................................
从ResetEntry处拷到RAM中
copy_proc_beg
adr r0, ResetEntry
ldr r2, BaseOfROM
cmp r0, r1
ldreq r0, TopOfROM
beq InitRam
ldr r3, TopOfROM
0
ldmia r0!, {r4-r7}
stmia r2!, {r4-r7}
cmp r2, r3
bcc %B0
sub r2, r2, r3
sub r0, r0, r2
作者: tylnyys 于 2006-10-10 11:07:00 发布:
前4K代码是硬件自动搬的 这里的搬移只是把你生成的代码段、数据段复制到RAM中执行 |
2楼: | >>参与讨论 |
作者: aijing 于 2006-10-10 11:52:00 发布:
弄明白了 搞明白了,是两条指令的差别 LDR r0,=_entry和ADR r0,_entry 前者是在编译的时候按照load address生成的绝对地址,后者反汇编后是相对当前PC寻址,例如在ADS中设置RO地址为0X30000000,那么前者传给r0的值是0x30000000,而后者传给r0的值要视当前PC而定,一般从NGCS0中启动时,传给r0的值就是0。 |