版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、【Nand Flash驅(qū)動(dòng)編寫之前要了解的知識】1. 硬件特性:【Flash的硬件實(shí)現(xiàn)機(jī)制】Flash全名叫做Flash Memory,屬于非易失性存儲設(shè)備(Non-volatile Memory Device),與此相對應(yīng)的是易失性存儲設(shè)備(Volatile Memory Device)。關(guān)于什么是非易失性/易失性,從名字中就可以看出,非易失性就是不容易丟失,數(shù)據(jù)存儲在這類設(shè)備中,即使斷電了,也不會(huì)丟失,這類設(shè)備,除了Flash,還有其他比較常見的入硬盤,ROM等,與此相對的,易失性就是斷電了,數(shù)據(jù)就丟失了,比
2、如大家常用的內(nèi)存,不論是以前的SDRAM,DDR SDRAM,還是現(xiàn)在的DDR2,DDR3等,都是斷電后,數(shù)據(jù)就沒了。 Flash的內(nèi)部存儲是MOSFET,里面有個(gè)懸浮門(Floating Gate),是真正存儲數(shù)據(jù)的單元。在Flash之前,紫外線可擦除(uv-erasable)的EPROM,就已經(jīng)采用用Floating Gate存儲數(shù)據(jù)這一技術(shù)了。圖1.典型的Flash內(nèi)存單元的物理結(jié)構(gòu)數(shù)據(jù)在Flash內(nèi)存單元中是以電荷(electrical charge) 形式存儲的。存儲電荷的多少,取決于圖中的外部門(external gate)所被施加的電壓,其控制了是向存儲單元中
3、沖入電荷還是使其釋放電荷。而數(shù)據(jù)的表示,以所存儲的電荷的電壓是否超過一個(gè)特定的閾值Vth來表示。 【SLC和MLC的實(shí)現(xiàn)機(jī)制】Nand Flash按照內(nèi)部存儲數(shù)據(jù)單元的電壓的不同層次,也就是單個(gè)內(nèi)存單元中,是存儲1位數(shù)據(jù),還是多位數(shù)據(jù),可以分為SLC和MLC:1. SLC,Single Level Cell:單個(gè)存儲單元,只存儲一位數(shù)據(jù),表示成1或0.就是上面介紹的,對于數(shù)據(jù)的表示,單個(gè)存儲單元中內(nèi)部所存儲電荷的電壓,和某個(gè)特定的閾值電壓Vth,相比,如果大于此Vth值,就是表示1,反之,小于Vth,就
4、表示0.對于nand Flash的數(shù)據(jù)的寫入1,就是控制External Gate去充電,使得存儲的電荷夠多,超過閾值Vth,就表示1了。而對于寫入0,就是將其放電,電荷減少到小于Vth,就表示0了。關(guān)于為何Nand Flash不能從0變成1,我的理解是,物理上來說,是可以實(shí)現(xiàn)每一位的,從0變成1的,但是實(shí)際上,對于實(shí)際的物理實(shí)現(xiàn),出于效率的考慮,如果對于,每一個(gè)存儲單元都能單獨(dú)控制,即,0變成1就是,對每一個(gè)存儲單元單獨(dú)去充電,所需要的硬件實(shí)現(xiàn)就很復(fù)雜和昂貴,同時(shí),所進(jìn)行對塊擦除的操作,也就無法實(shí)現(xiàn)之前的,一閃而過的速度了,也就失去了Flash的眾多特性了。 2.
5、60; MLC,Multi Level Cell:與SLC相對應(yīng),就是單個(gè)存儲單元,可以存儲多個(gè)位,比如2位,4位等。其實(shí)現(xiàn)機(jī)制,說起來比較簡單,就是,通過控制內(nèi)部電荷的多少,分成多個(gè)閾值,通過控制里面的電荷多少,而達(dá)到我們所需要的存儲成不同的數(shù)據(jù)。比如,假設(shè)輸入電壓是Vin4V(實(shí)際沒有這樣的電壓,此處只是為了舉例方便),那么,可以設(shè)計(jì)出2的2次方4個(gè)閾值, 1/4 的Vin1V,2/4的Vin2V,3/4的Vin3V,Vin4V,分別表示2位數(shù)據(jù)00,01,10,11,對于寫入數(shù)據(jù),就是充電,通過控制內(nèi)部的電荷的
6、多少,對應(yīng)表示不同的數(shù)據(jù)。對于讀取,則是通過對應(yīng)的內(nèi)部的電流(與Vth成反比),然后通過一系列解碼電路完成讀取,解析出所存儲的數(shù)據(jù)。這些具體的物理實(shí)現(xiàn),都是有足夠精確的設(shè)備和技術(shù),才能實(shí)現(xiàn)精確的數(shù)據(jù)寫入和讀出的。單個(gè)存儲單元可以存儲2位數(shù)據(jù)的,稱作2的2次方4 Level Cell,而不是2 Level Cell,這點(diǎn),之前差點(diǎn)搞暈了。,同理,對于新出的單個(gè)存儲單元可以存儲4位數(shù)據(jù)的,稱作 2的4次方16 Level Cell。 【關(guān)于如何識別SLC還是MLC】Nand Flash設(shè)計(jì)中,有個(gè)命令叫做Read ID,讀取ID,意思是讀取芯片的ID,就像大家的身份證一樣,這里
7、讀取的ID中,是讀取好幾個(gè)字節(jié),一般最少是4個(gè),新的芯片,支持5個(gè)甚至更多,從這些字節(jié)中,可以解析出很多相關(guān)的信息,比如此Nand Flash內(nèi)部是幾個(gè)芯片(chip)所組成的,每個(gè)chip包含了幾片(Plane),每一片中的頁大小,塊大小,等等。在這些信息中,其中有一個(gè),就是識別此flash是SLC還是MLC。下面這個(gè)就是最常見的Nand Flash的datasheet中所規(guī)定的,第3個(gè)字節(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個(gè)ID的含義 【Nand Flash的物理存儲單元的陣列組織結(jié)構(gòu)】Nand flash的內(nèi)部組織結(jié)構(gòu),此處還是用圖來解釋,比較容易理解:圖2.Nand Flash物理存儲單元的陣列組織結(jié)構(gòu)上圖是K9K8G08U0A的datasheet中的描述。簡單解釋就是:1.一個(gè)nand flash由很多個(gè)塊(Block)組成,塊的大小一般是128KB,256KB,512KB,此處是128KB。2
11、.每個(gè)塊里面又包含了很多頁(page)。每個(gè)頁的大小,對于現(xiàn)在常見的nand flash多數(shù)是2KB,更新的nand flash是4KB,這類的,頁大小大于2KB的nand flash,被稱作big block,對應(yīng)的發(fā)讀寫命令地址,一共5個(gè)周期(cycle),而老的nand flash,頁大小是256B,512B,這類的nand flash被稱作small block,。地址周期只有4個(gè)。而塊,也是Nand Flash的擦除操作的基本/最小單位。3.每一個(gè)頁,對應(yīng)還有一塊區(qū)域,叫做空閑區(qū)域(spare area)/冗余區(qū)域(redundant area),而Linux系統(tǒng)中,一般叫做OOB(
12、Out Of Band),這個(gè)區(qū)域,是最初基于Nand Flash的硬件特性:數(shù)據(jù)在讀寫時(shí)候相對容易錯(cuò)誤,所以為了保證數(shù)據(jù)的正確性,必須要有對應(yīng)的檢測和糾錯(cuò)機(jī)制,此機(jī)制被叫做EDC(Error Detection Code)/ECC(Error Code Correction, 或者 Error Checking and Correcting),所以設(shè)計(jì)了多余的區(qū)域,用于放置數(shù)據(jù)的校驗(yàn)值。頁是Nand Flash的寫入操作的基本/最小的單位。 【Nand Flash數(shù)據(jù)存儲單元的整體架構(gòu)】簡單說就是,常見的nand flash,內(nèi)部只有一個(gè)chip,每個(gè)chip只
13、有一個(gè)plane。而有些復(fù)雜的,容量更大的nand flash,內(nèi)部有多個(gè)chip,每個(gè)chip有多個(gè)plane。這類的nand flash,往往也有更加高級的功能,比如下面要介紹的Multi Plane Program和Interleave Page Program等。比如,型號為K9K8G08U0A這個(gè)芯片(chip),內(nèi)部有兩個(gè)K9F4G08U0A,每個(gè)K9F4G08U0A包含了2個(gè)Plane,每個(gè)Plane是1Gb,所以K9F4G08U0A的大小是1Gb×22Gb256MB,因此,K9K8G08U0A內(nèi)部有2個(gè)K9F4G08U0A,即4個(gè)Plane,總大小是4×25
14、6MB1GB。而型號是K9WAG08U1A的nand flash,內(nèi)部包含了2個(gè)K9K8G08U0A,所以,總?cè)萘渴荎9K8G08U0A的兩倍1GB×22GB,類似地K9NBG08U5A,內(nèi)部包含了4個(gè)K9K8G08U0A,總大小就是4×1GB4GB。 【Flash名稱的由來】Flash的擦除操作是以block塊為單位的,與此相對應(yīng)的是其他很多存儲設(shè)備,是以bit位為最小讀取/寫入的單位,F(xiàn)lash是一次性地擦除整個(gè)塊:在發(fā)送一個(gè)擦除命令后,一次性地將一個(gè)block,常見的塊的大小是128KB/256KB。,全部擦除為1,也就是里面的內(nèi)容全部都是0xFF了,由于是
15、一下子就擦除了,相對來說,擦除用的時(shí)間很短,可以用一閃而過來形容,所以,叫做Flash Memory。中文有的翻譯為 (快速)閃存。 【Flash相對于普通設(shè)備的特殊性】1. 上面提到過的,F(xiàn)lash最小操作單位,有些特殊。一般設(shè)備,比如硬盤/內(nèi)存,讀取和寫入都是以bit位為單位,讀取一個(gè)bit的值,將某個(gè)值寫入對應(yīng)的地址的位,都是可以按位操作的。但是Flash由于物理特性,使得內(nèi)部存儲的數(shù)據(jù),只能從1變成0,這點(diǎn),可以從前面的內(nèi)部實(shí)現(xiàn)機(jī)制了解到,只是方便統(tǒng)一充電,不方便單獨(dú)的存儲單元去放電,
16、所以才說,只能從1變成0,也就是釋放電荷。所以,總結(jié)一下Flash的特殊性如下: 普通設(shè)備(硬盤/內(nèi)存等)Flash讀取/寫入的叫法讀取/寫入讀取/編程(Program)讀取/寫入的最小單位Bit/位Page/頁擦除(Erase)操作的最小單位Bit/位Block/塊 擦除操作的含義將數(shù)據(jù)刪除/全部寫入0將整個(gè)塊都擦除成全是1,也就是里面的數(shù)據(jù)都是0xFF 對于寫操作直接寫即可在寫數(shù)據(jù)之前,要先擦除,然后再寫表2.Flash和普通設(shè)備相比所具有的特殊性注: 之所以將寫操作叫做編程,是因?yàn)?,flash 和之前的EPROM,EEPROM
17、繼承發(fā)展而來,而之前的EEPROM(Electrically Erasable Programmable Read-Only Memory),往里面寫入數(shù)據(jù),就叫做編程Program,之所以這么稱呼,是因?yàn)槠鋵?shù)據(jù)的寫入,是需要用電去擦除/寫入的,就叫做編程。 對于目前常見的頁大小是2K/4K的Nand Flash,其塊的大小有128KB/256KB/512KB等。而對于Nor Flash,常見的塊大小有64K/32K等。在寫數(shù)據(jù)之前,要先擦除,內(nèi)部就都變成0xFF了,然后才能寫入數(shù)據(jù),也就是將對應(yīng)位由1變成0。單片機(jī)控制Nand Flash 涉及到的算法:ECC校驗(yàn),壞塊管理,垃圾
18、搜集,負(fù)載均衡。Nand Flash原理分析與編程N(yùn)AND Flash 在嵌入式系統(tǒng)中的地位與PC機(jī)上的硬盤是類似的。用于保存系統(tǒng)運(yùn)行所必需的操作系統(tǒng),應(yīng)用程序,用戶數(shù)據(jù),運(yùn)行過程中產(chǎn)生的各類數(shù)據(jù),系統(tǒng)掉電后數(shù)據(jù)不會(huì)護(hù)丟失.本文主要介紹關(guān)于NAND Flash的組織結(jié)構(gòu)和編寫程序的方法。 在三星的NAND Flash 中,當(dāng)CPU從NAND Flash開始啟動(dòng)時(shí),CPU會(huì)通過內(nèi)部的硬件將NAND Flash開始的4KB數(shù)據(jù)復(fù)制到稱為“Steppingstone”的4KB的內(nèi)部RAM中,起始地址為0,然后跳到地址
19、0處開始執(zhí)行。這也就是我們?yōu)槭裁纯梢园研∮?KB的程序燒到NAND Flash中,可以運(yùn)行,而當(dāng)大于4KB時(shí),卻沒有辦法運(yùn)行,必須借助于NAND Flash的讀操作,讀取4KB以后的程序到內(nèi)存中。 NAND Flash的尋址方式和NAND Flash的memory組織方式緊密相關(guān)。NAND Flash的數(shù)據(jù)是以bit的方式保存在 memory cell(存儲單元)。一般情況下,一個(gè)cell中只能存儲一個(gè)bit。這些cell以8個(gè)或者16個(gè)為單位,連成 bit line ,形成所謂的byte(x8)/word(x16),這就是NAND Flash的位寬。 這些Line會(huì)再組成
20、Pape(頁)。然后是每32個(gè)page形成一個(gè)Block,所以一個(gè)Block(塊)大小是16k.Block是NAND Flash中最大的操作單元,其中的擦除操作是以Block為單位進(jìn)行擦除的,而讀寫和編程是以page為單位進(jìn)行操作的,并且讀寫之前必須進(jìn)行flash的擦寫。我們這里以三星K9F1208U0M的NAND Flash 為例,它的大小是64MB的。 1block = 32page 1page = 512bytes(datafield) + 16bytes(oob) K9F1208U0B總共有4096 個(gè)Blocks,故我們可以知道這塊flash的容量為40
21、96 *(32 *528)= 69206016 Bytes = 66 MB 但事實(shí)上每個(gè)Page上的最后16Bytes是用于存貯檢驗(yàn)碼用的,并不能存放實(shí)際的數(shù)據(jù),所以實(shí)際上我們可以操作的芯片容量為 4096 *(32 *512) = 67108864 Bytes = 64 MB Nand Flash 物理結(jié)構(gòu)圖 在NAND Flash中有8個(gè)I/O引腳(IO0IO7)、5個(gè)全能信號(nWE ALE CLE nCE nRE)、一個(gè)引腳,1個(gè)寫保護(hù)引腳。操作NAND Flash時(shí),先傳輸命令,然后傳輸?shù)刂?,最后讀寫數(shù)據(jù)。對于64MB的NAND Flash,需
22、要一個(gè)26位的地址。只能8個(gè)I/O引腳充當(dāng)?shù)刂?、?shù)據(jù)、命令的復(fù)用端口,所以每次傳地址只能傳8位。這樣就需要4個(gè)地址序列。因此讀寫一次nand flash需要傳送4次(A7:0 A16:9 A24:17 A25)。64M的NAND Flash的地址范圍為0x000000000x03FFFFFF。 一頁有528個(gè)字節(jié),而在前512B中存放著用戶的數(shù)據(jù)。在后面的16字節(jié)中(OOB)中存放著執(zhí)行命令后的狀態(tài)信息。主要是ECC校驗(yàn)的標(biāo)識。列地址A0-A7可以尋址的范圍是256個(gè)字節(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é)。訪問某頁時(shí)必須選定特定的區(qū)。這可以使地址指針指向特定的區(qū)實(shí)現(xiàn)。 在NAND Flash 中存在三類地址,分別為Block Address 、Column Address Page Address.。 Column Address 用來選擇是在上半頁尋址還是在下半頁尋址A0A7.也就相當(dāng)于頁內(nèi)的偏移地址。在進(jìn)行擦除時(shí)不需要列地址,因?yàn)椴脸且詨K為單位擦除。32個(gè)Page需要5bit來表示。也就是A13:9;也就是頁在塊內(nèi)的相對地址。A8這一位用來設(shè)置512字節(jié)的上半頁,還是下半頁,1表示是在上半頁
24、,而2表示是在下半頁。Block的地址有A25:14組成。 存儲操作特點(diǎn): 1.擦除操作的最小單位是塊 2.Nand Flash芯片每一位只能從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字節(jié)存放Nand Flash硬件ECC碼 一個(gè)容量為64M(512Mbit)的NAND Flash,分為131072頁,528列。(實(shí)際中由于存在spare
25、 area,故都大于這個(gè)值),有4096塊,需要12bit來表示即A25:14.如果是128M(1Gbit)的話,blodk Address為A26:14.由于地址只能在IO0IO7上傳送。編程時(shí)通常通過移位來實(shí)現(xiàn)地址的傳送。傳送過程如下: 第1個(gè)地址序列:傳遞column address,也就是NAND Flash7:0,這一周期不需要移位即可傳遞到I/O7:0上,而half page pointer 即A8是由操作指令決定,00h,在A區(qū),01h在B區(qū),指令決定在哪個(gè)half page上進(jìn)行讀寫,而真正A8的值是不需要程序員關(guān)心的; 第2個(gè)地址序列:就是將NAND_AD
26、DR 右移9位,而不是8位,將NAND_ADDR16:9傳遞到I/O7:0上; 第3個(gè)地址序列:將NAND_ADDR24:17 傳遞到I/O7:0上; 第4個(gè)地址序列:將NAND_ADDR25傳送到I/O上。 整個(gè)地址的傳送過程需要4步才能完成。如果NAND Flash 的大小是32MB的以下的話,那么block address 最高位只到bit24,因此尋址只需要3步,就可以完成。 在進(jìn)行擦除操作時(shí)由于是以塊進(jìn)行擦除,所以只需要3個(gè)地址序列,也就是只傳遞塊的地址,即A14:25。 NAND Flash地址的計(jì)算: Column Ad
27、dress 翻譯過來是列地址,也就是在一頁里的偏移地址。其實(shí)是指定Page上的某個(gè)Byte,指定這個(gè)Byte,其實(shí)也就是指定此頁的讀寫起始地址。 Page Address:頁地址。頁的地址總是以512Bytes對齊的,所以它的低9位問題0,確定讀寫操作在NAND Flash中的哪個(gè)頁進(jìn)行。 當(dāng)我們得到一個(gè)Nand Flash地址addr時(shí),我們可以這樣分解出Column Address和Page Address。 Columnaddr = addr % 512 / column address Pageaddr = addr>>9 / pag
28、e address 也就是一個(gè)Nand Flash地址的A0-A7是它的column address ,A9A25是它的Page Address,地址A8被忽略。 現(xiàn)在假設(shè)我要從Nand Flash中的第5000字節(jié)處開始讀取1024個(gè)字節(jié)到內(nèi)存的0x30000000處,我們這樣調(diào)用read函數(shù) NF_Read(5000, 0x30000000,1024); 我們來分析5000這個(gè)src_addr. 根據(jù) column_addr=src_addr%512; page_addr
29、ess=(src_addr>>9); 我們可得出column_addr=5000%512=392 page_address=(5000>>9)=9 于是我們可以知道5000這個(gè)地址是在第9頁的第392個(gè)字節(jié)處,于是我們的NF_read函數(shù)將這樣發(fā)送命令和參數(shù) 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ā)送完以上命令和參數(shù)之后,我們就可以從rNFDATA寄存器(NandFlash數(shù)據(jù)寄存器)讀取數(shù)據(jù)了. 我用下面的代碼進(jìn)行數(shù)據(jù)的讀取. for(i=column_addr;i<512;i
31、+) *buf+=NF_RDDATA(); 每當(dāng)讀取完一個(gè)Page之后,數(shù)據(jù)指針會(huì)落在下一個(gè)Page的0號Column(0號Byte).1、關(guān)于NAND FLASH 的壞塊管理就現(xiàn)在的NAND FLASH ,有串口和并口兩種,并口就是48PIN的數(shù)據(jù)的輸入和輸入公用IO的串口的就是使用SPI接口的NAND FLASH說下NAND FLASH 管理的核心思維:1 識別壞塊,標(biāo)記壞塊,2 如何保存壞塊信息3 交換區(qū)概念4 保留去概念1,NANDFLASH 的工藝不能保證寫進(jìn)去的每個(gè)塊里面的數(shù)據(jù),和讀出來的數(shù)據(jù)一致,所以是存在壞塊的,而NAND FLASH
32、的數(shù)據(jù)組織結(jié)構(gòu)是這樣的,由N個(gè)塊組成,而塊由M個(gè)PAGE組成+MXSPARE區(qū)比如 K9F1G08U0D 以這個(gè)片子為例子,BLOCK 大小為 128K 用戶可以寫的,實(shí)際大小為 128K + 64*4*16至于后面64*4*16的意思是這樣的, 因?yàn)樵撈用總€(gè)PAGE的大小為2048 也就是2K,而因?yàn)镹AND 存在壞塊,所以,在每寫512個(gè)字節(jié)后,都會(huì)產(chǎn)生一個(gè)校驗(yàn)碼,而這個(gè)校驗(yàn)碼用來標(biāo)記,該塊是壞塊還是可以正常使用的,當(dāng)然這個(gè)512是針對大頁的NAND FLASH,小頁的話是每256個(gè)字節(jié)產(chǎn)出一個(gè)校驗(yàn)碼,當(dāng)然現(xiàn)在這樣的小頁的NAND FLASH很少見了,老了,即使有,也是拆機(jī)弄下來的,壞塊
33、的識別的話,這幾種,并口的:一個(gè)是可以根據(jù)ECC校驗(yàn)算法來,判斷是否為壞塊,具體算法可以去百度查查,一個(gè)是可以判斷在寫玩數(shù)據(jù)之后,來判斷SPARE數(shù)據(jù)區(qū)域來判斷段壞塊,而對于小頁和大頁的有區(qū)別小頁的NANDFLASH ,比如一個(gè)頁的大小為1K,那么,在讀取1K后面數(shù)據(jù)的16個(gè)數(shù)據(jù),如果第一個(gè)數(shù)據(jù)不為FF,那么標(biāo)記該塊為壞塊,在標(biāo)記的時(shí)候,可以標(biāo)記的數(shù)據(jù)為全部為00,也就是在標(biāo)記16個(gè)數(shù)據(jù)的時(shí)候表示為0而在標(biāo)記的時(shí)候,一般標(biāo)記的區(qū)域是這個(gè)塊的第一個(gè)PAGE后的16個(gè)數(shù)據(jù) 串口:串口的,里面有自校驗(yàn),硬件的,所以在識別的時(shí)候,可以直接裝載要判斷的PAGE的地址,然后去讀取狀態(tài)寄存器即可,
34、同樣的也可以去標(biāo)記壞塊,標(biāo)記花開的話和并口的一樣2 如何保存壞塊信息,壞塊信息一般包括:1 ,保存壞塊的信息的地址,也就是你要獲得壞塊信息的話,一般去哪個(gè)地址去讀,可以是固定的,也可以不是固定的,不固定的花費(fèi)的時(shí)間長點(diǎn),管理起來復(fù)雜2,壞塊信息要保存交換區(qū)的信息:這個(gè)信息是,你所使用的交換區(qū),某個(gè)塊是壞塊,還是好塊 后面會(huì)介紹3,保留區(qū)的地址映射狀態(tài),后面會(huì)介紹4 ,如何去標(biāo)記該塊是作為,保存壞塊信息表格呢,至于如何保存壞塊信息,很多種方法,核心就是,用特殊的數(shù)據(jù)去標(biāo)記,比如,我在用來保存壞塊信息表的時(shí)候,一般這樣標(biāo)記該塊的第一個(gè)PAGE的前面八個(gè)數(shù)據(jù)是這樣的,0xff55aa00,0x000
35、0000該塊的最后一個(gè)PAGE ,最后8個(gè)數(shù)據(jù)是0X33445588.0XFF00FF00然后該塊的倒數(shù)第二個(gè)PAGE,標(biāo)記交換區(qū)的信息和保留去地址映射關(guān)系,+一個(gè)校驗(yàn)和而對于保存壞塊信息表格所用的塊,一般是3個(gè)或者5個(gè)不等,交替使用,或者也可以不交替使用,對于不交替使用的情況就是,一旦發(fā)生壞塊標(biāo)記的情況的話,那么3或者5個(gè)塊都要被寫數(shù)據(jù),而卻寫的數(shù)據(jù)是一樣的,有人會(huì)說,占用這么多塊不是浪費(fèi),其實(shí),對于整個(gè)芯片來說,占用這幾個(gè)塊,而有個(gè)壞塊管理程序是值得的3 交換區(qū)概念:比如,塊0 ,該塊大小為128K, 在0X000-0X18000里面有數(shù)據(jù),0x18800 - 0x20000這個(gè)有數(shù)據(jù)是文
36、件系統(tǒng)認(rèn)為的, 而文件系統(tǒng)要在0x18000-0x18800這個(gè)512的范圍內(nèi)要寫數(shù)據(jù),那該怎么辦呢,肯定要這個(gè)塊個(gè)擦除掉的,如果沒有交換區(qū)的話,那么擦除的話,會(huì)導(dǎo)致在0X000-0X18000,0x18800 - 0x20000之間的數(shù)據(jù)都會(huì)丟失的,那該怎么辦呢,那就要使用交換區(qū),交換區(qū)的作用就是這樣的,如果要擦除某個(gè)塊的話,那么首先要將這個(gè)塊里面的數(shù)據(jù)拷貝到另外一個(gè)塊里面,而這個(gè)另外一個(gè)塊,稱之為交換區(qū),首先將整個(gè)塊的數(shù)據(jù),全部放到一個(gè)可以用的交換區(qū),然后再將0這個(gè)塊擦除,擦除之后0這個(gè)塊里面的數(shù)據(jù)就是FF了,那么在擦除之后,在將交換區(qū)里面的數(shù)據(jù)回寫到0這個(gè)塊里面那么出現(xiàn)的情況就
37、是0X000-0X18000,0x18200 - 0x20000 這個(gè)兩個(gè)區(qū)間內(nèi)的數(shù)據(jù)還是原來的數(shù)據(jù),在將原來的數(shù)據(jù)回寫到0塊之后,然后在將這次文件系統(tǒng)要寫的數(shù)據(jù)寫到0x18000-0x18200這個(gè)區(qū)域里面,這樣既保證數(shù)據(jù)的完整性,又能將新數(shù)據(jù)寫進(jìn)去4保留區(qū)概念:保留區(qū)的作用就是這個(gè),當(dāng)在寫數(shù)據(jù)的時(shí)候發(fā)生壞塊的話,那么得將這個(gè)塊的數(shù)據(jù)要保存另外一個(gè)塊里面,同時(shí)要對產(chǎn)生的那個(gè)壞塊進(jìn)行標(biāo)記。2、NANDFLASH壞塊管理思維K9F2808U0C是16 MB×8 bit的NAND Flash,共有1 024個(gè)Block,1 Block=16 KB,32 Page/Block,1 Page
38、=528 B=(512 B+16 B),其中16 B為備用區(qū),主要存放NAND Flash出廠壞塊標(biāo)記、ECC校驗(yàn)碼以及用戶自定義區(qū)。K9F2808U0C地址空間是24 bit,分三個(gè)周期依次送入NAND Flash的地址鎖存器。本文使用的地址均為字節(jié)地址,數(shù)據(jù)類型為DWORD(4 B)。 將K9F2808U0C的存儲空間劃分為四個(gè)區(qū):壞塊映射表存放區(qū)、交換塊區(qū)、壞塊映射區(qū)和實(shí)際數(shù)據(jù)存放區(qū)。文件系統(tǒng)管理的空間就是實(shí)際的數(shù)據(jù)存放空間,如圖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、表存放塊數(shù) #define FLASH_SWAP_BLOCKS 5 /交換區(qū)的塊數(shù) #define FLASH_BAD_BLOCKS_REMAP 50/壞簇重映區(qū)的塊數(shù) #define FLASH_MAX_ADDR 0xFFFFFF/Flash最大字節(jié)地址 各分區(qū)首地址計(jì)算公式: 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); 塊內(nèi)偏移地址:Addr&(FLASH_BLOCK_SIZE-1); 塊中的頁:(Addr&(FLASH_BLOCK_SIZE-1)/FLASH_PAGE_SIZE;2.3 分區(qū)功能設(shè)計(jì)
43、160;壞塊映射區(qū)存放復(fù)制3份的壞塊信息BBI(Bad Block Information)表。復(fù)制3份是預(yù)防系統(tǒng)突然斷電,造成BBI表數(shù)據(jù)丟失。選擇最后3個(gè)塊,主要是出于固件設(shè)計(jì)。當(dāng)Flash首次上電,固件程序 通過讀取Flash ID,獲得設(shè)備的容量等信息,然后從Flash的最后一塊中尋找BBI表,如果最后一塊沒有發(fā)現(xiàn)BBI表,則認(rèn)為此塊為壞塊,繼續(xù)前移尋找,依此類推,直 到在預(yù)留的3個(gè)塊中找到,并將其數(shù)據(jù)讀入到在主控芯片為其開設(shè)的RAM中。如果還找不到,則固件認(rèn)為該片F(xiàn)lash沒有BBI表。交換塊區(qū)是對NAND Flash進(jìn)行擦除或?qū)懖僮鲿r(shí)用來臨時(shí)存放數(shù)據(jù),共分配5個(gè)塊。選取5塊是出于可
44、靠性設(shè)計(jì)。用一個(gè)數(shù)組 FlashSwapBlockStatusFLASH_SWAP_BLOCKS記錄交換塊狀態(tài):有效還是已經(jīng)損壞。初始化時(shí),固件認(rèn)為所有的交換塊都 是有效塊,在隨后對其進(jìn)行擦除或?qū)懖僮鲿r(shí),通過讀Flash狀態(tài)寄存器判斷該交換塊的真實(shí)狀態(tài),并記錄在數(shù)組中。交換塊的管理圍繞固件請求返回當(dāng)前可用交 換塊地址或當(dāng)前正在使用的交換塊地址,并判斷標(biāo)記當(dāng)前使用的交換塊狀態(tài)為壞。 壞塊映射區(qū)是當(dāng)主機(jī)向數(shù)據(jù)區(qū)寫數(shù)據(jù)時(shí),檢測到當(dāng)前塊(數(shù)據(jù)區(qū))為壞塊時(shí),將數(shù)據(jù)寫到壞塊映射區(qū)中的相應(yīng)好塊中,并且將這兩個(gè)塊的塊地址記錄到BBI表 中,以后主機(jī)若要對當(dāng)前塊(數(shù)據(jù)區(qū))訪問
45、時(shí),只需讀BBI表就可以找到相應(yīng)映射塊,從而代替壞塊的訪問。這樣就使文件系統(tǒng)所見邏輯塊地址 LBA(Logical Block Address)變成連續(xù)的,但實(shí)際上物理塊地址PBA(Physical Block Address)可能并不連續(xù)。上述方法就是壞塊管理的精髓。出于保守設(shè)計(jì)本文共選50塊作為重映塊。用數(shù)組 FlashRemapBlockStatusFLASH_BAD_BLOCKS_REMAP標(biāo)識壞塊映射區(qū)的狀態(tài):未使用、已使用還是已經(jīng)損壞。初始 化時(shí)認(rèn)為壞塊映射區(qū)中所有塊都是好塊。3 NFTL壞塊管理設(shè)計(jì)3.1 構(gòu)建BBI表 用一數(shù)組FlashBad
46、BlockTable2FLASH_BAD_BLOCKS_REMAP存放BBI表。第一維為壞塊(數(shù)據(jù)區(qū))的塊地址,第二維為映射塊地址(重映塊)。 BBI表的構(gòu)建可在Flash首次上電時(shí),通過讀取廠商設(shè)置在Flash備用區(qū)中的壞塊標(biāo)記識別壞塊,建立壞塊映射表,此法初始化時(shí)間與Flash的容 量成正比;或通過讀NAND Flash所有塊內(nèi)容并和0xFF作比較3,如果不相同,則表示壞塊。這種方法只針對新閃存,并且構(gòu)建BBI表的時(shí)間長,主控芯片的占用率高;另一種 方法是在Flash初次上電時(shí)先不建立壞塊表,認(rèn)為當(dāng)前所有的塊都是好塊,在隨后操作中發(fā)現(xiàn)壞塊,并更新BBI表
47、。本文選擇后一種方法。3.2 壞塊映射表區(qū)的設(shè)計(jì) 將BBI表通過特殊的方式保存,以后通過此種方式的逆向來識別BBI表。壞塊映射表區(qū)的3個(gè)塊的設(shè)計(jì)方法如下: (1)在每塊最后一頁的首字節(jié)處做特殊標(biāo)記,用于標(biāo)識該塊有沒有準(zhǔn)備被擦除:0xFF表示沒有準(zhǔn)備被擦除;0x00表示該塊已經(jīng)準(zhǔn)備被擦除4。 (2)在每塊的倒數(shù)第二頁的首字節(jié)處寫0x00,表示該塊存放BBI表數(shù)據(jù);并在第2、3、4、5個(gè)字節(jié)處以大端模式存放校驗(yàn)和,用于校驗(yàn)該塊中存放的所有數(shù)據(jù)的正確性。該頁的剩余字節(jié)寫0xFF。 &
48、#160; (3)在第一頁起依次寫:表頭特殊標(biāo)記(0x0055AAFF)、壞塊總數(shù)(FlashBadBlockCount)、BBI表(FlashBadBlockTable)、重映塊狀態(tài)(FlashRemapBlockStatus),其結(jié)構(gòu)如圖3所示。3.3 邏輯地址映射 在與主機(jī)批量數(shù)據(jù)傳輸時(shí),首先對主機(jī)發(fā)送的CBW命令解析,從而固件獲得主機(jī)請求數(shù)據(jù)傳輸?shù)腖BA,再對LBA地址映射以此獲得相應(yīng)的PBA,然后再執(zhí) 行主機(jī)命令。具體方法:首先讀取當(dāng)前總的壞塊數(shù)FlashBadBlocksCount,如果為0,表示無壞塊,LBA就不用映射,直接返回;如
49、果最后一 次訪問地址與LBA同屬于一個(gè)塊,那么也不用地址映射;如果當(dāng)前壞塊的數(shù)量為1,判斷LBA塊地址與BBI表中壞塊地址是否相同,從而決定是否采取地址映 射;如果當(dāng)前壞塊的數(shù)量不為1,就需要查找BBI表判斷是不是含有LBA的塊地址,如果存在,則要地址重新映射,如果不存在,就不用重新映射??梢圆捎枚?分法查表實(shí)現(xiàn)兩地址快速比較4。3.4 壞塊處理 對映射后的地址進(jìn)行寫或擦除過程中發(fā)現(xiàn)當(dāng)前塊變壞的處理方法:首先查找映射區(qū)中的塊狀態(tài) FlashRemapBlockStatusFLASH_BAD_BLOCKS_REMAP,尋找可用的映射塊。如果50個(gè)重映塊都被標(biāo)記
50、為壞或已使 用,則程序進(jìn)入死循環(huán);如果找到可用的映射塊,則固件對可能出現(xiàn)壞塊的三種情況進(jìn)行散轉(zhuǎn):(1)擦除當(dāng)前塊時(shí)出錯(cuò):將當(dāng)前塊地址與可用的重映塊地址寫入 BBI表中,按地址大小排列有利于二分法查表,并返回重映塊地址。(2)復(fù)制某頁從交換區(qū)到操作地址時(shí)失?。菏紫全@得當(dāng)前使用的交換塊的塊地址,然后判斷 操作地址是在數(shù)據(jù)存儲區(qū)還是在重映區(qū)。如果在重映區(qū),說明當(dāng)前操作地址所對應(yīng)的在數(shù)據(jù)存儲區(qū)中的塊已經(jīng)是壞塊,并且在這次操作中重映塊也變壞,此時(shí)就應(yīng)該 標(biāo)記當(dāng)前映射塊狀態(tài)為壞,并在重映區(qū)中尋找下一個(gè)可用重映塊,將原來在數(shù)據(jù)存儲區(qū)中的塊地址與更新后的映射塊地址寫入BBI表中,并返回新的映射后的地 址;如果
51、在數(shù)據(jù)存儲區(qū),就進(jìn)行第一次重映射,更新壞塊表,并且將映射地址返回。然后再完成復(fù)制工作。(3)向操作地址寫一頁數(shù)據(jù)時(shí)出錯(cuò):將當(dāng)前地址所在塊 中的前面頁從交換塊中相應(yīng)地址復(fù)制到重映塊,然后將操作地址所在當(dāng)前頁中的沒有寫到的數(shù)據(jù)從交換塊中復(fù)制,并將緩沖區(qū)中的數(shù)據(jù)重新寫到重映射的地址中,并 返回重映射地址。函數(shù)實(shí)現(xiàn)如下: 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ù)讀寫操作 當(dāng)主機(jī)與設(shè)備建立批量傳輸
60、數(shù)據(jù)連接時(shí),固件通過解析CBW封包獲得起始LBA。對該地址進(jìn)行映射和壞塊管理從而獲得PBA。設(shè)置一個(gè)變量,當(dāng)此變量有效 時(shí),表示主機(jī)對Flash仍需要讀或?qū)憯?shù)據(jù),直到此變量失效為止。同時(shí)將主機(jī)上一次讀寫扇區(qū)的地址存入另一個(gè)變量,此變量在連續(xù)讀中作用不大,但在連續(xù)寫 時(shí),通過與上一次寫操作地址所在塊做比較,判斷是否同屬一個(gè)塊,以此決定是不是需要進(jìn)行地址跨塊處理。 本文設(shè)計(jì)了一種針對NAND型的閃存轉(zhuǎn)譯層,使NFTL完成地址映射和壞塊管理以及連續(xù)讀寫數(shù)據(jù)的操作。對NAND Flash的分區(qū)設(shè)計(jì),使塊管理結(jié)構(gòu)清晰,有利于固件的開發(fā)。本文沒有對Flash的ECC校驗(yàn)進(jìn)行過多的設(shè)計(jì),這是因?yàn)樵趯?shí)際應(yīng)用中NAND Flash主要用于存儲多媒體數(shù)據(jù)(圖片、語音文件)等,并不會(huì)對它進(jìn)行頻繁的寫入或擦除操作,而且多媒體文件數(shù)據(jù)對數(shù)據(jù)的完整性不敏感5,所以不需 要對存儲在其中的每一位數(shù)據(jù)進(jìn)行嚴(yán)格的ECC校驗(yàn),可以通過另外設(shè)計(jì)簡單的校驗(yàn)方法來代替ECC校驗(yàn)。3、參考ST官方資料計(jì)算
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年車展環(huán)境保護(hù)與清潔服務(wù)協(xié)議
- 2024年量子計(jì)算機(jī)研發(fā)與投資合同
- 2024年綠色供應(yīng)方環(huán)境協(xié)議3篇
- 2024版竇姣的離婚協(xié)議書
- 2025年度LED顯示屏工程設(shè)計(jì)與施工總承包合同3篇
- 2025年度移民定居投資分析與風(fēng)險(xiǎn)評估合同協(xié)議3篇
- 2025年度股東持股分紅權(quán)轉(zhuǎn)讓合同3篇
- mcn主播藝人經(jīng)紀(jì)合同完整版范本文
- 2024年能源管理系統(tǒng)研發(fā)與應(yīng)用合同
- 2025年度邊坡支護(hù)與護(hù)壁樁施工新型施工工藝研發(fā)與應(yīng)用合同3篇
- JJF(京) 3029-2023 醫(yī)用(硬性)內(nèi)窺鏡校準(zhǔn)規(guī)范
- 工業(yè)數(shù)字孿生要求
- 固體礦產(chǎn)資源儲量核實(shí)報(bào)告編寫規(guī)范2
- GB/T 44592-2024紅樹林生態(tài)保護(hù)修復(fù)技術(shù)規(guī)程
- 人教版(2024新版)七年級上冊生物期末復(fù)習(xí)全冊知識點(diǎn)提綱
- 期末達(dá)標(biāo)測試卷(二)(試卷)-2024-2025學(xué)年冀教版數(shù)學(xué)四年級上冊
- 2024-2030年中國干燥設(shè)備行業(yè)研發(fā)創(chuàng)新狀況及發(fā)展行情監(jiān)測報(bào)告
- GB/T 44413-2024城市軌道交通分類
- GB 19041-2024光氣及光氣化產(chǎn)品生產(chǎn)安全規(guī)范
- 拔除氣管導(dǎo)管的護(hù)理
- 2024年大學(xué)英語四六級考試大綱詞匯
評論
0/150
提交評論