首页 理论教育TI芯片MMC实现详解

TI芯片MMC实现详解

【摘要】:DM 3730的MMC控制器框架如图7-11所示。图7-11DM 3730 MMC框架图从图7-11可见,MMC控制器中有复杂的命令和数据管理,控制器内部带有buffer用于数据缓冲,数据主要通过DMA读写。关于DM 3730 MMC的驱动部分,主要分析其相关的初始化和总线传输以及card状态变化的操作。

DM 3730的MMC控制器框架如图7-11所示。图7-11引自《DM 3730芯片手册》中第3398页的框图。

978-7-111-49426-3-Chapter07-142.jpg

图7-11 DM 3730 MMC框架图

从图7-11可见,MMC控制器中有复杂的命令和数据管理,控制器内部带有buffer用于数据缓冲,数据主要通过DMA读写。

关于DM 3730 MMC的驱动部分,主要分析其相关的初始化和总线传输以及card状态变化的操作。

1.初始化

先来看看初始化部分,这里还是通过platform driver的probe函数来了解细节,其内容如下:

978-7-111-49426-3-Chapter07-143.jpg

978-7-111-49426-3-Chapter07-144.jpg

978-7-111-49426-3-Chapter07-145.jpg

978-7-111-49426-3-Chapter07-146.jpg

978-7-111-49426-3-Chapter07-147.jpg

978-7-111-49426-3-Chapter07-148.jpg

从分析中可见,主要的工作是进行属性设置、资源申请和接口注册,然后通过mmc_add_host的调用实现功能。

相应的platform device是在系统初始化时通过omap_mmc_add进行的,这里就不详述了。

2.总线传输

总线传输的控制器接口是由mmc_host_ops中的request来定义的,DM 3730 MMC控制器相应的操作是omap_hsmmc_request。下面详细分析其功能:

978-7-111-49426-3-Chapter07-149.jpg(www.chuimin.cn)

978-7-111-49426-3-Chapter07-150.jpg

从中可见,主要是进行操作前的准备工作,如果有数据传输操作,则需要在函数omap_hsmmc_prepare_data中进行DMA申请、配置、启动等完成相关的准备工作,剩下的就是等待硬件信号来完成数据部分的操作。

总线控制器的传输启动操作是通过omap_hsmmc_start_command来实现的,详细分析如下:

978-7-111-49426-3-Chapter07-151.jpg

978-7-111-49426-3-Chapter07-152.jpg

主要是根据传输的命令以及状态进行寄存器设置。接下来控制器会根据操作执行的情况上报中断,中断处理函数omap_hsmmc_irq会进行状态的检查,根据状态做必要处理。如进行数据操作时有错误,则需要进行必要的DMA清理,最终通过mmc_request_done来向MMC框架层报告,mmcre quest的操作完整状态信息都在mmc_request中。这样就完成了整个的传输操作。

3.card状态变化

MMC总线设备有插拔的可能,这就需要能够检测设备的状态,下面来看看具体如何实现。在初始化时,已经见到一个检测相应信号的中断,当卡的状态发生变化时会有中断产生,在实现中由omap_hsmmc_cd_handler进行处理,具体如下:

978-7-111-49426-3-Chapter07-153.jpg

可见通过work来进行延迟操作,具体分析如下:

978-7-111-49426-3-Chapter07-154.jpg

978-7-111-49426-3-Chapter07-155.jpg

主要的操作就是获得当前卡的状态,并执行mmc_detect_change,但是会根据状态的不同进行延时后再执行设备发现操作。

具体的卡状态检测由omap_hsmmc_card_detect来执行,具体分析如下:

978-7-111-49426-3-Chapter07-156.jpg

978-7-111-49426-3-Chapter07-157.jpg

这样整个状态变化的操作就完整了。