当前位置: 代码迷 >> WinCE >> 优龙BIOS,nand_boot_beg段分析
  详细解决方案

优龙BIOS,nand_boot_beg段分析

热度:57   发布时间:2016-04-28 13:10:59.0
求助优龙BIOS,nand_boot_beg段分析!
我对汇编不是很熟悉,看论坛里面有几个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看一下.
------解决方案--------------------
探讨
ands r0, r8, #0x3f 
bne %F3

是什么意思?
bne 是不相等测跳到3,      这里是在判断  什么和什么 不相等?