參考文件 drivers\mtd\nand\s3c2410.c(當內核啓動時,會打印相關nand的信息,搜索相關打印信息,找到這個文件)
內核提供的nand flash 驅動例子,從這個例子中我們可以總結出nand flash 的框架,進而總結出如何寫一個nand_flash驅動程序。
(1)內核源代碼中支持s3c開發板的nand flash 驅動程序分析。
s3c2410_nand_init
platform_driver_register(&s3c24xx_nand_driver)
s3c24xx_nand_probe
s3c2410_nand_inithw //初始化硬件
s3c2410_nand_setrate //設置nand 主機控制器時序
s3c2410_nand_init_chip
struct nand_chip *chip = &nmtd->chip;
設置nand_chip
nand_scan_ident //掃描nand設備,nand_scan函數的第一個參數
s3c2410_nand_update_chip(info, nmtd);
nand_scan_tail(&nmtd->mtd); //nand_scan 函數的第二個參數
s3c2410_nand_add_partition(info, nmtd, sets);
mtd_device_parse_register
parse_mtd_partitions
//判斷選擇
add_mtd_partitions //解析分區表成功
add_mtd_device
add_mtd_device
list_for_each_entry(not, &mtd_notifiers, list) // &mtd_notifiers在哪裏設置?
not->add(mtd);
.......
add_disk() //註冊塊設備
(2)nand flash 框架:
app: open read write
--------------------------------------------
vfs: sys_open sys_read sys_write
----------------------------------- ---
塊設備驅動 :知道如何去優化,電梯調度算法
-------------------------------------
硬件:磁盤 光盤 MTD :關鍵結構體 mtd_info 結構體
---------------------
Nand Flash 協議層 : 知道發什麼,但是不知道怎麼發送,nand flash的共性已經抽象出來
----------------------
Nand Flash :知道如何去發送數據和命令
(3)nand flash 驅動編寫:
1) 分配一個nand_chip 結構體。
2) 設置。
3)把這個nand_chip 結構體用起來,如何用起來,調用下面兩個函數。
3.1) nand_scan()函數 : 主要是爲了產生一個 mtd_info結構體,用nand_chip 來填充
3.2) add_mtd_partitions ()函數:裏面最終會調用到 add_disk()函數,從而註冊塊設備。
(4)nand flash 讀 的大致過程
最終會調用到 ll_rw_block 函數,在 ll_rw_block 函數裏面主要是優化讀寫順序(電梯調度算法),調用請求隊列處理函數,在請求隊列處理函數裏面我們會調用mtd層向上提供的讀寫接口函數,在讀寫接口函數裏面,我們會調用mtd_info結構體的讀寫函數,而mtd_info結構體是有nand_chip提供的,最終就會調用到我們在nand_chip裏面設置的相關函數。
把這個讀的過程理解了,nand flash 驅動的框架就理解了。
注:ll_rw_block函數是根據《linux源代碼情景分析》這本書來的。