android_wifi读书笔记之8-SDIO驱动架构

本文详细介绍了Android系统中SDIO(Secure Digital Input/Output)驱动的架构,包括SDIO协议、驱动结构和SDIO卡驱动。内容涵盖SDIO总线、命令、寄存器及其在Linux mmc子系统中的驱动实现,以及SDIO驱动如何处理设备的热插拔和数据传输。通过对控制器host驱动部分的解析,揭示了SDIO卡如何识别、初始化和管理。
摘要由CSDN通过智能技术生成

本文为读书笔记,整理自网络文献和源码

8、SDIO驱动架构

8.1  SDIO协议

SDIO协议是由SD卡的协议演化升级而来的,很多地方保留了SD卡的读写协议,同时SDIO协议又在SD卡协议之上添加了CMD52和CMD53命令。由于这个,SDIO和SD卡规范间的一个重要区别是增加了低速标准,低速卡的目标应用是以最小的硬件开始来支持低速I/O能力

8.1.1 SDIO总线

       SDIO总线和USB总线类似,SDIO总线也有两端,其中一端是主机(HOST)端,另一端是设备端(DEVICE),采用HOST- DEVICE这样的设计是为了简化DEVICE的设计,所有的通信都是由HOST端发出命令开始的。在DEVICE端只要能解溪HOST的命令,就可以同HOST进行通信了。

       SDIO的HOST可以连接多个DEVICE。几种信号如下:

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复用作中断线。

8.1.2 sdio命令

SDIO总线上都是HOST端发起请求,然后DEVICE端回应请求。sdio命令由6个字节组成。

1. Command:用于开始传输的命令,是由HOST端发往DEVICE端的。其中命令是通过CMD信号线传送的。

2.Response:回应是DEVICE返回的HOST的命令,作为Command的回应。也是通过CMD线传送的。

3. Data:数据是双向的传送的。可以设置为1线模式,也可以设置为4线模式。数据是通过DAT0-DAT3信号线传输的。

  SDIO的每次操作都是由HOST在CMD线上发起一个CMD,对于有的CMD,DEVICE需要返回Response,有的则不需要。

sd命令格式




      以IO_SEND_OP_COND命令为例包含以下部分:

     S(开始位) 总为0

     D(方向位) 1 从host到 device (0  从device到host)

     命令索引:  通过值000101B来

     填充位    0

     IO_OCR     运转条件寄存器所支持的VDD的最小值和最大值

     CRC7       7位CRC校验数据

     E(结束位)  总为1

 

MMC命令总共有40多个,分为class0 ~class7共8类,class0的所有卡必须支持。驱动程序通过发送cmd1、cmd41来区分sd卡和mmc卡,如果发送cmd1返回成功,则为mmc卡,否则发送cmd41返回成功,则为sd卡。 

SDIO 命令清单   

SD Memorycmd   SDIO cmd

  CMD0        CMD52 CMD0是复位命令,为了复位SDIO,用CMD52写1到RES位     CMD12        CMD52 停止块数据传输CMD,写CCCR寄存器中的相应位     

CMD16       CMD52 设置块长度,对SD内存,用CMD5写块长度到FBR寄存器     CMD2         NONE  CID寄存器不存在SDIO CARD中

CMD4         NONE DSR寄存器不存在SDIO CARD中    

CMD9         NONE CSD寄存器不存在SDIO CARD中    

CMD10        NONE CID寄存器不存在SDIO CARD中    

CMD13        NONE  SDIO不支持

ACMD6        CMD52 设置总线宽度,通过些CCCR寄存器     

ACMD13       NONE  SDIO中不支持

ACMD41      CMD5 SDIO 卡和 HOST  用 IO_SEND_OP_COND_COMMAND(CMD5)      ACMD42      CMD52 在SD模式,上拉电阻在 DAT[3]被控制通过写CD Disable      ACMD51      NONE   不支持     

CMD17       CMD53 IO 块操作用CMD53,而不是内存块操作如果是IO功能的卡被激活,仅些CCCR被要求改变的位模式就可以了。如果仅内存激活,通过ACMD6改变总线宽度。如果两者都有,则激活两者需要两个命令。

 

 

8.1.3 SDIO的寄存器:

      SDIO卡的设备驱动80%的任务就是操作SDIO卡上的有关寄存器。SDIO卡最多允许有7个功能(function),这个同其功能号是对应的(0~7),每个功能都对应一个128K字节大小的寄存器, 这些寄存器的详细分区已经其对应的功能。功能号之所以取值范围是1~7,而没有包含0,是因为功能0并不代表真正的功能,而代表CIA寄存器,即CommonI/O Area,这个纪录着SDIO卡的一些基本信息和特性,并且可以改写这些寄存器。其中地址0x1000~0x17fff是SDIO卡的CIS区域,就是基本信息区域,Common Information Structure。初始化的时候读取并配对SDIO设备。

 

8.2 SDIO驱动结构

Linux mmc子系统驱动架构如下:

 

drivers/mmc下有三个目录的作用分别为:

1) card   这个目录是衔接最上层应用的接口,应用层使用sd卡一般都是通过文件系统来操作的,card目录里面的代码就是让sd卡成为一个块设备,这样应用层就可以把它当作磁盘来操作了。

2) core   这个目录是MMC子系统的核心,里面实现了card和host要用到的一些通用的函数接口和数据结构,它起到衔接作用,可以看作成中间层,是MMC总线驱动程序。mmc/sd/sdio协议部分就是在这个文件夹里面实现的(card目录里面也会涉及到协议)。

 3) host  这个目录存放了各个mmc/sd/sdio控制器的代码,最终操作mmc/sd/sdio卡的部分      (硬件通讯接口)就是在这里实现的。

 

几个重要的数据结构:该结果位于core核心层,主要用于核心层与主机驱动层的数据交换处理。/include/linux/mmc/host.h

struct mmc_host用来描述卡控制器

structmmc_card 用来描述卡

structmmc_driver 用来描述mmc卡驱动

structsdio_func  用来描述功能设备

structmmc_host_ops 用来描述卡控制器操作接口函数功能,用于从主机控制器层向core 层注册操作函数,从而将core 层与具体的主机控制器隔离。也就是说 core 要操作主机控制器,就用这个 ops 当中给的函数指针操作,不能直接调用具体主控制器的函数。

8.2.1核心部分

核心部分肯定是在core目录里。文件core.c里mmc_init负责初始化mmc子系统subsys_initcall(mmc_init); 主要代码:

         ret= mmc_register_bus();

         if(ret)

                   gotodestroy_workqueue;

 

        

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值