分类:
2012-11-25 11:34:07
原文地址:SDIO DRIVER 作者:steven_miao
SDIO
卡
SDIO
卡是在
SD
内存卡接口的基础上发展起来的接口,
SDIO
接口兼容以前的
SD
内存卡,并且可以连接
SDIO
接口的设备,目前根据
SDIO
协议的
SPEC
,
SDIO
接口支持的设备总类有蓝牙,网卡,电视卡等。
SDIO
协议是由
SD
卡的协议演化升级而来的,很多地方保留了
SD
卡的读写协议,同时
SDIO
协议又在
SD
卡协议之上添加了
CMD52
和
CMD53
命令。由于这个,
SDIO
和
SD
卡规范间的一个重要区别是增加了低速标准,低速卡的目标应用是以最小的硬件开始来支持低速
I/O
能力。低速卡支持类似调制解调器
,
条形码扫描仪和
GPS
接收器等应用。高速卡支持网卡,电视卡还有“组合”卡等,组合卡指的是存储器
+SDIO
。
SDIO
和
SD
卡的
SPEC
间的又一个重要区别是增加了低速标准。
SDIO
卡只需要
SPI
和
1
位
SD
传输模式。低速卡的目标应用是以最小的硬件开支来支持低速
I/O
能力,低速卡支持类似
MODEM
,条形扫描仪和
GPS
接收器等应用。对组合卡来说,全速和
4BIT
操作对卡内存储器和
SDIO
部分都是强制要求的。
在非组合卡的
SDIO
设备里,其最高速度要只有达到
25M
,而组合卡的最高速度同
SD
卡的最高速度一样,要高于
25M
。
SDIO
总线
SDIO
总线和
USB
总线类似,
SDIO
总线也有两端,其中一端是主机(
HOST
)端,另一端是设备端(
DEVICE
),采用
HOST- DEVICE
这样的设计是为了简化
DEVICE
的设计,所有的通信都是由
HOST
端发出命令开始的。在
DEVICE
端只要能解溪
HOST
的命令,就可以同
HOST
进行通信了。
SDIO
的
HOST
可以连接多个
DEVICE
,如下图所示
:
这个是同
SD
的总线一样的
,
其中有如下的几种信号
1.
CLK
信号
:HOST
给
DEVICE
的时钟信号
.
2.
CMD
信号:双向的信号,用于传送命令和反应。
3.
DAT0-DAT3
信号
:
四条用于传送的数据线。
4.
VDD
信号
:
电源信号。
5.
VSS1
,
VSS2:
电源地信号。
在
SDIO
总线定义中
,DAT1
信号线复用为中断线。在
SDIO
的
1BIT
模式下
DAT0
用来传输数据,
DAT1
用作中断线。在
SDIO
的
4BIT
模式下
DAT0-DAT3
用来传输数据,其中
DAT1
复用作中断线。
SDIO
命令:
SDIO
总线上都是
HOST
端发起请求,然后
DEVICE
端回应请求。其中请求和回应中会数据信息。
1.
Command:
用于开始传输的命令,是由
HOST
端发往
DEVICE
端的。其中命令是通过
CMD
信号线传送的。
2.
Response:
回应是
DEVICE
返回的
HOST
的命令,作为
Command
的回应。也是通过
CMD
线传送的。
3.
Data:
数据是双向的传送的。可以设置为
1
线模式,也可以设置为
4
线模式。数据是通过
DAT0-DAT3
信号线传输的。
SDIO
的每次操作都是由
HOST
在
CMD
线上发起一个
CMD
,对于有的
CMD
,
DEVICE
需要返回
Response
,有的则不需要。
对于读命令,首先
HOST
会向
DEVICE
发送命令,紧接着
DEVICE
会返回一个握手信号,此时,当
HOST
收到回应的握手信号后,会将数据放在
4
位的数据线上,在传送数据的同时会跟随着
CRC
校验码。当整个读传送完毕后,
HOST
会再次发送一个命令,通知
DEVICE
操作完毕,
DEVICE
同时会返回一个响应。
对于写命令,首先
HOST
会向
DEVICE
发送命令,紧接着
DEVICE
会返回一个握手信号,此时,当
HOST
收到回应的握手信号后,会将数据放在
4
位的数据线上,在传送数据的同时会跟随着
CRC
校验码。当整个写传送完毕后,
HOST
会再次发送一个命令,通知
DEVICE
操作完毕,
DEVICE
同时会返回一个响应。
SDIO
的寄存器:
SDIO
卡的设备驱动
80%
的任务就是操作
SDIO
卡上的有关寄存器。
SDIO
卡最多允许有
7
个功能(
function
)
,
这个同其功能号是对应的(
0
~
7
)
,
每个功能都对应一个
128K
字节大小的寄存器,这个见下面的图。功能号之所以取值范围是
1~7
,而没有包含
0
,是因为功能
0
并不代表真正的功能,而代表
CIA
寄存器,即
Common I/O Area
,这个纪录着
SDIO
卡的一些基本信息和特性,并且可以改写这些寄存器。其中地址
0x1000~0x17fff
是
SDIO
卡的
CIS
区域,就是基本信息区域,
Common Information Structure
。初始化的时候读取并配对
SDIO
设备。
这些寄存器的详细分区已经其对应的功能,在开发过程中都是需要仔细研读的,这些都在协议的
SPEC
中都有详细说明,这里就不在罗索了。
CMD52 命令:
SDIO 设备为了和 SD 内存卡兼容, SD 卡所有 Command 和 Response 完全兼容,同时加入了一些新的 Command 和 Response 。例如,初始化 SD 内存卡使用 ACMD41 ,而 SDIO 卡设备则用 CMD5 通知 DEVICE 进行初始化。
但二者最重要的区别是, SDIO 卡比 SD 内存卡多了 CMD52 和 CMD53 命令,这两个命令可以方便的访问某个功能的某个地址寄存器。
CMD52 命令是 IO_RW_DIRECT 命令的简称,其命令格式如下
首先第一位为 0, 表明是起始位,第二位为传输方向,这里为 1 ,代表方向为 HOST 向 DEVICE 设备传送,其后 6 位为命令号,这里是 110100b ,用十进制表示为 52 , CMD52 的名字也由此而来。紧接着是读写标志位。
然后是操作的功能号。也就是 function number 。如果为 0 则指示为 CCCR 寄存器组。
紧接着是寄存器地址,用 17 指示,由于功能寄存器有 128K 地址, 17 位正好能寻址。
再下来 8 位 Write data or Staff Bits 的意思是说,如果当前为写操作,则为数据,否则 8 位为填充位。无意义。
最后 7 位为 CRC 校验码。最后一位为结束位 0 。
对于 CMD52 的 Response 是 48 位,命令格式如下:
总结下, CMD52 是由 HOST 发往 DEVICE 的,它必须有 DEVICE 返回来的 Response 。 CMD52 不需要占用 DAT 线,读写的数据是通过 CMD52 或者 Response 来传送。每次 CMD52 只能读或者写一个 byte .
CMD53 命令:
CMD52 每次只能读写一个字节,因为有了 CMD53 对读写进行了扩展, CMD53 允许每次读写多个字节或者多个块 (BLOCK) 。 CMD53 的命令格式如下:
第一位是 1, 为开始位,然后是一位方向位,总是 1 ,代表方向为 HOST 向 DEVICE 设备传送,其后 6 位为命令号,这里是 110101b ,用十进制表示为 53 , CMD53 的名字也由此而来。
然后是 1 位的读写标志。接着是 3 位功能号,这个同 CMD52 都是相同的。 Block Mode 如果 1 代表是块传输模式,否则为字节传输模式。
OP Code 为操作位,如果是 0 ,代表数据往固定的位置读写,如果 1 代表是地质增量读写。例如,对地址 0 固定读写 16 个字节,相当于 16 次读写的地址 0 ,而对地址 0 增量读写 16 个字节,相当于读写 0~15 地址的数据。
然后是 17 位的地址寄存器,可以寻址到 128K 字节的地址,然后是 9 位的读写的计数,对于字节读取,读写大小就是这个计数,而对于块读写,读写的大小是计数乘以块的大小。
随后的 7 位为 CRC 校验码。最后一位为 1 。
当读写操作是块操作的时候,块的大小是可以通过设置 FBR 中的相关寄存器来设置。
同 CMD52 命令不同的是, CMD53 没有返回的命令的,这里判断是否 DEVICE 设备读写完毕是需要驱动里面自己判断的,一般有 2 个方法, 1. 设置相应的读写完毕中断。如果 DEVICE 设备读写完毕,则对 HOST 设备发送中断。 2.HOST 设备主动查询 DEVICE 设备是否读写完毕,可以通过 CMD 命令是否有返回来判断是否 DEVICE 是否读写完毕。
转自:http://blog.csdn.net/tanxs001/archive/2010/12/22/6091320.aspx