架构

SDIO 主机驱动程序遵循 Linux MMC 子系统。其架构如下面的图中所示。

../../rst_linux/7_sdio/figures/mmc_arch.svg

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。

编译配置

选择 Device Drivers > Drivers for Realtek > SDIO host driver

../../rst_linux/7_sdio/figures/select_sdio.png

APIs

用户空间 API

MMC 子系统提供用户空间接口:

  • dev/mmcblk0

  • dev/mmcblk0p1

用户应将接口挂载到一个目录,这样可以直接通过该目录访问 SDIO 设备。

备注

接口可以根据实际情况进行修改。

以 SD 卡为例。一旦 SD 卡插入电缆,MMC 子系统会立即响应,并创建两个设备节点—— /dev/mmcblk0/dev/mmcblk0p1。如果系统没有自动挂载,用户应将其挂载到文件系统。

  1. 将 SD 卡挂载到文件系统:

    mount /dev/mmcblk0pN /mnt/sdcard
    
  2. 定位到 SD 卡目录:

    cd /mnt/sdcard
    
  3. 在 SD 卡中创建一个目录:

    mkdir  test_dir
    
  4. 在 SD 卡目录 test_dir 中创建一个文件:

    touch test.txt
    
  5. 将内容写入文件 test.txt

    echo helloworld > test.txt
    
  6. 读取文件 test.txt

    cat test.txt
    

请参考示例代码以获取更多详细信息。SDIO 主机示例位于 <test>/sdioh

内核空间 API

无。