我对汇编不是很熟悉,看论坛里面有几个DX搞过这个,所以想请教下:
情况是:用AXD调试,bios可以起来!烧写到nandflash中后,就不可以了,所以就是nand_boot_beg段有问题了,
没有将nandflash中的代码搬到ram中去!
nand_boot_beg代码如下
- Assembly code
nand_boot_beg mov r5, #NFCONF bl ReadNandID mov r6, #0 ldr r0, =0xecda ;我要改的flash的ID是0xecda cmp r5, r0 ; beq %F1; ldr r0, =0xec73 ;这里很不解,之前的是K9F1208,ID是0xec76, 但是原来的代码里面 判断的是0xec73和0xec75! cmp r5, r0 beq %F1 mov r6, #11 bl ReadNandStatus mov r8, #0 ldr r9, =ResetEntry ;ro base addr2 ands r0, r8, #0x3f ;原来是0x1f ,应该是0~31吧,现改为0x3f=61, ;ands作用:r0=r8&0x3f,并设置相应寄存器 bne %F3 [color=#FF0000];bne 是不相等测跳到3, 这里是在判断 什么和什么 不相等?[/color] mov r0, r8 bl CheckBadBlk cmp r0, #0 addne r8, r8,#64 ;原来是#32 bne %F43 ;no entry mov r0, r8 mov r1, r9 bl ReadNandPage add r9, r9, #2048 ; 原来是512 ;每页的大小 add r8, r8, #1 ;指向下一页4 cmp r8, #64 ;默认读的大小 64*2K bcc %B2 ; mov r5, #NFCONF ;DsNandFlash ldr r0, [r5,#4] orr r0, r0, #0x2 str r0, [r5,#4];到了这里 ldr pc, =copy_proc_beg ;这里肯定是进步到了, ;标号2、3、4代码段的执行逻辑是什么: ;我的分析:先读一块(ands r0, r8, #0x3f |bne %F3 和3段代码应该是实现读一块的代码),在判断是否是坏块 (mov r0, r8 | bl CheckBadBlk) ;如果是则跳过这一块( cmp r0, #0 | addne r8, r8,#64 ),然后,跳到4块判断是否读完规定量数据,如果没有,再跳转到2块,循环..... ;【问题是:】现在从未进入3段代码,不知道是怎么回事
平台:2440 K9F2G08 flash
------解决方案--------------------
ands r0, r8, #0x3f
bne %F3
这个的意思是看 r8 是不是一个block的第一个扇区的地址
如果是的话,后多少位会是0
如果是一个block的第一个扇区就执行CheckBadBlk
如果不是的话就直接读数据
ReadNandPage
这个函数也要相应修改的,LZ看一下.
------解决方案--------------------