背景:依据《Rockchip RV1126/RV11029 硬件设计指南》为指导,在核心板上制作的底板,打板回来后,发现sd卡插上后无法识别

排查思路:

查看原理图,数据手册,没发现引脚有问题,芯片上的这几个pin脚确实是可以用作sdmmc功能。

然后查看设备树配置:

dtb文件反编译得到的结果:

对该节点的解释:

源dts文件里该节点的配置

从设备树节点来看,符合数据手册的要求,另外也检查了这几个引脚的复用功能,确认了这几个引脚没有用做其他功能,只当作fatasheet里的FUNCTION1功能(即sdmmc功能使用),所以设备树配置正常。

进入到系统后查看/sys/class/mmc_host/目录下已经有mmc2这个设备,说明这个设备节点已经被内核正确解析并加载到系统中了

看到生成了/sys/class/mmc_host/device/driver,说明驱动也被正确识到别了

然后再看dmesg中关于mmc的信息:

上面的数据显示sdmmc控制器一直在向外部sd卡发送初始化命令,但是一直未得到回应。驱动不断重试,但所有命令都收不到SD卡的任何回应,反复打印“超时。

而且我根据上面的错误码,专门去内核源码中的mmc控制器那一部分去追溯源码(位于 kernel/dvivers/mmc/core/core.c ),看一下那个错误码-5代表什么意思,经过查阅后得知,

当 SD 卡初始化流程中遇到严重错误时,驱动才会返回这个错误码。具体来说

SD卡初始化流程大致如下:

  1. 主控上电,复位SD卡
  1. 发送命令(如CMD0、CMD8、ACMD41等)探测卡的存在和能力
  1. 读取卡的CID、CSD等寄存器
  1. 协商电压、总线宽度、速度等参数
  1. 完成初始化,挂载块设备

只要在上述任何一步,主控发出的命令得不到SD卡的有效响应,或者收到的数据不对,驱动就会返回-EIO(-5),并打印这句日志。

对以上错误日志的追踪和分析。这说明sdmmc控制器驱动以及设备树配置是正确的,只是物理上根本与sd卡建立连接,由此可以断定是硬件问题

与硬件人员沟通,让他去排查,先是差了拿几根线与芯片引脚之间的连通性,又查了那几个引脚之间是否存在短路问题。这些都没有,当时他发现之前原理图中的CLK时钟线电压不正常,找到我,我说软件方面配置的就是3.3V给他供电,这个不用怀疑。然后他又看了下rv1126官方的硬件设计指南,加了个电阻,电压总算正常,但是依然还是识别不到sd卡,有用示波器抓波形观测,发现数据线上的电压值也不对。后来他又把那几个防静电的元起价不能都给去除掉,然后终于波形全部正常,也能识别到sd卡了。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐