规范中,详细定义了如何利用
NAND设备每个页中的冗余信息来实现上述功能。这个软件规范中,很重要的一个概念就是块的逻辑地址,它将在物理上可能不连续、不可靠的空间分配编号,为他们在逻辑空间上给系统文件提供一个连续可靠的存储空间。
表3给出了SSFDC规范中逻辑地址的标注方法。在系统初始化的时候,驱动程序先将所有的块扫描一遍,读出他们所对应的逻辑地址,并把逻辑地址和虚拟地址的映射表建好。系统运行时,驱动程序通过查询映射表,找到需要访问的逻辑地址所对应的物理地址然后进行数据读写。
表3 冗余字节定义
|
字节序号 |
内容 |
字节序号 |
内容 |
|
512 |
用户定义数据 |
520 |
后256BECC校验和 |
|
513 |
521 |
|
514 |
522 |
|
515 |
523 |
块逻辑地址 |
|
516 |
数据状态 |
524 |
|
517 |
块状态 |
525 |
前256BECC校验和 |
|
518 |
块逻辑地址1 |
526 |
|
519 |
527 |
表4给出了块逻辑地址的存放格式,LA表示逻辑地址,P代表偶校验位。逻辑地址只有10bit,代表只有1024bit的寻址空间。而SSFDC规范将NAND设备分成了多个zone,每个zone 内有1024块,但这物理上的1024块映射到逻辑空间只有1000块,其他的24块就作为备份使用,当有坏块存在时,就可以以备份块将其替换。
表4 逻辑地址格式
|
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
|
|
0 |
0 |
0 |
1 |
0 |
LA9 |
LA8 |
LA7 |
第518 523字节 |
|
LA6 |
LA5 |
LA4 |
LA3 |
LA2 |
LA1 |
LA0 |
P |
第519 524字节 |
有了以上的软件规范,就可以对NAND设备写出较标准的ECC校验,并可以编写检测坏块、标记坏块、建立物理地址和逻辑地址的映射表的程序了。
static int NF_IsBadBlock(U32 block) //检测坏块
{
int i;
unsigned int blockPage;
U8 data;
blockPage=(block<<5); // For 2'nd cycle I/O[7:5]
NF_nFCE_L();
NF_CMD(0x50); // Spare array read command
NF_ADDR(517&0xf); // Read the mark of bad block in spare array(M addr="5")
NF_ADDR(blockPage&0xff); // The mark of bad block is in 0 page
NF_ADDR((blockPage>>8)&0xff); // For block number A[24:17]
&nbs