eSDHC(The enhanced secure digital host controller),该控制器为主系统(host system)和以下存储卡(cards)之间提供了接口桥梁,卡的种类包括了mmc(MultiMediaCard)和Secure digital(SD)。通过该控制器让主端与卡之间建立起连接之后,发送指令以及传向或接收来自卡的执行数据就可以走此条“通路”了。该控制器操作着SD/MMC在传输层的协议。以下为eSDHC的系统连接图。

EMMC读卡器烧录boot 读卡器读写emmc_ide

       此次是对MMC的驱动进行调试,参考的代码是sd卡驱动代码。也就是对于sd卡与MMC卡来说,驱动代码的框架其实不用进行改变,关键在于对sd卡和mmc卡驱动过程中的细节上的把握,sd卡和mmc卡的驱动流程中最主要的差别集中在Card identification 这个过程中,以下是关于SD卡和MMC卡的identification过程,将重点指出两种卡在该过程中的异同。

       第一步是关于卡的侦测,对于两种卡的侦测部分而言,过程是一致,其中详细过程大家可以参考“P2020RM”,参考手册中画了该过程的流程图还是相当便于理解的,为了大家方便阅读,我在这里已为你们截好了图如下

EMMC读卡器烧录boot 读卡器读写emmc_ide_02

第二步,两种卡经历的过程也是一样的,过程流程图如下,也为大家高清截下

EMMC读卡器烧录boot 读卡器读写emmc_mmc驱动_03

        其中重点讲讲“Voltage Validation”部分,电压有效化(翻译不太专业,请大家不要介意),主端与卡之间建立连接时,电压值必须在适当的电压范围之内,规定的电压值在OCR(operation conditions register)中,只有在数据传输电压标准之下,卡中存储的CID(card identification)才能被主端读取到、CSD(Card-Specific Data)才能被发送。在此,将出现驱动过程中SD卡与MMC卡的第一个不同点:

/**************************************************华丽分割线***************************************************/

SEND_OP_CONT (CMD1 for MMC)

SD_SEND_OP_CONT (ACMD41 for SD Memory)

这个cmd41(41号指令,后面就直接英文简写了)也是我们将在驱动中屏蔽的地方,此阶段改为cmd1。

/**************************************************华丽分割线***************************************************/

接下来是卡的注册阶段,SD卡的过程为:

cmd2  ->  cmd3(每个指令具体干些什么活参考手册)

MMC卡的过程为:

cmd2  ->  cmd3(每个指令具体干些什么活参考手册)

        在代码中,在进行cmd2之前,还进行了cmd8指令操作,反正事实证明在mmc驱动调式中没起到什么作用,这里我直接将该指令屏蔽了,如果不屏蔽反而影响了后面执行的cmd2,你会发现cmd2指令执行超时,而导致超时的罪魁祸首就是cmd8,由于cmd8执行不成功,导致命令线一直被占据而使cmd2执行超时。所以做法简单粗暴直接干掉。

        而在cmd3的过程中也做了相应修改,cmd3主要针对相关联卡地址,这里计算出来的关联卡地址为0,这个不科学,此处强制设置为1了,至于为什么设为1(这里还需要进一步探索)

        参考手册对于identification就描述到这了,其实还没有完,是不是感觉很“操蛋”,后面的过程,将继续为大家展开,如果相应指令做了修改也会提出。以下是MMC卡的过程identification的过程。在cmd3之后,操作过程为:

cmd9  ->  cmd7  ->  cmd16  ->  (cmd6  ->   cmd13如果大家需要修改传输模式可以添加这两步,但是cmd中的参数(直接查找手册)需要大家格外重视,如果参数错了,将会导致后面文件系统无法挂载的现象,总之identification这个代码过程非常重要,可以说后面文件系统用得爽不爽直接与这里挂钩)。

/**************************************************华丽分割线***************************************************/

然后我们的代码中有一个cmd42也是非常操蛋,直接导致我们无法创建设备文件,这里直接干掉它。我们mmc是不支持cmd55 和 cmd41,凡是大家在identification中看到不要犹豫,不要手软直接干它。因为这些指令的存在很有可能导致你其他指令的执行超时。

/**************************************************华丽分割线***************************************************/

这里mmc的调试大家主要需要注意identification这个过程,至于文中还有些模糊的地方,以后搞明白了,继续补充。