4.3.20. SDIO 使用说明
4.3.20.1. 概述
X5 支持 SDIO(Secure Digital Input Output)接口,用于
高速 数据传输 和 扩展 外设。 X5 提供
完整 的 SDIO 硬件 支持 与 驱动 框架,支持 多种 传输 模式 及 协议 版本,允许 通过 标准接口 连接 多种 外设 如 Wi-Fi 模块、蓝牙 模块。
4.3.20.2. 特点
支持
协议 版本:兼容 SDIO Ver3.0 协议(含 eSDIO)。 高速
时钟 支持:接口 最高 支持 200 MHz 时钟 输入。 多种
传输 模式:支持 4 线 数据传输,包括 SD High Speed、SDR12、SDR25、SDR50、SDR104 等 模式,详细 规格 如下:
| Bus Speed Mode | Maximum Frequency | Signal Voltage | Bus Maximum Performance | Spec. Version |
|---|---|---|---|---|
| Default Speed (DS) | 25MHz | 3.3V | 12.5MB/sec | 1.01 |
| High Speed (HS) | 50MHz | 3.3V | 25MB/sec | 1.10 |
| UHS-I: SDR12 | 25MHz | 1.8V | 12.5MB/sec | 3.01 |
| UHS-I: SDR25 | 50MHz | 1.8V | 25MB/sec | 3.01 |
| UHS-I: SDR50 | 100MHz | 1.8V | 50MB/sec | 3.01 |
| UHS-I: SDR104 | 208MHz | 1.8V | 104MB/sec | 3.01 |
SDIO 协议
4.3.20.3. 功能描述
典型应用
SDIO 接口

CLK:主机
提供 的 时钟 信号 给 到 SDIO 外设 CMD:用于
发送 命令 和 接收 响应 主机
通过 这条线 向 SDIO 外设 发送 控制 命令(如 初始化、配置、数据 读写 等) 外设
通过 这条线 将 命令 的 响应 返回 给 主机
DATA: 模式
不同,支持 单线(DATA0) 或 多线 传输(DATA0-DATA3) 单线
模式:只有 DATA0 一根 线 用于 数据传输 4线
模式:DATA0-DATA3 提供 更 高 的 数据 传输速率
SDIO 常见
Bluetooth :通过 SDIO 接口
连接 蓝牙 模块,实现 无线通信 功能。 Wi-Fi :利用 SDIO 接口
与 主控 通信,提供 无线 局域网(WLAN)连接。 4G :支持 SDIO 接口
的 4G 模块,用于 提供 高速 的 移动 数据通信。
功能原理
协议
支持 : 基于 SDIO Ver3.0 标准,支持完整 的 命令 接口(CMD0~CMD52),支持 eSDIO(Embedded SDIO)。 驱动
架构 : 内核中 的 MMC 框架 与 SDIO 驱动 协同工作,负责 完成 以下 任务: 通过
sdio_register_driver和sdio_unregister_driver完成设备 注册 和 注销。 解析
设备树(DTS)中 的 硬件 信息,初始化 硬件资源。 利用
中断 机制 和 DMA 引擎 高效 处理 数据传输。
4.3.20.4. 驱动代码
Kernel 驱动
在
驱动接口说明
驱动
int sdio_register_driver(struct sdio_driver *drv)
驱动
void sdio_unregister_driver(struct sdio_driver *drv)
sdio_driver 结构
struct sdio_driver {
char *name;
const struct sdio_device_id *id_table;
int (*probe)(struct sdio_func *, const struct sdio_device_id *);
void (*remove)(struct sdio_func *);
struct device_driver drv;
};
设备树配置指南
SDIO 控制器arch/arm64/boot/dts/hobot/x5.dtsi
适配外设注意事项
根据
硬件 设计,确认 目标 MMC 控制器 的 SDIO 编号 是否 与 设备树(DTS)中 配置 的 物理地址 和 设备 类型 一致。 以 X5 EVB 为
参考 设计,配置 如下:
| SDIO 控制器 | 物理地址 | 设备 |
|---|---|---|
| SDIO0 | 0x35040000 | eMMC |
| SDIO1 | 0x35020000 | SD 卡 |
| SDIO2 | 0x35030000 | 其它 SDIO 设备,一般 |
常用字
non-removable:标记不可 移除 设备,系统启动 后 不 支持 热插拔。 cd-gpios:定义 SD 卡检测 引脚。 broken-cd:禁用卡槽 检测 功能。 no-sd:禁用 SD 卡功能。 no-mmc:禁用 eMMC 功能。cap-sdio-irq:启用 SDIO 中断。clock-frequency:自定义工作 时钟 频率,单位 Hz。
以下
eMMC
关键
属性 non-removable:标记为 不可 移除 设备。注意,此 配置 会 使 系统 在 启动 时仅 对 该 控制器 的 设备 进行 一次 探测。
运行
模式 :一般有 以下 两种 选择: cap-mmc-highspeed:High Speed 模式,最高时钟 频率 为 52 MHz(X5 平台 实际 限制 为 50 MHz)。 mmc-hs200-1_8v:HS200 模式,最高时钟 频率 为 200 MHz。
bus-width:数据线宽度,通常 配置 为 8。
SD 卡
关键
属性 no-mmc和no-sdio:SD 卡默认 DTS 配置 包含 no-mmc、no-sdio以优化 探测 流程。 broken-cd和cd-gpios:如果
未 连接 SD 卡 插拔 检测 中断 引脚,请 配置 broken-cd并删除 cd-gpios字段,系统 将 通过 轮询 方式 检测 卡槽 状态。 如果
有 插拔 检测 中断 引脚,按照 实际 硬件 定义 配置 cd-gpios(包括极性)。
运行
模式 :根据需求 配置 sd-uhs-*或cap-sd-highspeed模式,具体说明 参考 SD 协议 或 MMC 协议 文档。 电压
域 :调整 SD 卡
默认 探测 电压 为 3.3V,高速 模式( sd-uhs-*)需要 1.8V IO 电压。配置
项: uhs-180v-gpio+uhs-180v-logic:配置用于 切换 SD 卡槽 IO 供电 的 GPIO 和 极性,需 与 硬件 设计 一致。 MMC 电压
域 的 切换 由 MMC 自己 控制,对应 的 pinctrl 信息 不 需要 调整。
其他 SDIO 设备(如 WiFi)
关键
属性 no-mmc和no-sd:SDIO 设备默认 DTS 配置 no-mmc、no-sd优化探测 流程。 broken-cd:通常 SDIO 设备不 需要 插拔 检测 中断。如果 需要,配置 方式 与 SD 卡 类似。 如果 WIFI 模组
没有 Card Detect 管脚,必须 将”broken-cd”加上。 如果
需要 对WiFi进行 上下 电,需要 将”non-removable”字 段 删除,host端 才 会 进行 多次 探测;否则 WiFi 模组 不会 被 二次 探测。
cap-sdio-irq:用于接收 SDIO 设备 的 中断(如 WiFi 唤醒)。
运行
模式 :根据需求 配置 sd-uhs-*或cap-sd-highspeed模式。电压
域 :调整 若
默认 电压 为 3.3V,但 需 切换 至 1.8V:参考 SD 卡 配置 方法。 若
默认 电压 为 1.8V: 删除
uhs-180v-gpio和uhs-180v-logic等字 段,以防 对GPIO进行 误操作 配置
mmc-fixed-voltage:特殊 DTS 字段,用于 强制 指定 MMC 控制器 的IO供电,定义 为”1800或”3300”,以 配置 为 对应 的 电压,示例: mmc-fixed-voltage = <1800>;
完整Documentation/devicetree/bindings/mmc/mmc-controller.yaml
Kernel SDIO 框架调试
X5 SDIO 接口Dynamic Debug和 ftrace调试
下面Dynamic Debug和ftrace调试
Dynamic Debug 使用指南
Dynamic debug(具体
echo 'file drivers/mmc/core/core.c +p' >/sys/kernel/debug/dynamic_debug/control
echo 'file drivers/mmc/core/mmc.c +p' >/sys/kernel/debug/dynamic_debug/control
echo 'file drivers/mmc/core/block.c +p' >/sys/kernel/debug/dynamic_debug/control
echo 'file drivers/mmc/host/sdhci-of-dwcmshc.c +p' > /sys/kernel/debug/dynamic_debug/control
echo 'file drivers/mmc/host/sdhci.c +p' > /sys/kernel/debug/dynamic_debug/control
echo 7 7 7 7 > /proc/sys/kernel/printk
Ftrace 使用指南
配置
内核 支持 Ftrace 相关 选项 CONFIG_FTRACE=y CONFIG_FUNCTION_TRACER=y CONFIG_DYNAMIC_FTRACE=y CONFIG_DEBUG_FS=y
完成
内核 配置 后,重新 编译 并 将 生成 的 镜像 烧录 到 目标 设备。 进入
系统 加载 驱动 后 开始 ftrace 使用,以 MMC 传输 事件 为例。 cd /sys/kernel/debug/tracing/ #进入 Ftrace 工作目录 echo mmc:mmc_request_start > set_event #添加事件 mmc_request_start,用于标识 MMC 请求的开始 echo mmc:mmc_request_done >> set_event #添加事件 mmc_request_done,用于标识 MMC 请求的完成 echo 0 > tracing_on #关闭实时跟踪功能,确保初始化阶段数据不被记录 echo nop > current_tracer #清除之前的跟踪器设置 echo > trace #清空 trace 文件,避免干扰后续分析 echo 1 > tracing_on #开启实时跟踪功能。 cat /sys/kernel/debug/tracing/trace | grep mmc #查看并过滤 trace 文件中的 MMC 相关事件
trace 文件
分析 通过 trace 文件
中 记录 的 事件,可以 分析 MMC 请求 的 执行 细节,包括 请求 发起、完成 的 具体 时间 及 参数。以下 是 部分 示例 日志 及其 含义: kworker/5:1H-152 586.094457: mmc_request_start: mmc0: start struct mmc_request[000000007dc8561b]: cmd_opcode=25 cmd_arg=0xdca8 .... <idle>-0 586.094839: mmc_request_done: mmc0: end struct mmc_request[000000007dc8561b]: cmd_opcode=25 cmd_err=0 .... kworker/0:0H-8 586.094911: mmc_request_start: mmc0: start struct mmc_request[00000000daeefa66]: cmd_opcode=13 cmd_arg=0x10000 .... kworker/0:0H-8 586.094936: mmc_request_done: mmc0: end struct mmc_request[00000000daeefa66]: cmd_opcode=13 cmd_err=0 .... kworker/5:1H-152 586.095231: mmc_request_start: mmc0: start struct mmc_request[000000002e7e251a]: cmd_opcode=6 cmd_arg=0x3200101 .... <idle>-0 586.095258: mmc_request_done: mmc0: end struct mmc_request[000000002e7e251a]: cmd_opcode=6 cmd_err=0 .... kworker/5:1H-152 586.095866: mmc_request_start: mmc0: start struct mmc_request[000000001e3cd0e1]: cmd_opcode=13 cmd_arg=0x10000 .... <idle>-0 586.095889: mmc_request_done: mmc0: end struct mmc_request[000000001e3cd0e1]: cmd_opcode=13 cmd_err=0 ....
时间
戳 :586.094457 和 586.094839 分别为 事件 发生 的 时间 点(单位:秒)。 进程
名 :例如,kworker/5:1H-152 表示处理事件 的 内核 线程。 事件
类型 :mmc_request_start:表示
发起 MMC 请求,包含 具体 的 请求 参数(如 cmd_opcode=25,cmd_arg=0xdca8)。 mmc_request_done:表示
完成 MMC 请求,记录 请求 的 执行 结果(如 cmd_err=0 表示 无 错误,bytes_xfered=45056 表示 传输 了 45056 字节)。 关联
请求 :通过 struct mmc_request[000000007dc8561b] 可定位 每个 请求 的 唯一 标识。
MMC 控制器配置和运行参数
可以mmc2 为例):
cat /sys/kernel/debug/mmc2/ios
clock: 200000000 Hz
actual clock: 200000000 Hz
vdd: 21 (3.3 ~ 3.4 V)
bus mode: 2 (push-pull)
chip select: 0 (don't care)
power mode: 2 (on)
bus width: 2 (4 bits)
timing spec: 6 (sd uhs SDR104)
signal voltage: 1 (1.80 V)
driver type: 0 (driver type B)
参数
clock: MMC 控制器配置 的 时钟 频率(200 MHz)。 actual clock:实际运行 的 时钟 频率(200 MHz)。 vdd:供电电压 范围(3.3 ~ 3.4 V)。 bus mode:总线模式(2:推挽 模式)。 chip select:芯片选择 模式(0:无关)。 power mode:电源模式(2:开启)。 bus width:总线宽度(4 位)。 timing spec:传输模式(SDR104)。 signal voltage:信号电压(1.8 V)。 driver type:驱动类型(B 类型)。
SDIO 设备调试
请
参考 设备 厂商 提供 的 驱动 源码,启用 其 内置 调试 选项 进行 编译 与 调试。 关于 WIFI SDIO 设备
调试 请 查阅 WIFI_Driver_Debug_Guide 。
4.3.20.5. 常见问题
1. 无法识别 SDIO 设备
设备树
检查 :确认 SDIO 接口状态 是否 配置 为 okay。时钟
配置 :确保检查 时钟 频率 和 模式 配置 正确。
2. 卡运行模式与预期不符
DTS 配置
检查 :核对设备树 中 目标 运行 模式 的 配置(如 电压 域 等)。 硬件
支持 :确保检查 硬件 提供 目标 模式 所 需 的 IO 电压。
3. 控制器未初始化
初始化
确认 :通过检查 /sys/kernel/debug/mmc[x]文件夹,确认当前 已 初始化 的 MMC 控制器 数量。
注意事项
如果 SDIO0 在 DTS 中
配置 为 status="disabled",而 SDIO1 配置为 status="okay":在
/sys/kernel/debug中,SDIO1 会被 枚举 为 mmc0,依次类推。
可
通过 以下 命令 查看 对应 SDIO 控制器 的 初始化 状态: cat /sys/firmware/devicetree/base/soc/hsio_apb/sdhci@xxx/status