AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 1533358
Accepted
Alexander Amelkin
Alexander Amelkin
Asked: 2024-11-20 01:05:55 +0800 CST2024-11-20 01:05:55 +0800 CST 2024-11-20 01:05:55 +0800 CST

为什么 udev 规则仅对系列外的随机串行 USB 设备节点起作用一次?

  • 772

我有一个基于 CH348 芯片的多端口 USB-UART 设备,运行来自https://github.com/WCHSoftGroup/ch9344ser_linux的内核外驱动程序

驱动程序创建 8 个字符的设备节点 ( /dev/ttyCH9344USB0.. /dev/ttyCH9344USB7)。该设备未在 USB 设备描述符中提供序列号,但我想从设备中读取一个 EEPROM,从中提取序列号并使用它来创建类似的符号链接/dev/ttyUSB.CH348.<serial_number>.<instance>。

我创建了一个简单的udev规则并将其放入/etc/udev/rules.d/99-usb-serial.rules:

ACTION=="add", KERNEL=="*ttyCH9344USB*", OPTIONS="log_level=debug", PROGRAM="/usr/local/bin/ch34x_serial %E{DEVNAME}", SYMLINK+="ttyUSB.CH348.$result"

该规则确实按预期工作,但只适用于 8 个节点中的一个随机节点。我实际上尝试了多种不同的匹配规则,无论我使用哪种方法(内核名称、USB 属性等),如果匹配,它只会匹配该系列中的一个随机实例。它可能会为实例 3、6、7 或任何其他实例创建一个符号链接,但只针对一个实例。

我检查了journalctl和udevadm monitor -p,发现加载驱动程序模块时恰好有 8 个不同的add事件发生udev。除了 KERNEL、DEVPATH、SEQNUM 和 MINOR 属性外,所有事件都相同,如下所示:

KERNEL[706136.962119] add      /devices/pci0000:00/0000:00:1d.0/usb1/1-1/1-1.1/1-1.1.3/1-1.1.3.2/1-1.1.3.2.1/1-1.1.3.2.1:1.0/tty/ttyCH9344USB0 (tty)
ACTION=add
DEVPATH=/devices/pci0000:00/0000:00:1d.0/usb1/1-1/1-1.1/1-1.1.3/1-1.1.3.2/1-1.1.3.2.1/1-1.1.3.2.1:1.0/tty/ttyCH9344USB0
SUBSYSTEM=tty
DEVNAME=/dev/ttyCH9344USB0
SEQNUM=26571
MAJOR=168
MINOR=0

我不明白为什么只有其中一个实际事件会触发规则,而如果我udevadm test针对 8 个设备节点中的任何一个运行,则该规则对所有节点都有效。

它看起来像是udev以某种方式缓存动作并丢弃“重复”的,虽然我不明白它是如何得出这个结论的。

我正在运行 Ubuntu 24.04 Serverudev版本255.4-1ubuntu8.4。

任何帮助都将不胜感激。谢谢。

usb
  • 1 1 个回答
  • 39 Views

1 个回答

  • Voted
  1. Best Answer
    Alexander Amelkin
    2024-11-28T04:46:33+08:002024-11-28T04:46:33+08:00

    事实证明,正如@meuh 在其评论中指出的那样,udev我的程序并行运行了ch34x_serial8 次。显然,驱动程序不能容忍 EEPROM 访问操作。

    为了解决这个问题,我添加了一个基于共享信号量的简单同步,以序列化与底层 EEPROM 的通信。我想我可以修补 ch9344_linux 驱动程序,但修改用户空间程序似乎更容易。

    任何需要解决将多个 CH348 设备连接到一台机器的相同问题的人都可以尝试使用https://codeberg.org/AlexanderAmelkin/ch34x_serial提供的修改后的工具

    修改后的版本加上简单的 udev 规则(也可以从上述存储库获得)对我来说工作正常,并产生了 8 个独立的设备别名。

    • 1

相关问题

  • 如何显示UMTS信号强度?

  • 如何在连接 MTP 设备时禁用自动播放功能?

  • 我这里有一个 22 号陷阱!除非我更新,否则没有互联网[关闭]

  • 修复 USB 驱动器自动通知

  • 如何从命令行重置 USB 设备?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve