參考檔案 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
----------------------------------- ---
塊裝置驅動 :知道如何去優化,電梯排程算法
-------------------------------------
硬體:磁盤 CD光牒 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源代碼情景分析》這本書來的。