【MMC子系统】三、MMC子系统框架

【MMC子系统】三、MMC子系统框架 #

上章,我们简单了解了EMMC协议,感兴趣的可以查阅一下SDSDIO的协议,之所以Linux内核能够对SDSDIOEMMC进行统一管理,根本原因就是三者协议上的相似性,我们该系列文章均以EMMC为剑,一层层划开包裹着的盔甲。

本系列文章,均以Linux 4.19为参考

 

1、MMC子系统框架 #

MMC Subsystem

如上图所示,MMC子系统的整体框架包括:MMC HostMMC CoreMMC Block。我们从下网上看:

  • MMC HOST:即MMC控制器驱动层,正如其名,该层主要是为了实现MMC控制器的初始化,以及MMC底层的数据收发操作,其直接控制的是底层寄存器,用以产生相应的通信时序。
  • MMC CORE:即MMC核心层,该层主要起到了承上启下的作用。对下,主要体现在注册MMC总线,实现对MMC deviceMMC driver的统一管理;对上,体现在实现MMC通信协议,并向上提供相应的读写操作接口。
  • MMC BLOCK:即MMC块设备驱动层,其主要作用是屏蔽底层的实现逻辑,将底层抽象为卡设备,并且与虚拟文件系统关联,负责块设备请求的处理以及请求队列的管理,又称为card卡驱动。

哈哈,简单吧,我们刚开始对MMC子系统框架就先了解这么多,不着急,慢慢来。

 

2、MMC子系统文件结构 #

了解完MMC子系统后,我们看一下MMC驱动在Linux下的目录结构,我们进入到drivers/mmc目录

drivers/mmc/
	├── core
		├── block.c
		├── bus.c
		├── core.c
		├── mmc.c
		├── mmc_ops.c
		├── ......
	├── host
		├── sunxi-mmc.c
		├── ......

这里介绍一个方法

如果刚接触的朋友,不知道文件之间的关系是怎么样的,可以通过MakefileKconfig文件来大致看一下。

obj-$(CONFIG_MMC)		+= mmc_core.o
mmc_core-y			:= core.o bus.o host.o \
				   mmc.o mmc_ops.o sd.o sd_ops.o \
				   sdio.o sdio_ops.o sdio_bus.o \
				   sdio_cis.o sdio_io.o sdio_irq.o \
				   slot-gpio.o

由上面可知,MMC CORE核心层,包括的文件有:core.cbus.c等等,

 

更多干货可见:高级工程师聚集地,助力大家更上一层楼!

 

了解大致的文件布局后,我们主要介绍一下文件的作用:

MMC HOST控制器驱动层

  • sunxi-mmc.c:所有的控制器驱动文件,均位于host文件夹下,主要是不同芯片厂家对MMC控制器的底层实现,一般非原厂人员不必深入研究。

MMC CORE核心层

  • bus.c:主要作用是为了注册MMC总线,实现对MMC driversdevices的统一管理
  • core.c:主要作用是实现MMC通信协议,封装MMC通信命令,完成MMC核心功能,并向上提供操作接口。
  • mmc_ops.c:主要作用是提供操作MMC卡的接口函数,如:发送,接收数据接口,该文件会用到core.c提供的命令接口。
  • mmc.c:主要作用是处理MMC卡的相关操作,包括识别卡,读写卡等等,该文件会用到mmc_ops.ccore.c提供的命令接口。

MMC BLOCK块设备驱动层

  • block.c:处理MMC卡的块设备接口,包括读写块,处理块设备的电源和时钟等。

 

3、MMC设备在Linux下的文件分布 #

介绍完源代码中的目录结构,我们看一下成功加载MMC驱动后,在Linux文件系统中的目录结构。

在进程文件系统中

  • 我们的MMC Card被成功识别后,会在procfs中看到mmc的相关节点:如/dev/mmcblk0,其中看到/dev/mmcblk0p1表示磁盘中的一个分区

在虚拟文件系统中

同时在sysfs中也会看到对应的节点

  • /sys/bus/mmc/devices/下,我们能够看到识别到的设备信息
  • /sys/class/mmc_host/mmc0/下也能够看到设备信息
  • 同时在/sys/block/mmcblk0/下,能够看到该卡设备的信息,以及分区信息等。
# ls /sys/bus/mmc/devices/
mmc0:aaaa

# ls /sys/class/mmc_host/mmc0/
device     mmc0:aaaa  power      subsystem  uevent

# ls /sys/block/mmcblk0/
alignment_offset   ext_range          mq                 size
bdi                force_ro           power              slaves
capability         hidden             queue              stat
dev                holders            range              subsystem
device             inflight           removable          uevent
discard_alignment  mmcblk0p1          ro

 

4、总结 #

本章主要介绍了三个部分:

  • MMC子系统的框架
  • MMC子系统的文件结构
  • MMC设备在Linux下的文件分布

下章,我们来详细了解MMC子系统的代码实现部分。

欢迎关注【嵌入式艺术】,董哥原创!
img