在 Linux 系统中配置 SDIO 接口与 SD NAND 通信需要通过设备树(Device Tree)和内核驱动进行设置。以下是详细的配置步骤:
确保硬件连接正确:
SDIO 信号 | 常见连接位置 | 备注 |
---|---|---|
CLK | 连接到 SD NAND 的 CLK | 需 4.7kΩ 上拉(可选) |
CMD | 连接到 SD NAND 的 CMD | 必须 4.7kΩ 上拉 |
DATA0-3 | 连接到 SD NAND 的 D0-D3 | 每线需 4.7kΩ 上拉 |
CD | 连接到 GPIO(可选) | 用于检测卡插入 / 拔出 |
VCC | 3.3V | 需稳定供电 |
GND | 系统地 | 确保共地 |
修改设备树文件(通常为arch/arm/boot/dts/xxx.dts
或arch/arm64/boot/dts/xxx.dts
):
/* SDIO控制器节点 */ sdhci@40012000 { compatible = "st,stm32-sdhci", "mmc-sdhci"; reg = <0x40012000 0x400>; /* 控制器基址和大小 */ interrupts = <0 43 IRQ_TYPE_LEVEL_HIGH>; /* 中断号和触发类型 */ clocks = <&rcc SDIO>; /* 时钟源 */ clock-names = "sdio"; bus-width = <4>; /* 数据总线宽度:1/4/8位 */ non-removable; /* 非可移除设备 */ pinctrl-names = "default"; pinctrl-0 = <&sdmmc1_pins>; /* 引脚配置 */ vmmc-supply = <®_vcc>; /* 电源供应 */ status = "okay"; /* 启用设备 */ }; /* 引脚配置(示例) */ &pinctrl { sdmmc1_pins: sdmmc1-pins { pins_cmd { pins = "PC8"; /* CMD引脚 */ function = "sdmmc1"; bias-pull-up; /* 上拉使能 */ }; pins_clk { pins = "PC9"; /* CLK引脚 */ function = "sdmmc1"; }; pins_data { pins = "PC10 PC11 PC12 PD2"; /* DATA0-3引脚 */ function = "sdmmc1"; bias-pull-up; /* 上拉使能 */ }; }; };
启用必要的内核选项:
make menuconfig # 或 make nconfig / make xconfig# 启用SD/MMC支持Device Drivers ---> <*> MMC/SD/SDIO card support ---> <*> MMC block device driver <*> SDHCI support <*> SDHCI platform support <*> STM32 SDHCI support # 根据芯片型号选择# 启用文件系统支持(可选)File systems ---> <*> DOS/FAT/NT Filesystems ---> <*> VFAT (Windows-95) fs support <*> The Extended 4 (ext4) filesystem
make dtbs
编译内核:
make zImage modules
部署到目标设备:
make modules_install INSTALL_MOD_PATH=/path/to/rootfs
dmesg | grep -i mmc
正常输出示例:
mmc0: SDHCI controller on 40012000.sdhci [40012000.sdhci] using ADMA mmc0: new high speed SDHC card at address aaaa mmcblk0: mmc0:aaaa SD08G 7.40 GiB mmcblk0: p1
查看块设备:
lsblk
应看到类似mmcblk0
的设备。
挂载文件系统(首次使用需格式化):
# 格式化(谨慎操作,会清空数据)mkfs.ext4 /dev/mmcblk0p1# 挂载mkdir /mnt/sdcardmount /dev/mmcblk0p1 /mnt/sdcard
/* 在设备树节点中添加 */ max-frequency = <50000000>; /* 设置最大时钟频率为50MHz */
启用 DMA:
/* 在设备树节点中添加 */ dma-names = "rx", "tx"; dmas = <&dma1 0 4 0>, <&dma1 1 4 0>; /* 根据芯片型号调整 */
调整块设备参数:
# 增加IO调度队列深度echo 1024 > /sys/block/mmcblk0/queue/nr_requests
通过以上步骤,可在 Linux 系统中成功配置 SDIO 接口与 SD NAND 通信,实现数据存储和读取功能。