Linux nand controller驅動開發指導(Linux mtd子系統專欄分析之六)

        在前面的兩章,我們基本上完成了nand驅動模型的介紹以及nand_chip的註冊說明,本章我們主要說明如何進行nand controller驅動的開發,以及我們在進行nandflash的適配時,需要注意的事項。本章的主要內容如下:

一、 nand controller驅動開發流程說明

二、nandflash適配注意事項說明

 

一、 nand controller驅動開發流程說明

      在此前的文章中,我們已經介紹了nand controller抽象而來的結構體爲struch nand_chip(建議大家在開本篇文章時,請先看下之前兩篇文章,以便對nand controller驅動模型有一個邏輯的概念)。

  1. 創建一個platform driver驅動,以便實現nand_controller芯片相關私有數據與驅動的分離(關於platform模型的使用方式以及好處,請參考我之前寫的文章)。
  2. 在platform的probe接口中,開始進行struct nand_chip類型變量內存空間的申請及初始化,需要設置的內容如下:
    1. 設置nand_chip的IO_ADDR_R、IO_ADDR_W地址,該地址主要用於nanflash數據的讀寫操作(如在nand_chip->read_buf、nand_chip->write_buf等接口中);
    2. 設置nand_chip->ecc變量,主要設置ecc及其相關的讀寫接口,若該nand_controller支持硬件ecc,則需要根據platform_device中傳遞的resource信息,設置硬件ecc類型,並設置ecc使能hwctl、ecc校驗接口calculate、ecc糾錯接口correct、read_page_raw、write_page_raw、read_page、read_subpage、write_subpage、write_page、write_oob_raw、read_oob_raw、read_oob、write_oob等函數指針,並設置每頁數據執行ecc校驗的次數、單次進行數據ecc計算的字節數、產生的ecc字節數等(如ti omap2的nand chip驅動,針對硬件bch4、bch8,其設置的接口爲omap_elm_correct_data、omap3_calculate_ecc_bch、omap_read_page_bch、omap_write_page_bch、omap3_enable_hwecc_bch、nand_chip.ecc.size、nand_chip.ecc.mode、nand_chip.ecc.strength、nand.ecc.bytes);
    3. 設置與nandflash進行命令通信的函數指針,針對ti omap2的nand chip驅動而言,其設置如下nand.cmd_ctrl  = omap_hwcontrol;
    4. 設置與nanflash進行數據通信的接口以及壞塊標記以及芯片選擇相關的接口,這主要涉及到如下一些函數指針的設置read_byte、read_word、write_buf、read_buf、block_bad、block_markbad、select_chip、block_bad、erase_cmd、scan_bbt、errstat等接口(這些接口不是需要全部設置的,在ti omap2的驅動中,僅設置了dev_ready、read_buf、write_buf等接口,而對其他接口並沒有設置,那這些接口在哪裏設置呢?在上一章我們介紹的nand_scan_identnand_scan_tail接口中,針對nand_chip中未進行初始化的函數指針,會設置nand驅動模塊定義的通用接口)。
    5. 設置oob中存儲ecc的字節數以及每一個ecc字節在oob中的偏移位置;
    6. 調用nand_scan_ident、nand_scan_tail接口,完成nand_chip中page size、block size、erase size、nand flash size等參數的設置,並針對nand_chip中尚未設置的函數指針的設置,並完成該nand_flash對應的mtd_info類型變量中flash參數的設置以及其對應的mtd接口的設置(針對這些內容已在上一篇文章中介紹,此處不再贅述)
    7. 調用mtd_device_parse_register接口,完成該nandflash各分區的對應的mtd_info的註冊(若沒有對nandflash分區,則將該master mtd_info註冊至系統中,也就是完成mtd_info對應的額塊設備、字符設備的註冊等等,這些內容已在上幾篇文章中說明)。

        完成以上內容即可完成nand_controller的驅動開發。

 

 

 

二、nandflash適配注意事項說明

nandflash參數設置說明

       在我們進行開發板的適配時,若需要適配的nandflash不支持onfi規範,則我們需要在變量struct nand_flash_dev nand_flash_ids[] 中檢測下我們所使用的的nandflash相關的參數是否已在定義中,若沒有添加即可,添加規則如下圖所示。

 

           若nandflash支持onfi接口,則無須在nand_flash_ids中設置相關參數,由nand驅動模型中的nand_flash_detect_onfi函數即可通過與nandflash通信,獲取writesize、erasesize、oobsize、chipsize等信息即可。

         nandflash對應分區屬性設置

       我們知道nandflash容易出現bit翻轉的情況,因此我們在進行分區劃分時,針對boot分區、kernel分區,可以將分區屬性設置爲只讀屬性;另外針對文件系統分區,我們可以劃分多個文件系統分區,對於系統程序、系統文件、系統庫文件可單獨劃分爲一個分區,而針對需要大量讀寫操作的部分,可單獨劃分一個分區。

       例如如下的分區劃分,我們只需要將mask_flags設置爲MTD_WRITEABLE,即可將該分區設置爲只讀分區。另外針對文件系統,我們也可以選擇只讀文件系統類型,將文件系統設置爲只讀。

 

nandflash的oob設置

        我們知道nandflash容易出現bit翻轉,但會通過糾錯算法,對出現bit翻轉位進行糾錯,這就涉及到計算的ecc值存放的問題,目前這些值存放在nandflash的oob中,因此在驅動開發中,需要確定ecc存儲在oob中的位置以及大小,並確保boot和kernel中設置的參數相同,針對kernel,其對應的數據結構如下所示。

 

 

 

以上即爲本篇文章的主要內容,主要說明了nand controller以及nandflash適配相關的注意事項,希望對大家的工作開發有所幫助。

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