6590|15

78

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

求助优龙BIOS,nand_boot_beg段分析! [复制链接]

我对汇编不是很熟悉,看论坛里面有几个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

最新回复

这个事我滴判断是否是坏块的函数,贴上来帮分析下 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
点赞 关注

回复
举报

64

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
上一周 弄KEIL ,一直没搞少,现在转到ADS了  ,果然好多了
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
顶上去        
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

4
 
ands        r0, r8, #0x3f   
bne                %F3       

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

回复

78

帖子

0

TA的资源

一粒金砂(初级)

5
 
ands r0, r8, #0x3f
bne %F3
这个的意思是看 r8 是不是一个block的第一个扇区的地址
如果是的话,后多少位会是0
如果是一个block的第一个扇区就执行CheckBadBlk
如果不是的话就直接读数据

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

回复

75

帖子

0

TA的资源

一粒金砂(初级)

6
 
等下帮你看看,先玩玩先,嘿嘿
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

7
 
哈哈 !就知道你弄过! 谢过
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

8
 
引用 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]
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

9
 
引用 3 楼 trueman_onlyme 的回复:
ands r0, r8, #0x3f?
bne %F3

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


这部分其实没有必要,因为前面的block不需要检测坏块的。
 
 
 

回复

56

帖子

0

TA的资源

一粒金砂(初级)

10
 
从来都没有进入代码段3
说明检测坏块的函数有问题,把所有的块都当成坏块了.
检测坏块还是有必要的,nandflash一般只保证第一个block不是坏块,后面的就难讲了.
你的boot肯定不止占了第一个block.
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

11
 
我还得仔细看看! 谢谢gooogleman 和Reallyu!
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

12
 
回gooogleman 和Reallyu:
    我的boot共40K,只占第一个blokc的前20个page,

ands r0, r8, #0x3f  
bne %F3

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

我得研究一下CheckBadBlk了,
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

13
 
判断 ands r0, r8, #0x3f  这个运算造成的标志位改变
一上来就先检查坏块,如果你的boot比一个block小,这一段是可以不要.
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(中级)

14
 
我终于懂了都乖自己的汇编功底不够,在这里再分析一下,请各位帮忙指正:

  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           ;这里肯定是进步到了,
复制代码

 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

15
 
郁闷又遇见坏块了!
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

16
 
这个事我滴判断是否是坏块的函数,贴上来帮分析下
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);
}
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表