daigua04
驱动牛犊
驱动牛犊
  • 注册日期2008-03-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望13点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
阅读:1704回复:2

系统启动时nandflash读取坏区

楼主#
更多 发布于:2008-10-23 10:24
各位高手:
         我现在的pxa255+wince4.2平台,开机后,当wce启动正常后,便自动进入nandflash的坏区检测程序中,即有个上层函数不断的调用nandflash驱动中的FMD_GetBlockStatus函数获取每个块的好坏情况。请问FMD_GetBlockStatus这个函数是被谁调用的呢(暂时找不到上层函数)?为什么wce启动成功后,还会去检测nandflash的坏区呢?如果要提高启动速度,能不能避开nandflash的自检呢?比如把FMD_GetBlockStatus函数设为空?有什么方法可以提高速度呢?
        网上有说nandflash启动后会自动mount文件系统,文件系统是在什么阶段加载到nandflash中的呢?
cuijinquan
驱动牛犊
驱动牛犊
  • 注册日期2006-04-09
  • 最后登录2008-10-24
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望4点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2008-10-24 01:38
 我也想了解。
daigua04
驱动牛犊
驱动牛犊
  • 注册日期2008-03-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望13点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2008-10-29 16:12
windows ce4.2里,Nandflash驱动分为2层,FAL层和FMD层,其中FAL层是以LIB文件形式提供,FMD层则实现一些接口函数,如FMD_GetBlockStatus等。
本人的平台每次开机的时候都会去检测nandflash的坏区情况,它有8192个block,依次掉用FMD_GetBlockStatus去检测很浪费时间。个人觉得已经存在的坏区不用再检测了,出现新的坏区后去更新坏区表而已;如果存在一个坏区表,比如在第0个block,第一次开机的时候先读取三星原有的坏区并更新第0个block,以后就不再读了;如果使用过程中发现坏区,再去更新第0个block;然后在擦除或者写入block的时候,先检测当前是否是坏区,如果是坏区,便转到下一个block。
现在想修改驱动程序,把开机自检部分去除,但上层FAL代码没有公开,无法避免FMD_GetBlockStatus函数被循坏调用8192次。我现在的驱动,写入或者擦除的时候没有去检测当前是否坏区。部分代码如下:

                       NF_CMD(CMD_WRITE);

            //  Set up address
            NF_ADDR((unsigned char)(((SectorAddr%4)*512)&0xff));
            NF_ADDR((unsigned char)((((SectorAddr%4)*512)>>8)&0xff));
            NF_ADDR((unsigned char)((SectorAddr/4)&0xff));
            NF_ADDR((unsigned char)(((SectorAddr/4)>>8)&0xff));
            NF_ADDR((unsigned char)(((SectorAddr/4)>>16)&0xff));
                             for(i=0; i<NAND_PAGE_SIZE; i++)
                                              {
                         NF_DATA_W((UCHAR)pSectorBuff);
           }
            
           NF_CMD(0x85);
           NF_ADDR((unsigned char)((2048+((SectorAddr%4)*16))&0xff));
           NF_ADDR((unsigned char)(((2048+((SectorAddr%4)*16))>>8)&0xff));

          //  Write the bad block flag
                           NF_DATA_W((unsigned char)(pSectorInfoBuff->bBadBlock));

pSectorInfoBuff->bBadBlock的信息从何而来?为什么不是写到第0或第1页的第2048个字节呢?而是NF_DATA_W((unsigned char)(pSectorInfoBuff->bBadBlock));写入呢?
高手们给点建议啊!本人已经焦头烂额了。
游客

返回顶部