架构
SDIO 主机驱动程序遵循 Linux MMC 子系统。其架构如下面的图中所示。
MMC 框架分为三层:MMC 主机驱动程序、MMC 核心和 MMC 卡驱动程序。MMC 卡驱动程序将 MMC 子系统注册为块设备,上层可以通过带文件系统的块设备访问 MMC 子系统。
MMC 核心实现了总线和 MMC/SD/SDIO 协议的核心逻辑。MMC 主机驱动程序用于连接主控制器和 MMC 核心,SDIO 驱动程序在这一层实现。
实现
SDIO 主机驱动程序实现为以下文件:
驱动位置 |
介绍 |
---|---|
<linux>/drivers/rtkdrivers/mmc/Kconfig |
SDIO 主机驱动程序 Kconfig |
<linux>/drivers/rtkdrivers/mmc/Makefile |
SDIO 主机驱动程序 Makefile |
<linux>/drivers/rtkdrivers/mmc/rtk-mmc.c |
SDIO 主机驱动程序 |
<linux>/drivers/rtkdrivers/mmc/rtk-mmc.h |
SDIO 主机驱动程序头文件 |
配置
设备树配置
设备树节点定义在 <dts>/rtl8730e-ocp.dtsi
中。
sdioh: sdioh@400D0000 {
compatible = "realtek,ameba-sdiohost";
reg = <0x400D0000 0x8000>;
interrupts = <GIC_SPI 38 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&rcc RTK_CKE_SDH>;
status = "okay";
};
下表是属性描述:
属性 |
描述 |
可配置? |
---|---|---|
compatible |
用于匹配驱动程序和设备的 ID |
否 |
reg |
寄存器资源 |
否 |
interrupts |
SPI 中断 |
否 |
clocks |
SDIO 时钟节点 |
否 |
status |
SDIOH 中断状态 |
否 |
pinctrl 的设备树节点在 <dts>/rtl8730e-pinctrl.dtsi
中定义。
sdioh_pins: sdioh@0 {
pins {
pinmux = <REALTEK_PINMUX('B', 27, SDIO)>, // SD_CMD
<REALTEK_PINMUX('B', 28, SDIO)>, // SD_CLK
<REALTEK_PINMUX('C', 0, SDIO)>, // SD_CD
<REALTEK_PINMUX('B', 29, SDIO)>, // SD_D0
<REALTEK_PINMUX('B', 25, SDIO)>, // SD_D1
<REALTEK_PINMUX('B', 26, SDIO)>, // SD_D2
<REALTEK_PINMUX('B', 30, SDIO)>; // SD_D3
bias-pull-up;
slew-rate = <0>;
drive-strength = <0>;
};
};
下表是引脚复用的说明:
属性 |
描述 |
可配置? |
---|---|---|
pinmux |
SDIO主机的引脚定义 |
是 |
bias-pull-up |
引脚上拉/下拉状态 |
是 |
slew-rate |
引脚电压转换速率 |
否 |
drive-strength |
引脚驱动强度 |
否 |
备注
根据实际情况配置引脚。如果使用 1-bit 模式,可以省略 SD_D1、SD_D2、SD_D3。如果不使用卡检测和卡保护功能,可以省略 SD_CD、SD_WP。
编译配置
选择
:
APIs
用户空间 API
MMC 子系统提供用户空间接口:
dev/mmcblk0
dev/mmcblk0p1
用户应将接口挂载到一个目录,这样可以直接通过该目录访问 SDIO 设备。
备注
接口可以根据实际情况进行修改。
以 SD 卡为例。一旦 SD 卡插入电缆,MMC 子系统会立即响应,并创建两个设备节点—— /dev/mmcblk0
和 /dev/mmcblk0p1
。如果系统没有自动挂载,用户应将其挂载到文件系统。
将 SD 卡挂载到文件系统:
mount /dev/mmcblk0pN /mnt/sdcard
定位到 SD 卡目录:
cd /mnt/sdcard
在 SD 卡中创建一个目录:
mkdir test_dir
在 SD 卡目录 test_dir 中创建一个文件:
touch test.txt
将内容写入文件
test.txt
:echo helloworld > test.txt
读取文件
test.txt
:cat test.txt
请参考示例代码以获取更多详细信息。SDIO 主机示例位于 <test>/sdioh
。
内核空间 API
无。