SD NAND在启动文件系统时卡住是一个比较常见的问题,通常与硬件、固件或文件系统本身有关。别担心,我们可以按照从易到难的顺序进行系统性排查。
以下是一份详细的排查指南,你可以逐步尝试:
电源问题(非常常见!)
症状: 在启动挂载文件系统时,系统需要更大的电流来初始化NAND闪存控制器和读取数据,如果电源容量不足,会导致电压瞬间跌落,使芯片工作异常甚至复位,从而卡住。
排查方法:
使用性能更好的电源适配器,确保输出电流(如5V/2A以上)足够。
在SD NAND的VCC和GND之间并联一个100μF的电解电容和一个0.1μF的瓷片电容,用于滤波和缓冲瞬间大电流需求。这是解决此类问题最有效的方法之一。
物理连接问题
症状: 接触不良会导致通信失败,在尝试访问时卡住。
排查方法:
检查SD NAND模块是否完全插入底板座子,有无歪斜。
检查底板上SD卡座子的焊点是否有虚焊、连锡。
尝试用酒精棉签轻轻擦拭SD NAND的金手指,去除氧化层。
镜像文件写入问题
症状: 如果系统镜像(如Linux的rootfs)没有正确烧录,启动时无法识别到有效的文件系统就会卡住。
排查方法:
重新烧录镜像: 使用专业的烧录工具(如balenaEtcher
、Win32DiskImager
)。
验证烧录: 烧录完成后,有些工具(如Etcher)会自动验证。确保验证通过。
检查镜像源: 确保下载的系统镜像是完整且未损坏的。
内核驱动与配置
症状: 内核没有正确配置对SD/MMC主机控制器和NAND芯片的支持。
排查方法:
查看内核启动日志(最关键的一步!):通过串口调试工具(如USB-TTL)连接你的主板,在启动过程中查看完整的日志输出。卡住的地方之前的最后几行信息是至关重要的线索。
你可能会看到 Waiting for root device /dev/mmcblk0p2...
之类的信息然后卡住,这说明内核没找到设备。
或者看到一些错误信息,如 mmc0: error -110 whilst initialising SD card
,这指向硬件通信问题。
也可能看到 VFS: Cannot open root device “(null)” or unknown-block(0,0)
,这指向内核命令行参数(cmdline)错误。
确保内核配置:确保你的内核编译时开启了正确的驱动:
CONFIG_MMC
(MMC/SD卡支持)
CONFIG_MMC_SDHCI
(你的SoC平台对应的SDHCI主机控制器驱动,如CONFIG_MMC_SDHCI_IPROC
for Raspberry Pi)
CONFIG_MMC_BLOCK
(块设备支持)
内核命令行参数(cmdline)
症状: 内核不知道从哪里去挂载根文件系统。
排查方法:
如果你的系统使用cmdline.txt
(如树莓派)或U-Boot环境变量传递启动参数,请检查 root=
参数是否正确。
例如:root=/dev/mmcblk0p2 rootfstype=ext4 rootwait rw
rootwait
参数非常重要,它告诉内核一直等待直到root设备就绪,对于慢速设备是必需的。
确认 /dev/mmcblk0p2
确实是你根文件系统所在的分区(有些镜像可能是p1
或p3
)。
文件系统损坏
症状: 内核能识别到块设备,但在挂载时尝试读取超级块(superblock)时失败卡住。
排查方法:
将SD NAND插入一个Linux电脑(使用读卡器),或者通过网络挂载到主机上。
运行文件系统检查命令:sudo fsck /dev/sdXY
(请将sdXY
替换为实际的分区,如sdb2
)。注意:操作前最好先备份数据!
SD NAND与主板的兼容性
症状: 主板SDIO控制器时钟频率或时序与SD NAND不兼容。
排查方法:
降低时钟频率: 在U-Boot或内核启动早期,强制降低SDIO的时钟频率(例如降到25MHz或更低)。这可以通过修改设备树(Device Tree)或内核代码实现,比较复杂,需要查阅你的主板和SD NAND的 datasheet。
上拉电阻: SDIO协议要求CMD和DATA线有上拉电阻。检查你的底板原理图,是否在CMD
、DAT0-DAT3
线上配备了4.7K-10KΩ的上拉电阻。缺少上拉电阻会导致信号完整性差,在高频率下无法正常工作。
SD NAND本身问题
症状: 排除以上所有问题后,可能是模块本身故障。
排查方法:
交叉测试: 将这张SD NAND拿到另一个确认正常的主板上测试,或者将另一张确认正常的SD卡/SD NAND拿到你的主板上测试。这是判断硬件谁坏谁好的黄金标准。
推荐步骤:
接上串口调试线:这是最重要的第一步,没有日志就是盲人摸象。
根据串口日志的错误代码,优先检查电源(并联大电容)和物理连接。
如果日志显示找不到设备或分区,检查镜像烧录和内核cmdline参数。
如果以上都无效,尝试降低SDIO时钟频率并检查上拉电阻。
最后进行交叉测试,确定是否是硬件本身损坏。
请提供一下你的主板型号(例如:树莓派4B,全志H616开发板等)和从串口日志中看到的卡住之前最后几行错误信息,这样可以更精准地帮你分析问题。
下一篇:没有了!
电话:176-6539-0767
Q Q:135-0379-986
邮箱:1350379986@qq.com
地址:深圳市南山区后海大道1021号C座