SDMC 配置
本节介绍了 SDMC 的参数配置流程。
内核配置
-
在内核配置界面,按如下选择:
Linux Device Drivers <*> MMC/SD/SDIO card support <*> MMC block device driver <*> ArtInChip Memory Card Interface
SDMC 的扩展 DTS 参数
SDMC 驱动基于 Linux 内核的 MMC 子系统,而 MMC 子系统提供了很多常用的参数,详见代码 drivers/mmc/core/host.c 中的函数 mmc_of_parse()。下表展示了部分扩展 DTS 参数:
参数名称 |
类型 |
取值范围 |
功能说明 |
---|---|---|---|
max-frequenc |
Integer |
> 0 |
控制器可输出的最大频率 |
bus-width |
Integer |
1, 4, 8 |
控制器的数据位宽 |
sd-uhs-sdr50 |
Boolean |
有 - 1,无 - 0 |
配置 SDCard 的 SDR50 模式 |
no-sd |
Boolean |
有 - 1,无 - 0 |
关闭 SDCard 的功能支持 |
no-sdio |
Boolean |
有 - 1,无 - 0 |
关闭 SDIO 的功能支持 |
no-mmc |
Boolean |
有 - 1,无 - 0 |
关闭 eMMC 的功能支持 |
参数名称 |
类型 |
取值范围 |
功能说明 |
---|---|---|---|
aic,fifo-depth |
Integer |
[1, 128] |
控制器的 FIFO 深度 |
aic,fifo-watermark-aligned |
Boolean |
有 - 1,无 - 0 |
FIFO 水位是按 2 的整数次幂对齐 |
D211 配置
sdmc0: sdmc@10440000 { compatible = "artinchip,aic-sdmc-v1.0"; reg = <0x0 0x10440000 0x0 0x1000>; interrupts-extended = <&plic0 46 IRQ_TYPE_LEVEL_HIGH>; clocks = <&cmu CLK_SDMMC0>; clock-names = "ciu"; resets = <&rst RESET_SDMMC0>; reset-names = "reset"; #address-cells = <1>; #size-cells = <0>; max-frequency = <24000000>; clock-frequency = <48000000>; bus-width = <4>; fifo-depth = <128>; }; sdmc1: sdmc@10450000 { compatible = "artinchip,aic-sdmc-v1.0"; reg = <0x0 0x10450000 0x0 0x1000>; interrupts-extended = <&plic0 47 IRQ_TYPE_LEVEL_HIGH>; clocks = <&cmu CLK_SDMMC1>; clock-names = "ciu"; resets = <&rst RESET_SDMMC1>; reset-names = "reset"; #address-cells = <1>; #size-cells = <0>; max-frequency = <24000000>; clock-frequency = <48000000>; bus-width = <4>; fifo-depth = <128>; }; sdmc2: sdmc@10460000 { compatible = "artinchip,aic-sdmc-v1.0"; reg = <0x0 0x10460000 0x0 0x1000>; interrupts-extended = <&plic0 48 IRQ_TYPE_LEVEL_HIGH>; clocks = <&cmu CLK_SDMMC2>; clock-names = "ciu"; resets = <&rst RESET_SDMMC2>; reset-names = "reset"; #address-cells = <1>; #size-cells = <0>; };
Board 配置
-
SDMC0 - eMMC
-
SDMC1 - SDCard
-
SDMC2 - SDIO
&sdmc0 { pinctrl-names = "default"; pinctrl-0 = <&sdmc0_pins>; no-sd; no-sdio; status = "okay"; }; &sdmc1 { pinctrl-names = "default"; pinctrl-0 = <&sdmc1_pins>; no-mmc; no-sdio; status = "okay"; }; &sdmc2 { pinctrl-names = "default"; pinctrl-0 = <&sdmc2_pins>; no-mmc; no-sd; status = "disabled"; };
热插拔配置
- 轮询监控:每隔一段时间扫描一次 mmc 硬件总线,一般是 HZ,1s)。对于 SDMC0 控制器,如需以轮询监控方式配置热插拔功能,则在 xxx/board.dts 中配置如下参数:
&sdmc0 { pinctrl-names = "default"; pinctrl-0 = <&sdmc0_pins>; broken-cd; status = "okay"; };
- 中断监控:通过 card detect (cd) 引脚电平变化触发中断,从而告知 CPU 当前 sdcard 插入状态发生了变化。对于 SDMC2 控制器,如需以中断监控方式配置热插拔,则在 xxx/board.dts 中配置参如下参数:
&sdmc2 { pinctrl-names = "default"; pinctrl-0 = <&sdmc2_pins>; cd-inverted;//根据硬件设计配置 cd-gpios = <&gpio_c 8 GPIO_ACTIVE_HIGH>;//根据硬件设计配置 cd-debounce-delay-ms = <250>; status = "okay"; };
参数名称 |
类型 |
取值范围 |
功能说明 |
---|---|---|---|
cd-inverted |
Boolean |
有 - 1,无 - 0 |
gpio 检测电平翻转 |
cd-debounce-delay-ms |
Integer |
> 0 |
gpio 消抖(默认 200 ms) |
broken-cd |
Boolean |
有 - 1,无 - 0 |
配置为轮询监控功能 |
cd-gpios |
Array |
同普通 gpio 配置 |
配置中断监控的 gpio 值 |