linux - 具有少量父设备属性的 udev 规则

标签 linux debian raspberry-pi udev

我需要复杂且通用的 udev 规则来确定插入任何 USB 集线器的特定端口的 USB 设备。所以,我必须结合设备树不同层的父属性...

我有这个:

$udevadm info --query=all --name=/dev/ttyUSB0 --attribute-walk

  looking at device '/devices/platform/bcm2708_usb/usb1/1-1/1-1.2/1-1.2.4/1-1.2.4:1.0/ttyUSB0/tty/ttyUSB0':
    KERNEL=="ttyUSB0"
    SUBSYSTEM=="tty"
    DRIVER==""

            . . .

  looking at parent device '/devices/platform/bcm2708_usb/usb1/1-1/1-1.2/1-1.2.4':
    KERNELS=="1-1.2.4"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
            ...

  looking at parent device '/devices/platform/bcm2708_usb/usb1/1-1/1-1.2':
    KERNELS=="1-1.2"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{devpath}=="1.2"
    ATTRS{idVendor}=="0835"
            ...
    ATTRS{idProduct}=="8500"
    ATTRS{bDeviceClass}=="09"
    ATTRS{product}=="USB2.0 Hub"

            . . .

然后我构建了类似这样的 udev 规则来识别特定 USB 集线器的特定端口:

KERNEL=="ttyUSB[0-9]*", KERNELS=="1-1.2.4", ATTRS{idVendor}=="0835", ATTRS{idProduct}=="8500", SYMLINK+="port1"

但是当我尝试使用来自不同父层的属性时它不起作用。

我知道 udev 只支持一个特定父设备的附加属性。但我真的需要从我的设备的 2 个父节点获取组合属性的规则

有人可以提出解决方案吗?有什么技巧可以得到吗?

最佳答案

经过多次失败的经验,我找到了解决办法!

它的主要特点是设置环境变量:

  1. 在发生堵塞事件时,我们查找 vendor:id 对并将其记住在环境变量中。
  2. 在同一事件中,我们比较保存的变量和 usb-device 树节点 ID,以分配特定 usb-hub 端口的确切名称。

这份文件帮助了我 http://www.reactivated.net/writing_udev_rules.html

KERNEL=="ttyUSB[0-9]*", SUBSYSTEM=="tty", SUBSYSTEMS=="usb", ATTRS{idVendor}=="05e3", ATTRS{idProduct}=="0610", ENV{USB_HUB_TYPE}="05e3:0610"
KERNEL=="ttyUSB[0-9]*", SUBSYSTEM=="tty", SUBSYSTEMS=="usb", ATTRS{idVendor}=="0835", ATTRS{idProduct}=="8500", ENV{USB_HUB_TYPE}="0835:8500"
#
ENV{USB_HUB_TYPE}=="0835:8500", KERNEL=="ttyUSB[0-9]*", SUBSYSTEM=="tty", KERNELS=="1-1.[2-3].4:1.0", SYMLINK+="port1"
ENV{USB_HUB_TYPE}=="0835:8500", KERNEL=="ttyUSB[0-9]*", SUBSYSTEM=="tty", KERNELS=="1-1.[2-3].3:1.0", SYMLINK+="port2"
ENV{USB_HUB_TYPE}=="0835:8500", KERNEL=="ttyUSB[0-9]*", SUBSYSTEM=="tty", KERNELS=="1-1.[2-3].2:1.0", SYMLINK+="port3"
ENV{USB_HUB_TYPE}=="0835:8500", KERNEL=="ttyUSB[0-9]*", SUBSYSTEM=="tty", KERNELS=="1-1.[2-3].5.5:1.0", SYMLINK+="port4"
ENV{USB_HUB_TYPE}=="0835:8500", KERNEL=="ttyUSB[0-9]*", SUBSYSTEM=="tty", KERNELS=="1-1.[2-3].5.2:1.0", SYMLINK+="port5"
ENV{USB_HUB_TYPE}=="0835:8500", KERNEL=="ttyUSB[0-9]*", SUBSYSTEM=="tty", KERNELS=="1-1.[2-3].5.3:1.0", SYMLINK+="port6"
ENV{USB_HUB_TYPE}=="0835:8500", KERNEL=="ttyUSB[0-9]*", SUBSYSTEM=="tty", KERNELS=="1-1.[2-3].5.4:1.0", SYMLINK+="port7"
#
ENV{USB_HUB_TYPE}=="05e3:0610", KERNEL=="ttyUSB[0-9]*", SUBSYSTEM=="tty", KERNELS=="1-1.[2-3].1.1:1.0" SYMLINK+="port1"
ENV{USB_HUB_TYPE}=="05e3:0610", KERNEL=="ttyUSB[0-9]*", SUBSYSTEM=="tty", KERNELS=="1-1.[2-3].2:1.0", SYMLINK+="port2"
ENV{USB_HUB_TYPE}=="05e3:0610", KERNEL=="ttyUSB[0-9]*", SUBSYSTEM=="tty", KERNELS=="1-1.[2-3].1.2:1.0", SYMLINK+="port3"
ENV{USB_HUB_TYPE}=="05e3:0610", KERNEL=="ttyUSB[0-9]*", SUBSYSTEM=="tty", KERNELS=="1-1.[2-3].3:1.0", SYMLINK+="port4"
ENV{USB_HUB_TYPE}=="05e3:0610", KERNEL=="ttyUSB[0-9]*", SUBSYSTEM=="tty", KERNELS=="1-1.[2-3].1.3:1.0", SYMLINK+="port5"
ENV{USB_HUB_TYPE}=="05e3:0610", KERNEL=="ttyUSB[0-9]*", SUBSYSTEM=="tty", KERNELS=="1-1.[2-3].4:1.0", SYMLINK+="port6"
ENV{USB_HUB_TYPE}=="05e3:0610", KERNEL=="ttyUSB[0-9]*", SUBSYSTEM=="tty", KERNELS=="1-1.[2-3].1.4:1.0", SYMLINK+="port7"

也许,它会对某人有用。

关于linux - 具有少量父设备属性的 udev 规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27017203/

相关文章:

linux - rsync 只同步小于 xy 天的文件

android - 在 Linux 平台上运行 Android 应用程序

debian - 从 wsl2 debian 打开文件资源管理器

php - 编译 PHP - bison 版本?

使用 ProcessBuilder 构建的 Java 子进程丢失串口数据

Linux 出包率

linux - 无法在 docker 容器上运行 dmidecode

通过树莓派切换套接字状态的Java函数

php - Typo3 6.2 LTS 升级到 7.4 版

docker - 如何解决 Raspberry Pi 上的 Gradle docker 图像卡住问题并发出有关单调时钟的警告?