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等函数指针,完成针对下层设备驱动操作接口的抽象,完成对下层设备驱动接口的抽象模型的建立。

 

 

二、mtd设备驱动相关的数据结构说明

struct mtd_partition

      在上面已经说了,该结构体主要用于定义分区的大小、偏移位置、是否只读等功能的结构体,请具体定义如下。请记住,该数据结构类型变量的定义一般在板级文件或者在flash设备驱动文件进行mtd_info分区的注册时使用。属于mtd设备驱动模型对外的数据结构。

 

 

struct mtd_part

该结构体用于mtd设备驱动模型内部进行mtd设备分区所用,该数据结构类型变量不对外部开放。系统中所有已注册的mtd分区设备,均链接至全局链表mtd_partitions上。

 

 

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设备字符设备与块设备相关的初始化接口已在系统初始化时完成主设备的注册)

 

 

 

        以上即为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设备驱动模型中上下层接口间的关联。

发布了145 篇原创文章 · 获赞 30 · 访问量 46万+

猜你喜欢

转载自blog.csdn.net/lickylin/article/details/104718561
今日推荐