1、關鍵操作
(1)分配nand_chip結構體
(2)配置結構體的相關成員
(3)硬體相關的配置
2、最重要的函式(nand flash初始化函式)
int s3c_nand_init(void)
nand_ecc_modes
這是個列舉型別啊 ,如果不定義值,那麼預設從0開始順序定義,即nand_ecc_none=0,nand_ecc_soft=1,nand_ecc_hw=2,nand_ecc_hw_syndrome=3
/* 3. 硬體相關的設定: 根據nand flash的手冊設定時間引數 */
/* 使能nand flash控制器的時鐘 */
clk = clk_get(null, "nand");
clk_enable(clk); /* clkcon'bit[4] */
/* 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
*/#define tacls 0
#define twrph0 1
#define twrph1 0
//這裡nfconf是nand flash配置暫存器
s3c_nand_regs->nfconf = (tacls<<12) | (twrph0<<8) | (twrph1<<4);
/* nfcont: 是nand flash控制暫存器
* bit1-設為1, 取消片選
* bit0-設為1, 使能nand flash控制器
*/s3c_nand_regs->nfcont = (1<<1) | (1<<0);
/* 4. 使用: nand_scan */(分配mtd_info結構體並對成員進行設定)
s3c_mtd = kzalloc(sizeof(struct mtd_info), gfp_kernel);
s3c_mtd->owner = this_module;
s3c_mtd->priv = s3c_nand;(私有成員指向nand_chip結構體)
//左邊引數是mtd_info結構體,右邊引數是
nand_scan(s3c_mtd, 1);/* 識別nand flash, 構造mtd_info */
/* 5. add_mtd_partitions */
//左邊引數是mtd_info結構體,中間引數是mtd_partition 結構體,右邊引數是
add_mtd_partitions(s3c_mtd, s3c_nand_parts, 4);
//add_mtd_device(s3c_mtd);
return 0;
}3、mtd_partition結構體陣列
static struct mtd_partition s3c_nand_parts =
};
Nand Flash驅動程式編寫指南 3
下面開始分析 nand flash 時序圖,並以讀操作為例編寫 nand flash 驅動,先看下我們應該發什麼命令讀資料,下面是資料手冊的命令集合 由上可以看出,要讀取資料,只需要傳送乙個命令週期,發 00h或 01h。知道了發什麼命令,再來看如何傳送命令,下面是讀命令的時序圖 上面圖的紅線處,它...
NAND Flash的驅動程式設計
摘要 以三星公司k9f2808uob 為例,設計了nand flash與s3c2410 的介面電路,介紹了nand flash在arm嵌入式系統中的設計與實現方法,並在uboot上進行了驗證。所設計的驅動易於移植,可簡化嵌入式系統開發。引言當前各類嵌入式系統開發設計中,儲存模組設計是不可或缺的重要方...
NAND FLASH驅動注意事項
1.nand flash寫入只能由1寫為0,所以寫入前必須先擦除,擦除後所有資料為1.2.2k大頁面的64位元組冗餘資料按照飛凌的定義為 第0位為壞塊標記,第1 4位為2k頁面的ecc校驗,其他為0xff。3.k9f1g08u0b的位址線有28根,對應空間應該是256mb,而實際空間為128mb,我...