标题:
ARM-S3C2440启动文件init.s解析(8)
[打印本页]
作者:
yuyang911220
时间:
2014-7-26 12:45
标题:
ARM-S3C2440启动文件init.s解析(8)
; 哈哈,下面又有看头了,这个初始化程序好像被名曰hzh的高手改过
; 能在NOR NAND 还有内存中运行,当然了,在内存中运行最简单了.
; 在NOR NAND中运行的话都要先把自己拷到内存中.
; 此外,还记得上面提到的|Image$$RO$$Base|,|Image$$RO$$Limit|...吗?
; 这就是拷贝的依据了!!!
;=========================================================================
;BWSCON的[2:1]反映了外部引脚OM[1:0]:若OM[1:0] != 00, 从NOR FLash启动或直接在内存运行;
;若OM[1:0]==00,则为Nand Flash Mode
ldr r0, =BWSCON
ldr r0, [r0]
ands r0, r0, #6 ; #6 == 0110 --> BWSCON[2:1]
bne copy_proc_beg ;OM[1:0] != 00,NOR FLash boot,不读取NAND FLASH
adr r0, ResetEntry ;否则,OM[1:0] == 0, 为从NAND FLash启动
cmp r0, #0 ;再比较入口是否为0地址处
;如果是0才是真正从NAND 启动,因为其4k被复制到0地址开始的stepingstone 内部sram中
; 注意adr得到的是 相对 地址,非绝对地址 == if use Multi-ice,
bne copy_proc_beg ;如果!=0,说明在using ice, 这种情况也不读取NAND FLASH.
;don't read nand flash for boot
;nop
;==============这一段代码完成从NAND Flash读代码到RAM=====================
nand_boot_beg ;
mov r5, #NFCONF ;首先设定NAND的一些控制寄存器
;set timing value
ldr r0, =(7<<12)|(7<<8)|(7<<4)
str r0, [r5]
;enable control
ldr r0, =(0<<13)|(0<<12)|(0<<10)|(0<<9)|(0<<8)|(1<<6)|(1<<5)|(1<<4)|(1<<1)|(1<<0)
str r0, [r5, #4]
bl ReadNandID ;按着读取NAND的ID号,结果保存在r5里
mov r6, #0 ;r6设初值0.
ldr r0, =0xec73 ;期望的NAND ID号
cmp r5, r0 ;这里进行比较
beq %F1 ;相等的话就跳到下一个1标号处
ldr r0, =0xec75 ;这是另一个期望值
cmp r5, r0
beq %F1 ;相等的话就跳到下一个1标号处
mov r6, #1 ;不相等,设置r6=1.
1
bl ReadNandStatus ;读取NAND状态,结果放在r1里
mov r8, #0 ; r8设初值0,意义为页号
ldr r9, =ResetEntry ; r9设初值为初始化程序入口地址
; 注意,在这里使用的是ldr伪指令,而不是上面用的adr伪指令,它加载的是ResetEntry
; 的绝对地址,也就是我们期望的RAM中的地址,在这里,它和|Image$$RO$$Base|一样
; 也就是说,我如我们编译程序时RO base指定的地址在RAM里,而把生成的文件拷到
; NAND里运行,由ldr加载的r9的值还是定位在内存. ???
2
ands r0, r8, #0x1f ;凡r8为0x1f(32)的整数倍-1,eq有效,ne无效
bne %F3 ;这句的意思是对每个块(32页)进行检错 -- 在每个块的开始页进行
mov r0, r8 ;r8->r0
bl CheckBadBlk ;检查NAND的坏区
cmp r0, #0 ;比较r0和0
addne r8, r8, #32 ;存在坏块的话就跳过这个坏块: + 32得到下一块.
;故: r8 = blockpage addr,因为读写是按页进行的(每页512Byte)
bne %F4 ;然后跳到4进行循环条件判断。没有的话就跳到标号3处copy当前页
3
mov r0, r8 ;当前页号->r0
mov r1, r9 ;当前目标地址->r1
bl ReadNandPage ;读取该页的NAND数据到RAM
add r9, r9, #512 ;每一页的大小是512Bytes
add r8, r8, #1 ;r8指向下一页
4
cmp r8, #256 ;比较是否读完256页即128KBytes
;注意:这说明此程序默认拷贝128KByte的代码(by Tinko)
bcc %B2 ;如果r8小于256(没读完),就返回前面的标号2处
; now copy completed
mov r5, #NFCONF ;Disable NandFlash
ldr r0, [r5, #4]
bic r0, r0, #1
str r0, [r5, #4]
ldr pc, =copy_proc_beg ;调用copy_proc_beg
;个人认为应该为InitRam ?????????????
;===========================================================
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/)
Powered by Discuz! 7.0.0