您的位置:首页 > 其它

k9f1g08 2K page nand flash驱动调试

2007-08-15 17:14 316 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: