嵌入式 Nand 中oob、bbt、ecc含義小結(jié)
芯片內(nèi)部存儲布局及存儲操作特點(diǎn):
一片Nandflash為一個(gè)設(shè)備(device), 其數(shù)據(jù)存儲分層為:
1 (Device) =4096 (Blocks)
1 (Block) -= 32 (Pages/Rows)頁與行是相同的意思,叫法不一樣
1(Page) = 528 (Bytes) =數(shù)據(jù)塊大小(512Bytes) + OOB 塊大小(16Bytes)
在每一頁中,最后16個(gè)字節(jié)(又稱OOB)用于NandFlash命令執(zhí)行完后設(shè)置狀態(tài)用,剩余512個(gè)字節(jié)又分為前半部分和后半部分。可以通過NandFlash命令00h/01h/50h分別對前半部、后半部、OOB進(jìn)行定位通過
Nand Flash內(nèi)置的指針指向各自的首地址。
存儲操作特點(diǎn):
1.擦除操作的最小單位是塊。
2. NandFlash芯片每一位(bit)只能從1變?yōu)?,而不能從0變?yōu)?,所以在對其進(jìn)行寫入操作之前要一定將相應(yīng)塊擦除(擦除即是將相應(yīng)塊得位全部變?yōu)?).
3.OOB部分的第六字節(jié)(即517字節(jié))標(biāo)志是否是壞塊,如果不是壞塊該值為FF,否則為壞塊。
4.除OOB第六字節(jié)外,通常至少把OOB的前3個(gè)字節(jié)存放Nand Flash硬件ECC碼。
BBT:bad blocktable,即壞塊表。各家對nand的壞塊管理方法都有差異。比如專門用nand做存儲的,會把bbt放到block0,因?yàn)榈?塊一定是好的塊。但是如果nand本身被用來boot,那么第0塊就要存放程序,不能放bbt了。
有的把bbt放到最后一塊,當(dāng)然,這一塊不能為壞塊。
有的bbt中用2個(gè)bits表示1個(gè)block的狀態(tài),所以1個(gè)字節(jié)可以表示4個(gè)blocks。
bbt的大小跟nand大小有關(guān),nand越大,需要的bbt也就越大。
所以具體代碼具體分析。
ECC:
NANDFlash出錯(cuò)的時(shí)候一般不會造成整個(gè)Block或是Page不能讀取或是全部出錯(cuò),而是整個(gè)Page(例如512Bytes)中只有一個(gè)或幾個(gè)bit出錯(cuò)。一般使用一種比較專用的校驗(yàn)——ECC。ECC能糾正單比特錯(cuò)誤和檢測雙比特錯(cuò)誤,而且計(jì)算速度很快,但對1比特以上的錯(cuò)誤無法糾正,對2比特以上的錯(cuò)誤不保證能檢測。
ECC一般每256字節(jié)原始數(shù)據(jù)生成3字節(jié)ECC校驗(yàn)數(shù)據(jù),這三字節(jié)共24比特分成兩部分:6比特的列校驗(yàn)和16比特的行校驗(yàn),多余的兩個(gè)比特置1.
當(dāng)往NANDFlash的page中寫入數(shù)據(jù)的時(shí)候,每256字節(jié)我們生成一個(gè)ECC校驗(yàn)和,稱之為原ECC校驗(yàn)和,保存到PAGE的OOB(out-of-band)數(shù)據(jù)區(qū)中。其位置就是eccpos[]。
校驗(yàn)的時(shí)候,根據(jù)上述ECC生成原理不難推斷:將從OOB區(qū)中讀出的原ECC校驗(yàn)和新ECC校驗(yàn)和按位異或,若結(jié)果為0,則表示不存在錯(cuò)(或是出現(xiàn)了ECC無法檢測的錯(cuò)誤);若3個(gè)字節(jié)異或結(jié)果中存在11個(gè)比特位為1,表示存在一個(gè)比特錯(cuò)誤,且可糾正;若3個(gè)字節(jié)異或結(jié)果中只存在1個(gè)比特位為1,表示OOB區(qū)出錯(cuò);其他情況均表示出現(xiàn)了無法糾正的錯(cuò)誤。