由于在裸板或者在uboot存在的情況燒寫kernel以及yaffs2 fs的時候 Nand 中oob、bbt、ecc很大程度上影響了燒寫的成功率,所以我們下面進行沒含義進行了解:
芯片內部存儲布局及存儲操作特點:
一片Nandflash為一個設備(device), 其數據存儲分層為:
1 (Device) =4096 (Blocks)
1 (Block) -= 32 (Pages/Rows)頁與行是相同的意思,叫法不一樣
1(Page) = 528 (Bytes) =數據塊大小(512Bytes) + OOB 塊大小(16Bytes)
在每一頁中,最后16個字節(又稱OOB)用于NandFlash命令執行完后設置狀態用,剩余512個字節又分為前半部分和后半部分??梢酝ㄟ^NandFlash命令00h/01h/50h分別對前半部、后半部、OOB進行定位通過
Nand Flash內置的指針指向各自的首地址。
存儲操作特點:
1.擦除操作的最小單位是塊。
2. NandFlash芯片每一位(bit)只能從1變為0,而不能從0變為1,所以在對其進行寫入操作之前要一定將相應塊擦除(擦除即是將相應塊得位全部變為1).
3.OOB部分的第六字節(即517字節)標志是否是壞塊,如果不是壞塊該值為FF,否則為壞塊。
4.除OOB第六字節外,通常至少把OOB的前3個字節存放Nand Flash硬件ECC碼。
BBT:bad blocktable,即壞塊表。各家對nand的壞塊管理方法都有差異。比如專門用nand做存儲的,會把bbt放到block0,因為第0塊一定是好的塊。但是如果nand本身被用來boot,那么第0塊就要存放程序,不能放bbt了。
有的把bbt放到最后一塊,當然,這一塊不能為壞塊。
有的bbt中用2個bits表示1個block的狀態,所以1個字節可以表示4個blocks。
bbt的大小跟nand大小有關,nand越大,需要的bbt也就越大。
所以具體代碼具體分析。
ECC:
NANDFlash出錯的時候一般不會造成整個Block或是Page不能讀取或是全部出錯,而是整個Page(例如512Bytes)中只有一個或幾個bit出錯。一般使用一種比較專用的校驗——ECC。ECC能糾正單比特錯誤和檢測雙比特錯誤,而且計算速度很快,但對1比特以上的錯誤無法糾正,對2比特以上的錯誤不保證能檢測。
ECC一般每256字節原始數據生成3字節ECC校驗數據,這三字節共24比特分成兩部分:6比特的列校驗和16比特的行校驗,多余的兩個比特置1.
當往NANDFlash的page中寫入數據的時候,每256字節我們生成一個ECC校驗和,稱之為原ECC校驗和,保存到PAGE的OOB(out-of-band)數據區中。其位置就是eccpos[]。
校驗的時候,根據上述ECC生成原理不難推斷:將從OOB區中讀出的原ECC校驗和新ECC校驗和按位異或,若結果為0,則表示不存在錯(或是出現了ECC無法檢測的錯誤);若3個字節異或結果中存在11個比特位為1,表示存在一個比特錯誤,且可糾正;若3個字節異或結果中只存在1個比特位為1,表示OOB區出錯;其他情況均表示出現了無法糾正的錯誤。
-
芯片
+關注
關注
454文章
50438瀏覽量
421910 -
嵌入式
+關注
關注
5069文章
19022瀏覽量
303420 -
存儲
+關注
關注
13文章
4265瀏覽量
85677
原文標題:嵌入式 Nand 中oob、bbt、ecc含義小結
文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論