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

Flash存儲器算法


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


——》它既有ROM斷電可保存數據的特色,又有易於擦寫的特色。Flash能夠在斷電的狀況下長期保存信息,所以被普遍的應用在PC機的BIOS和嵌入式系統的存儲設備。框架



Linux Flash驅動結構ide


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



MTD概述性能


——》MTD是英文Memory Technology Device的縮寫,中文能夠直接譯爲內存技術設備。大數據


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


——》對內核其餘部分來講,MTD屏蔽了閃存設備的細節;對於閃存設備驅動來講,只須要向MTD中間層提供接口就能夠向內核提供閃存設備支持。設計



MTD系統結構3d


——》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成員函數不須要設置。

相關文章
相關標籤/搜索