Linux mmc驱动框架(1)——基本概念

SD/MMC/SDIO基础概念的介绍

  SD/MMC/SDIO基础概念的介绍网上可以找到很多,就不重复造轮子了,推荐一篇我觉得写的比较好的介绍文章。
链接: SD/MMC/SDIO基础概念的介绍

MMC驱动目录结构

在这里插入图片描述
1)块设备层(card/)
存放闪存卡(块设备)的相关驱动,如MMC/SD卡设备驱动
  按照 linux块设备驱动程序的框架实现一个mmc/SD卡的块设备驱动,这 block.c 当中我们可以看到写一个块设备驱动程序时需要的 block_device_operations 结构体变量的定义,其中有 open/release/request 函数的实现,而 queue.c 则是对内核提供的请求队列的封装。
2)核心层(core)
整个MMC的核心层,这部分完成不同协议和规范的实现,为host层和设备驱动层提供接口函数。
  核心层封装了 MMC/SD 卡的命令(CMD),例如存储卡的识别,设置,读写。例如不管什么卡都应该有一些识别,设置,和读写的命令,这些流程都是必须要有的,只是具体对于不同的卡会有一些各自特有的操作。 core.c 文件是由 sd.c 、 mmc.c 两个文件支撑的, core.c 把 MMC 卡、 SD 卡的共性抽象出来,它们的差别由 sd.c 和 sd_ops.c 、 mmc.c 和 mmc_ops.c 来完成。
3)控制器层(host)
针对不同主机端的SDHC、MMC控制器的驱动,这部分需要由驱动工程师来完成;
  主机控制器则是依赖于不同的平台的,硬件相关,需要针对不同芯片,不同芯片对应的控制器来实现对应的代码。一般情况要进行一些设置,例如中断函数注册,控制器寄存器初始化等等。然后它会向 core 层注册一个主机( host ),用结构 mmc_host_ops 描述,这样核心层就可以拿着这个 host 来操作对应的卡控制器了,而具体是什么控制器, core 层是不用知道的。

Linux MMC子系统代码结构

MMC核心层:完成不同协议和规范的实现,为host层和设备驱动层提供接口函数。MMC核心层由三个部分组成:MMC,SD和SDIO,分别为三类设备驱动提供接口函数;
Host 驱动层:针对不同主机端的SDHC、MMC控制器的驱动;
Client 驱动层:针对不同客户端的设备驱动程序。如SD卡、T-flash卡、SDIO接口的GPS和wi-fi等设备驱动。
在这里插入图片描述

SD总线协议

  SD总线通信是基于指令和数据比特流,起始位开始和停止位结束。SD总线通信有三个元素:
Command:由host发送到卡设备,使用CMD线发送;
Response:从card端发送到host端,作为对前一个CMD的相应,通过CMD线发送;
Data:即能从host传输到card,也能从card传输到host,通过data线传输。

Commands

以下是四种用于控制卡设备的指令类型,每个command都是固定的48位长度:
1、 broadcast commands(bc), no response:广播类型的指令,不需要有响应;
2、 broadcast commands with response(bcr):广播类型的指令且需要响应;
3、 addressed(point-to-point) commands(ac):由HOST发送到指定的卡设备,没有数据的传输;
4、 address(point-to-point) data transfercommands(adtc):由HOST发送到指定的卡设备且伴随有数据传输。
指令格式:
在这里插入图片描述

Card register

几个主要的寄存器:OCR,CID,CSD,RCA和SCR。
Operation condition register(OCR):32位的OCR包含卡设备支持的工作电压表;
Card identification number register (CID):包含用于在卡识别阶段的卡信息,包括制造商ID,产品名等;
Card specific data register(CSD):CSD寄存器提供了如何访问卡设备的信息,包括定义了数据格式,错误校验类型,最大访问次数,数据传输率等;
Relative card address register(RCA):存放在卡识别阶段分配的相对卡地址,缺省相对卡地址为0000h;
SD card configuration register(SCR):SCR是一个配置寄存器,用于配置SD memory card的特殊功能。

Response

所有的response都通过CMD线发送到host端,R4和R5响应类型是SDIO中特有的:
1、 R1(normal response command):用来响应常用指令;
2、 R2(CID,CSD register):用来响应CMD2和CMD10或CMD9,并把CID或CSD寄存器作为响应数据;
3、 R3(OCR register):用来响应ACMD41指令,并把OCR寄存器作为响应数据;
4、 R6(published RCA response):分配相对卡地址的响应;
5、 R7(card interface condition):响应CMD8,返回卡支持的电压信息;
6、 R4(CMD5):响应CMD5,并把OCR寄存器作为响应数据;
7、 R5(CMD52):CMD52是一个读写寄存器的指令,R5用于CMD52的响应;
Response 格式:
在这里插入图片描述

发布了9 篇原创文章 · 获赞 0 · 访问量 386

猜你喜欢

转载自blog.csdn.net/weixin_42262944/article/details/104249779