本節裡面我們實現乙個簡單的nandflash驅動程式,我們先來看**:
/* 參考
* 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;
static struct mtd_info *s3c_mtd;
static struct s3c_nand_regs *s3c_nand_regs;
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");
分析:首先我們先來看一下nandflash驅動的編寫步驟:
(1)分配乙個nand_chip
(2)設定這個nand_chip
(3)硬體相關的設定
(4)使用nand_scan和add_mtd_partitions
那麼下面我們就根據這個步驟來一步一步分析這個程式:
我們先分配乙個nand_chip,對這個結構體的設定是乙個比較糾結的過程,但是韋東山老師告訴我們乙個好辦法,nand_chip設定了是給
nand_scan用的,那麼我們只要看看它是怎麼用這個結構體的不就可以學著設定了嗎?果然是好主要!
我們從 nand_scan
出發,一步一步往下分析:
(1)我們發現有這麼個函式:select_chip(mtd, 0)
我們到函式:nand_set_defaults(chip, busw);裡面去看預設的設定,發現對
chip->select_chip 這個函式的設定比較坑爹,所以我們必須自己完成這個函式。這個函式的作用就是選通晶元,或者不選通晶元,這由
nfcont 的第一位來決定,為0是表示選通,1時表示不選通, 還是比較容易設定的。
(2)接下來又出現了函式:chip->cmdfunc(mtd, nand_cmd_readid, 0x00, -1);我們到
nand_set_defaults(chip, busw);裡面去看它的預設設定,然後發現
chip->cmdfunc函式最終會呼叫:chip->cmd_ctrl(mtd, readcmd, ctrl);這個函式,那麼我們需要對chip->cmd_ctrl(mtd, readcmd, ctrl);進行實現。這個函式的作用就是根據
ctrl來判斷傳遞的是位址、命令還是資料。也很容易實現。
(3)接下來是:maf_id = chip->read_byte(mtd);我們還是去看預設設定,發現這麼一句:readb(chip->io_addr_r);裡面的引數當然就是讀的位址了,所以我們還必須要設定讀位址。同樣寫位址也要設這的,方法一樣的。
(4)我們還需要獲取的是nandflash的狀態,因為我們需要判斷nandflash是不是忙。
(5)設定校驗碼:關於校驗碼我們還得好好說道一下呢!我們下來看一下nandflash的組織圖:
我們看到一頁裡面有2k加64b,其實儲存真正的資料的是2k,64b是用作ecc校驗的。它的原理如下:
當我們寫nandflash時,會根據寫入的資料計算出來ecc碼,並將ecc碼寫入64b的空間裡面。當我們讀資料時,會根據讀出來的資料從新計算出來ecc校驗碼,然後跟存放在64b空間裡面的ecc校驗碼相比較,如果一致說明沒有發生錯誤,否則是發生了錯誤。
(6)我們還需要乙個struct mtd_info結構體,並使其私有資料指向我們上面所設定的struct nand_chip結構體。
先貼兩張圖:
這兩張是s3c2440上的:
這兩張是nandflash晶元資料上面的:
我們先來說說我們要設定的三個時間引數的含義吧:
tacls: 發出cle/ale之後多長時間才發出nwe訊號
twrph0: nwe的脈衝寬度, hclk x ( twrph0 + 1 )
twrph1: nwe變為高電平後多長時間cle/ale才能變為低電平
比較兩幅時序圖我們發下如下對應關係(hclk=100mhz):
tacls*hclk=tcls-twp=12-12=0,所以
tacls=0
(twrph0+1)*hclk>=12ns,所以
twrph0>=1
(twrph1+1)*hclk>=5ns, 所以
twrph1>=0
於是可以設定:s3c_nand_regs->nfconf = (0<<12) | (1<<8) | (0<<4);
(8)對於nfcont,我們要先使能控制暫存器,但是要先取消片選。
塊裝置驅動之NAND FLASH驅動程式
一.框架總結 二.硬體原理 相比於nor flash。我們能夠清楚的看出引腳少了非常多,主要是輸入輸出引腳進行了復用。如今我說下各引腳的用途。a.ldata0 ldata7這8個引腳為輸入輸出引腳。命令 位址 資料的傳輸都是由這8個引腳實現的 引腳復用,節約引腳 b.rnb 此引腳用來判忙。由於命令...
塊裝置驅動程式之nandflash 基本框架
我們先檢視核心的啟動資訊,以搞清楚從哪個檔案著手來分析 s3c24xx nand driver c 2004 simtec electronics s3c2440 nand s3c2440 nand tacls 3,30ns twrph0 7 70ns,twrph1 3 30ns nand devi...
linux驅動之塊裝置驅動
塊裝置驅動的系統架構 塊裝置註冊過程 1,註冊裝置塊驅動程式 register blkdev 2,初始化請求佇列 blk init queue 3,指明扇區的大小 blk queue logical block size dev queue,sect size 4,申請乙個gendisk結構,初始化...