引用 4 楼 reallyu 的回复:
ands r0, r8, #0x3f
bne %F3
这个的意思是看 r8 是不是一个block的第一个扇区的地址
就看作为页计数的r8是不是64的整数倍,如果是整数倍那么就是block的第一个扇区了,那么在3段代码执行后下一步执行什么,3段是读一页的操作吧!
如果是的话,后多少位会是0
如果是一个block的第一个扇区就执行CheckBadBlk
如果不是的话就直接读数据
ReadNandPage
这个函数也要相应修改的,LZ看一下.
ReadNandPage 如下
- ReadNandPage
- mov r7,lr
- mov r4,r1
- mov r5,#NFCONF
- ldr r1,[r5,#4] ;NFChipEn()
- ldr r2, =0xfffc
- and r1, r1, r2
- orr r1, r1, #1
- 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]
- ;<----
-
-
- strb r1,[r5,#0xc] ;0
- strb r1,[r5,#0xc] ;0
- strb r0,[r5,#0xc] ;WrNFAddr(addr)
- mov r1,r0,lsr #8 ;
- strb r1,[r5,#0xc] ;WrNFAddr(addr>>8)
-
- mov r0,r0,lsr #16 ;WrNFAddr(addr>>16)
- strb r0,[r5,#0xc]
-
- mov r1,#0x30
- strb r1,[r5,#8] ;WrNFCmd(READCMD0)
-
-
- ; ldr r0,[r5,#4] ;InitEcc()
- ; orr r0,r0,#0x10
- ; str r0,[r5,#4]
-
- wait
- ldr r0,[r5,#0x20]
- and r0,r0,#1
- cmp r0,#1
- bne wait
-
-
- ; bl WaitNandBusy ;WaitNFBusy()
-
- mov r0,#0 ;for(i=0; i<2048 i++) r0为通用寄存器,这里做循环计数
- 1
- ldrb r1,[r5,#0x10] ;buf[i] = RdNFDat()
- strb r1,[r4,r0]
-
- add r0,r0,#1
- bic r0,r0,#0x10000
- cmp r0,#0x800 ;cmp r0,#0x200.....0x800=2048Bytes
- bcc %B1 ;bcc 小于,则跳转
-
- ldr r0,[r5,#4] ;NFChipDs()
- orr r0,r0,#0x2
- str r0,[r5,#4]
-
- mov pc,r7
复制代码
我的这个问题跟这个贴很像,但这个贴也没说明是什么问题,自己汇编有残像 所以高秋不来
[url=http://topic.eeworld.net/u/20081120/23/42e41867-46d5-4f39-89e5-67d8053c3feb.html][/url] |