1. 问题现象与初步分析
最近在使用Hi3519DV500开发板时遇到一个奇怪现象:64GB容量的SD卡能够正常识别,但16GB和32GB的SD卡却无法识别(测试了不同品牌)。系统日志中反复出现"mmc1: error -110 whilst initialising SD card"的错误提示。这个现象引起了我的注意,因为通常我们会认为容量差异不应该导致识别问题。
查看完整的内核日志(dmesg | grep -i mmc),发现关键线索:
code复制mmc1: tuning failed! can not found edge!
mmc1: tuning execution failed: -1
mmc1: error -1 whilst initialising SD card
mmc1: error -110 whilst initialising SD card
错误代码-110在Linux内核中表示"超时"(ETIMEDOUT),结合"tuning failed"的提示,可以初步判断问题出在SD卡初始化阶段的信号调谐环节。这提示我们可能需要关注SD卡的工作模式和电压配置。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 深入定位问题根源
2.1 设备树配置分析
通过查阅Hi3519DV500的设备树文件,发现mmc1控制器被配置为sdr104模式:
c复制// hi3519dv500.dtsi
mmc1: mmc@10030000 {
compatible = "hisilicon,hi3519-sdhci";
reg = <0x0 0x10030000 0x0 0x1000>;
bus-width = <4>;
cap-sd-highspeed;
sd-uhs-sdr104; // 关键配置项
...
};
sdr104是SD 3.0规范定义的高速模式,理论传输速率可达104MB/s。但实现这个模式需要满足一个重要条件:SD卡接口电压必须能够在1.8V和3.3V之间切换。而我们的开发板硬件设计上,SD卡槽的供电电压固定为3.3V,无法提供1.8V电压。
2.2 不同容量SD卡的行为差异
为什么64GB卡能工作而小容量卡不行?这与SD卡的技术规范有关:
- 64GB卡通常采用SDXC
