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

基于SERDEV的ST7580 PLC调制解调器Linux驱动加载问题排查

ST7580 SERDEV驱动加载失败排查与修复

背景概述

将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. 验证步骤

  1. 重启后检查覆盖层加载状态:
    cat /sys/devices/platform/bone_capemgr/slots
    
  2. 检查SERDEV设备节点:
    ls /sys/bus/serdev/devices/
    
  3. 检查驱动绑定与日志:
    lsmod | grep st7580
    dmesg | grep st7580
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 02:45:32