Nand Flash驅動程序編寫(linux 3.4.2內核)

參考文件  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源代碼情景分析》這本書來的。



 

                

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章