S3C2440 Linux驅動移植 NAND驅動

2021-06-26 19:34:09 字數 3600 閱讀 2034

**

開發板:tq2440

核心:linux 2.6.32

pc os:ubuntu 11.04

本文將對nand驅動的移植進行簡單介紹。其中,將對nand控制器所需要的引數進行詳細說明。

開啟檔案arch/arm/plat-s3c24xx/common-smdk.c,修改mtd_partition結構體陣列。

修改後如下:

[cpp]view plain

copy

static

struct mtd_partition smdk_default_nand_part = ,  

[1] = ,  

[2] =   

[cpp]view plain

copy

};  

tq2440板上的nand為256m,請根據你的nand實際大小分配空間。

開啟檔案arch/arm/plat-s3c24xx/common-smdk.c,修改smdk_nand_info結構體。

修改後如下:

[cpp]view plain

copy

static

struct s3c2410_platform_nand smdk_nand_info = ;  

這裡的三個引數tacls,twrph0,和twrph1是如何給出的? 我們來分析下。

先看下這個結構體的定義,位於arch/arm/mach-s3c2410/include/mach/nand.h:

[cpp]view plain

copy

struct s3c2410_platform_nand ;  

看到了對這三個引數的說明,這裡提到了這三個引數的單位為納秒,請注意。

那麼這三個引數到底從哪來的呢? 它來自於s3c2440 nand 控制器的nfconf控制器,如下:

這幅時序圖同樣來自s3c2440的datasheet。

通過這幅圖和struct s3c2410_platform_nand中的注釋,我們可以對這3個引數做出如下定義。

tacls:表示在cle/ale拉高後,多少時間以後才允許將nwe拉低。

twrph0:表示nwe低電平持續的時間。

twrph1:表示nwe變為高電平後,多少時間後允許cle/ale拉低。

知道引數的意義後,我們來看下nand晶元k9f1208u0c的datasheet來確定這3個引數的值。

從這個時序圖,我們可以直觀地看到twp對應著引數twrph0,而tclh對於著引數twrph1。

但是tacls如何得出呢?從圖中並不能直接得出該引數的值,需要轉個彎,那就是將tcls減去twp,就可以得到tacls了。

綜上所述,為了得到nand控制器所需的3個引數,我們需要獲得該nand晶元的3個時序引數:twp,tcls和tclh。

通過查詢該nand的datasheet,3個時序引數的值如下:

twp=21, tcls=21, tclh=5。

將這3個時序引數轉為我們需要的3個引數,單位為納秒(ns):

tacls = tcls-twp = 21 - 21 = 0 ns

twrph0= twp = 21 ns

twrph1 = tclh = 5 ns

至此,就成功計算出三個引數的值了 。

在經過上述步驟後,編譯核心並將核心少入nand,啟動系統。在linux的啟動資訊中,會有如下輸出:

s3c24xx nand driver, (c) 2004 simtec electronics

s3c24xx-nand s3c2440-nand: tacls=1, 10ns twrph0=3 30ns, twrph1=1 10ns

s3c24xx-nand s3c2440-nand: nand hardware ecc

nand device: manufacturer id: 0xec, chip id: 0xda (samsung nand 256mib 3,3v 8-bit)

scanning device for bad blocks

bad eraseblock 781 at 0x0000061a0000

bad eraseblock 1113 at 0x000008b20000

bad eraseblock 1117 at 0x000008ba0000

bad eraseblock 1481 at 0x00000b920000

bad eraseblock 1566 at 0x00000c3c0000

bad eraseblock 1885 at 0x00000eba0000

creating 3 mtd partitions on "nand 256mib 3,3v 8-bit":

0x000000000000-0x000000040000 : "uboot"

0x000000200000-0x000000500000 : "kernel"

0x000000500000-0x000010000000 : "filesystem"

上述資訊表明以成功訪問了nand flash。

這裡,對第二行的輸出進行個說明。

uboot啟動將s3c2440的工作頻率 fclk:hclk:pclk = 8:4 :1,

而fclk為400mhz,那麼hclk為100mhz,根據nfconf暫存器的說明,暫存器中的這3個引數都跟hclk有關,必須為1/hclk的倍數,

也就是1/100mhz=10ns的倍數。

通過上面第二行的輸出資訊,twrph0為 30ns而twrph1為10ns,這是顯而意見的。

由於引數必須為10ns的倍數,而且必須大於datasheet給出的值,因此向上取到10的倍數,也即5ns取到10ns,21ns取到30ns。

那麼為什麼tacls是10ns呢?明明給出的是0ns,是不是驅動不允許引數為0ns?

在s3c2440的nand驅動中,引數的值是通過如下函式確定的:

[cpp]view plain

copy

static

int s3c_nand_calc_rate(int wanted, unsigned long clk, int max)  

if (result 

result = 1;  

return result;  

}  

引數wanted就是0(ns),而clk即為hclk/1000。

div_round_up巨集將返回0,但是if對result進行了限制,也就是不允許小於0,因此將引數值設定為1,並返回給呼叫函式。

Linux 2 6 26 在S3C2440上的移植

我使用的板子與s3c2440的公板差不多,linux2.6.26對smdk的板支援得比較好,改動不多,這裡只對過程做乙個簡單的記錄。開發環境 vmware ubuntu 8.10,虛擬機器配置了兩個網絡卡,乙個是bridge連線,用來在虛擬機器中訪問網際網路 乙個是nat連線用來搭samba伺服器與...

S3C2440 UART串列埠驅動

通用非同步接收器和傳送器 universal asynchronous receiver and transmitter 簡稱uart。通常是嵌入式裝置中預設都會配置的通訊介面。這是因為,很多嵌入式裝置沒有顯示屏,無法獲得嵌入式裝置實時資料資訊,通過uart串列埠和超級終端相連,列印嵌入式裝置輸出資...

s3c2440 LCD驅動編寫

struct lcd regs static struct fb ops s3c lcdfb ops static volatile unsigned long gpbcon static volatile unsigned long gpbdat static volatile unsigned ...