參考文件:
nandflashecc校驗原理與實現
ecc簡介
由於nandflash的工藝不能保證nand的memoryarray在其生命周
期中保持效能的可靠,因此,在nand的生產中及使用過程中會產生壞塊。為了檢測資料的可靠性,在應用nandflash的系統中一般都會採用一定的壞
區管理策略,而管理壞區的前提是能比較可靠的進行壞區檢測。
如果操作時序和電路穩定性不存在問題的話,nandflash出錯的時候一般不會造成整個block或是page不能讀取或是全部出錯,而是整個page(例如512bytes)中只有乙個或幾個bit出錯。
對資料的校驗常用的有奇偶校驗、crc校驗等,而在nandflash處理中,一般使用一種比較專用的校驗——ecc。ecc能糾正單位元錯誤和檢測雙位元錯誤,而且計算速度很快,但對1位元以上的錯誤無法糾正,對2位元以上的錯誤不保證能檢測。
ecc原理
ecc一般每256位元組原始資料生成3位元組ecc校驗資料,這三位元組共24位元分成兩部分:6位元的列校驗和16位元的行校驗,多餘的兩個位元置1,如下圖所示:
ecc的列校驗和生成規則如下圖所示:
用數學表示式表示為:
p4=d7(+)d6(+)d5(+)d4 p4`=d3(+)d2(+)d1(+)d0
p2=d7(+)d6(+)d3(+)d2 p2`=d5(+)d4(+)d1(+)d0
p1=d7(+)d5(+)d3(+)d1 p1`=d6(+)d4(+)d2(+)d0
這裡(+)表示「位異或」操作
ecc的行校驗和生成規則如下圖所示:
用數學表示式表示為:
p8=bit7(+)bit6(+)bit5(+)bit4(+)bit3(+)bit2(+)bit1(+)bit0(+)p8
……………………………………………………………………………………
這裡(+)同樣表示「位異或」操作
當往nandflash的page中寫入資料的時候,每256位元組我們生成乙個ecc校驗和,稱之為原ecc校驗和,儲存到page的oob(out-of-band)資料區中。
當從nandflash中讀取資料的時候,每256位元組我們生成乙個ecc校驗和,稱之為新ecc校驗和。
校驗的時候,根據上述ecc生成原理不難推斷:將從oob區中讀出的原ecc校驗和新ecc校驗和按位異或,若結果為0,則表示不存在錯(或是出現了
ecc無法檢測的錯誤);若3個位元組異或結果中存在11個位元位為1,表示存在乙個位元錯誤,且可糾正;若3個位元組異或結果中只存在1個位元位為1,表示
oob區出錯;其他情況均表示出現了無法糾正的錯誤。
ecc演算法的實現
staticconstu_charnand_ecc_precalc_table=
;// createsnon-invertedecccodefromlineparity
staticvoidnand_trans_result(u_charreg2,u_charreg3,u_char*ecc_code)
/*calculatesecondeccbyte*/
b=0x80;
for(i=0;i<4;i++)
/*storetwooftheeccbytes*/
ecc_code[0]=tmp1;
ecc_code[1]=tmp2;
}// calculate3byteecccodefor256byteblock
voidnand_calculate_ecc(constu_char*dat,u_char*ecc_code)
}/*createnon-invertedecccodefromlineparity*/
nand_trans_result(reg2,reg3,ecc_code);
/*calculatefinalecccode*/
ecc_code[0]=~ecc_code[0];
ecc_code[1]=~ecc_code[1];
ecc_code[2]=((~reg1)<<2)|0x03;
}// detectandcorrecta1biterrorfor256byteblock
intnand_correct_data(u_char*dat,u_char*read_ecc,u_char*calc_ecc)
else
c=0x80;
for(i=0;i<4;i++)
bit=0;
b=0x04;
c=0x80;
for(i=0;i<3;i++)
b=0x01;
a=dat[add];
a^=(b<>=1;
}while(d2)
while(d3)
if(i==1)
else}}
NAND Flash ECC演算法長度計算
nand flash中常用的糾錯方式 因為快閃儲存器中會有出錯的可能,如果沒有使用ecc模組,讀出的資料和寫入的資料會有不匹配的可能,也許乙個檔案中只有一兩個bit不匹配,這也是不能容忍的。相對來說slc中出錯概率比較低,所以使用乙個糾錯能力不強的hanming碼就可以了,在mlc中hanming碼...
NAND Flash ECC演算法長度計算
nand flash中常用的糾錯方式 因為快閃儲存器中會有出錯的可能,如果沒有使用ecc模組,讀出的資料和寫入的資料會有不匹配的可能,也許乙個檔案中只有一兩個bit不匹配,這也是不能容忍 的。相對來說slc中出錯概率比較低,所以使用乙個糾錯能力不強的hanming碼就可以了,在mlc中hanming...
IP資料報的校驗和演算法C 版 原
為做偽ip,特地做了乙個ip包,用c 改寫ip頭的校驗和演算法。資料一 ip頭格式 版本號 4位 ip頭長度 4位 服務型別 8位 資料報長度 16位 標識段 16位 標誌段 16位 生存時間 8位 傳輸協議 8位 頭校驗和 16位 傳送位址 16位 目標位址 16位 選項 填充 資料二 ip 協議...