【驅動】Flash設備驅動基礎·NOR·NAND

Flash存儲器


——》Flash存儲器是近幾年來發展最快的存儲設備,通常也稱作閃存。Flash屬於EEPROM(電可擦除可編程只讀存儲器),是一類存取速度很高的存儲器。


——》它既有ROM斷電可保存數據的特點,又有易於擦寫的特點。Flash可以在斷電的情況下長期保存信息,因此被廣泛的應用在PC機的BIOS和嵌入式系統的存儲設備。



Linux Flash驅動結構


——》Linux內核對Flash存儲器有很好的支持。內核設計了一個MTD結構支持Flash設備,用戶只需要按照MTD的要求設置Flash設備的參數並且提供驅動就可以讓Flash設備很好的工作。



MTD概述


——》MTD是英文Memory Technology Device的縮寫,中文可以直接譯爲內存技術設備。


——》MTD是Linux內核爲支持閃存設備的一個驅動中間層。


——》對內核其他部分來說,MTD屏蔽了閃存設備的細節;對於閃存設備驅動來說,只需要向MTD中間層提供接口就可以向內核提供閃存設備支持。



MTD系統結構


——》Linux內核MTD設備相關代碼在drivers/mtd目錄下,設計MTD的目的是讓新的閃存設備使用更簡單。MTD設備可以分層四層。


——》如圖所示,內核 MTD從上到下可以分成設備節點、MTD設備層、MTD原始設備層和硬件驅動層在內核中,文件系統和根文件系統都可以建立在 MTD基礎上。



設備節點層


——》通過 mknod命令可以在 /dev目錄下建立 MTD字符設備節點(主設備號 90)和 MTD塊節點(主設備號 31),通過設備節點可以訪問 MTD字符設備和塊設備。



MTD設備層


——》MTD設備層基於 MTD原始設備,向上一層提供文件操作函數,如 lseek()、open()、close()、read()、write()等。


——》MTD塊設備定義了一個描述 MTD塊設備的結構 mtdblk_dev,並且申明瞭一個 mtdblks數據用於存放系統所有註冊的 MTD塊設備。



MTD原始設備層


——》MTD原始設備層由兩部分組成,一部分包括 MTD原始設備的通用代碼,另一部分包括特定的 Flash數據,如閃存分區等。MTD原始設備的 mtd_info結構描述定義了有關 MTD的大量數據的操作函數。


——》drivers/mtd/mtd_core.c文件定義了 mtd_table全局變量作爲 MTD原始設備列表,drivers/mtd/mtd_part.c定義了 mtd_part全局變量作爲 MTD原始設備分區結構,其中包含 mtd_info結構。


——》在內核中每個 MTD分區都被當作一個 MTD原始設備加入到 mtd_table中進行處理。


——》drivers/mtd/maps目錄存放的是特定的閃存數據,該目錄下每個文件都對應一種類型開發板上的閃存。通過調用內核提供的 add_mtd_device()函數可以建立一個 mtd_info結構並加入到 mtd_table中,通過 del_mtd_device()函數可以從 mtd_table中刪除一個閃存設備。



硬件驅動層


——》硬件驅動層負責在系統初始化的時候驅動閃存硬件。


——》Linux內核 MTD技術中,比較難理解的是設備層和原始設備層的關係,如下所示



——》一個 MTD原始設備可以通過 mtd_part結構被分成多個 MTD原始設備,然後註冊到 mtd_table中。


——》mtd_table列表中,每個 MTD原始設備都可以註冊爲一個 MTD設備。其中,字符設備的主設備號是 90,次設備號奇數是隻讀設備,偶數是可讀寫設備;塊設備的主設備號是 31,次設備號爲連續的自然數。



Flash設備基礎


——》NAND和NOR是兩種不同的Flash存儲技術,它們各有不同,適合不同的工作範圍。編寫一個閃存設備的驅動不僅需要了解MTD的結構,還需要知道閃存設備的硬件原理。



存儲原理


——》NAND和NOR閃存都使用三端器件作爲存儲單元,和模擬電子技術裏面的一種叫做場效應管的器件原理類似。三端器件分別有源極、漏極和柵極,柵極利用了電場效應控制源極於漏極之間的通斷。


——》從上可以看出,三端器件的底部是一個硅基,用來存放材料,浮置柵極是由氮化物夾在兩層二氧化硅中間構成的,中間的氮化物可以存儲電荷,達到存儲數據的目的。


——》程序向數據單元寫入數據的過程就是向浮置柵極中間注入電荷的過程。


——》從物理角度看,寫入數據有熱電子注入(Hot Election Injection)和 F-N隧道效應(Fowler Nordheim Tunneling)。這兩種技術的區別是,一種通過源極給浮置柵極充電,另一種通過硅基給浮置柵極充電。通常 NOR Flash使用熱電子注入方式,而 NAND Flash使用 F-N隧道效應充電。


——》Flash存儲器在寫入數據前必須把數據擦除,從物理角度看就是把浮置柵極的電荷釋放掉。兩種Flash都是通過 F-N隧道效應放電。


——》對程序來說,向浮置柵極注入電荷表示寫入了二進制數據 0,沒有注入電荷表示二進制 1.因此,擦除 Flash數據是寫 1,而不是寫 0,這點與傳統的存儲設備不同。


——》NOR和 NAND Flash具有相同的存儲單元,工作原理也相同,每次按照一定大小的塊讀取數據會降低存取時間,NAND Flash只能按照串行讀取數據,而 NOR Flash可以按照塊讀取數據。爲了讀取數據,必須對存儲單元進行編址。NAND Flash把存儲單元分成若干塊,每個塊又可以分成頁,每個頁是 512字節大小。NOR Flash的地址線是並聯方式的,因此 NOR可以使用直接尋址方式存取數據。



性能比較


——》NOR閃存的特點是支持片內執行(Execute In Place),應用程序不必加載到RAM就可以直接運行,簡化了軟件開發。NOR閃存的讀取速率非常高,但是容量通常不大,因爲容量大成本會顯著增大。此外,NOR閃存的寫入和擦除速度非常慢,不利於大量數據存儲。


——》NAND Flash特點是存儲密度高,寫入和擦除速度都比NOR Flash快,適合大數據量存儲。但是,NAND Flash需要特殊的存儲電路控制,並且空的或者已經擦除的單元才能寫入數據,所以必須在寫入數據之前先擦除塊。



NOR Flash設備驅動框架


——》Linux內核提供了map_info結構描述NOR Flash設備,驅動程序圍繞該結構操作,通過內核提供的註冊函數把芯片的信息提交給內核,並且提供必要的操作函數。


——》在一個 NOR Flash設備驅動程序中,主要需要考慮到初始化和清除兩個部分。


——》Linux內核 NOR Flash驅動程序與 MTD層的關係



——》典型的 NOR Flash驅動模型




NAND Flash設備驅動框架


——》NAND Flash設備使用nand_chip結構描述。該結構與 MTD層的關係如圖所示。



——》在 MTD層的映射下,編寫 Linux系統 NAND Flash設備驅動工作量相對較小,主要集中在向內核提供必要的設備硬件信息。


——》注意:內核提供了 ECC校驗算法,如果硬件沒有提供 ECC,則 nand_chip結構中的 calculate_ecc成員函數不需要設置。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章