启用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
可能原因与调试思路
可能原因
- I2C总线初始化时序问题:RV3028所在的I2C-8是I2C-0的子总线(大概率通过多路器扩展),启动阶段总线初始化不完整,导致驱动访问设备时陷入阻塞
- RTC驱动初始化死锁:
rtc-rv3028驱动在probe阶段的时钟同步、寄存器读写等操作未正确处理超时,或与系统其他RTC服务存在资源竞争 - 硬件上电时序问题: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
相关产品推荐
相关产品推荐

