Linux mtd子系統專欄分析之二MTD設備驅動模型架構及數據結構說明

本篇文章我們主要說明向mtd設備驅動模型的架構及相應的數據結構,我們從數據結構入手,即可以較好的理解mtd設備驅動模型的架構,以便我們能較好的理解mtd設備驅動模。

本篇主要包括如下幾個部分:

一、mtd設備驅動模型的架構說明

二、mtd設備驅動相關的數據結構說明


一、mtd設備驅動模型的架構說明

為了方便我們認識mtd設備驅動模型,此處我們先說明mtd設備驅動模型的架構(即mtd設備驅動模型與外部模塊間的聯繫,包括接口、數據結構之間的關聯),在我們對mtd設備驅動模型架構有一個感性認識的基礎上,我們再分析mtd設備驅動模型相關的數據結構。

我們mtd驅動模型對上層的抽象以及對下層的抽象,都進行一一詳細說明,如下為mtd設備驅動模型的架構,針對mtd設備驅動模型而言,主要包括接口抽象層、數據結構關聯兩部分。下面分別進行說明。

接口抽象層

  1. 針對接口抽象層,對於上層主要包括mtd_read、mtd_write、get_mtd_device、mtd_erase等接口。這些接口是對上層的抽象,主要供mtd 字符設備、mtd 塊設備以及相應的閃存文件系統調用;
  2. mtd對下也做了抽象,為了能兼容nor flash、nandflash等閃存驅動,mtd也做了相應的抽象,而這些接口主要在struct mtd_info類型結構體中定義,主要包括_erase、_read、_write、_block_isbad、_block_markbad等接口;這些接口由具體閃存類型相關的驅動去實現,如針對nandflash驅動而言,這些接口即為nand_erase、nand_read、nand_write、nand_block_isbad、nand_block_markbad;而針對nor flash(cfi標準的norflash),則接口為cfi_amdstd_erase_varsize、cfi_amdstd_write_words、cfi_amdstd_read、cfi_amdstd_sync、cfi_amdstd_suspend、cfi_amdstd_resume等。

數據結構關聯

針對mtd設備驅動層,主要涉及struct mtd_partition、struct mtd_part、struct mtd_info這幾個主要的數據結構。

  1. struct mtd_partition用於進行閃存芯片的分區定義,針對不支持設備樹的內核,則一般在開發板對應的板級文件中定義該結構體類型變量的定義,用於說明本芯片的分區情況;針對支持設備樹的內核,一般在設備樹文件中定義分區信息,然後在芯片對應的驅動文件中解析該分區定義;
  2. struct mtd_part,主要由mtd設備驅動模型內部使用的分區信息,該結構體中包括本分區對應的struct mtd_info類型的變量以及指向master mtd_info的指針。系統中所有已註冊的struct mtd_part變量,均鏈接至鏈表mtd_partitions上。一般針對閃存芯片的操作接口(如mtd_info->_erase/_read/_write等),均在master mtd_info中定義。而在mtd_erase、mtd_read、mtd_write等對上層的接口中,根據傳遞的struct mtd_info類型變量,獲取到對應的struct mtd_part類型變量,從而調用master mtd_info中對應的_erase、_read、_write等接口。
  3. struct mtd_info,該結構體是mtd設備驅動模型最主要的數據結構,通過該數據結構,對上完成與mtd接口層的關聯;對下完成與具體類型閃存芯片驅動的關聯(如針對nand flash controller driver,則通過mtd_info->priv=nand_chip,完成與nandflash controller driver的關聯;針對nor flash,則同樣通過mtd_info->priv=map_info完成關聯;而針對其他類型的芯片,則同樣是通過mtd_info->priv的關聯),通過該結構體中的_erase、_read、_write等函數指針,完成針對下層設備驅動操作接口的抽象,完成對下層設備驅動接口的抽象模型的建立。


Linux mtd子系統專欄分析之二MTD設備驅動模型架構及數據結構說明

二、mtd設備驅動相關的數據結構說明

struct mtd_partition

在上面已經說了,該結構體主要用於定義分區的大小、偏移位置、是否只讀等功能的結構體,請具體定義如下。請記住,該數據結構類型變量的定義一般在板級文件或者在flash設備驅動文件進行mtd_info分區的註冊時使用。屬於mtd設備驅動模型對外的數據結構。


Linux mtd子系統專欄分析之二MTD設備驅動模型架構及數據結構說明

struct mtd_part

該結構體用於mtd設備驅動模型內部進行mtd設備分區所用,該數據結構類型變量不對外部開放。系統中所有已註冊的mtd分區設備,均鏈接至全局鏈表mtd_partitions上。


Linux mtd子系統專欄分析之二MTD設備驅動模型架構及數據結構說明

struct mtd_info

該數據結構為mtd設備驅動模型的關鍵,其定義的變量也比較多,下面我們從幾個方面進行說明,並聯合其他數據結構,說明其中的關聯;

  1. 定義mtd設備類型、總大小、寫單位、擦除單位、index等等信息;
  2. 抽象的閃存芯片的操作接口(讀寫擦除等接口)
  3. 提供priv指針,指向該mtd設備的私有信息,若mtd設備需要特殊的處理相關的變量,則可以將該priv指向對應的內存,如針對nandflash controller驅動而言,則通過該priv指針實現nand_chip與mtd_info的關聯;
  4. 定義struct device類型的變量,將該mtd_info設備與linux設備驅動模型關聯,該結構體實現如下幾個功能:
    1. 可通過該變量實現mtd設備與mtd class的關聯;
    2. 當調用device_register等接口將該變量註冊至linux設備驅動模型中時,則通過netlink嚮應用層發送device add的uevent,而應用層的udev/mdev則在接收到該事件後,則進行該mtd_info設備對應的mtd字符設備與塊設備文件的創建(通過mknod,而mtd設備字符設備與塊設備相關的初始化接口已在系統初始化時完成主設備的註冊)


Linux mtd子系統專欄分析之二MTD設備驅動模型架構及數據結構說明

以上即為mtd設備驅動模型相關的說明。針對mtd設備驅動模型而言,其完成了對上層xxxfs、mtd字符設備、塊設備的接口抽象;對下完成了針對閃存芯片的操作接口的抽象,並且藉助struct device完成與linux設備驅動模型模塊的關聯,並以此完成mtd設備對應的字符設備、塊設備的創建。基於此我們也知道mtd設備註冊大概完成哪些功能:

  1. 首先進行閃存芯片驅動的初始化,完成該閃存芯片對應master mtd_info的初始化與賦值(包括芯片對應的參數、接口的賦值等);
  2. 在閃存芯片驅動的probe接口中,完成針對各分區對應的mtd_part、mtd_Info的初始化與註冊操作,主要包括對mtd_info類型的變量進行賦值與初始化操作,包括write_size、erase_size、size等賦值、對閃存芯片操作接口的賦值(_read、_write、_erase等接口);
  3. 並完成mtd_info對應的strcut device類型變量的註冊,並藉助註冊完成mtd_info對應字符設備、塊設備文件節點的創建;
  4. 將該mtd_info對應的分區變量註冊到鏈表mtd_partitions中。


以上即為本次內容的主要內容,主要說明mtd設備驅動模型對應的架構抽象以及數據結構的說明。同時說明了mtd設備的註冊流程。下一章主要介紹mtd設備驅動模型中上下層接口間的關聯。


分享到:


相關文章: