天天看點

Linux mtd子系統專欄分析之二 MTD裝置驅動模型架構及資料結構說明一、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裝置驅動模型的架構說明二、mtd裝置驅動相關的資料結構說明

二、mtd裝置驅動相關的資料結構說明

struct mtd_partition

      在上面已經說了,該結構體主要用于定義分區的大小、偏移位置、是否隻讀等功能的結構體,請具體定義如下。請記住,該資料結構類型變量的定義一般在闆級檔案或者在flash裝置驅動檔案進行mtd_info分區的注冊時使用。屬于mtd裝置驅動模型對外的資料結構。

Linux mtd子系統專欄分析之二 MTD裝置驅動模型架構及資料結構說明一、mtd裝置驅動模型的架構說明二、mtd裝置驅動相關的資料結構說明

struct mtd_part

該結構體用于mtd裝置驅動模型内部進行mtd裝置分區所用,該資料結構類型變量不對外部開放。系統中所有已注冊的mtd分區裝置,均連結至全局連結清單mtd_partitions上。

Linux mtd子系統專欄分析之二 MTD裝置驅動模型架構及資料結構說明一、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裝置驅動相關的資料結構說明

        以上即為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裝置驅動模型中上下層接口間的關聯。

繼續閱讀