基于SERDEV的ST7580 PLC调制解调器Linux驱动加载问题排查
背景概述
将ST7580电力线通信调制解调器连接到SD卡启动的BeagleBone Black(Debian Linux,内核v4.19),基于SERDEV模型开发自定义串口驱动,编译为st7580km.ko模块并通过modprobe加载。修改BONE-UART1.dts生成BONE-ST7580.dtbo并放置到指定目录,修改/boot/uEnv.txt配置加载覆盖层,但重启后dmesg无驱动调试输出,启动日志也未显示加载指定dtbo。已启用内核配置CONFIG_SERIAL_DEV_BUS=y和CONFIG_SERIAL_DEV_CTRL_TTYPORT=y。
现有配置问题分析
1. 设备树覆盖层加载失败
命名不匹配
uEnv.txt中指定加载BB-ST7580,但你的dtbo文件名为BONE-ST7580.dtbo,BeagleBone覆盖层命名规则为BB-xxx格式,需:
- 将dtbo重命名为
BB-ST7580.dtbo - 修改dts中
chosen/overlays下的名称为BB-ST7580
SD卡启动路径验证
确认SD卡中的/boot/uEnv.txt是否被正确读取:部分SD镜像要求uEnv.txt放在分区根目录而非/boot下,可手动验证加载:
echo BB-ST7580 > /sys/devices/platform/bone_capemgr/slots
查看输出及dmesg日志确认是否加载成功。
2. 设备树节点配置错误
Compatible属性丢失控制器标识
修改bone_uart1的compatible属性时,移除了原有的ti,omap3-uart,导致内核无法识别该节点为UART控制器,SERDEV总线无法绑定。需恢复兼容链(注意逗号后无空格,符合设备树规范):
&bone_uart1 { compatible = "st7580,st7580km", "ti,omap3-uart"; status = "okay"; };
冗余引脚配置
原BONE-UART1.dts的引脚复用已包含在bone_uart1的pinctrl设置中,无需在&ocp节点下重复定义P9_24_pinmux和P9_26_pinmux,直接删除该部分代码。
3. 驱动代码问题
错误日志宏误用
代码中使用了_dev_err,正确宏应为dev_err,修正后:
if (ret) { dev_err(&serdev->dev, "unable to open the device\n"); return ret; }
冗余SERDEV配置
手动修改uart_flags并调用serdev_device_set_tiocm(TIOCMSET, uart_flags)会覆盖SERDEV专属API的配置,SERDEV模型不推荐直接操作tty标志位,删除以下冗余代码:
uart_flags = 0; uart_flags &= ~PARENB; uart_flags &= ~CSTOPB; uart_flags &= ~CSIZE; uart_flags |= CS8; uart_flags &= ~CRTSCTS; uart_flags |= CREAD | CLOCAL; serdev_device_set_tiocm(serdev, TIOCMSET, uart_flags); serdev_device_set_rts(serdev, 0); serdev_device_set_tiocm(serdev, TIOCMSET, TIOCM_RTS);
保留SERDEV标准配置调用即可:
serdev_device_set_baudrate(serdev, ST7580_DEFAULT_BAUD_RATE); serdev_device_set_flow_control(serdev, false); ret = serdev_device_set_parity(serdev, SERDEV_PARITY_NONE);
Compatible字符串格式不规范
驱动中of_device_id的"st7580, st7580km"包含空格,与设备树中的格式需统一,设备树规范要求兼容字符串列表逗号后无空格,同步修正驱动和设备树中的字符串为"st7580,st7580km"。
4. 验证步骤
- 重启后检查覆盖层加载状态:
cat /sys/devices/platform/bone_capemgr/slots - 检查SERDEV设备节点:
ls /sys/bus/serdev/devices/ - 检查驱动绑定与日志:
lsmod | grep st7580 dmesg | grep st7580
内容的提问来源于stack exchange,提问作者Raghu

