nand_boot_beg
mov r5, #NFCONF
ldr r0, =(7<<12)|(7<<8)|(7<<4)
str r0, [r5]
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
mov r6, #0
ldr r0, =0xec73
cmp r5, r0
beq %F1
ldr r0, =0xec75
cmp r5, r0
beq %F1
ldr r0, =0xecd3
cmp r5, r0
bne %F1
mov r6, #1
1
bl ReadNandStatus
mov r8, #0
ldr r9, =ResetEntry
2
ands r0, r8, #0x3f
bne %F3
mov r0, r8
bl CheckBadBlk
cmp r0, #0
addne r8, r8, #64
bne %F4
3
mov r0, r8
mov r1, r9
bl Led_Testd
bl ReadNandPage
add r9, r9, #2048
add r8, r8, #1
4
cmp r8, #128 这个地方说明一下,如果我写64上面2里不会跳到3,改一下就可以了,不明白中
bcc %B2
mov r5, #NFCONF
ldr r0, [r5, #4]
bic r0, r0, #1
str r0, [r5, #4]
adr pc, copy_proc_beg 这个地方说明一下,用长跳转伪指令不会正确跳转,短跳转就可以,一样迷惑
=========================================================================================================================
================================================================================================================
ReadNandID
mov r7,#NFCONF
ldr r0,[r7,#4] ;NFChipEn();
bic r0,r0,#2
str r0,[r7,#4]
mov r0,#0x90 ;WrNFCmd(RdIDCMD);
strb r0,[r7,#8]
mov r4,#0 ;WrNFAddr(0);
strb r4,[r7,#0xc]
1 ;while(NFIsBusy());
ldr r0,[r7,#0x20]
tst r0,#1
beq %B1
ldrb r0,[r7,#0x10] ;id = RdNFDat()<<8;
mov r0,r0,lsl #8
ldrb r1,[r7,#0x10] ;id |= RdNFDat();
orr r5,r1,r0
ldr r0,[r7,#4] ;NFChipDs();
orr r0,r0,#2
str r0,[r7,#4]
mov pc,lr
ReadNandStatus
mov r7,#NFCONF
ldr r0,[r7,#4] ;NFChipEn();
bic r0,r0,#2
str r0,[r7,#4]
mov r0,#0x70 ;WrNFCmd(QUERYCMD);
strb r0,[r7,#8]
ldrb r1,[r7,#0x10] ;r1 = RdNFDat();
ldr r0,[r7,#4] ;NFChipDs();
orr r0,r0,#2
str r0,[r7,#4]
mov pc,lr
WaitNandBusy
mov r0,#0x70 ;WrNFCmd(QUERYCMD);
mov r1,#NFCONF
strb r0,[r1,#8]
1
ldrb r0,[r1,#0x10]
tst r0,#0x40 ;while(!(RdNFDat()&0x40));
beq %B1
mov r0,#0 ;WrNFCmd(READCMD0);
strb r0,[r1,#8]
mov pc,lr
CheckBadBlk
mov r7, lr
mov r5, #NFCONF
bic r0, r0, #0x3f
ldr r1,[r5,#4] ;NFChipEn()
bic r1,r1,#2
str r1,[r5,#4]
mov r1,#0x30 ;WrNFCmd(READCMD2)这句我明天再验证下需不需要,8G08就一个read指令,只是一周期和二周 期不一样
strb r1,[r5,#8]
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()
mov r0, #100
1
subs r0, r0, #1
bne %B1
2
ldr r0, [r5, #0x20]
tst r0, #1
beq %B2
ldrb r0, [r5,#0x10] ;RdNFDat()
sub r0, r0, #0xff
mov r1,#0 ;WrNFCmd(READCMD0)
strb r1,[r5,#8]
ldr r1,[r5,#4] ;NFChipDs()
orr r1,r1,#2
str r1,[r5,#4]
mov pc, r7
ReadNandPage
mov r7,lr
mov r4,r1
mov r5,#NFCONF
ldr r1,[r5,#4] ;NFChipEn()
bic r1,r1,#2
str r1,[r5,#4]
mov r1,#0 ;WrNFCmd(READCMD0)
strb r1,[r5,#8]
strb r1,[r5,#0xc] ;WrNFAddr(0)
strb r1,[r5,#0xc]
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]
mov r1,#0x30
strb r1,[r5,#8]
ldr r0,[r5,#4] ;InitEcc()
orr r0,r0,#0x10
str r0,[r5,#4]
bl WaitNandBusy ;WaitNFBusy()
mov r0,#0 ;for(i=0; i<512; i++)
1
ldrb r1,[r5,#0x10] ;buf = RdNFDat()
strb r1,[r4,r0]
add r0,r0,#1
bic r0,r0,#0x20000
cmp r0,#0x800
bcc %B1
ldr r0,[r5,#4] ;NFChipDs()
orr r0,r0,#2
str r0,[r5,#4]
mov pc,r7
大侠抽空帮我看下,我对照手册也弄了,你得我也比较了,我改也只改了这里面得东西烧到板子上就是不行,哎
我得点灯程序:
Led_Testd
stmfd sp!,{r0-r4}
ldr r0,=GPFCON
str r0,[r3]
ldr r1,=0x5555
str r1,[r0]
ldr r0,=GPFDAT
str r0,[r4]
ldr r1,=0xdf
str r1,[r0]
ldr r1,=0xfff
0
subs r1,r1,#1
bne %B0
ldr r0,=GPFCON
str r3,[r0]
ldr r0,=GPFDAT
str r4,[r0]
ldmfd sp!,{r0-r4}
mov pc,lr
这样点灯也不会影响寄存器。期望大侠再帮帮忙^-^ |