sdhci: mmc@fe2e0000 { compatible = "rockchip,rk3588-dwcmshc", "rockchip,dwcmshc-sdhci"; reg = <0x0 0xfe2e0000 0x0 0x10000>; interrupts = <GIC_SPI 205 IRQ_TYPE_LEVEL_HIGH>; assigned-clocks = <&cru BCLK_EMMC>, <&cru TMCLK_EMMC>, <&cru CCLK_EMMC>; assigned-clock-rates = <200000000>, <24000000>, <200000000>; clocks = <&cru CCLK_EMMC>, <&cru HCLK_EMMC>, <&cru ACLK_EMMC>, <&cru BCLK_EMMC>, <&cru TMCLK_EMMC>; clock-names = "core", "bus", "axi", "block", "timer"; resets = <&cru SRST_C_EMMC>, <&cru SRST_H_EMMC>, <&cru SRST_A_EMMC>, <&cru SRST_B_EMMC>, <&cru SRST_T_EMMC>; reset-names = "core", "bus", "axi", "block", "timer"; max-frequency = <200000000>; supports-cqe; status = "disabled"; };
时间: 2025-06-05 19:58:26 浏览: 12
<think>好的,用户想查找关于RK3588 SDHCI控制器的设备树配置和寄存器映射信息,特别是compatible属性为rockchip,rk3588-dwcmshc的内容。首先,我需要回顾之前的问题和回答,确保这次回答的一致性。用户之前询问过GPIO驱动强度配置,现在转向SDHCI控制器,可能是在进行存储设备(如eMMC或SD卡)的驱动开发或调试。首先,我需要确认RK3588的SDHCI控制器在设备树中的标准配置。根据Rockchip的惯例,设备树节点通常位于soc节点下,包含基地址、中断、时钟等属性。用户提到的compatible属性是rockchip,rk3588-dwcmshc,这可能是RK3588特有的SDHCI控制器驱动。需要查找Rockchip的官方文档或内核源码中的示例,比如rk3588.dtsi或相关板级dts文件。接下来,设备树配置可能包括时钟配置、引脚复用(pinctrl)、电压供应等。例如,SDHCI控制器需要正确的时钟频率和引脚复用设置,以确保与eMMC或SD卡的通信正常。用户可能需要配置不同的速度模式,如HS400,这需要设备树中的特定属性设置,比如mmc-hs400-1_8v。关于寄存器映射,每个SDHCI控制器都有特定的寄存器基地址,用户需要知道这些地址来访问控制器的寄存器。例如,基地址可能为0xfe310000,长度0x10000。寄存器包括控制寄存器、状态寄存器、数据传输寄存器等,具体偏移量需要参考RK3588的技术参考手册。用户还可能关心如何通过设备树配置驱动强度或其他电气参数,这可能与之前讨论的GPIO驱动强度相关。例如,SDHCI的IO引脚可能需要调整驱动强度以确保信号完整性,这可以通过pinctrl子节点中的rockchip,pins属性来设置,引用之前提到的驱动强度配置节点。
另外,用户提到的引用[2]中提到了rk3399的SDHCI驱动路径为drivers/mmc/rockchip_sdhci.c,这可能意味着RK3588的驱动也在类似的位置,需要确认内核源码中的具体文件。在驱动中,probe函数可能需要处理设备树中的配置,如时钟、中断、DMA设置等,用户可能需要添加调试打印来验证配置是否正确应用。
最后,需要确保生成的回答结构清晰,分点说明设备树配置、寄存器映射、compatible属性,并给出示例代码和调试方法。同时,生成的相关问题要围绕SDHCI配置、寄存器访问、兼容性问题和性能优化展开,帮助用户深入理解后续步骤。</think>### RK3588 SDHCI控制器设备树配置及寄存器映射解析
---
#### 1. **设备树基础配置**
RK3588的SDHCI控制器(如eMMC/SD卡控制器)在设备树中通常通过`dwcmshc`驱动实现,其核心配置包括:
```dts
&sdhci {
compatible = "rockchip,rk3588-dwcmshc";
reg = <0x0 0xfe310000 0x0 0x10000>; // 寄存器基地址和长度
interrupts = <GIC_SPI 123 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&cru HCLK_SD>, <&cru CCLK_SD>, <&cru SCLK_SD>;
clock-names = "bus", "card", "sample";
max-frequency = <200000000>; // 最大工作频率
mmc-hs400-1_8v; // 支持HS400模式
non-removable; // 不可移除设备(如eMMC)
status = "okay";
};
```
- **关键属性**:
- `compatible`:匹配驱动`rockchip,rk3588-dwcmshc`,需与驱动代码中的`of_device_id`一致[^2]
- `reg`:寄存器物理地址,需与芯片手册的**Memory Map**章节对应
- `clocks`:控制器需要的时钟源,需在时钟树中正确配置
---
#### 2. **寄存器映射与功能**
RK3588 SDHCI控制器寄存器映射范围通常为`0xfe310000~0xfe31ffff`,主要寄存器包括:
| 寄存器偏移 | 名称 | 功能描述 |
|------------|-------------------|------------------------------|
| `0x0000` | SDHCI_CAPABILITIES| 控制器能力信息(DMA支持等) |
| `0x002C` | SDHCI_CLOCK_CTRL | 时钟分频控制 |
| `0x0030` | SDHCI_TIMEOUT_CTRL| 超时设置 |
| `0x0034` | SDHCI_INT_STATUS | 中断状态寄存器 |
| `0x00E0` | SDHCI_ADMA_ADDR | DMA传输地址寄存器 |
**寄存器访问示例**:
```c
// 读取时钟控制寄存器值
u32 clk_reg = readl(host->ioaddr + SDHCI_CLOCK_CTRL);
// 设置分频系数为50MHz
writel(clk_reg | (0x3 << 8), host->ioaddr + SDHCI_CLOCK_CTRL);
```
---
#### 3. **引脚复用与电压配置**
SDHCI控制器需要正确配置GPIO引脚复用模式,通常通过`pinctrl`子系统实现:
```dts
&pinctrl {
sdhci_pins: sdhci-pins {
rockchip,pins =
<RK_GPIO3 RK_PB0 1 &pcfg_pull_up_drv_8>, // CMD线
<RK_GPIO3 RK_PB1 1 &pcfg_pull_up_drv_8>, // CLK线
<RK_GPIO3 RK_PB2 1 &pcfg_pull_up_drv_8>; // DATA0线
};
};
&sdhci {
pinctrl-names = "default";
pinctrl-0 = <&sdhci_pins>;
vmmc-supply = <&vcc_sd>; // SD卡电源域
};
```
- **驱动强度**:通过`pcfg_pull_up_drv_8`设置上拉电阻和驱动电流(8mA)[^1]
---
#### 4. **调试与验证方法**
1. **寄存器检查**:
```bash
# 通过sysfs查看寄存器映射
cat /sys/kernel/debug/regmap/fe310000.regmap/registers
```
2. **设备树兼容性验证**:
```bash
# 查看设备树节点是否匹配成功
dmesg | grep "rockchip,rk3588-dwcmshc"
```
3. **性能测试**:
```bash
# 测试eMMC读写速度
dd if=/dev/mmcblk0 of=/dev/null bs=1M count=100
```
---
###
阅读全文
相关推荐












