Linux SDIO

本文深入解析了SDIO总线的工作原理,包括时钟信号、命令与数据传输方式,以及热插拔机制。详细介绍了SDIO命令的格式与执行流程,并探讨了SDIO接口驱动的核心数据结构与操作接口函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、sdio接口层解析

SDIO总线

     SDIO总线 和 USB总线 类似,SDIO也有两端,其中一端是HOST端,另一端是device端。所有的 通信 都是 由HOST端 发送 命令 开始的,Device端只要能解析命令,就可以相互通信。

  CLK信号:HOST给DEVICE的 时钟信号,每个时钟周期传输一个命令。

  CMD信号:双向 的信号,用于传送 命令 和 反应

  DAT0-DAT3 信号:四条用于传送的数据线。

  VDD信号:电源信号。

  VSS1,VSS2:电源地信号。

  SD卡有全速模式和低速模式:

        全速模式: 时钟在0 - 25MHz,传输速率可以达到100Mbps  ,有spi模式和1bit,4bit模式的数据传输;

        低速模式: 时钟在1 - 400kHz , 可选的4为数据线传输,默认spi传输和1bit的数据传输;

   SD 卡在1bit模式下,bit1 作为数据线,bit2 作为中断线。 在4bit模式下,bit1分时复用数据和中断;


SDIO热插拔原理:

     方法:设置一个 定时器检查 或 插拔中断检测

     硬件:假如GPG10(EINT18)用于SD卡检测

          GPG10 为高电平 即没有插入SD卡

          GPG10为低电平  即插入了SD卡

 

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,有的则不需要。

       对于读命令,首先HOST会向DEVICE发送命令,紧接着DEVICE会返回一个握手信号,此时,当HOST收到回应的握手信号后,会将数据放在4位的数据线上,在传送数据的同时会跟随着CRC校验码。当整个读传送完毕后,HOST会再次发送一个命令,通知DEVICE操作完毕,DEVICE同时会返回一个响应。

       对于写命令,首先HOST会向DEVICE发送命令,紧接着DEVICE会返回一个握手信号,此时,当HOST收到回应的握手信号后,会将数据放在4位的数据线上,在传送数据的同时会跟随着CRC校验码。当整个写传送完毕后,HOST会再次发送一个命令,通知DEVICE操作完毕,DEVICE同时会返回一个响应。

    

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卡。

     cmd0   初始化mmc卡


  SD卡用的是SD协议, SDIO卡用的是SDIO协议,协议不一样,用的初始化和读写都不一样。相对与SD协议,SDIO协议多了cmd5,cmd52,cmd53命令。


   每个SDIO卡都有1-7个function和memory fuction组成,所谓function就是一个IO设备,就是一些寄存器的组合。



 --------------------------------------

Sdio接口驱动

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

struct mmc_host 用来描述 卡控制器

struct mmc_card 用来描述 

struct mmc_driver 用来描述 mmc 卡驱动

struct sdio_func  用来描述 功能设备

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

 

Linux系统中,SDIO(Secure Digital Input/Output)是一种用于在嵌入式系统中连接外部设备的接口标准。Linux内核中的SDIO子系统是一个驱动程序集合,提供了与SDIO设备通信和管理的功能。 SDIO子系统在Linux内核中作为一个子系统存在,它不仅仅是一个单独的驱动程序,而是包含了与SDIO相关的多个驱动程序和功能。这些驱动程序和功能包括与SDIO设备通信的接口、SDIO主机的资源管理、中断处理等。 在Linux内核中,SDIO子系统提供了对SDIO设备的支持。SDIO设备包括各种外部设备,如无线网卡、蓝牙模块、摄像头等。SDIO子系统通过与SDIO设备的通信,使得这些设备能够在Linux系统中被识别和使用。 SDIO子系统的核心组件是SDIO核心驱动(mmc_core)。该驱动负责SDIO设备的控制和管理,包括设备的初始化、数据传输、中断处理等。SDIO核心驱动与SDIO设备的具体实现有关,不同的SDIO设备可能需要不同的驱动程序来支持。 总而言之,LinuxSDIO子系统是一个包含了多个驱动程序和功能的子系统,用于支持和管理SDIO设备在Linux系统中的使用。它通过与SDIO设备的通信实现了与外部设备的连接和交互。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Linux内核之mmc子系统-sdio](https://blog.youkuaiyun.com/mrwangwang/article/details/35997153)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值