Mango Pi MQ-Pro(Allwinner D1)Ubuntu系统下mv64xxx I2C驱动定位、重编译替换及总线锁定故障解决问询
Mango Pi MQ-Pro(Allwinner D1)Ubuntu系统下mv64xxx I2C驱动定位、重编译替换及总线锁定故障解决问询
先梳理下你的环境信息,方便后续排查:
- 设备:Mango Pi MQ-Pro
- 处理器:Allwinner D1
- 系统:Ubuntu 5.17.0-1003-allwinner riscv64
- 已通过设备树启用I2C3对应引脚,设备树状态显示
okay,引脚复用配置正确,但执行i2cdetect -y 0时出现总线锁定错误。
问题1:为什么找不到mv64xxx.ko驱动文件?
这是因为你的mv64xxx I2C驱动是直接编译进内核(built-in),而非作为可加载模块存在的。
验证这个结论很简单:执行以下命令
grep CONFIG_I2C_MV64XXX /boot/config-$(uname -r)
如果输出是CONFIG_I2C_MV64XXX=y,就说明它是内核内置的——这种情况下不会生成单独的.ko文件,也不会出现在lsmod的输出里,内核启动时就会自动加载它,所以你能看到它的报错信息,但找不到对应的模块文件。
问题2:如何替换为Linux 6.4版本的mv64xxx驱动?
你已经尝试编译了新模块但加载无反应,核心原因是内置驱动的优先级高于可加载模块——内核已经加载了内置的旧驱动,不会再加载同名的新模块。解决这个问题有两种可行路径:
路径1:重新编译内核,将新驱动设为内置
- 获取当前系统对应的内核源码:
apt-get source linux-image-$(uname -r) - 进入内核源码目录,找到
drivers/i2c/busses/i2c-mv64xxx.c,替换为Linux 6.4版本的对应文件(你已经做了适配修改,比如返回值和结构体字段的调整,确保这些修改正确)。 - 配置内核:
先执行你已经完成的make oldconfig,然后用make menuconfig进入图形配置界面,找到:Device Drivers -> I2C support -> I2C bus drivers -> Marvell MV64XXX I2C driver,确保它被设为Y(内置)。 - 编译并安装内核:
make -j$(nproc) # 多线程编译,加快速度 sudo make modules_install install - 重启系统,新内核就会带着修复后的mv64xxx驱动启动。
路径2:重新编译内核,将驱动改为可加载模块
如果不想替换整个内核,可以把旧驱动禁用,新驱动设为模块:
- 同样先获取内核源码并替换驱动文件。
- 进入
make menuconfig,把Marvell MV64XXX I2C driver设为M(模块),同时将原有内置驱动的配置设为N(禁用)。 - 编译模块:
make modules SUBDIRS=drivers/i2c/busses - 安装模块:
sudo cp drivers/i2c/busses/i2c-mv64xxx.ko /lib/modules/$(uname -r)/kernel/drivers/i2c/busses/ sudo depmod -a - 重启后,就可以通过
modprobe i2c-mv64xxx加载新模块了。
问题3:I2C总线锁定故障的其他解决思路
除了替换驱动,你还可以尝试这些排查方向:
- 硬件检查:确认SDA和SCL引脚上的上拉电阻是否正常(一般是4.7kΩ左右),外部I2C设备是否接线正确、有没有短路,设备本身是否故障。很多总线锁定问题其实是硬件导致的。
- 总线重置:部分内核支持通过sysfs重置I2C总线,尝试执行:
如果这个文件不存在,说明你的驱动不支持该功能。echo 1 > /sys/bus/i2c/devices/i2c-0/reset - 详细日志排查:用
dmesg -w实时查看内核日志,或者cat /var/log/kern.log查看历史日志,看看有没有更多关于mv64xxx驱动的报错细节,比如时钟配置错误、中断异常等,这些可能帮你定位其他潜在问题。
关于你的UPD补充
你编译了新模块但加载无反应,就是因为旧驱动是内置的,内核不会加载同名模块。必须按照上面的内核编译方法,调整驱动的配置类型,才能让修复后的驱动生效。
备注:内容来源于stack exchange,提问作者nx4n
相关产品推荐
相关产品推荐

