ZynqMP ZCU102 SD卡驱动深度调试:从设备树配置到电压兼容性实战
最近在ZynqMP ZCU102平台上折腾SD卡驱动,遇到了一个挺典型的坑:内核启动后SD卡死活初始化失败,报错mmc0: error -84 whilst initialising SD card。如果你也在用这块板子,或者正在调试ZynqMP系列的SD/eMMC控制器,特别是从默认的sdhci1切换到sdhci0时,这篇文章或许能帮你省下不少查资料、看原理图的时间。咱们不聊那些空洞的理论,直接切入实际调试中遇到的电压匹配问题,一步步拆解设备树该怎么配、信号该怎么看,以及如何利用有限的调试信息定位到根本原因。
1. 理解ZynqMP的SDHCI控制器与设备树基础
Zynq UltraScale+ MPSoC的SD/eMMC控制器(SDHCI)设计得相当灵活,但也正因为灵活,配置上容易出岔子。ZCU102评估板默认的Linux BSP(板级支持包)通常只使能了sdhci1,也就是连接到MIO 40-45引脚的那个控制器,用于连接板载的eMMC或SD卡槽。但很多自定义硬件设计,出于引脚分配、bank电压或功能隔离的考虑,会选择使用sdhci0(连接MIO 22-27引脚)。这时,你就不能直接照搬BSP的设备树了,得自己动手配。
设备树(Device Tree)在这里扮演了硬件描述的角色,它告诉Linux内核:“嘿,这块板子上SD控制器0是存在的,它的引脚是这么连的,工作电压是这么设定的,你按这个配置去驱动它。” 一个最基础的sdhci0节点使能配置看起来是这样的:
&sdhci0 {
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_sdhci0_default>;
xlnx,mio_bank = <0>;
disable-wp; // 如果硬件没有写保护检测引脚,就禁用WP
};
这里有几个关键属性需要解释一下:
status = "okay":这是告诉内核启用这个设备节点。pinctrl-0:指向一个引脚控制(pinctrl)配置节点,这个节点定义了具体哪些MIO引脚被复用为SD功能,以及它们的电气特性(如上拉、下拉、驱动强度、电平标准)。xlnx,mio_bank = <0>:这个属性特定于Xilinx的SDHCI驱动,用于指示控制器连接的MIO Bank编号。对于sdhci0,通常是bank 0。disable-wp:如果硬件设计上没有连接写保护(Write Protect)信号线,就必须加上这个属性,否则驱动可能会因为检测不到WP信号而卡住。

402

被折叠的 条评论
为什么被折叠?



