1. 程式人生 > >嵌入式Linux——nand flash 驅動開發(一):硬體介紹

嵌入式Linux——nand flash 驅動開發(一):硬體介紹

本文章講nand flash的驅動開發,而在介紹驅動程式之前我想先介紹一下我所用的硬體。這樣對程式的開發更為方便。本文所使用的nand flash晶片為K9F2G08U0C,下面是他的一些必要的特性:

•支援電壓
- 3.3V device(K9F2G08U0C): 2.70V ~ 3.60V
• 組成
- Memory Cell Array : (
256M + 8M) x 8bit
- Data Register : (2K + 64) x 8bit
• 自動編碼和擦除
- Page Program : (2K + 64)Byte
- Block Erase : (128K + 4K)Byte

• Page Read Operation

- Page Size : (2K + 64)Byte

而他的示意圖為:

從上圖我們可以知道:

一頁有:(2K+64)byte ,其中2KByte為頁記憶體是資料區,而64byte位oob的資料存放的是資料校驗碼。

而一塊有:64頁,一個裝置有2048塊。

     我們介紹完nand flash的儲存結構就應該介紹nand flash的定址方式了。我們要知道nand flash的定址方式是和他的記憶體方式密切相關的,nand flash的資料以bit的方式儲存在memory cell,一個cell中只能儲存一個bit。而這些cell以8個或者16個為單位,連成bit line,形成byte(x8)/word(x16),這就是nand的資料寬度。

    這些Line會再組成Page,就像上面所介紹的那樣,一頁有(2K+64)byte ,一塊有:64頁,一個裝置有2048塊。

    而像上邊介紹裝置特徵介紹的:該裝置程式設計/讀取是按照page為單位完成的,而擦除是按照block為單位完成。

    所以通過上面的介紹我們就知道nand flash有2048 個塊,每個塊內有 64 頁,每個頁是 2K+64 Bytes。那麼他是怎麼找到對應位置上的資料的那?

其實他的  實體地址=塊大小*塊號+頁大小*頁號+頁內地址

    從上圖可以看出,該FLASH的地址週期一共有5個,2個列地址(Column)週期,3個行地址(Row)週期

     a)對應的列地址就是頁內地址,該flash一個頁的大小是2K即2048個位元組,所以它的地址範圍是0~2047,對應的上圖的列地址A0-A10就是頁內地址。你可能會發現多出了一個A11,從A0-A11,這樣一共就有了12位,那它的地址範圍就是0~2^12,即0~4096了,實際上,由於我們訪問頁內地址,可能會訪問到 oob 的位置,即 2048-2111 這 64 個位元組的範圍內,所以,此處實際上只用到了 2048~2111,用於表示頁內的 oob 區域,其大小是 64位元組。

    b)對應地,A12~A28,稱作頁號,頁的號碼,可以定位到具體是哪一個頁,該FLASH一共是64頁一共需要6位即A12~A17,而其中A18~A28表示對應的塊號,即屬於哪個塊。

    這裡有一個很重要的地方就是我們要傳入的地址的每一位,就是對應著上表中的 A0 到 A28 ,實際上上表中的 A11是比較特殊的,只有當我們訪問頁內地址處於 oob的位置,即屬於 2048~2111 的時候,A11才會其效果,才會用 A0-A11用來表示對應的某個屬於 2048~2111 的某個值,屬於 oob 的某個位置,而我們此處的頁內地址為 1208,還沒有超過 2047 呢,所以 A11肯定是 0。

    然後我們再來算上面我們要訪問的地址,假設,我們要訪問其中的第1000個塊中的第 25 頁中的1208位元組處的地址,此時,我們就要先把具體的地址算出來:

第 1000個塊中的第 25 頁中的 1208位元組處的地址它對應著的頁內地址為:

頁內地址 =1208Bytes=0x4B8

頁     號 =塊數*每塊多少頁 + 塊內的頁號=1000*64 + 25 =0xFA19

也就是我們要訪問0xFA19頁內的0x4B8地址,再把這個地址轉換成列和行地址

A0~A10是用來表示頁內地址的所以把0x4B8拆分成兩列

列地址1=0xB8,列地址2=0x04;

再把頁號0xFA19拆分成3行

行地址1=0x19,行地址2=0xFA,行地址3=0x0;

對應的看看linux2.6.35/driver/mtd/nand/nand_base.c中地址的傳送

上面的column即對應著頁內地址,通常情況是0,如果不是0則通過傳入進來的地址除於頁地址就可得到相應的列地址了。而 page_addr 即頁號,就是通過要訪問的地址,除於頁大小,即可得到。

下面我們就要對nand flash晶片的引腳,以及如何收發資料做一些介紹了。

首先介紹一下nand flash的引腳

I/O0 ~ I/O7

資料輸入/輸出口:這些IO口用於輸入命令,地址和資料,當在讀操作時輸出資料

CLE

命令鎖存使能:CLE輸入控制啟用命令進入命令暫存器的通道。當為高電平時,同時在WE的上升沿訊號時,命令可以鎖存到命令暫存器中。

ALE

地址鎖存使能:ALE輸入控制啟用地址資料進入內部地址暫存器的通道,當ALE為高電平同時WE為上升沿訊號時,地址值寫入地址暫存器。

CE

片選:CE是片選控制,當裝置在忙的狀態時,CE的高被忽略,同時,當裝置在程式設計或者在擦除時,裝置不會返回到待命狀態

RE

讀使能:當RE下降沿時寫入資料

WE

寫使能:上升沿時寫入命令地址或者資料

WP

防寫:

R/B

就緒/忙狀態輸出

Vcc

電源正極

Vss

電源地

N.C

不接

而在電路圖中nand flash的接法為:

介紹完引腳和電路圖,我們就要介紹nand flash晶片的主要工作模式以及要在不同工作模式下所對應的命令

從圖中我們可以看出nand flash大致可以完成:收命令,收地址,收資料,發資料以及擦除

而他們所對應的命令為:

下面我們以具體的例項進行說明:

寫操作:當片選CE為低電平,而命令鎖存使能CLE為高電平,而地址鎖存使能ALE為低電平,WE為上升沿時寫入第一個命令資料80h,然後命令鎖存使能CLE為低電平,而地址鎖存使能ALE為高電平,WE為每個上升沿時寫入一個地址資料,一共寫五個。而後命令鎖存使能CLE為低電平,而地址鎖存使能ALE為低電平,在每個WE的上升沿寫一個數據,直到資料寫完。而後命令鎖存使能CLE為高電平,而地址鎖存使能ALE為低電平,WE為上升沿時寫入命令資料10h。

讀操作:當片選CE為低電平,而命令鎖存使能CLE為高電平,而地址鎖存使能ALE為低電平,WE為上升沿時寫入第一個命令資料00h,然後命令鎖存使能CLE為低電平,而地址鎖存使能ALE為高電平,WE為每個上升沿時寫入一個地址資料,一共寫五個。而後命令鎖存使能CLE為高電平,而地址鎖存使能ALE為低電平,WE為上升沿時寫入命令資料30h。而後命令鎖存使能CLE為低電平,而地址鎖存使能ALE為低電平,在每個RE的下降沿讀一個數據,直到資料讀完。

上面我們介紹的是讀操作和寫操作的具體方式,我們可以注意到在上圖中各個引腳電平的高低變化是由時間限制的。而這些引腳要在這些時間限制內完成特定的操作,而這些時間的特性在下表中:

而在讀資料中有一些很重要的操作就是讀ID,通過讀取nand flash的ID我們可以知道該裝置的生產廠家,線寬,大小等重要資訊。下面就是讀ID的操作方式以及各引數的意義:

說完nand flash裝置,接下來我們就應該介紹一下S3C2440中的nand flash控制器以及一些重要的暫存器了。

        S3C2440的啟動程式碼可以在外部的nand flash上執行,為了支援nand flash的啟動指引,S3C2440在其內部SRAM中裝配了一個稱為“Steppingstone”的緩衝。當啟動時,nand flash上開始的4KBYTE 的資料被載入到Steppingstone中,而當啟動碼被載入到Steppingstone的同時啟動碼也被執行。

nand flash控制器框架圖:

        而在重啟時,nand flash控制器將通過引腳狀態(NCON(Adv flash), GPG13(頁容量), GPG14(地址週期), GPG15(匯流排寬度) – refer to PIN CONFIGURATION),獲得連線到的nand flash的資訊。上電或者重啟之後,nand flash控制器自動載入4Kbyte的啟動碼。之後再Steppingstone執行。

nand flash控制器同樣有時間的限制,不過他只有三個:

*TACLS:發出ALE/CLE之後多長時間才發出nWE訊號

 *TWRPH0:nWE的脈衝寬度,HCLK*(TWRPH0+1)

 *TWRPH1:nWE變為高電平後多長時間ALE/CLE能變為低電平,HCLK*(TWRPH1+1),

而下面是一些比較重要的暫存器

配置暫存器:

控制暫存器:

命令,地址,資料暫存器:

狀態暫存器:

上面就是與nand有關的硬體方面的介紹,而下一篇文章我們將對nand flash驅動的框架以及程式進行分析。