在mmc_rescan_try_freq函数中会依次调用host驱动接口执行POWER_UP、hw_reset以及发送CMD0命令让卡进入idle状态 接下来会依次尝试attach SDIO、SD和MMC三种子协议的卡,本小节以MMC子协议为例讲解具体的attach流程 发送CMD1命令,获取OCR寄存器值。通过mmc_select_voltage函数设置OCR中引脚电平为3.3V 通过mmc_init_card函...
第71行就是分配sdio_func结构体变量,该结构体存储了功能块的参数。 第75行就是给功能块编号,编号是从1到7(因为一个SDIO设备最多只有7个功能块),存储在变量func->num中 第78行就是读取SDIO卡中的FBR寄存器中关于该卡的功能类型的数据,存储在func->class变量中(具体关于FBR寄存器内容,可以参考SDIO spec文档) ...
mmc_attach_sdio(host) mmc_send_io_op_cond(host,0, &ocr);//使用CMD5命令,获取OCR值(slave支持的电压范围)mmc_attach_bus(host, &mmc_sdio_ops);//设置host的bus操作函数是mmc_sdio_opsmmc_select_voltage(host, ocr);//设置电压为选取电压(slave本身支持的电压范围 & 平台环境选取的电压ocr_avail==...
那这篇文章,我们就看看SDIO的识别过程,它对应的函数就是mmc_attach_sdio(host) (函数位于文件drivers/mmc/core/sdio.c) 这个函数大概来说做了如下的工作 1、向卡发送CMD5命令,该命令有两个作用: 第一,通过判断卡是否有反馈信息来判断是否为SDIO设备(只有SDIO设备才对CMD5命令有反馈,其他卡是没有回馈的);...
从上篇文章的最后,我们知道host在扫描卡的过程中,其识别的顺序为SDIO SD MMC,并且从它的注释可以看出,这个顺序是很重要的。那这篇文章,我们就看看SDIO的识别过程,它对应的函数就是mmc_attach_sdio(host)(函数位于文件drivers/mmc/core/sdio.c) 这个函数大概来说做了如下的工作 ...
sd,sdio或者mmc的协议实现在哪里呢?可以在图5中看到,初始化就是在mmc_attach_sdio, mmc_attach_sd或者mmc_attach_mmc函数中。 1.初始化时候,首先发送cmd0使卡进入idle状态; 2.接着发送cmd8,检测卡是否SD2.0。SD1.1不支持cmd8,因此如果发送cmd8无回应,则卡为SD1.1,否则就是SD2.0; ...
接下来会依次尝试attach SDIO、SD和MMC三种子协议的卡,本小节以MMC子协议为例讲解具体的attach流程 发送CMD1命令,获取OCR寄存器值。通过mmc_select_voltage函数设置OCR中引脚电平为3.3V 通过mmc_init_card函数执行mmc卡的初始化流程,如下 再次发送CMD0命令,保证前面OCR修改后卡的状态再次回到idle态 ...
假设不考虑上述没有swakeup line,进入suspend状态的hsmmc无法在有卡中断时自动开始恢复工作的情况,或者说我们已经找到了某种解决办法后,考虑下host,sdio等mmc子系统模块如何配合实现使用中断方式处理sdio事件。 图4.2表明了在当前mmc子系统软件架构下可行的中断处理方式。
一、SD/MMC/SDIO概念区分 SD(SecureDigital)与 MMC(MultimediaCard) SD 是一种 flash memory card 的标准,也就是一般常见的 SD 记忆卡,而 MMC 则是较早的一种记忆卡标准,目前已经被 SD 标准所取代。在维基百科上有相当详细的 SD/MMC 规格说明:[http://zh.wikipedia.org/wiki/Secure_Digital]。
先SDIO接口 /* * First we search for SDIO... */ err = mmc_send_io_op_cond(host, 0, &ocr); if (!err) { if (mmc_attach_sdio(host, ocr)) { ... 在SD: /* * ...then normal SD... */ err = mmc_send_app_op_cond(host, 0, &ocr); ...