NAND FLASH驱动
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记录坏块信息吗?