本模块主要介绍MMC子系统与设备-总线-驱动模型的关联,并介绍该MMC子系统是如何借助LINUX内核的设备-总线-驱动模型实现自己的驱动模型的。针对MMC子系统而言,主要使用了系统中的两个模型:设备-总线-驱动模型、块设备驱动模型。
设备-总线-驱动模型
在分析MMC子系统的设备-总线-驱动模型时,我们可以借助之前已经分析的i2c驱动模型、spi驱动模型的实现,来学习mmc子系统的驱动模型,通过与i2c驱动模型、spi驱动模型的对比,也可以加深我们对mmc子系统驱动模型的理解(从已知去学习未知,可提供我们的学习效率)。
我们知道针对复杂的设备,则需要借助控制器进行通信,而针对i2c、spi、mmc而言,均需要
对应的控制器实现与该类设备的通信。而针对这三类控制器,其模块都进行了抽象,其中i2c控制器抽象为i2c adapter、spi控制器抽象为spi master,而针对mmc控制器,则抽象为mmc host;而针对这三种类型设备的抽象,i2c设备抽象为i2c client、spi设备抽象为spi device、mmc device抽象为mmc card。
下面分析下这三类驱动模型的异同:
- 均为控制器创建了对应的class,用于将对应的控制器设备链接至对应的class上;
- 针对i2c adapter、spi master这两类而言,其驱动模型中均创建了对应的链表,将所有注册的控制器设备链接在一起,而mmc子系统并没有为mmc host创建类似的链表;
- I2c/spi设备不属于热插拔设备,因此在具体系统的板级文件或者设备树中,需要针对系统中存在的i2c/spi设备定义注册信息,从而在LINUX系统初始化时完成i2c/spi设备的注册;而针对mmc子系统其属于热插拔的,因此在系统初始化时不需要单独进行设备的注册;
- 针对mmc子系统而言,针对mmc card的注册,mmc子系统提供了rescan接口,而该接口作为延迟工作队列的回调函数。针对mmc card而发起扫描的时机如下:
- 在mmc host添加的时候,执行一次mmc card的扫描操作;
- 若mmc host支持卡在位检测引脚(即cd引脚),在cd引脚对应的中断发生后,在该中断的处理函数中,会进行延迟队列的调度,从而完成一次mmc card的扫描操作;
- 若mmc host不支持卡在位检测,则可以将卡在位检测设置为轮询机制,则针对该mmc host,以1s为周期进行mmc card的扫描;
- 针对i2c/spi驱动模型而言,针对不同类型的外设,需要对应类型的设备驱动程序,而针对mmc子系统而言,因mmc、emmc等协议规范中已经规定了所有mmc/sd/tf/emmc设备的操作方法、寄存器定义等,因此针对mmc总线而言,mmc子系统提供了一个统一的mmc driver,所有的mmc/sd/tf/emmc设备均与该驱动绑定(当然了,针对sdio总线而言,因其外设的功能不一,因此针对具体的设备也需要对应的设备驱动)。针对mmc子系统的mmc设备而言,不需要驱动开发者实行mmc 设备驱动,仅对sdio外设需要实现对应的mmc设备驱动;
- 因mmc driver仅有一个,因此针对mmc bus而言其match函数直接返回1,而不需要像spi/i2c总线的match接口那样对设备和驱动进行匹配检测;
- 因一个mmc控制器仅与一个mmc card关联,且mmc子系统提供了mmc rescan接口,可以实现对mmc host下的mmc card进行扫描并进行mmc card的创建、与mmc host的绑定以及注册至mmc总线上;因此不需要像上述2中所述的i2c/spi那样,将所有已注册的控制器设备链接在一起方便查找从而实现i2c/spi设备的注册与绑定;
- 针对spi master、i2c adapter,均提供与外设通信的方法(spi_master->transfer、i2c_adapter->master_xfer/smbus_xfer),而针对mmc host而言,也需要提供相应的访问接口(记为mmc_host->request);
- 因mmc/emmc协议规范已经规定了访问mmc card的命令格式以及相应的寄存器定义,所有mmc/sd/tf/emmc设备均需要遵守,因此mmc子系统针对访问mmc card的命令抽象出统一的接口,包括设备状态设置、卡使能去使能、sleep/awake、poweroff notify、cid/rca/dsr/csd寄存器读写、通过mmc switch命令实现与extend csd寄存器的读写等接口
以上即是i2c/spi/mmc各模块的异同点,针对上面的几点分析,也大大加深了我们的印象,也基本上了解了mmc子系统的设备-总线-驱动、设备-类模型。下面我们从mmc子系统设备-驱动-总线模型间数据结构体之间的关联,来进一步分析mmc子体系的驱动模型。
mmc子系统设备-总线-驱动模型
如下即为mmc_bus_type、mmc_card、mmc_host、mmc_driver、kset、kobject的关联如下图(针对设备驱动模型、sysfs文件系统这两个部分,之前已经分析过,个人认为把这两部分内容熟悉了之后,针对大多数的设备驱动模型理解,均会比较轻松,因此强烈建议大家先熟悉这两个模块)。其中i2cbus、mmc bus、spi总线均通过其对应的kobject完成关联。而mmc host与mmc card通过其指针成员完成了绑定,而mmc card、mmc driver、mmc bus则借助设备-总线-驱动模型的数据结构完成了关联操作。