第1章 SDIO协议概述:历史、版本、速度模式
各位同学,咱们今天聊SDIO。其实它最早是SD卡协会为手机和嵌入式设备扩接口搞出来的——你想想看,一块SD卡既当存储又能接WiFi、蓝牙、GPS,物理层复用比USB便宜得多。我早年做平板电脑时,就是被这个“一根线干两件事”的理念拉进SDIO坑的。
1.1 从SD到SDIO:为什么多此一举?
SD规范最初只为存储。但2001年WiFi刚热,设备商发现:如果能把SD卡槽的引脚和协议扩展成通用IO,就能低成本接通信模组。于是SDIO 1.0诞生了,说白了就是在SD协议基础上加了CMD53(读写扩展寄存器)和特殊中断机制。
关键转折点:
- 2001年 SDIO 1.0:定义1-bit模式,时钟最高25MHz,速度一般。
- 2004年 SDIO 2.0:加入4-bit模式,时钟升到50MHz,带宽明显改善。
- 2011年 SDIO 3.0:引入UHS-I(超高速一级),时钟208MHz,1.8V信号。
- 2018年 SDIO 4.0(草案):开始推8-bit模式,目标带宽达200MB/s以上,但目前消费端落地少。
我记得2014年帮某厂家调一款SDIO WiFi模组时,读spec发现SDIO 2.0的4-bit理论最高100Mbps,但实际跑WiFi只能到70Mbps。后来换3.0 UHS-I,才勉强把802.11n的150Mbps跑满。嗯,这里要注意:协议版本决定了你能拉多高的时钟,但实际吞吐还看卡主控和天线。
1.2 速度模式:从1-bit到8-bit的进化
速度模式大体分三类——你要记住它们对应的时钟和位宽,因为后面讲WiFi时序全绕不开。
| 模式 | 位宽 | 最大时钟 | 理论带宽 | 信号电平 |
|---|---|---|---|---|
| DS(默认速度) | 1/4-bit | 25 MHz | 12.5 MB/s | 3.3V |
| HS(高速) | 4-bit | 50 MHz | 25 MB/s | 3.3V |
| UHS-I SDR12/25/50 | 4-bit | 208 MHz | 104 MB/s | 1.8V |
| UHS-I DDR50 | 4-bit(双沿) | 50 MHz | 50 MB/s | 1.8V |
| 8-bit模式 | 8-bit | 208 MHz | 208 MB/s(理论) | 1.8V |
为什么8-bit模式这么晚才出现?根本原因是SD卡插槽物理引脚限制——标准SD卡只有9根线(CMD、CLK、DAT0~3、VDD、VSS、VSS2)。要跑8-bit必须额外引4根DAT线,这通常需要专用卡座或定制PCB。WiFi模组为了省成本,这么多年一直用4-bit到顶。直到车载和工业领域需要更高带宽(比如WiFi 6的1.2Gbps),才开始推8-bit。
1.3 SDIO 8-bit模式的核心逻辑
8-bit模式并不是独立协议,它复用SDIO 3.0的UHS-I物理层,只是把数据线从4根扩展到8根。关键变化只有两个:
- 时钟208MHz双沿(SDR/DDR):数据在上升沿和下降沿都采样,等效频率翻倍。
- 增加DAT4~7的同步:主机发送CMD6切换位宽,从设备必须在8个时钟内反应。
我个人习惯把8-bit模式的时序画成下面这张图——你理解了这个,后面调驱动时就不会被硬件手册搞晕。
1.4 SDIO版本与WiFi驱动的映射关系
WiFi驱动里通常用 mmc->ios.timing 来控制模式切换。拿Linux内核举例:
/* drivers/mmc/core/sdio_ops.c */
static int sdio_set_bus_speed(struct mmc_host *host, unsigned int speed)
{
struct mmc_ios *ios = &host->ios;
switch (speed) {
case MMC_TIMING_SD_HS:
ios->clock = 50000000; /* 50 MHz */
ios->bus_width = MMC_BUS_WIDTH_4;
break;
case MMC_TIMING_UHS_SDR104:
ios->clock = 208000000; /* 208 MHz */
ios->bus_width = MMC_BUS_WIDTH_4;
break;
case MMC_TIMING_UHS_DDR50:
ios->clock = 50000000;
ios->bus_width = MMC_BUS_WIDTH_4;
ios->timing = MMC_TIMING_UHS_DDR50;
break;
/* 8-bit模式案例(非标准,需自定义) */
case MMC_TIMING_SDIO_8BIT:
ios->clock = 208000000;
ios->bus_width = MMC_BUS_WIDTH_8; /* 需要头文件定义 */
break;
}
}
总结一下:SDIO从1.0走到3.0,本质是时钟升高+位宽加倍。8-bit模式不是革命,而是UHS-I物理层在引脚数上的极限延伸。你只要把握住“时钟、位宽、电平”这三个变量,后面看任何SDIO WiFi芯片手册都不会懵。