一.框架總結
二.硬體原理
相比於nor flash。我們能夠清楚的看出引腳少了非常多,主要是輸入輸出引腳進行了復用。如今我說下各引腳的用途。
a.ldata0~ldata7這8個引腳為輸入輸出引腳。
命令、位址、資料的傳輸都是由這8個引腳實現的(引腳復用,節約引腳)。
b.rnb:此引腳用來判忙。由於命令、資料、位址發出去和收到時候不能立馬就完畢。須要乙個時間。
此引腳為高電平時表示就緒,低電平時候表示正忙。
c.nfce、nfwe、nfce
各自是晶元使能、寫使能、和讀使能。舉個樣例,就是說假如你想讀資料、命令、位址時候。
必須先使能nfce、nfce(就是這兩個引腳為低電平)。
d.cle、ale兩個引腳是指令鎖時能和資料鎖使能。
三.驅動程式
/* 參考
* drivers\mtd\nand\s3c2410.c
* drivers\mtd\nand\at91_nand.c
*/#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /*用到的暫存器*/
struct s3c_nand_regs ;
static struct nand_chip *s3c_nand; //nand_chip結構體
static struct mtd_info *s3c_mtd;
static struct s3c_nand_regs *s3c_nand_regs;
static struct mtd_partition s3c_nand_parts = ,
[1] = ,
[2] = ,
[3] =
};/*推斷是否選中*/
static void s3c2440_select_chip(struct mtd_info *mtd, int chipnr)
else }
/*推斷發命令,還是位址*/
static void s3c2440_cmd_ctrl(struct mtd_info *mtd, int dat, unsigned int ctrl)
else }
/*推斷狀態*/
static int s3c2440_dev_ready(struct mtd_info *mtd)
static int s3c_nand_init(void) //入口函式
static void s3c_nand_exit(void) //出口函式
module_init(s3c_nand_init);
module_exit(s3c_nand_exit);
module_license("gpl");
四.驅動分析
1.總體分析
1.1分配乙個nand_chip結構體並對映相關暫存器
1.2設定nand_chip(設定nand_chip是給nand_scan函式使用的, 假設不知道怎麼設定, 先看nand_scan怎麼使用。它應該提供:選中,發命令,發位址,發資料,讀資料,推斷狀態的功能)
1.3硬體相關的設定: 依據nand flash的手冊設定時間引數
1.4使用: nand_scan
1.5add_mtd_partitions 加入分割槽(分割槽在s3c_nand_parts結構體中進行設定)
2.暫存器介紹
2.1 nfstat(狀態暫存器。主要判忙)
s3c_nand->dev_ready = s3c2440_dev_ready; //推斷狀態
2.2 nfcmmd(命令暫存器)和nfaddr(位址暫存器)
2.3 nfcont(控制暫存器)
/* nfcont: bit1-設為1, 取消片選。 bit0-設為1, 使能nand flash控制器*/
2.4 nfconf(配置暫存器)
/* hclk=100mhz
* tacls: 發出cle/ale之後多長時間才發出nwe訊號, 從nand手冊可知cle/ale與nwe能夠同一時候發出,所以tacls=0
* twrph0: nwe的脈衝寬度, hclk x ( twrph0 + 1 ), 從nand手冊可知它要》=12ns, 所以twrph0>=1
* twrph1: nwe變為高電平後多長時間cle/ale才幹變為低電平, 從nand手冊可知它要》=5ns, 所以twrph1>=0
左圖為2440nand時序。右面為nand手冊要求時序。最後乙個圖為詳細數值。
以下這三個圖計算最小值。
tacls = tcls-twp=12-12=0
twrph0= twp
=12
twrph1= tclh =5
3.ecc校驗
因為nand flash的工藝特性。所以nand flash有乙個缺點就是位反轉。所以增加了ecc校驗。
詳細怎麼實現呢?
nand flash的儲存是以頁為單位的。它在每頁的後面增加了oob(16位元組),這裡面存的就是ecc的值。怎樣工作?
a.寫每頁的時候生成ecc,將ecc寫入obb
b.當讀每頁的時候先算出ecc,然後讀obb的ecc。兩個ecc進行比較。
詳細的演算法實現比較複雜,我在這裡僅僅是簡單的說一下,有興趣的能夠深入研究。
塊裝置驅動程式之nandflash 基本框架
我們先檢視核心的啟動資訊,以搞清楚從哪個檔案著手來分析 s3c24xx nand driver c 2004 simtec electronics s3c2440 nand s3c2440 nand tacls 3,30ns twrph0 7 70ns,twrph1 3 30ns nand devi...
塊裝置驅動之nandflash 簡單程式分析
本節裡面我們實現乙個簡單的nandflash驅動程式,我們先來看 參考 drivers mtd nand s3c2410.c drivers mtd nand at91 nand.c include include include include include include include in...
linux驅動之塊裝置驅動
塊裝置驅動的系統架構 塊裝置註冊過程 1,註冊裝置塊驅動程式 register blkdev 2,初始化請求佇列 blk init queue 3,指明扇區的大小 blk queue logical block size dev queue,sect size 4,申請乙個gendisk結構,初始化...