📄 copy_nand_to_dram.txt
字号:
;=================
; NAND flash for 2440
;=================
NFCONF EQU 0x4e000000 ;NAND Flash configuration
NFCONT EQU 0x4e000004 ;NADD Flash command
NFCMD EQU 0x4e000008 ;NADD Flash command
NFADDR EQU 0x4e00000c ;NAND Flash address
NFDATA EQU 0x4e000010 ;NAND Flash data
NFSTAT EQU 0x4e000020 ;NAND Flash operation status
NFECC EQU 0x4e00002c ;NAND Flash ECC
;********************************************************************************************************/
; 复制nand到DRAM
;********************************************************************************************************/
nand_boot_beg ;复制nand到DRAM
mov r5, #NFCONF ;用2440配置nand
ldr r0, =( (7<<12)|(7<<8)|(7<<4)|(0<<0) )
str r0, [r5]
;****************************************
ldr r1, =NFCONT
ldr r2, =( (1<<4)|(0<<1)|(1<<0) ) ; Active low CE Control
str r2, [r1]
; ldr r2, [r1]
ldr r1, =NFSTAT
ldr r2, =(0x6) ; RnB Clear
str r2, [r1]
; ldr r2, [r1]
ldr r1, =NFCMD
mov r2, #0xff ; RESET command
strb r2, [r1]
mov r3, #0 ; wait
nand1
add r3, r3, #0x1
cmp r3, #0xa
blt nand1
nand2
ldr r2,=NFSTAT
ldr r3,[r2] ; wait ready
tst r3, #0x4
beq nand2
ldr r1,=NFCONT
ldr r2,[r1]
orr r2, r2, #0x2 ; Flash Memory Chip Disable
str r2, [r1]
;****************************************
bl ReadNandID ; 读Nand芯片ID,将结果放在r5中
mov r6, #0
ldr r0, =0xec73
cmp r5, r0 ; 如果ID等于0xec73则跳到1处
beq %F1
ldr r0, =0xec75
cmp r5, r0
beq %F1 ; 如果ID等于0xec75则跳到1处
mov r6, #1
1
bl ReadNandStatus ; 读取Nand芯片状态将结果放在r1中
mov r8, #0 ; nand的第1页(r8是页数变量)
ldr r9, =0x30000000 ; 要复制nand起始地址,r9指向在RAM中的起始地址。
2
ands r0, r8, #0x1f ; r0 = r8 & #0x1f =0 & #0x1f=0 ;若结果为0,则标志位Z=1
bne %F3 ; 如果是在nand的前一块因为Z置零
mov r0, r8
bl CheckBadBlk ; 检查坏块,返回值非0表明当前块不是坏块。
cmp r0, #0 ; 相等则是坏块
addne r8, r8, #32 ; 不相等则r8=r8+#32,如果当前块坏了,跳过读取操作。 1 block=32 pages
bne %F4 ; 不相等跳到4处检查下一块
3
mov r0, r8
mov r1, r9
bl ReadNandPage ; 读 Nand 1页(512B)
add r9, r9, #512 ; 缓冲区地址加512即1页
add r8, r8, #1 ; 页数加1
4
cmp r8, #256 ; 一共读取128页=256*512=64KB
bcc %B2
mov r5, #NFCONF ;DsNandFlash;关闭Nand芯片
ldr r0, [r5]
and r0, r0, #~0x8000
str r0, [r5]
b ok_nand_read
;mov pc,lr ;返回
ReadNandID ; 读Nand芯片ID将结果放在r5中
mov r7,#NFCONF
ldr r0,[r7,#4] ;NFChipEn();启动Nand芯片
bic r0,r0,#0x2
str r0,[r7,#4] ;启动Nand
mov r0,#0x90 ;WrNFCmd(RdIDCMD) ;0x90为读ID指令
strb r0,[r7,#8] ;NFCmd
mov r4,#0 ;WrNFAddr(0);
strb r4,[r7,#0xc] ;NFADDR
1 ;while(NFIsBusy());
ldr r0,[r7,#0x20] ;NFSTAT 等待写完毕
tst r0,#0x4
beq %B1
ldrb r0,[r7,#0x10] ; id = RdNFDat()<<8 ; NFDATA,读出Nand芯片id前8位
mov r0,r0,lsl #8 ; r0 << #8再存进r0
ldrb r1,[r7,#0x10] ; id |= RdNFDat() ; NFDATA,读出Nand芯片id后8位
orr r5,r1,r0 ; r5 = r1|r0
ldr r0,[r7,#4] ;NFChipDs();关闭Nand芯片
orr r0,r0,#0x2
str r0,[r7,#4]
mov pc,lr ;返回
ReadNandStatus ;读取Nand芯片状态将结果放在r1中,此处没有用到返回值。
mov r7,#NFCONF
ldr r0,[r7,#4] ;NFChipEn();启动Nand芯片
bic r0,r0,#0x2
str r0,[r7,#4] ;;;;;;;;;启动Nand芯片
mov r0,#0x70 ;WrNFCmd(QUERYCMD);读取Nand芯片状态
strb r0,[r7,#8] ;写命令
ldrb r1,[r7,#0x10] ;r1 = RdNFDat();Busy : "0" Ready : "1"
ldr r0,[r7,#4] ;NFChipDs();关闭Nand芯片
orr r0,r0,#0x2
str r0,[r7,#4]
mov pc,lr ;返回
WaitNandBusy ;等待Nand内部操作完毕
mov r0,#0x70 ;WrNFCmd(QUERYCMD);
mov r1,#NFCONF
strb r0,[r1,#8] ;读取Nand芯片状态
1 ;while(!(RdNFDat()&0x40));
ldrb r0,[r1,#0x10]
tst r0,#0x40
beq %B1
mov r0,#0 ;WrNFCmd(READCMD0);
strb r0,[r1,#8] ;发送读指令0x00,是整页读取
mov pc,lr ;返回
CheckBadBlk ;检查坏块返回值非0表明当前块不是坏块。
mov r7, lr
mov r5, #NFCONF
bic r0, r0, #0x1f ;addr &= ~0x1f;
ldr r1,[r5,#4] ;NFChipEn();启动Nand芯片
bic r1,r1,#0x2
str r1,[r5,#4]
mov r1,#0x50 ;WrNFCmd(READCMD2)
strb r1,[r5,#8] ;读校验码
mov r1, #6
strb r1,[r5,#0xc] ;WrNFAddr(6)
strb r0,[r5,#0xc] ;WrNFAddr(addr)
mov r1,r0,lsr #8 ;WrNFAddr(addr>>8)
strb r1,[r5,#0xc]
cmp r6,#0 ;if(NandAddr)
movne r0,r0,lsr #16 ;WrNFAddr(addr>>16)
strneb r0,[r5,#0xc]
bl WaitNandBusy ;WaitNFBusy()
ldrb r0, [r5,#0x10] ;RdNFDat()读
sub r0, r0, #0xff
mov r1,#0 ;WrNFCmd(READCMD0)
strb r1,[r5,#8]
ldr r1,[r5,#4] ;NFChipDs(),关闭Nand芯片
orr r1,r1,#0x2
str r1,[r5,#4]
mov pc, r7 ;返回
ReadNandPage ;读Nand页
mov r7,lr
mov r4,r1 ;读进缓冲区的首地址
mov r5,#NFCONF
ldr r1,[r5,#4] ;NFChipEn();启动Nand芯片
bic r1,r1,#0x2
str r1,[r5,#4]
mov r1,#0 ;WrNFCmd(READCMD0)
strb r1,[r5,#8]
strb r1,[r5,#0xc] ;WrNFAddr(0)
strb r0,[r5,#0xc] ;WrNFAddr(addr)
mov r1,r0,lsr #8 ;WrNFAddr(addr>>8)
strb r1,[r5,#0xc]
cmp r6,#0 ;if(NandAddr)
movne r0,r0,lsr #16 ;WrNFAddr(addr>>16)
strneb r0,[r5,#0xc]
ldr r0,[r5,#4] ;InitEcc()
orr r0,r0,#0x1000
str r0,[r5,#4]
bl WaitNandBusy ;WaitNFBusy()
mov r0,#0 ;for(i=0; i<512; i++)
1
ldrb r1,[r5,#0x10] ;buf[i] = RdNFDat()
strb r1,[r4,r0] ;;读进缓冲区地址加1
add r0,r0,#1 ;每循环一次r0= r0 + #1
bic r0,r0,#0x10000 ;
cmp r0,#0x200 ; 判断R0是否等于512
bcc %B1 ;
ldr r0,[r5,#4] ;NFChipDs(),关闭Nand芯片
orr r0,r0,#0x2
str r0,[r5,#4]
mov pc,r7 ;返回
;********************************************************************************************************/
;********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -