You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

启用rtc-rv3028导致LS1028a-rdb启动异常求助

LS1028A-RDB开发板RV3028 RTC启动挂起问题排查

硬件与环境

  • 开发板:LS1028A-RDB,板载NXP PCF2129 RTC(独立I2C总线)
  • 加装设备:Microcrystal RV3028 RTC,连接至I2C-8(地址0x52),无I2C地址冲突
  • 内核版本:5.15

故障现象

  • 设备树启用RV3028并开机自动加载rtc-rv3028驱动时,偶发启动挂起(无法进入控制台)
  • 故障时系统日志输出:
[  188.940580] udevd[205]: worker [212] /devices/platform/f080000.display timeout; kill it
[  188.948683] udevd[205]: seq 2486 '/devices/platform/f080000.display' killed
[  190.612231] udevd[211]: timeout '/etc/udev/scripts/mount.sh'
[  190.617943] udevd[211]: slow: '/etc/udev/scripts/mount.sh' [364]
[  190.629844] udevd[208]: timeout '/etc/udev/scripts/mount.sh'
[  190.629845] udevd[215]: timeout '/etc/udev/scripts/mount.sh'
[  190.629865] udevd[215]: slow: '/etc/udev/scripts/mount.sh' [398]
[  190.635555] udevd[208]: slow: '/etc/udev/scripts/mount.sh' [406]
[  191.625018] udevd[211]: timeout: killing '/etc/udev/scripts/mount.sh' [364]
[  191.632042] udevd[211]: slow: '/etc/udev/scripts/mount.sh' [364]
[  194.657432] udevd[205]: worker [209] /devices/platform/soc/2000000.i2c/i2c-0/i2c-8/8-0052 timeout; kill it
[  194.667153] udevd[205]: seq 2576 '/devices/platform/soc/2000000.i2c/i2c-0/i2c-8/8-0052' killed
  • 关键线索:最后一条日志指向RV3028对应的I2C设备节点
  • 其他验证:RV3028硬件本身正常,手动加载驱动可正常读写;禁用驱动(设备树设为disabled或modprobe黑名单)可避免挂起,但无法使用设备

Ftrace日志(疑似锁死)

[   11.500634] i2c_result: i2c-0 n=1 ret=1
[   11.507360] i2c_write: i2c-0 #0 a=00a f=0000 l=4 [00-32-50-00]
[   11.513920] i2c_result: i2c-0 n=1 ret=1
[   11.517772] i2c_result: i2c-2 n=1 ret=1
[   11.521636] i2c_write: i2c-8 #0 a=052 f=0000 l=1 [0e]
[   11.526726] i2c_read: i2c-8 #1 a=052 f=0001 l=1
[   11.531281] i2c_write: i2c-0 #0 a=077 f=0000 l=1 [0f]
[   11.536748] i2c_result: i2c-0 n=1 ret=1
[   11.540600] i2c_write: i2c-0 #0 a=052 f=0000 l=1 [0e]
[   11.545679] i2c_read: i2c-0 #1 a=052 f=0001 l=1
[   11.550824] i2c_reply: i2c-0 #1 a=052 f=0001 l=1 [11]
[   11.555906] i2c_result: i2c-0 n=2 ret=2
[   11.559755] i2c_reply: i2c-8 #1 a=052 f=0001 l=1 [11]
[   11.564835] i2c_result: i2c-8 n=2 ret=2
[   11.568700] i2c_write: i2c-2 #0 a=00a f=0000 l=4 [00-34-00-00]
[   11.574561] i2c_write: i2c-0 #0 a=077 f=0000 l=1 [09]
[   68.574166] cfg80211: failed to load regulatory.db
[   71.582351] udevd[205]: worker [213] /devices/platform/soc/2000000.i2c/i2c-0/i2c-8/8-0052 is taking a long time
[   71.592562] udevd[205]: worker [209] /devices/platform/soc/2000000.i2c/i2c-0/i2c-2/2-000a is taking a long time

可能原因与调试思路

可能原因

  1. I2C总线初始化时序问题:RV3028所在的I2C-8是I2C-0的子总线(大概率通过多路器扩展),启动阶段总线初始化不完整,导致驱动访问设备时陷入阻塞
  2. RTC驱动初始化死锁:rtc-rv3028驱动在probe阶段的时钟同步、寄存器读写等操作未正确处理超时,或与系统其他RTC服务存在资源竞争
  3. 硬件上电时序问题:RV3028上电滞后于I2C总线,驱动probe时设备未就绪,触发无响应的I2C传输,进而阻塞整个总线

调试步骤

  • 调整驱动加载时机:将rtc-rv3028设为模块,通过systemd服务延迟加载(例如在multi-user.target之后),避开启动早期的资源竞争
  • 添加I2C传输超时:修改rtc-rv3028驱动代码,在I2C读写操作中明确设置超时参数,防止无响应时永久阻塞
  • 检查I2C多路器初始化:确认I2C-8对应的多路器在RV3028驱动probe前完成初始化,可在设备树中调整节点的status或depends-on属性保证时序
  • 启用内核I2C调试:开启内核配置CONFIG_I2C_DEBUG_CORE和CONFIG_I2C_DEBUG_ALGO,获取更详细的总线交互日志定位阻塞点
  • 替换驱动版本:尝试升级rtc-rv3028驱动至主线内核较新版本,或回退至稳定版本,排查是否为特定版本的驱动bug

内容的提问来源于stack exchange,提问作者bielu000

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 13:59:53