塊裝置驅動之nandflash 簡單程式分析

2021-06-09 18:59:58 字數 2854 閱讀 8238

本節裡面我們實現乙個簡單的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結構,初始化...