RK3506 eMMC 固件重启崩溃问题(USB 触发)技术总结
一、问题核心场景
- 硬件与系统:RK3506 板卡、eMMC 存储、Buildroot 系统,NAND 版固件无此问题
- 触发条件:ADB 专用 USB 口连接电脑时触发重启崩溃,不接电脑则正常
- 关键日志:模块卸载失败(
Resource temporarily unavailable)、虚拟 USB 禁用失败(Failed to disable vusb_a: -EIO)、内核空指针异常(Unable to handle kernel paging request)最终导致 Kernel Panic
二、根本原因定位
- 模块卸载顺序错误:批量卸载内核模块时未遵循「上层功能模块→下层核心模块」的反向依赖顺序,导致依赖链断裂、资源释放异常(如先卸载
udc_core.ko核心模块,再卸载依赖它的usbserial.ko,引发指针悬空)。 - USB 与 eMMC 资源冲突:eMMC 固件中 USB Gadget 驱动(ADB 依赖)与 eMMC 驱动争夺共享资源(DMA 通道、中断号),仅在 USB 连接电脑触发 Gadget 初始化时爆发冲突;NAND 版因存储驱动逻辑、模块加载顺序不同,未触发该问题。
- 冗余模块加剧冲突:eMMC 固件加载了 USB 串口、存储、网络等冗余模块,增加驱动调度复杂度,与 ADB 功能形成隐性依赖冲突。
三、核心技术原理
1. 内核模块依赖逻辑
Linux 模块遵循「树形依赖」:加载需按「核心模块→功能模块」顺序(如下层usbcore.ko→上层usbserial.ko),卸载需反向执行。无序卸载会导致:
- 资源残留与引用计数异常
- 驱动资源指针失效,触发内核内存访问错误
- USB Gadget 控制器无法正常释放(
vusb_a禁用失败)
2. eMMC 与 NAND 的差异点
| 对比维度 | eMMC 版(有问题) | NAND 版(正常) |
|---|---|---|
| 模块依赖 | 冗余模块多,依赖链复杂 | 模块精简,依赖关系简单 |
| 资源分配 | USB 与 eMMC 可能共享 DMA / 中断资源 | 存储与 USB 资源隔离更合理 |
| 驱动初始化 | eMMC 加载优先级与 USB 冲突 | NAND 初始化时序避开冲突窗口 |
四、解决方案体系
1. 紧急调试方案:按依赖顺序安全卸载模块
通过脚本自动解析依赖链,按「上层→下层」顺序卸载 USB 相关模块(避免手动失误):
bash
#!/bin/sh
USB_MODULES=$(lsmod | grep -E "usb|udc|composite|serial" | awk '{print $1}')
DEP_FILE=$(mktemp)
depmod -n $(uname -r) > $DEP_FILE
UNLOAD_ORDER=""
for mod in $USB_MODULES; doDEPENDS_ON=$(grep -E "^$mod:" $DEP_FILE | awk '{print $2}' | tr ',' ' ')for dep in $DEPENDS_ON; do[ $(echo $USB_MODULES | grep -q $dep) ] && UNLOAD_ORDER="$dep $UNLOAD_ORDER"doneUNLOAD_ORDER="$mod $UNLOAD_ORDER"
done
for mod in $(echo $UNLOAD_ORDER | tr ' ' '\n' | sort -u); domodprobe -r $mod 2>/dev/null
done
rm -f $DEP_FILE
2. 根治方案:固件层面优化(生产环境首选)
(1)精简内核模块(Buildroot 配置)
- 保留 ADB 必需模块:
USB Gadget Core、Rockchip USB Gadget Driver、usb_f_fs、ADB Function - 禁用冗余模块:USB 串口、存储、网络适配器等非必需功能
(2)设备树资源隔离
- 强制 USB 为从机模式(禁用 OTG 自动切换):
dts
&usbdrd_dwc3 { dr_mode = "peripheral"; status = "okay"; }; &usb2phy { otg-mode = "disabled"; }; - 隔离中断号 / DMA 通道:确保 eMMC 与 USB 的资源配置无重叠
(3)优化模块加载顺序
编辑启动脚本,按「核心模块→功能模块」顺序加载 USB 驱动,避免依赖倒置。
五、验证与避坑要点
- 验证方法:USB 连接电脑后持续 ADB 操作、多次冷热重启,通过
dmesg监控无资源冲突日志 - 核心避坑点:
- 禁止无序卸载核心模块(eMMC、文件系统驱动等),否则直接崩溃
- 嵌入式系统遵循「模块最小化」原则,减少依赖冲突风险
- 优先使用 RK 官方驱动补丁,修复 eMMC+USB 兼容性问题
六、结论
问题本质是「模块卸载顺序错误 + USB 与 eMMC 资源冲突」,通过「精简冗余模块 + 按依赖顺序管理模块 + 设备树资源隔离」可彻底解决。NAND 版无问题的核心是依赖链与资源分配更合理,eMMC 版需通过固件配置对齐稳定性。

重启崩掉的原因是模块卸载是没有按照模块依赖去卸载导致的
