求助优龙BIOS,nand_boot_beg段分析!

dengf   2009-9-15 10:42 楼主
我对汇编不是很熟悉,看论坛里面有几个DX搞过这个,所以想请教下:

情况是:用AXD调试,bios可以起来!烧写到nandflash中后,就不可以了,所以就是nand_boot_beg段有问题了,
没有将nandflash中的代码搬到ram中去!
nand_boot_beg代码如下

  1. nand_boot_beg
  2.        
  3.         mov        r5, #NFCONF       
  4.         bl        ReadNandID
  5.         mov        r6, #0
  6.         ldr        r0, =0xecda                                                ;我要改的flash的ID是0xecda
  7.         cmp        r5,        r0                                                                 ;
  8.         beq        %F1;                                                                       

  9.         ldr        r0, =0xec73                        ;这里很不解,之前的是K9F1208,ID是0xec76,  但是原来的代码里面 判断的是0xec73和0xec75!
  10.         cmp        r5, r0
  11.         beq        %F1
  12.         mov        r6, #1
  13. 1       
  14.         bl        ReadNandStatus       
  15.         mov        r8, #0
  16.         ldr        r9, =ResetEntry  ;ro base addr

  17. 2               
  18.         ands        r0, r8, #0x3f                   ;原来是0x1f ,应该是0~31吧,现改为0x3f=61,
  19.                                                                                                          ;ands作用:r0=r8&0x3f,并设置相应寄存器
  20.         bne                %F3                                                               
  21.         [color=#FF0000];bne 是不相等测跳到3,      这里是在判断  什么和什么 不相等?[/color]
  22.        
  23.         mov                r0, r8
  24.         bl                CheckBadBlk
  25.         cmp                r0, #0
  26.         addne        r8, r8,#64                          ;原来是#32
  27.         bne                %F4
  28. 3       
  29. ;no entry       
  30.         mov        r0, r8
  31.         mov        r1, r9
  32.         bl        ReadNandPage
  33.         add        r9, r9, #2048                                ;        原来是512   ;每页的大小
  34.         add        r8, r8, #1            ;指向下一页
  35. 4       
  36.        
  37.         cmp        r8, #64                                           ;默认读的大小  64*2K
  38.         bcc        %B2                                                    ;

  39.        
  40.         mov        r5, #NFCONF                        ;DsNandFlash
  41.         ldr        r0, [r5,#4]
  42.         orr        r0, r0, #0x2
  43.         str        r0, [r5,#4]

  44. ;到了这里
  45.         ldr        pc, =copy_proc_beg           ;这里肯定是进步到了,
  46.        
  47.         ;标号2、3、4代码段的执行逻辑是什么:
  48.         ;我的分析:先读一块(ands        r0, r8, #0x3f   |bne                %F3                        和3段代码应该是实现读一块的代码),在判断是否是坏块        (mov                r0, r8 |        bl                CheckBadBlk)
  49.         ;如果是则跳过这一块(        cmp                r0, #0 |        addne        r8, r8,#64 ),然后,跳到4块判断是否读完规定量数据,如果没有,再跳转到2块,循环.....
  50.        
  51.         ;【问题是:】现在从未进入3段代码,不知道是怎么回事       

平台:2440 K9F2G08 flash

回复评论 (15)

上一周 弄KEIL ,一直没搞少,现在转到ADS了  ,果然好多了
点赞  2009-9-15 10:42
顶上去        
点赞  2009-9-15 13:16
ands        r0, r8, #0x3f   
bne                %F3       

是什么意思?       
bne 是不相等测跳到3,      这里是在判断  什么和什么 不相等?                       
点赞  2009-9-15 17:06
ands r0, r8, #0x3f
bne %F3
这个的意思是看 r8 是不是一个block的第一个扇区的地址
如果是的话,后多少位会是0
如果是一个block的第一个扇区就执行CheckBadBlk
如果不是的话就直接读数据

ReadNandPage
这个函数也要相应修改的,LZ看一下.
点赞  2009-9-15 18:10
等下帮你看看,先玩玩先,嘿嘿
点赞  2009-9-15 19:45
哈哈 !就知道你弄过! 谢过
点赞  2009-9-15 20:44
引用: 引用 4 楼 reallyu 的回复:
ands r0, r8, #0x3f
bne %F3
这个的意思是看 r8 是不是一个block的第一个扇区的地址
   就看作为页计数的r8是不是64的整数倍,如果是整数倍那么就是block的第一个扇区了,那么在3段代码执行后下一步执行什么,3段是读一页的操作吧!
如果是的话,后多少位会是0
如果是一个block的第一个扇区就执行CheckBadBlk
如果不是的话就直接读数据

ReadNandPage
这个函数也要相应修改的,LZ看一下.


ReadNandPage 如下

  1. ReadNandPage
  2.         mov                 r7,lr
  3.         mov      r4,r1
  4.         mov      r5,#NFCONF

  5.         ldr      r1,[r5,#4]                ;NFChipEn()
  6.         ldr      r2, =0xfffc
  7.         and      r1, r1, r2
  8.         orr      r1, r1, #1
  9.         str      r1,[r5,#4]       

  10.         mov      r1,#0                        ;WrNFCmd(READCMD0)
  11.         strb     r1,[r5,#8]         ;        
  12.        
  13. ;-->原数据
  14.         ;strb     r1,[r5,#0xc]        ;WrNFAddr(0)
  15.         ;strb     r0,[r5,#0xc]        ;WrNFAddr(addr)
  16.         ;mov      r1,r0,lsr #8        ;WrNFAddr(addr>>8)
  17.         ;strb     r1,[r5,#0xc]               
  18.         ;cmp      r6,#0                        ;if(NandAddr)
  19.         ;movne    r0,r0,lsr #16        ;WrNFAddr(addr>>16)
  20.         ;strneb   r0,[r5,#0xc]
  21. ;<----
  22.        
  23.        

  24.         strb     r1,[r5,#0xc]        ;0
  25.         strb     r1,[r5,#0xc]        ;0

  26.         strb     r0,[r5,#0xc]        ;WrNFAddr(addr)       

  27.         mov      r1,r0,lsr #8        ;
  28.         strb     r1,[r5,#0xc]        ;WrNFAddr(addr>>8)        
  29.        

  30.         mov    r0,r0,lsr #16        ;WrNFAddr(addr>>16)
  31.         strb   r0,[r5,#0xc]
  32.        
  33.         mov      r1,#0x30                       
  34.         strb     r1,[r5,#8]   ;WrNFCmd(READCMD0)
  35.        
  36.        
  37. ;        ldr      r0,[r5,#4]                ;InitEcc()
  38. ;        orr      r0,r0,#0x10
  39. ;        str      r0,[r5,#4]       
  40.        

  41. wait   
  42.     ldr      r0,[r5,#0x20]
  43.     and      r0,r0,#1
  44.     cmp      r0,#1
  45.     bne      wait
  46.    
  47.    
  48. ;        bl       WaitNandBusy        ;WaitNFBusy()
  49.        
  50.         mov      r0,#0                        ;for(i=0; i<2048 i++)    r0为通用寄存器,这里做循环计数
  51. 1
  52.         ldrb     r1,[r5,#0x10]        ;buf[i] = RdNFDat()
  53.         strb     r1,[r4,r0]
  54.        
  55.         add      r0,r0,#1
  56.         bic      r0,r0,#0x10000       
  57.         cmp      r0,#0x800                ;cmp      r0,#0x200.....0x800=2048Bytes
  58.         bcc      %B1      ;bcc 小于,则跳转
  59.        
  60.         ldr      r0,[r5,#4]                ;NFChipDs()
  61.         orr      r0,r0,#0x2
  62.         str      r0,[r5,#4]
  63.                
  64.         mov                 pc,r7


我的这个问题跟这个贴很像,但这个贴也没说明是什么问题,自己汇编有残像 所以高秋不来
[url=http://topic.eeworld.net/u/20081120/23/42e41867-46d5-4f39-89e5-67d8053c3feb.html][/url]
点赞  2009-9-15 21:12
引用: 引用 3 楼 trueman_onlyme 的回复:
ands r0, r8, #0x3f?
bne %F3

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


这部分其实没有必要,因为前面的block不需要检测坏块的。
点赞  2009-9-16 06:54
从来都没有进入代码段3
说明检测坏块的函数有问题,把所有的块都当成坏块了.
检测坏块还是有必要的,nandflash一般只保证第一个block不是坏块,后面的就难讲了.
你的boot肯定不止占了第一个block.
点赞  2009-9-16 10:23
我还得仔细看看! 谢谢gooogleman 和Reallyu!
点赞  2009-9-16 10:28
回gooogleman 和Reallyu:
    我的boot共40K,只占第一个blokc的前20个page,

ands r0, r8, #0x3f  
bne %F3

   在刚开始r8为0,跟0x3f相与,结果为0,是不是eq有效,ne无效,所以先检查坏块?,还是刚开始就跳到3段了,   
   bne %F3  在和什么比较 ?  标志位?

我得研究一下CheckBadBlk了,
点赞  2009-9-16 10:56
判断 ands r0, r8, #0x3f  这个运算造成的标志位改变
一上来就先检查坏块,如果你的boot比一个block小,这一段是可以不要.
点赞  2009-9-16 11:00
我终于懂了都乖自己的汇编功底不够,在这里再分析一下,请各位帮忙指正:

  1. nand_boot_beg
  2.    
  3.     mov    r5, #NFCONF   
  4.     bl    ReadNandID
  5.     mov    r6, #0
  6.     ldr    r0, =0xecda                     
  7.     cmp    r5,    r0                                 ;
  8.     beq    %F1;                                 

  9.     ldr    r0, =0xec73               
  10.      cmp    r5, r0
  11.     beq    %F1
  12.     mov    r6, #1
  13. 1   
  14.     bl    ReadNandStatus   
  15.     mov    r8, #0
  16.     ldr    r9, =ResetEntry  ;ro base addr

  17. 2        
  18.     ands    r0, r8, #0x3f                                                               
  19.      bne        %F3                                
  20.               [b]最先执行这里,bne  %F3 判断标志位是否改变,如果改变说明已经是当前块的首页了,那么就执行后面的 CheckBadBlk,反之,则跳到3段代码中,直接读取数据  因为我的bios远小于一个block得大小,所以,不用检测坏块,我把下面的代码屏蔽了,就可以直接进入3段,读代码,一直到规定的页数。就跳到  copy_proc_beg   中去[/b]
  21.     ;mov        r0, r8
  22.    ; bl        CheckBadBlk
  23.     ;cmp        r0, #0
  24.     ;addne    r8, r8,#64              ;原来是#32
  25.    ; bne        %F4
  26. 3   
  27. ;no entry   
  28.     mov    r0, r8
  29.     mov    r1, r9
  30.     bl    ReadNandPage
  31.     add    r9, r9, #2048                ;    原来是512   ;每页的大小
  32.     add    r8, r8, #1            ;指向下一页
  33. 4   
  34.    
  35.     cmp    r8, #64                       ;默认读的大小  64*2K
  36.     bcc    %B2                            ;

  37.    
  38.     mov    r5, #NFCONF            ;DsNandFlash
  39.     ldr    r0, [r5,#4]
  40.     orr    r0, r0, #0x2
  41.     str    r0, [r5,#4]

  42. ;到了这里
  43.     ldr    pc, =copy_proc_beg           ;这里肯定是进步到了,

点赞  2009-9-16 11:36
郁闷又遇见坏块了!
点赞  2009-9-16 16:21
这个事我滴判断是否是坏块的函数,贴上来帮分析下
static int CheckBadBlk(U32 addr)
{
        U8 dat;
       
        addr &= ~0x3f;
       
        NFChipEn();
       
        WrNFCmd(0x00);
               
        WrNFAddr(2048);        //第2049字节存放 标记信息       
        WrNFAddr(2048>>8);       
               
        WrNFAddr(addr);
        WrNFAddr(addr>>8);       
        WrNFAddr(addr>>16);
       
        WaitNFBusy();
       
        WrNFCmd(0x30);       
       
        dat = RdNFDat();
        dat=0xff;
       
               
        if(dat!=0xff)
        {
                return TRUE; //是坏块  
        }
       
       
        NFChipDs();

        //return (dat!=0xff);
        return (FALSE);
}
点赞  2009-9-16 17:53
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复