CMD53(IO_RW_EXTENDED):
In order to read and write multiple I/O registers with a single command, a new command,IO_RW_EXTENDED is defined.
CMD53的response(R5):
与CMD52的response一样,只是8-bit data field shall be stuff bits and shall be read as 00h。
其它位定义:
Block Mode:表示块读写还是字节读写,0:字节读写;1:块读写;
OP code:读写时地址的变化模式
0:Multi byte R/W to fixed address;
1:Multi byte R/W to incrementing address;
Byte/Block Count:读写的字节或块数;
3 SDIO设备的扫描
本文对sdio设备的扫描过程主要是结合sdio命令进行,对于sdio控制器的上电,复位,clock的初始化等不做详细介绍。Linux内核中扫描sdio设备涉及的代码包含在下面目录中:kernel\drivers\mmc\core。
A、 sdio设备扫描从mmc_rescan函数开始,mmc_rescan函数中分别使用400k、300k、200k,100k的速率调用mmc_rescan_try_freq进行扫描,只要扫描到了设备,就会退出扫描。所以如果在400k速率时扫描到了sdio���备,后面3种速率的扫描就不需要再执行。
B、 mmc_rescan_try_freq函数中,先进行sdio_reset,命令如下:
cmd,Arg:0xc00, Cmd:52 /* 读取寄存器06h */
cmd,Arg:0x80000c08, Cmd:52 /* 寄存器06h RES (复位)bit写1 */
可以看到这两个命令都没有回应,这是因为sdio设备刚上电时处于initialization state,对于cmd52命令是不响应的,在这种情况下,这两个命令对sdio设备也是没有任何作用的。如果当前sdio设备处于commond state或transfer state,需要重新扫描sido设备,这两个命令就起作用了,会对sdio设备进行复位;
C、 mmc_go_idle把卡从sd mode切换到spi mode;
cmd,Arg:0x0, Cmd:0 /* 该命令不需要应答 */
这个命令对sd卡来说,作用是切换到idle状态,但对sdio设备来说,就是用于从sd mode切换到spi mode。同时这个命令要起作用,传输时CS管脚还必须要拉低,但在sd mode传输时,CS(对应DATA[3])管脚没有拉低,所以该命令在sd mode传输时也是不起作用的,只有在SPI mode传输时才会起作用。
D、 mmc_send_if_cond
cmd,Arg:0x1aa, Cmd:8
该命令对sdio设备为可选命令,可以不用实现。
从初始化开始到这个命令,对于重新上电了并使用sd mode的sdio设备来说,都是不起作用的,但这些命令的目的是为了兼容sd卡、emmc的扫描,及sdio设备在不同状态、不同模式时的扫描使用。
接下来就是调用mmc_attach_sdio进行实际的sdio设备扫描及初始化。
E、 mmc_attach_sdio函数中,先进行mmc_send_io_op_cond获取配置;
cmd,Arg:0x0, Cmd:5 /* 获取OCR及配置 */
cmd resp, 0:0x20ffff00, 1:0x3f
/* resp中已经把所有数据右移8bit(去掉CRC7和E bit) */
从response中,可以知道,该sdio设备配置:
Functions: 2个(function1, function2);
Memory Present::0 该设备不包含sd memory,sdio设备类型为MMC_TYPE_SDIO;
OCR: ffff00(详细定义见“表14 OCR Values for CMD5”)
获取完配置后,接着调用mmc_sdio_init_card进行sdio设备初始化;
F、 mmc_sdio_init_card函数中,先mmc_send_io_op_cond对sdio设备配置;
cmd,Arg:0x1018000, Cmd:5 /* 设置OCR及请求切换到1.8V */
cmd resp, 0:0xa0ffff00, 1:0x3f /* 回应Card is ready to operate,并不支持切换到1.8V */
response发现sdio设备不支持1.8V,后面不会进行1.8V的切换;同时该sdio设备不支持sd memory,也不需要进行sd memory的相关初始化。
G、 mmc_send_relative_addr获取sdio设备的RCA;
cmd,Arg:0x0, Cmd:3 /* cmd3获取RCA */
0:0x10000, 1:0x3 /* RCA值为1 */