天天看點

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 

         ----------------------------------- ---  

        塊裝置驅動             :知道如何去優化,電梯排程算法

       -------------------------------------

硬體:磁盤   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源代碼情景分析》這本書來的。

繼續閱讀