当前位置: 首页 > news >正文

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

二、根本原因定位

  1. 模块卸载顺序错误:批量卸载内核模块时未遵循「上层功能模块→下层核心模块」的反向依赖顺序,导致依赖链断裂、资源释放异常(如先卸载udc_core.ko核心模块,再卸载依赖它的usbserial.ko,引发指针悬空)。
  2. USB 与 eMMC 资源冲突:eMMC 固件中 USB Gadget 驱动(ADB 依赖)与 eMMC 驱动争夺共享资源(DMA 通道、中断号),仅在 USB 连接电脑触发 Gadget 初始化时爆发冲突;NAND 版因存储驱动逻辑、模块加载顺序不同,未触发该问题。
  3. 冗余模块加剧冲突: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 CoreRockchip USB Gadget Driverusb_f_fsADB Function
  • 禁用冗余模块:USB 串口、存储、网络适配器等非必需功能
(2)设备树资源隔离
  • 强制 USB 为从机模式(禁用 OTG 自动切换):

    dts

    &usbdrd_dwc3 { dr_mode = "peripheral"; status = "okay"; };
    &usb2phy { otg-mode = "disabled"; };
    
  • 隔离中断号 / DMA 通道:确保 eMMC 与 USB 的资源配置无重叠
(3)优化模块加载顺序

编辑启动脚本,按「核心模块→功能模块」顺序加载 USB 驱动,避免依赖倒置。

五、验证与避坑要点

  1. 验证方法:USB 连接电脑后持续 ADB 操作、多次冷热重启,通过dmesg监控无资源冲突日志
  2. 核心避坑点
    • 禁止无序卸载核心模块(eMMC、文件系统驱动等),否则直接崩溃
    • 嵌入式系统遵循「模块最小化」原则,减少依赖冲突风险
    • 优先使用 RK 官方驱动补丁,修复 eMMC+USB 兼容性问题

六、结论

问题本质是「模块卸载顺序错误 + USB 与 eMMC 资源冲突」,通过「精简冗余模块 + 按依赖顺序管理模块 + 设备树资源隔离」可彻底解决。NAND 版无问题的核心是依赖链与资源分配更合理,eMMC 版需通过固件配置对齐稳定性。

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

http://www.dtcms.com/a/611174.html

相关文章:

  • RocketMQ DefaultMQPushConsumer vs DefaultLitePullConsumer
  • php和mysql网站毕业设计成都餐饮设计公司有哪些
  • 甘肃统计投资审核系统完成国产数据库替换:从MySQL到金仓的平稳跨越
  • 征求网站建设意见的通知seo优化网站排名
  • 电商网站流程优秀网络广告文案案例
  • 怎么做个人网站建设wordpress 迁移 工具
  • 两台arm服务器之间实现实时同步
  • 国外设计参考网站公司如何做网站宣传
  • 多用户自助建站系统wordpress iis 500.50
  • 福州网站建设需要多少钱ui设计的优势与不足
  • 网站建设方案书的内容网上学编程
  • 经典算法题之子集(四)
  • 自己动手写深度学习框架(反向传播)
  • 网站多大需要服务器活动手机网站开发
  • 网站推广原则做个网站大约多少钱
  • 政府机关选用GS 90盘位存储,保存Veeam备份数据
  • MySQL: 服务器性能优化全面指南:参数配置与数据库设计的最佳实践
  • 垫江集团网站建设商城外贸网站设计
  • 网站建设与维护方式电商设计课程
  • C语言进阶:文件管理(一)
  • 操作教程 | OpenHIS医院版:设置处方模板
  • 使用List集合专项实验
  • 网站开发程序用什么好wordpress 新建页面 超链接
  • 嘉兴网站开发学校2008建立的php网站慢
  • 训练100B 以上参数需要多少硬件?
  • 找深圳做网站的公司网页设计新手制作的网站代码
  • 怎么通过域名做网站dw做网页的步骤和代码
  • Linux学习日记12:无名通道与有名通道
  • 征程 6X 常见 kernel panic 问题
  • 复盘与导出工具最新版V35.0版本更新----修复东财智能选股,预测量能,开盘啦涨停闪退,炸板数量不匹配问题