Linux nand驅動註冊相關接口說明(Linux mtd子系統專欄分析之五)

       在上一篇文章中,我們分析了nand驅動模型中接口抽象以及相關數據結構體的分析,本章我們主要說明nand驅動模型提供的nand controller驅動註冊以及nand驅動模塊提供的通用接口說明。本章主要包括如下幾個內容:

一、nand_controller驅動的註冊流程及功能說明

二、nand驅動模型中通用接口說明

 

 

一、nand_controller驅動的註冊流程及功能說明

 

    在前面幾章裏,我們已經介紹了mtd驅動模型、nand驅動模型以及mtd與nand的關聯、mtd與vfs之間的關聯。在這一小節中,我們主要介紹nand_chip(nand controller對應的邏輯抽象結構體)的註冊接口。

     而針對nand_chip而言,其註冊接口所實現的功能主要包括哪些呢?我們還是藉助上一篇文章的圖來進行說明吧(用邏輯關聯圖,能讓我們在大腦中快速建立nand_chip註冊所實現的功能)。

  1. 建立mtd_info(該mtd_info爲該nandflash芯片對應的master mtd_info)中訪問nandflash相關的函數指針,主要用於指向nand驅動模型中通用接口(即nand_write、nand_write、nand_read_oob等接口);
  2. 實現nand_chip中ecc控制相關成員,即實現nand_chip->ecc變量,即實現(struct nand_ecc_ctrl類型的結構體變量,包括ecc計算接口、ecc糾錯接口、讀取一頁接口、寫一頁數據接口、ecc字節數、單次進行ecc計算的數據字節數等等信息,該接口可由具體的nand_controller驅動自己賦值,無須nand驅動模型的註冊函數實現,若具體的nand_controller驅動未設置,則由nand驅動模型的註冊函數使用通用的接口(soft ecc接口));
  3. 實現nand_chip中通過nand_controller與nandflash進行命令通信的接口cmd_ctrl(該接口因不同nand_controller而不同,因此針對不同的nand_controller,需要實現對應的cmd_ctrl);
  4. 實現nand_chip中與nand flash進行通信的命令接口cmdfunc,該接口主要調用cmd_ctrl,實現將相關操作命令下發給nandflash(如讀取nandflash id、讀寫數據、讀寫oob數據等命令);
  5. 實現nand_chip中的read_byte、read_word、read_buf、write_buf、block_bad等接口,這些接口實現讀寫flash的功能,同時read_byte、read_word、read_buf、write_buf接口也主要是由上述2中讀寫一頁數據的接口調用;
  6. 實現壞塊表的建立操作;
  7. 獲取nandflash的頁大小、塊大小、flash大小等參數大小,並賦值給nand_chip中具體的參數中。

 

        nand_chip的註冊大致即實現以上這些功能,完成上述功能後,也就實現了mtd_info->_read/_write--->nand_chip->ecc->read_page/write_page/…--->nand_chip->cmdfunc/read_buf/write_buf接口間的調用邏輯的關聯,從而即可實現通過mtd_info中的函數指針即可完成調用nand_chip->read_buf/write_buf,實現與nandflash的通信。

 

 

       而針對nand_chip的註冊,nand驅動模型提供了兩個接口nand_scan_ident、nand_scan_tail,通過這兩個接口即完成了上述所說的功能,下面我們分析下這兩個接口。

 

nand_scan_ident接口分析

      該接口主要調用nand_set_defaults、nand_get_flash_type接口實現nand_chip中成員變量的設置,主要實現的功能如下:

  1. 調用nand_set_defaults接口,設置nand_chip中讀寫flash的接口(若未設置,則使用通用的接口,如nand_command、nand_wait、nand_read_byte、nand_read_byte16、nand_read_word、nand_read_buf、nand_write_buf、nand_block_bad等等接口);
  2. 調用nand_get_flash_type接口,獲取nandflash相關的參數(若page size、block size、oob size、flash size等信息),該接口主要通過如下操作實現參數的獲取:
    1. 通過讀取flash的設備id信息,並從全局變量nand_flash_ids中查找是否存在該設備id對應的定義參數,若存在,則獲取page size、block size、oob size、flash size等等信息;若不存在,則進入步驟b;
    2. 通過調用nand_flash_detect_onfi接口,判斷flash是否支持onfi規範,若支持則讀取onfi相關的參數,從而獲取page size、block size、oob size、flash size等等信息;若未獲取到,則進入步驟c;
    3. 則根據設備id、擴展id,設置對應的page size、block size、oob size、flash size等等信息;

 

 

 

 

nand_scan_tail接口分析

 

該接口實現的功能如下:

  1. 若nand_chip->ecc.layout 未設置,則根據ecc類型,設置默認的oob信息;
  2. 依據nand_chip->ecc的類型,並確認是否需要設置ecc中calculate、correct、read_page、read_subpage、write_page、read_page_raw、write_page_raw、read_oob、write_oob接口(若nand_controller驅動未設置這些函數指針,則設置這幾個接口,針對不同的ecc算法,默認接口也有所不同);
  3. 設置mtd_info中的函數指針,主要涉及_erase、_read、_write、_panic_write、_read_oob、_write_oob、_sync、_suspend、_resume、_block_isbad、_block_markbad等接口,並設置mtd_info的type、flags、ecclayout、ecc_strength等接口;
  4. 若nand_chip設置了bbt標誌,則調用chip->scan_bbt,建立壞塊表。

 

 

      以上便爲nand_scan_ident、nand_scan_tail接口的實現流程,說白了也就是設置mtd_info的_erase、_read、_write等接口,以及nand_chip的ecc中的接口、nand_chip的函數指針等等內容,最終完成本章開頭的邏輯關聯圖。支持mtd_info、nand_chip的所有成員變量也已完成了設置。

    那至此時,是否已經算是完成了mtd_info、nand_chip的所有關聯了呢?

    還差最後一步,那就是需要進行master mtd_info、slaver mtd_info的關聯,這一步需要調用mtd_device_parse_register接口。這才完成了mtd_info、nand_chip的關聯,也就建立了如下的關聯圖

 

 

二、nand驅動模型中通用接口說明

        nand驅動模型提供的通用接口,主要用於抽象針對所有nand controller以及所有nand flash的讀寫接口等信息,這些接口主要如下幾類接口:

  1. Nand flash擦除接口
  2. Nand flash讀寫接口
  3. nandflashoob讀寫接口
  4. nandflash壞塊檢測及標記接口

 

我們以nand_write爲例進行簡要說明,nand_write實現的流程如下:

  1. 調用nand_get_device接口獲取nand_chip的執行權(若當前nand_chip不在ready狀態(即nand_chip再執行其他的讀、寫或者擦除等操作),則將該進程加入到等待隊列中,並把該進程調度出去);
  2. 獲取nand_chip的執行權後,則調用nand_do_write_ops執行寫操作;
    1. nand_do_write_ops接口中判斷flash處於寫保護,則返回失敗;
    2. nand_do_write_ops通過調用chip->write_page進行寫操作(即nand_write_page接口);而nand_write_page則會調用nand_chip->ecc->write_page接口;而在nand_chip->ecc->write_page接口則會調用nand-chip->write_buff進行寫操作。

 

        以上變爲nand_write接口的寫操作流程,下面我們總結一下,nand驅動模型中通用接口的調用邏輯如下所示(nand_write的調用也遵循下面的調用流程),nand驅動模塊的通用抽象接口通過nand_chip->ecc、nand_chip接口的調用關係,關聯在一起。

 

 

 

以上便爲本章的主要內容,下面再簡要總結一下:

  1. 說明nand_chip的註冊流程,包括nand_scan_ident、nand_scan_tail接口的實現流程;
  2. 說明nand驅動模型的通用抽象接口,並說明該通用抽象接口與nand_chip->ecc接口、nand_chip接口的調用關聯。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章