LINUX MMC子系统分析之三 MMC/SDIO总线接口分析

       在上一章节中,我们分析了mmc子系统的驱动模型,针对mmc子系统包括mmc bus、mmc driver、 mmc host以及mmc通用命令接口层、mmc card rescan机制、mmc block driver层等等内容。本章则主要介绍mmc子系统的bus type的定义,针对mmc 子系统包括mmc bus、sdio bus两个bus总线。其中mmc bus主要针对mmc/sd/tf/emmc等存储卡设备。

 

Mmc bus分析

    针对mmc bus相关的操作,我们主要分析如下三个部分:mmc bus type的定义及其接口实现说明、mmc driver的注册与注销接口、mmc card的注册与注销接口。

 

Mmc bus的定义及其接口分析

如下为mmc bus_type的定义,主要提供的功能如下:

  1. 定义了dev_attrs属性,针对所有注册到mmc bus上的设备,均会创建mmc_dev_attrs中定义的属性文件(后面介绍);
  2. match接口用于实现mmc card与mmc driver的匹配检测;
  3. uevent接口主要用于添加该mmc bus的uevent参数(在调用device_add时,会调用kobject_uevent向应用层发送设备添加相关的事件(通过netlink 发送和 call_usermodehelper机制(向/proc/sys/kernel/hotplug中写入usermodehelper机制调用的应用层程序)),而kobject_uevent会调用该device所属bus和class的uevent接口,添加需要发送到应用的event参数);
  4. probe接口主要用于mmc card与mmc driver匹配成功后,则会调用该mmc bus的probe接口实现探测操作;
  5. remove接口主要用于mmc card与mmc driver解绑时,调用该接口,进行remove操作(对于mmc driver而言,包括注销块设备驱动等功能);
  6. pm是电源管理相关的接口。

 

 

mmc_dev_attrs

该属性为所有注册至该总线上的设备所默认创建的,其定义如下,主要提供只读的设备属性,该属性用于提供mmc card的类型,在具体的mmc card目录下(sysfs),会创建type的文件,该文件只读,读取该文件可以获取mmc card的类型,目前支持的类型包括mmc、sd、sdio、sd combo。

 

 

mmc_bus_match

      该接口主要用于mmc card、mmc driver的匹配检测,我们在之前的文章中已经说明,mmc bus的mmc driver由mmc 子系统实现,且针对mmc/sd/emmc等存储卡设备,其均与mmc子系统实现的mmc driver匹配,因此此处的mmc_bus_match并没有进行匹配检测,直接返回1,表示mmc 子系统实现的mmc driver可匹配所以注册至mmc bus上的mmc card。

 

mmc_bus_probe、mmc_bus_remove

这两个接口均直接调用mmc 子系统注册的mmc driver的probe/remove接口,实现简单。

 

mmc_bus_uevent

        该接口主要是提供mmc bus添加的event env,该接口主要提供“MMC_TYPE”、“MMC_NAME”、“MODALIAS”这三个env。若应用层的udev、mdev需要关注mmc card的这三个env,则可以添加对应这三个env的规则即可。

 

     以上即是mmc bus_type定义的接口和变量的说明,该总线的实现相对比较简单,针对mmc子系统而言,其主要的实现在mmc host、mmc driver、mmc card rescan机制等,因此其总线定义相对来说倒没有什么特别的地方(唯一的特别的是,其不需要检测mmc card、mmc driver是否匹配,默认认为mmc driver可匹配任意注册mmc card。。。)

 

mmc driver的注册与注销接口

     针对mmc_register_driver、mmc_unregister_driver接口,就是对driver_register、driver_unregister的封装,此处不再赘述(对这两个接口需要了解的朋友,请参考我之前分析的设备模型相关的文章)。

 

mmc card的注册与注销接口

主要包括mmc card内存的申请、mmc card的注册、mmc card的注销等接口。

 

mmc_alloc_card

该接口主要实现的流程图如下:

1.申请一个mmc_card类型的内存空间;

2.对mmc_card->dev成员进行初始化,并设置该device类型变量所依附的总线为mmc_bus

3.设置mmc_card->dev的release接口为mmc_release_card,该接口实现mmc_card类型内存空间的释放操作;

4.设置mmc_card->dev的父设备为mmc_host->class_dev

其实就是调用device模型对应的接口完成device类型变量的初始化,并完成mmc_card与mmc_host的绑定。

 

mmc_add_card

该接口也包括两部分,主要内容如下,这个接口的实现也比较简单,就不细说了。

  1. 调用device_add,完成将该mmc_card注册至mmc bus上;
  2. 设置mmc_card的状态为在位状态。

 

 

mmc_remove_card

      该接口主要将mmc_card的device类型的成员与mmc bus、mmc driver之间的绑定解除,并去除对device类型成员的引用计数,当mmc_card->dev的引用计数为0时,则触发mmc_card->dev->kobject->kobj_type->release的执行,即device_release接口的执行,该接口最终调用会调用接口mmc_card->dev->release接口(mmc_release_card),从而完成mmc_card对应内存的释放操作。

 

 

Sdio bus分析

Sdio bus type的定义如下:

下面我们通过与mmc bus type对比,来分析sdio bus。

 

sdio_dev_attrs

     与mmc bus的dev_attr相比,sdio_dev_attrs则主要创建了class、vendor、device、modalias这四个只读的sysfs 属性文件,用于获取sdio device的class、vendor、device这三个属性。

 

sdio_bus_match

    与mmc bus的match接口相比,该匹配检测,则对sdio_driver、sdio_func进行绑定检测,主要包括对class、vendor、device这三个参数的匹配检测,只要匹配成功,则会进行sdio_driver、sdio_func绑定。

 

 

sdio_bus_uevent

    针对sdio bus而言,当执行kobject_uevent接口时,则针对sdio_bus而言会增加“SDIO_CLASS”、“SDIO_ID”、“MODALIAS”这三个env添加至uevent数组中,发送给应用层程序。

 

sdio_bus_probe、sdio_bus_remove

   这两个接口相比于mmc bus的probe/remove接口,增加了sdio_func、sdio_driver的匹配检测、电源管理以及设置block size的接口等等。

 

 

 

sdio_driver的注册与注销接口

     这两个接口的实现与mmc_driver的实现类似,均是简单的对driver_register/driver_unregister的封装(还有设置driver需要绑定的bus_type),而关于驱动模型接口driver_register/driver_unregister的实现,需要了解的朋友可参考我之前的设备驱动模型分析相关的文章。

 

 

Sdio func的注册与注销接口

    sdio_func的注册与注销接口对应于mmc_card的注册与注销接口。主要函数有sdio_alloc_func、sdio_add_func、sdio_remove_func、sdio_release_func(相比mmc card,多了针对acpi的配置调用),这些接口的实现也相对简洁明了,此处不再细说。

 

 

 

小结

   本篇文章的内容相对简单,主要介绍了mmc_bus_type、sdio_bus_type的定义及其成员变量的说明;mmc_card、mmc_driver的注册、注销;sdio_func、sdio_driver的注册、注销接口。本部分介绍的接口基本上就是针对设备驱动模型接口的封装或数据结构的初始化等接口,实现逻辑相对简单。

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

猜你喜欢

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