NAND FLASH驱动

daigua04 2008-10-29 10:51:45
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));

问题:
1、pSectorInfoBuff->bBadBlock的信息从何而来?为什么不是写到第0或第1页的第2048个字节呢?而是NF_DATA_W((unsigned char)(pSectorInfoBuff->bBadBlock));写入呢?
2、怎样避免系统自动调用FMD_GetBlockStatus函数呢?
3、nandflash加载FAT文件系统后,第0个block是不是被文件系统占用(比如FAT表区)?还能使用第0个block记录坏块信息吗?
...全文
611 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
wince_arm 2008-12-18
  • 打赏
  • 举报
回复
终于找到党组织了,希望没有来晚,楼主这个问题怎么解决的阿????分享一下经验,分都给你!!
gooogleman 2008-11-07
  • 打赏
  • 举报
回复
不检测坏块的话如果遇到坏块那以后就启动不了了。我没有看那么深入,没有办法跟你交流啊。现在又有别的事情做,跟不了了。
daigua04 2008-11-07
  • 打赏
  • 举报
回复
我在微软技术论坛上看到一篇帖子,原文如下:


他是在起动时要读取,在剩余空间里标注了扇区号的FLAH的页的INFO,对未标注的就只读取好坏块的INFO,
也就是说你的文件或删掉的文件,只要曾使用过的页都会被标注扇区号,都会被读,即如国你的扇区越小越浪费时间!
FMD这块,我认为微软做的很差径,卡卡!

请问下,什么样的扇区标注了扇区号?标注在哪里?是不是使用过的扇区都会标明扇区号?那未标注的就是指空闲的扇区?

我的系统基于wce4.2平台,nand flash为1GB,共8192个block,每个block256个扇区,系统每次开机时,都会去调用FMD_ReadSector函数读取每个扇区的状态,同时还会调用FMD_GetBlockStatus去读每个block的好坏。由于扇区数目庞大,导致开机很慢。奇怪的现象是,系统也不是每个扇区都会去读,而是跳跃式的,比如从第0个开始,读到第10万个的时候,直接就去读第80万了,而且读到大概160万个的时候就停止了,此时nand flash才能正常被识别。

请问,为什么每次开机都会去读扇区的状态?是不是因为这些扇区保留有数据,系统需要验证这些数据的正确与否?空闲的扇区就跳过?如果nand flash接近饱和,可能导致开机速度越来越慢,有没有什么办法呢?



因为上层FAL层代码不可见,导致分析起来捉襟见肘,恳请英雄指点迷津,不胜感激!
beyondma 2008-11-07
  • 打赏
  • 举报
回复
1、pSectorInfoBuff->bBadBlock的信息从何而来?为什么不是写到第0或第1页的第2048个字节呢?而是NF_DATA_W((unsigned char)(pSectorInfoBuff->bBadBlock));写入呢?
怎么会写到0页的第2048个字节呢?我记得是通过宏操作的。
2、怎样避免系统自动调用FMD_GetBlockStatus函数呢?
应该是避免不了,你不导出这个函数肯定是不行,而且避免会有问题不让系统查坏区?,
3、nandflash加载FAT文件系统后,第0个block是不是被文件系统占用(比如FAT表区)?还能使用第0个block记录坏块信息吗?
这个不能啊。
gooogleman 2008-11-07
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 Seven_zhangxw 的回复:]
这个问题我曾经研究过的,等我过两天给你一个文档,方便的时候单独交流交流。
[/Quote]

发给我flash 和文件系统的宝贝吧。我的邮箱:wogoyixikexie@163.com
gooogleman 2008-11-07
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 gooogleman 的回复:]
FMD的驱动我没有了解那么深入,不过我最近要移植,估计也会遇到问题,先留个脚印先。到时候我再花时间来看,
貌似楼主加我为好友,我拒绝了,不好意思,你是初来论坛,以前都没有见过,所以不敢加那么多人,我加你吧。
[/Quote]

哈哈,刚才我开QQ发现你加我-----------我不知道是谁,所以就拒绝了。不过你在CSDN和我的群都可以经常看见我。不用加什么好友的。
mengren425 2008-11-06
  • 打赏
  • 举报
回复
给我发一分资料吧
mengren425@163.com
非常感谢~
lijinyan3000 2008-11-01
  • 打赏
  • 举报
回复
关注一下,其实我对ECC也是似懂非懂的,向大家请教。
daigua04 2008-11-01
  • 打赏
  • 举报
回复
英雄,server_zhangxw,我来取了,上面有我的联系方式。
Seven_zhangxw 2008-11-01
  • 打赏
  • 举报
回复
我当初研究EBOOT烧录和生产线烧录的问题,因此研究了一下NAND和文件系统。。。
谁要来取啊。
daigua04 2008-10-30
  • 打赏
  • 举报
回复
呵呵,自己发帖的历史不长,第一次有这么多回复,我高兴的笑出声来!我的联系方式:
qq:55142978
email:daigua04@hotmail.com
张开双手欢迎各位新朋友...
中国168 2008-10-30
  • 打赏
  • 举报
回复
学习,帮顶!
gooogleman 2008-10-30
  • 打赏
  • 举报
回复
FMD的驱动我没有了解那么深入,不过我最近要移植,估计也会遇到问题,先留个脚印先。到时候我再花时间来看,
貌似楼主加我为好友,我拒绝了,不好意思,你是初来论坛,以前都没有见过,所以不敢加那么多人,我加你吧。
gsymichael 2008-10-30
  • 打赏
  • 举报
回复
关注一下。
gooogleman 2008-10-30
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 Seven_zhangxw 的回复:]
这个问题我曾经研究过的,等我过两天给你一个文档,方便的时候单独交流交流。
[/Quote]
发给我,我给分你,哈哈
Seven_zhangxw 2008-10-30
  • 打赏
  • 举报
回复
这个问题我曾经研究过的,等我过两天给你一个文档,方便的时候单独交流交流。

19,502

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧