




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、【Nand Flash驅動編寫之前要了解的知識】1. 硬件特性:【Flash的硬件實現機制】Flash全名叫做Flash Memory,屬于非易失性存儲設備(Non-volatile Memory Device),與此相對應的是易失性存儲設備(Volatile Memory Device)。關于什么是非易失性/易失性,從名字中就可以看出,非易失性就是不容易丟失,數據存儲在這類設備中,即使斷電了,也不會丟失,這類設備,除了Flash,還有其他比較常見的入硬盤,ROM等,與此相對的,易失性就是斷電了,數據就丟失了,比
2、如大家常用的內存,不論是以前的SDRAM,DDR SDRAM,還是現在的DDR2,DDR3等,都是斷電后,數據就沒了。 Flash的內部存儲是MOSFET,里面有個懸浮門(Floating Gate),是真正存儲數據的單元。在Flash之前,紫外線可擦除(uv-erasable)的EPROM,就已經采用用Floating Gate存儲數據這一技術了。圖1.典型的Flash內存單元的物理結構數據在Flash內存單元中是以電荷(electrical charge) 形式存儲的。存儲電荷的多少,取決于圖中的外部門(external gate)所被施加的電壓,其控制了是向存儲單元中
3、沖入電荷還是使其釋放電荷。而數據的表示,以所存儲的電荷的電壓是否超過一個特定的閾值Vth來表示。 【SLC和MLC的實現機制】Nand Flash按照內部存儲數據單元的電壓的不同層次,也就是單個內存單元中,是存儲1位數據,還是多位數據,可以分為SLC和MLC:1. SLC,Single Level Cell:單個存儲單元,只存儲一位數據,表示成1或0.就是上面介紹的,對于數據的表示,單個存儲單元中內部所存儲電荷的電壓,和某個特定的閾值電壓Vth,相比,如果大于此Vth值,就是表示1,反之,小于Vth,就
4、表示0.對于nand Flash的數據的寫入1,就是控制External Gate去充電,使得存儲的電荷夠多,超過閾值Vth,就表示1了。而對于寫入0,就是將其放電,電荷減少到小于Vth,就表示0了。關于為何Nand Flash不能從0變成1,我的理解是,物理上來說,是可以實現每一位的,從0變成1的,但是實際上,對于實際的物理實現,出于效率的考慮,如果對于,每一個存儲單元都能單獨控制,即,0變成1就是,對每一個存儲單元單獨去充電,所需要的硬件實現就很復雜和昂貴,同時,所進行對塊擦除的操作,也就無法實現之前的,一閃而過的速度了,也就失去了Flash的眾多特性了。 2.
5、60; MLC,Multi Level Cell:與SLC相對應,就是單個存儲單元,可以存儲多個位,比如2位,4位等。其實現機制,說起來比較簡單,就是,通過控制內部電荷的多少,分成多個閾值,通過控制里面的電荷多少,而達到我們所需要的存儲成不同的數據。比如,假設輸入電壓是Vin4V(實際沒有這樣的電壓,此處只是為了舉例方便),那么,可以設計出2的2次方4個閾值, 1/4 的Vin1V,2/4的Vin2V,3/4的Vin3V,Vin4V,分別表示2位數據00,01,10,11,對于寫入數據,就是充電,通過控制內部的電荷的
6、多少,對應表示不同的數據。對于讀取,則是通過對應的內部的電流(與Vth成反比),然后通過一系列解碼電路完成讀取,解析出所存儲的數據。這些具體的物理實現,都是有足夠精確的設備和技術,才能實現精確的數據寫入和讀出的。單個存儲單元可以存儲2位數據的,稱作2的2次方4 Level Cell,而不是2 Level Cell,這點,之前差點搞暈了。,同理,對于新出的單個存儲單元可以存儲4位數據的,稱作 2的4次方16 Level Cell。 【關于如何識別SLC還是MLC】Nand Flash設計中,有個命令叫做Read ID,讀取ID,意思是讀取芯片的ID,就像大家的身份證一樣,這里
7、讀取的ID中,是讀取好幾個字節(jié),一般最少是4個,新的芯片,支持5個甚至更多,從這些字節(jié)中,可以解析出很多相關的信息,比如此Nand Flash內部是幾個芯片(chip)所組成的,每個chip包含了幾片(Plane),每一片中的頁大小,塊大小,等等。在這些信息中,其中有一個,就是識別此flash是SLC還是MLC。下面這個就是最常見的Nand Flash的datasheet中所規(guī)定的,第3個字節(jié),3rd byte,所表示的信息,其中就有SLC/MLC的識別信息: DescriptionI/O7I/O6I/O5 I/O4I/O3 I/O2I/O1 I/O0InternalChip Num
8、ber1248 0 00 11 01 1Cell Type2 Level Cell4 Level Cell8 Level Cell16 Level Cell 0 00 11
9、 01 1 Number ofSimultaneouslyProgrammed Pages1248 0 00 11 01 1 Interleave ProgramBetween multiple chipsNot SupportSupport
10、160;01 Cache ProgramNot SupportSupport01 表1.Nand Flash 第3個ID的含義 【Nand Flash的物理存儲單元的陣列組織結構】Nand flash的內部組織結構,此處還是用圖來解釋,比較容易理解:圖2.Nand Flash物理存儲單元的陣列組織結構上圖是K9K8G08U0A的datasheet中的描述。簡單解釋就是:1.一個nand flash由很多個塊(Block)組成,塊的大小一般是128KB,256KB,512KB,此處是128KB。2
11、.每個塊里面又包含了很多頁(page)。每個頁的大小,對于現在常見的nand flash多數是2KB,更新的nand flash是4KB,這類的,頁大小大于2KB的nand flash,被稱作big block,對應的發(fā)讀寫命令地址,一共5個周期(cycle),而老的nand flash,頁大小是256B,512B,這類的nand flash被稱作small block,。地址周期只有4個。而塊,也是Nand Flash的擦除操作的基本/最小單位。3.每一個頁,對應還有一塊區(qū)域,叫做空閑區(qū)域(spare area)/冗余區(qū)域(redundant area),而Linux系統(tǒng)中,一般叫做OOB(
12、Out Of Band),這個區(qū)域,是最初基于Nand Flash的硬件特性:數據在讀寫時候相對容易錯誤,所以為了保證數據的正確性,必須要有對應的檢測和糾錯機制,此機制被叫做EDC(Error Detection Code)/ECC(Error Code Correction, 或者 Error Checking and Correcting),所以設計了多余的區(qū)域,用于放置數據的校驗值。頁是Nand Flash的寫入操作的基本/最小的單位。 【Nand Flash數據存儲單元的整體架構】簡單說就是,常見的nand flash,內部只有一個chip,每個chip只
13、有一個plane。而有些復雜的,容量更大的nand flash,內部有多個chip,每個chip有多個plane。這類的nand flash,往往也有更加高級的功能,比如下面要介紹的Multi Plane Program和Interleave Page Program等。比如,型號為K9K8G08U0A這個芯片(chip),內部有兩個K9F4G08U0A,每個K9F4G08U0A包含了2個Plane,每個Plane是1Gb,所以K9F4G08U0A的大小是1Gb×22Gb256MB,因此,K9K8G08U0A內部有2個K9F4G08U0A,即4個Plane,總大小是4×25
14、6MB1GB。而型號是K9WAG08U1A的nand flash,內部包含了2個K9K8G08U0A,所以,總容量是K9K8G08U0A的兩倍1GB×22GB,類似地K9NBG08U5A,內部包含了4個K9K8G08U0A,總大小就是4×1GB4GB。 【Flash名稱的由來】Flash的擦除操作是以block塊為單位的,與此相對應的是其他很多存儲設備,是以bit位為最小讀取/寫入的單位,Flash是一次性地擦除整個塊:在發(fā)送一個擦除命令后,一次性地將一個block,常見的塊的大小是128KB/256KB。,全部擦除為1,也就是里面的內容全部都是0xFF了,由于是
15、一下子就擦除了,相對來說,擦除用的時間很短,可以用一閃而過來形容,所以,叫做Flash Memory。中文有的翻譯為 (快速)閃存。 【Flash相對于普通設備的特殊性】1. 上面提到過的,Flash最小操作單位,有些特殊。一般設備,比如硬盤/內存,讀取和寫入都是以bit位為單位,讀取一個bit的值,將某個值寫入對應的地址的位,都是可以按位操作的。但是Flash由于物理特性,使得內部存儲的數據,只能從1變成0,這點,可以從前面的內部實現機制了解到,只是方便統(tǒng)一充電,不方便單獨的存儲單元去放電,
16、所以才說,只能從1變成0,也就是釋放電荷。所以,總結一下Flash的特殊性如下: 普通設備(硬盤/內存等)Flash讀取/寫入的叫法讀取/寫入讀取/編程(Program)讀取/寫入的最小單位Bit/位Page/頁擦除(Erase)操作的最小單位Bit/位Block/塊 擦除操作的含義將數據刪除/全部寫入0將整個塊都擦除成全是1,也就是里面的數據都是0xFF 對于寫操作直接寫即可在寫數據之前,要先擦除,然后再寫表2.Flash和普通設備相比所具有的特殊性注: 之所以將寫操作叫做編程,是因為,flash 和之前的EPROM,EEPROM
17、繼承發(fā)展而來,而之前的EEPROM(Electrically Erasable Programmable Read-Only Memory),往里面寫入數據,就叫做編程Program,之所以這么稱呼,是因為其對數據的寫入,是需要用電去擦除/寫入的,就叫做編程。 對于目前常見的頁大小是2K/4K的Nand Flash,其塊的大小有128KB/256KB/512KB等。而對于Nor Flash,常見的塊大小有64K/32K等。在寫數據之前,要先擦除,內部就都變成0xFF了,然后才能寫入數據,也就是將對應位由1變成0。單片機控制Nand Flash 涉及到的算法:ECC校驗,壞塊管理,垃圾
18、搜集,負載均衡。Nand Flash原理分析與編程NAND Flash 在嵌入式系統(tǒng)中的地位與PC機上的硬盤是類似的。用于保存系統(tǒng)運行所必需的操作系統(tǒng),應用程序,用戶數據,運行過程中產生的各類數據,系統(tǒng)掉電后數據不會護丟失.本文主要介紹關于NAND Flash的組織結構和編寫程序的方法。 在三星的NAND Flash 中,當CPU從NAND Flash開始啟動時,CPU會通過內部的硬件將NAND Flash開始的4KB數據復制到稱為“Steppingstone”的4KB的內部RAM中,起始地址為0,然后跳到地址
19、0處開始執(zhí)行。這也就是我們?yōu)槭裁纯梢园研∮?KB的程序燒到NAND Flash中,可以運行,而當大于4KB時,卻沒有辦法運行,必須借助于NAND Flash的讀操作,讀取4KB以后的程序到內存中。 NAND Flash的尋址方式和NAND Flash的memory組織方式緊密相關。NAND Flash的數據是以bit的方式保存在 memory cell(存儲單元)。一般情況下,一個cell中只能存儲一個bit。這些cell以8個或者16個為單位,連成 bit line ,形成所謂的byte(x8)/word(x16),這就是NAND Flash的位寬。 這些Line會再組成
20、Pape(頁)。然后是每32個page形成一個Block,所以一個Block(塊)大小是16k.Block是NAND Flash中最大的操作單元,其中的擦除操作是以Block為單位進行擦除的,而讀寫和編程是以page為單位進行操作的,并且讀寫之前必須進行flash的擦寫。我們這里以三星K9F1208U0M的NAND Flash 為例,它的大小是64MB的。 1block = 32page 1page = 512bytes(datafield) + 16bytes(oob) K9F1208U0B總共有4096 個Blocks,故我們可以知道這塊flash的容量為40
21、96 *(32 *528)= 69206016 Bytes = 66 MB 但事實上每個Page上的最后16Bytes是用于存貯檢驗碼用的,并不能存放實際的數據,所以實際上我們可以操作的芯片容量為 4096 *(32 *512) = 67108864 Bytes = 64 MB Nand Flash 物理結構圖 在NAND Flash中有8個I/O引腳(IO0IO7)、5個全能信號(nWE ALE CLE nCE nRE)、一個引腳,1個寫保護引腳。操作NAND Flash時,先傳輸命令,然后傳輸地址,最后讀寫數據。對于64MB的NAND Flash,需
22、要一個26位的地址。只能8個I/O引腳充當地址、數據、命令的復用端口,所以每次傳地址只能傳8位。這樣就需要4個地址序列。因此讀寫一次nand flash需要傳送4次(A7:0 A16:9 A24:17 A25)。64M的NAND Flash的地址范圍為0x000000000x03FFFFFF。 一頁有528個字節(jié),而在前512B中存放著用戶的數據。在后面的16字節(jié)中(OOB)中存放著執(zhí)行命令后的狀態(tài)信息。主要是ECC校驗的標識。列地址A0-A7可以尋址的范圍是256個字節(jié),要尋址528字節(jié)的話,將一頁分為了A.(1half array)B(2 half array) C(spare
23、array)。A區(qū)0255字節(jié),B區(qū) 256-511 字節(jié)C區(qū)512527字節(jié)。訪問某頁時必須選定特定的區(qū)。這可以使地址指針指向特定的區(qū)實現。 在NAND Flash 中存在三類地址,分別為Block Address 、Column Address Page Address.。 Column Address 用來選擇是在上半頁尋址還是在下半頁尋址A0A7.也就相當于頁內的偏移地址。在進行擦除時不需要列地址,因為擦除是以塊為單位擦除。32個Page需要5bit來表示。也就是A13:9;也就是頁在塊內的相對地址。A8這一位用來設置512字節(jié)的上半頁,還是下半頁,1表示是在上半頁
24、,而2表示是在下半頁。Block的地址有A25:14組成。 存儲操作特點: 1.擦除操作的最小單位是塊 2.Nand Flash芯片每一位只能從1變?yōu)?,而不能從0變?yōu)?,所以在對其進行寫入操作之前一定要將相應塊擦除(擦除就是將相應塊的位全部變?yōu)? 3 OOB部分的第六字節(jié)(即517字節(jié))標志是否壞塊,如果不是壞塊該值為FF,否則為壞塊 4 除OOB第六字節(jié)外,通常至少把OOB前3字節(jié)存放Nand Flash硬件ECC碼 一個容量為64M(512Mbit)的NAND Flash,分為131072頁,528列。(實際中由于存在spare
25、 area,故都大于這個值),有4096塊,需要12bit來表示即A25:14.如果是128M(1Gbit)的話,blodk Address為A26:14.由于地址只能在IO0IO7上傳送。編程時通常通過移位來實現地址的傳送。傳送過程如下: 第1個地址序列:傳遞column address,也就是NAND Flash7:0,這一周期不需要移位即可傳遞到I/O7:0上,而half page pointer 即A8是由操作指令決定,00h,在A區(qū),01h在B區(qū),指令決定在哪個half page上進行讀寫,而真正A8的值是不需要程序員關心的; 第2個地址序列:就是將NAND_AD
26、DR 右移9位,而不是8位,將NAND_ADDR16:9傳遞到I/O7:0上; 第3個地址序列:將NAND_ADDR24:17 傳遞到I/O7:0上; 第4個地址序列:將NAND_ADDR25傳送到I/O上。 整個地址的傳送過程需要4步才能完成。如果NAND Flash 的大小是32MB的以下的話,那么block address 最高位只到bit24,因此尋址只需要3步,就可以完成。 在進行擦除操作時由于是以塊進行擦除,所以只需要3個地址序列,也就是只傳遞塊的地址,即A14:25。 NAND Flash地址的計算: Column Ad
27、dress 翻譯過來是列地址,也就是在一頁里的偏移地址。其實是指定Page上的某個Byte,指定這個Byte,其實也就是指定此頁的讀寫起始地址。 Page Address:頁地址。頁的地址總是以512Bytes對齊的,所以它的低9位問題0,確定讀寫操作在NAND Flash中的哪個頁進行。 當我們得到一個Nand Flash地址addr時,我們可以這樣分解出Column Address和Page Address。 Columnaddr = addr % 512 / column address Pageaddr = addr>>9 / pag
28、e address 也就是一個Nand Flash地址的A0-A7是它的column address ,A9A25是它的Page Address,地址A8被忽略。 現在假設我要從Nand Flash中的第5000字節(jié)處開始讀取1024個字節(jié)到內存的0x30000000處,我們這樣調用read函數 NF_Read(5000, 0x30000000,1024); 我們來分析5000這個src_addr. 根據 column_addr=src_addr%512; page_addr
29、ess=(src_addr>>9); 我們可得出column_addr=5000%512=392 page_address=(5000>>9)=9 于是我們可以知道5000這個地址是在第9頁的第392個字節(jié)處,于是我們的NF_read函數將這樣發(fā)送命令和參數 column_addr=5000%512; page_address=(5000>>9); NF_CMD=0x01; /要從2nd half開始讀取 所以要發(fā)送命令0x01 NF_ADDR= column_addr &0xff
30、; /1st Cycle A7:0 NF_ADDR=page_address& 0xff NF_ADDR=(page_address>>8)&0xff; /3rd.Cycle A24:17 NF_ADDR=(page_address>>16)&0xff; /4th.Cycle A25 向NandFlash的命令寄存器和地址寄存器發(fā)送完以上命令和參數之后,我們就可以從rNFDATA寄存器(NandFlash數據寄存器)讀取數據了. 我用下面的代碼進行數據的讀取. for(i=column_addr;i<512;i
31、+) *buf+=NF_RDDATA(); 每當讀取完一個Page之后,數據指針會落在下一個Page的0號Column(0號Byte).1、關于NAND FLASH 的壞塊管理就現在的NAND FLASH ,有串口和并口兩種,并口就是48PIN的數據的輸入和輸入公用IO的串口的就是使用SPI接口的NAND FLASH說下NAND FLASH 管理的核心思維:1 識別壞塊,標記壞塊,2 如何保存壞塊信息3 交換區(qū)概念4 保留去概念1,NANDFLASH 的工藝不能保證寫進去的每個塊里面的數據,和讀出來的數據一致,所以是存在壞塊的,而NAND FLASH
32、的數據組織結構是這樣的,由N個塊組成,而塊由M個PAGE組成+MXSPARE區(qū)比如 K9F1G08U0D 以這個片子為例子,BLOCK 大小為 128K 用戶可以寫的,實際大小為 128K + 64*4*16至于后面64*4*16的意思是這樣的, 因為該片子每個PAGE的大小為2048 也就是2K,而因為NAND 存在壞塊,所以,在每寫512個字節(jié)后,都會產生一個校驗碼,而這個校驗碼用來標記,該塊是壞塊還是可以正常使用的,當然這個512是針對大頁的NAND FLASH,小頁的話是每256個字節(jié)產出一個校驗碼,當然現在這樣的小頁的NAND FLASH很少見了,老了,即使有,也是拆機弄下來的,壞塊
33、的識別的話,這幾種,并口的:一個是可以根據ECC校驗算法來,判斷是否為壞塊,具體算法可以去百度查查,一個是可以判斷在寫玩數據之后,來判斷SPARE數據區(qū)域來判斷段壞塊,而對于小頁和大頁的有區(qū)別小頁的NANDFLASH ,比如一個頁的大小為1K,那么,在讀取1K后面數據的16個數據,如果第一個數據不為FF,那么標記該塊為壞塊,在標記的時候,可以標記的數據為全部為00,也就是在標記16個數據的時候表示為0而在標記的時候,一般標記的區(qū)域是這個塊的第一個PAGE后的16個數據 串口:串口的,里面有自校驗,硬件的,所以在識別的時候,可以直接裝載要判斷的PAGE的地址,然后去讀取狀態(tài)寄存器即可,
34、同樣的也可以去標記壞塊,標記花開的話和并口的一樣2 如何保存壞塊信息,壞塊信息一般包括:1 ,保存壞塊的信息的地址,也就是你要獲得壞塊信息的話,一般去哪個地址去讀,可以是固定的,也可以不是固定的,不固定的花費的時間長點,管理起來復雜2,壞塊信息要保存交換區(qū)的信息:這個信息是,你所使用的交換區(qū),某個塊是壞塊,還是好塊 后面會介紹3,保留區(qū)的地址映射狀態(tài),后面會介紹4 ,如何去標記該塊是作為,保存壞塊信息表格呢,至于如何保存壞塊信息,很多種方法,核心就是,用特殊的數據去標記,比如,我在用來保存壞塊信息表的時候,一般這樣標記該塊的第一個PAGE的前面八個數據是這樣的,0xff55aa00,0x000
35、0000該塊的最后一個PAGE ,最后8個數據是0X33445588.0XFF00FF00然后該塊的倒數第二個PAGE,標記交換區(qū)的信息和保留去地址映射關系,+一個校驗和而對于保存壞塊信息表格所用的塊,一般是3個或者5個不等,交替使用,或者也可以不交替使用,對于不交替使用的情況就是,一旦發(fā)生壞塊標記的情況的話,那么3或者5個塊都要被寫數據,而卻寫的數據是一樣的,有人會說,占用這么多塊不是浪費,其實,對于整個芯片來說,占用這幾個塊,而有個壞塊管理程序是值得的3 交換區(qū)概念:比如,塊0 ,該塊大小為128K, 在0X000-0X18000里面有數據,0x18800 - 0x20000這個有數據是文
36、件系統(tǒng)認為的, 而文件系統(tǒng)要在0x18000-0x18800這個512的范圍內要寫數據,那該怎么辦呢,肯定要這個塊個擦除掉的,如果沒有交換區(qū)的話,那么擦除的話,會導致在0X000-0X18000,0x18800 - 0x20000之間的數據都會丟失的,那該怎么辦呢,那就要使用交換區(qū),交換區(qū)的作用就是這樣的,如果要擦除某個塊的話,那么首先要將這個塊里面的數據拷貝到另外一個塊里面,而這個另外一個塊,稱之為交換區(qū),首先將整個塊的數據,全部放到一個可以用的交換區(qū),然后再將0這個塊擦除,擦除之后0這個塊里面的數據就是FF了,那么在擦除之后,在將交換區(qū)里面的數據回寫到0這個塊里面那么出現的情況就
37、是0X000-0X18000,0x18200 - 0x20000 這個兩個區(qū)間內的數據還是原來的數據,在將原來的數據回寫到0塊之后,然后在將這次文件系統(tǒng)要寫的數據寫到0x18000-0x18200這個區(qū)域里面,這樣既保證數據的完整性,又能將新數據寫進去4保留區(qū)概念:保留區(qū)的作用就是這個,當在寫數據的時候發(fā)生壞塊的話,那么得將這個塊的數據要保存另外一個塊里面,同時要對產生的那個壞塊進行標記。2、NANDFLASH壞塊管理思維K9F2808U0C是16 MB×8 bit的NAND Flash,共有1 024個Block,1 Block=16 KB,32 Page/Block,1 Page
38、=528 B=(512 B+16 B),其中16 B為備用區(qū),主要存放NAND Flash出廠壞塊標記、ECC校驗碼以及用戶自定義區(qū)。K9F2808U0C地址空間是24 bit,分三個周期依次送入NAND Flash的地址鎖存器。本文使用的地址均為字節(jié)地址,數據類型為DWORD(4 B)。 將K9F2808U0C的存儲空間劃分為四個區(qū):壞塊映射表存放區(qū)、交換塊區(qū)、壞塊映射區(qū)和實際數據存放區(qū)。文件系統(tǒng)管理的空間就是實際的數據存放空間,如圖2所示。2.2 各分區(qū)宏定義 #define FLASH_BLOCK_SIZE
39、; 0x40000 /16 KB/Block #define FLASH_PAGE_SIZE 0x200 /512 B/Page #define FLASH_SECTOR_SIZE 0x200/1Page=1Sector(only K9F2808U0C) #define FLASH_BLOCKS_TABLE 3/壞塊映射
40、表存放塊數 #define FLASH_SWAP_BLOCKS 5 /交換區(qū)的塊數 #define FLASH_BAD_BLOCKS_REMAP 50/壞簇重映區(qū)的塊數 #define FLASH_MAX_ADDR 0xFFFFFF/Flash最大字節(jié)地址 各分區(qū)首地址計算公式: FLASH_BLOCK_TABLE_ADD
41、R=FLASH_MAX_ADDR+1-3*FLASH_BLOCK_SIZE); FLASH_SWAP_BLOCK_ADDR=(FLASH_BLOCK_TABLE_ADDR-5*FLASH_BLOCK_SIZE); FLASH_BAD_BLOCK_REMAP_ADDR=(FLASH_SWAP_BLOCK_ADDR-50*FLASH_BLOCK_SIZE); FLASH_MAX_SECTOR_ADDR=(FLASH_MAX_ADDR-3*FLASH_BLOCK_TABLE_ADDR-5*FL
42、ASH_SWAP_BLOCK_ADDR-50*FLASH_BAD_BLOCK_REMAP_ADDR);文件系統(tǒng)管理的最大字節(jié)地址。 任意地址Addr: 所在塊地址:Addr&(FLASH_BLOCK_SIZE-1); 塊內偏移地址:Addr&(FLASH_BLOCK_SIZE-1); 塊中的頁:(Addr&(FLASH_BLOCK_SIZE-1)/FLASH_PAGE_SIZE;2.3 分區(qū)功能設計
43、160;壞塊映射區(qū)存放復制3份的壞塊信息BBI(Bad Block Information)表。復制3份是預防系統(tǒng)突然斷電,造成BBI表數據丟失。選擇最后3個塊,主要是出于固件設計。當Flash首次上電,固件程序 通過讀取Flash ID,獲得設備的容量等信息,然后從Flash的最后一塊中尋找BBI表,如果最后一塊沒有發(fā)現BBI表,則認為此塊為壞塊,繼續(xù)前移尋找,依此類推,直 到在預留的3個塊中找到,并將其數據讀入到在主控芯片為其開設的RAM中。如果還找不到,則固件認為該片Flash沒有BBI表。交換塊區(qū)是對NAND Flash進行擦除或寫操作時用來臨時存放數據,共分配5個塊。選取5塊是出于可
44、靠性設計。用一個數組 FlashSwapBlockStatusFLASH_SWAP_BLOCKS記錄交換塊狀態(tài):有效還是已經損壞。初始化時,固件認為所有的交換塊都 是有效塊,在隨后對其進行擦除或寫操作時,通過讀Flash狀態(tài)寄存器判斷該交換塊的真實狀態(tài),并記錄在數組中。交換塊的管理圍繞固件請求返回當前可用交 換塊地址或當前正在使用的交換塊地址,并判斷標記當前使用的交換塊狀態(tài)為壞。 壞塊映射區(qū)是當主機向數據區(qū)寫數據時,檢測到當前塊(數據區(qū))為壞塊時,將數據寫到壞塊映射區(qū)中的相應好塊中,并且將這兩個塊的塊地址記錄到BBI表 中,以后主機若要對當前塊(數據區(qū))訪問
45、時,只需讀BBI表就可以找到相應映射塊,從而代替壞塊的訪問。這樣就使文件系統(tǒng)所見邏輯塊地址 LBA(Logical Block Address)變成連續(xù)的,但實際上物理塊地址PBA(Physical Block Address)可能并不連續(xù)。上述方法就是壞塊管理的精髓。出于保守設計本文共選50塊作為重映塊。用數組 FlashRemapBlockStatusFLASH_BAD_BLOCKS_REMAP標識壞塊映射區(qū)的狀態(tài):未使用、已使用還是已經損壞。初始 化時認為壞塊映射區(qū)中所有塊都是好塊。3 NFTL壞塊管理設計3.1 構建BBI表 用一數組FlashBad
46、BlockTable2FLASH_BAD_BLOCKS_REMAP存放BBI表。第一維為壞塊(數據區(qū))的塊地址,第二維為映射塊地址(重映塊)。 BBI表的構建可在Flash首次上電時,通過讀取廠商設置在Flash備用區(qū)中的壞塊標記識別壞塊,建立壞塊映射表,此法初始化時間與Flash的容 量成正比;或通過讀NAND Flash所有塊內容并和0xFF作比較3,如果不相同,則表示壞塊。這種方法只針對新閃存,并且構建BBI表的時間長,主控芯片的占用率高;另一種 方法是在Flash初次上電時先不建立壞塊表,認為當前所有的塊都是好塊,在隨后操作中發(fā)現壞塊,并更新BBI表
47、。本文選擇后一種方法。3.2 壞塊映射表區(qū)的設計 將BBI表通過特殊的方式保存,以后通過此種方式的逆向來識別BBI表。壞塊映射表區(qū)的3個塊的設計方法如下: (1)在每塊最后一頁的首字節(jié)處做特殊標記,用于標識該塊有沒有準備被擦除:0xFF表示沒有準備被擦除;0x00表示該塊已經準備被擦除4。 (2)在每塊的倒數第二頁的首字節(jié)處寫0x00,表示該塊存放BBI表數據;并在第2、3、4、5個字節(jié)處以大端模式存放校驗和,用于校驗該塊中存放的所有數據的正確性。該頁的剩余字節(jié)寫0xFF。 &
48、#160; (3)在第一頁起依次寫:表頭特殊標記(0x0055AAFF)、壞塊總數(FlashBadBlockCount)、BBI表(FlashBadBlockTable)、重映塊狀態(tài)(FlashRemapBlockStatus),其結構如圖3所示。3.3 邏輯地址映射 在與主機批量數據傳輸時,首先對主機發(fā)送的CBW命令解析,從而固件獲得主機請求數據傳輸的LBA,再對LBA地址映射以此獲得相應的PBA,然后再執(zhí) 行主機命令。具體方法:首先讀取當前總的壞塊數FlashBadBlocksCount,如果為0,表示無壞塊,LBA就不用映射,直接返回;如
49、果最后一 次訪問地址與LBA同屬于一個塊,那么也不用地址映射;如果當前壞塊的數量為1,判斷LBA塊地址與BBI表中壞塊地址是否相同,從而決定是否采取地址映 射;如果當前壞塊的數量不為1,就需要查找BBI表判斷是不是含有LBA的塊地址,如果存在,則要地址重新映射,如果不存在,就不用重新映射??梢圆捎枚?分法查表實現兩地址快速比較4。3.4 壞塊處理 對映射后的地址進行寫或擦除過程中發(fā)現當前塊變壞的處理方法:首先查找映射區(qū)中的塊狀態(tài) FlashRemapBlockStatusFLASH_BAD_BLOCKS_REMAP,尋找可用的映射塊。如果50個重映塊都被標記
50、為壞或已使 用,則程序進入死循環(huán);如果找到可用的映射塊,則固件對可能出現壞塊的三種情況進行散轉:(1)擦除當前塊時出錯:將當前塊地址與可用的重映塊地址寫入 BBI表中,按地址大小排列有利于二分法查表,并返回重映塊地址。(2)復制某頁從交換區(qū)到操作地址時失?。菏紫全@得當前使用的交換塊的塊地址,然后判斷 操作地址是在數據存儲區(qū)還是在重映區(qū)。如果在重映區(qū),說明當前操作地址所對應的在數據存儲區(qū)中的塊已經是壞塊,并且在這次操作中重映塊也變壞,此時就應該 標記當前映射塊狀態(tài)為壞,并在重映區(qū)中尋找下一個可用重映塊,將原來在數據存儲區(qū)中的塊地址與更新后的映射塊地址寫入BBI表中,并返回新的映射后的地 址;如果
51、在數據存儲區(qū),就進行第一次重映射,更新壞塊表,并且將映射地址返回。然后再完成復制工作。(3)向操作地址寫一頁數據時出錯:將當前地址所在塊 中的前面頁從交換塊中相應地址復制到重映塊,然后將操作地址所在當前頁中的沒有寫到的數據從交換塊中復制,并將緩沖區(qū)中的數據重新寫到重映射的地址中,并 返回重映射地址。函數實現如下: DWORD FlashDealBadBlock(DWORD Addr,DWORD Type) DWORD i; DWORD
52、RemapBlockAddr; DWORD SwapBlockAddr; while(1) RemapBlockAddr=FlashGetNewRemapBlock(); if(RemapBlockAddr=-1) return Addr; &
53、#160; switch(Type) case 1: goto Exit; break; case 2:
54、0; SwapBlockAddr=FlashGetCurrentSwapBlock(); for(i=0;i<(Addr&(FLASH_BLOCK_SIZE-1)/FLASH_PAGE_SIZE+1;i+) if(0x00=(FlashCopyPage(SwapBlockAddr+i*FLASH_P
55、AGE_SIZE,RemapBlockAddr+i*FLASH_PAGE_SIZE) goto BadRemapBlock; goto Exit; break;
56、160; case 3: SwapBlockAddr=FlashGetCurrentSwapBlock(); for(i=0;i<(Addr&(FLASH_BLOCK_SIZE-1)/FLASH_PAGE_SIZE;i+)
57、160; if(0x00=(FlashCopyPage(SwapBlockAddr+i*FLASH_PAGE_SIZE,RemapBlockAddr+i*FLASH_PAGE_SIZE) goto BadRemapBlock; if(0x00=(FlashCopyPage(Addr,RemapBlo
58、ckAddr+i*FLASH_PAGE_SIZE) goto BadRemapBlock; goto Exit; break; default:
59、;break; BadRemapBlock: FlashMarkRemapBlockBad(RemapBlockAddr); Exit:FlashUpdateBadBlockTable(Addr,RemapBlockAddr); return RemapBlockAddr+(Addr&(FLASH_BLOCK_SIZE-1);3.5 連續(xù)讀寫操作 當主機與設備建立批量傳輸
60、數據連接時,固件通過解析CBW封包獲得起始LBA。對該地址進行映射和壞塊管理從而獲得PBA。設置一個變量,當此變量有效 時,表示主機對Flash仍需要讀或寫數據,直到此變量失效為止。同時將主機上一次讀寫扇區(qū)的地址存入另一個變量,此變量在連續(xù)讀中作用不大,但在連續(xù)寫 時,通過與上一次寫操作地址所在塊做比較,判斷是否同屬一個塊,以此決定是不是需要進行地址跨塊處理。 本文設計了一種針對NAND型的閃存轉譯層,使NFTL完成地址映射和壞塊管理以及連續(xù)讀寫數據的操作。對NAND Flash的分區(qū)設計,使塊管理結構清晰,有利于固件的開發(fā)。本文沒有對Flash的ECC校驗進行過多的設計,這是因為在實際應用中NAND Flash主要用于存儲多媒體數據(圖片、語音文件)等,并不會對它進行頻繁的寫入或擦除操作,而且多媒體文件數據對數據的完整性不敏感5,所以不需 要對存儲在其中的每一位數據進行嚴格的ECC校驗,可以通過另外設計簡單的校驗方法來代替ECC校驗。3、參考ST官方資料計算
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 行業(yè)保安工作中的信息安全問題計劃
- 樂器租賃協議合同樣本
- 企業(yè)業(yè)績合同樣本
- 2025年度采購合同范本
- 養(yǎng)魚合同標準文本
- 跨部門協作的有效方法計劃
- 焊接網架工程施工方案
- 出售預制過梁合同標準文本
- 2025涉及合同糾紛的仲裁申請書
- 出租鳳凰車位合同樣本
- 戶籍業(yè)務培訓
- TCUWA40055-2023排水管道工程自密實回填材料應用技術規(guī)程
- 2023年飛行員教員理論考試題庫(核心600題)
- 高二【化學(魯科版)】微項目:模擬和表征有機化合物分子結構-教學設計
- 10kV線路跨越等級公路施工方案
- 《創(chuàng)新教育教程》第三章-組合創(chuàng)造法-教案-
- 未成年人監(jiān)護狀況基本情況表、監(jiān)護人監(jiān)護能力等級評估表、評估報告
- 江蘇省無錫市錫山區(qū)天一實驗中學2022-2023學年七下期中數學試題(原卷版)
- 排班表管理制度
- 房屋團購方案
- 警察服裝采購投標方案(技術方案)
評論
0/150
提交評論