首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

ARM-S3C2440启动文件init.s解析(8)

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 ?????????????

;===========================================================
继承事业,薪火相传
返回列表