1、結(jié)構(gòu)分析
NAND FLASH以頁(page)為單位進行讀寫,以塊(block)為單位進行擦除。
其中,512B用于存放數(shù)據(jù),16B用于存放其他信息(包括:塊好壞的標記、塊的邏輯地址、頁內(nèi)數(shù)據(jù)的ECC校驗和等)。2410處理器針對NAND設備還集成了硬件ECC校驗,這將大大提高NAND設備的讀寫效率。系統(tǒng)在每次讀一頁后會計算其校驗和,并和存儲在頁內(nèi)的冗余的16B內(nèi)的校驗和做比較,以此來判斷讀出的數(shù)據(jù)是否正確。
NAND FLASH有與頁大小相同的頁寄存器,用于數(shù)據(jù)緩存。當讀數(shù)據(jù)時,先從NAND FLASH內(nèi)存單元把數(shù)據(jù)讀到頁寄存器,外部通過訪問NAND FLASH I/O端口獲得頁寄存器中數(shù)據(jù)(地址自動累加);當寫數(shù)據(jù)時,外部通過NAND FLASH I/O端口輸入的數(shù)據(jù)首先緩存在頁寄存器,寫命令發(fā)出后才寫入到內(nèi)存單元中。
按照k9f1208的組織方式可以分四類地址: Column Address、halfpage pointer、Page Address 、Block Address。A[0:25]表示數(shù)據(jù)在64M空間中的地址。
Column Address表示數(shù)據(jù)在半頁中的地址,大小范圍0~255,用A[0:7]表示;
halfpage pointer表示半頁在整頁中的位置,即在0~255空間還是在256~511空間,用A[8]表示;
Page Address表示頁在塊中的地址,大小范圍0~31,用A[13:9]表示;
Block Address表示塊在flash中的位置,大小范圍0~4095,A[25:14] 表示;
2、NAND設備的軟件調(diào)試步驟:
設置相關寄存器、NAND 設備的初始化、NAND設備的識別、NAND設備的讀擦寫(帶ECC校驗)
NFCONF――配置寄存器
NFCONT――控制寄存器
NFCMD―― 命令設置寄存器
NFADDR――地址設置寄存器
NFDATA――數(shù)據(jù)寄存器
NFSTAT―― 操作狀態(tài)寄存器
NFECC―― ECC 寄存器
讀操作過程
K9f1208的尋址分為4個cycle。分別是:A[0:7]、A[9:16]、A[17:24]、A[25]。讀操作的過程為: 1、發(fā)送讀取指令;2、發(fā)送第1個cycle地址;3、發(fā)送第2個cycle地址;4、發(fā)送第3個cycle地址;5、發(fā)送第4個cycle地址;6、讀取數(shù)據(jù)至頁末。K9f1208提供了兩個讀指令,‘0x00’、‘0x01’。這兩個指令區(qū)別在于‘0x00’可以將A[8]置為0,選中上半頁;而‘0x01’可以將A[8]置為1,選中下半頁。雖然讀寫過程可以不從頁邊界開始,但在正式場合下還是建議從頁邊界開始讀寫至頁結(jié)束。
寫操作過程
寫操作的過程為: 1、發(fā)送寫開始指令;2、發(fā)送第1個cycle地址;3、發(fā)送第2個cycle地址;4、發(fā)送第3個cycle地址;5、發(fā)送第4個cycle地址;6、寫入數(shù)據(jù)至頁末;7、發(fā)送寫結(jié)束指令
3、存儲檢查
需要ECC(Error Corection Co
表1 冗余字節(jié)定義
字節(jié)序號 | 內(nèi)容 | 字節(jié)序號 | 內(nèi)容 |
512 | 用戶定義數(shù)據(jù) | 520 | 后256BECC校驗和 |
513 | 521 | ||
514 | 522 | ||
515 | 523 | 塊邏輯地址 | |
516 | 數(shù)據(jù)狀態(tài) | 524 | |
517 | 塊狀態(tài) | 525 | 前256BECC校驗和 |
518 | 塊邏輯地址1 | 526 | |
519 | 527 |
表2給出了塊邏輯地址的存放格式,LA表示邏輯地址,P代表偶校驗位。邏輯地址只有10bit,代表只有1024bit的尋址空間。而SSFDC規(guī)范將NAND設備分成了多個zone,每個zone 內(nèi)有1024塊,但這物理上的1024塊映射到邏輯空間只有1000塊,其他的24塊就作為備份使用,當有壞塊存在時,就可以以備份塊將其替換。
表2
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | |
0 | 0 | 0 | 1 | 0 | LA9 | LA8 | LA7 | 第518 |
LA6 | LA5 | LA4 | LA3 | LA2 | LA1 | LA0 | P | 第519 |
有了以上的軟件規(guī)范,就可以對NAND設備寫出較標準的ECC校驗,并可以編寫檢測壞塊、標記壞塊、建立物理地址和邏輯地址的映射表的程序了。
static int NF_IsBadBlock(U32 block)
{
}
static int NF_MarkBadBlock(U32 block)
{
}
//建立物理地址到邏輯地址的映射表
int search_logic_block(void)
{
}
這段代碼的主要作用就是產(chǎn)生數(shù)組lg2ph[],這個數(shù)組的含義就是“塊物理地址=lg2ph[邏輯地址]”。