颈椎病压迫神经手麻:k9f1g08 2K page nand flash驱动调试——转载自:作者shuiii

来源:百度文库 编辑:九乡新闻网 时间:2024/05/03 15:23:03
k9f1g08 2K page nand flash驱动调试——转载自:作者shuiii 

k9f1208

secotr size = 512byte,block_pre_sector =32sector, block size = 512*32 =16K, device=4096block=64M

k9f1g08

secotr size = 2k, block_pre_sector =64sector, block size = 2*64 =128K, device=1024block=128M

以上是我以前对NANDFLASH的结构认识,其中忽略了非常重要的一块,就是NAND用来保存其它信息的一块区域,这些信息包括块好坏的标记,块的逻辑地址,还有页内数据的ECC校验和等。。。。

这部分数据通过结构SectorInfo保存

typedef struct _SectorInfo
{
    DWORD dwReserved1;              // Reserved - used by FAL
    BYTE  bOEMReserved;             // For use by OEM
    BYTE  bBadBlock;             // Indicates if block is BAD
    WORD  wReserved2;               // Reserved - used by FAL

}SectorInfo, *PSectorInfo;

在读写NAND时通过

BOOL  FMD_ReadSector (SECTOR_ADDR startSectorAddr, LPBYTE pSectorBuff, PSectorInfo pSectorInfoBuff, DWORD dwNumSectors);
BOOL  FMD_WriteSector(SECTOR_ADDR startSectorAddr, LPBYTE pSectorBuff, PSectorInfo pSectorInfoBuff, DWORD dwNumSectors);

pSectorInfoBuff参数读取相应sector状态,如果pSectorInfoBuff参数为NULL则读写sector数据。pSectorBuff为NULL则读写sector状态。

地址循环的差别
读数据时。列地址的低16位为0,页内偏移量为0,
         NF_ADDR(0);  // Column (A[7:0]) = 0
    NF_ADDR(0);  // A[11:8]
         NF_ADDR((blockPage)&0xff); // A[19:12]
         NF_ADDR((blockPage>>8)&0xff); // A[27:20]

读状态时,列地址低16位为2048,页内偏移量为2048
  NF_ADDR((2048+0)&0xff);   // 2060 = 0x080c
   NF_ADDR(((2048+0)>>8)&0xff);
        NF_ADDR((blockPage)&0xff); // A[19:12]
        NF_ADDR((blockPage>>8)&0xff); // A[27:20]

由于NAND设备存储数据有一定错误率,需要ECC校验保证数据的正确性。传统的文件系统一般直接和硬件驱动程序接口,但对于NAND设备,还需要增加一层FTL(flash translation layer)来完成像块逻辑地址到物理地址转换,坏块标注,ECC校验这样的工作。
TARGETLIBS=  $(_COMMONOAKROOT)/lib/$(_CPUINDPATH)/FAL.LIB      /

NAND驱动 FMD_Init,初始化完全后,就会通过FMD_GetInfo来获得NAND的一些基本信息。
之后 FAL会调用FMD_ReadSector建立物理页到逻辑页的映射表。最后根据注册表的配置,还会决定是否重新格式化NAND,是否自动MOUNT挂载NAND的分区到存储管理器。

[HKEY_LOCAL_MACHINE/System/StorageManager/Profiles/FlashDrv]
 "DefaultFileSystem"="FATFS"
 "PartitionDriver"="mspart.dll"
 "AutoMount"=dword:1
 "AutoPart"=dword:1
 "AutoFormat"=dword:1