Linux

udev規則匹配多節點USB設備

  • December 26, 2018

我有一個創建 5 個 tty 節點的 3G/GPS 設備,儘管它只是一個物理 USB 連接。基本上,一個多埠 USB 串列適配器。

我正在嘗試創建一些udev規則以確保這些節點始終具有相同的名稱,或者至少具有指向它們的符號連結。

我確實可以在/sys/devices/platform/pxa27x-ohci/usb1/1-2/1-2.2/. 裡面是1-2.2:1.0/to 1-2.2:1.4/,對於它創建的 5 個節點。

我也可以在/sys/bus/usb/devices/1-2.2.

設備的udev資訊如下:

udevadm info -a -p /sys/bus/usb/devices/1-2.2/1-2.2\:1.0
looking at device '/bus/usb/devices/1-2.2/1-2.2:1.0':
KERNEL=="1-2.2:1.0"
SUBSYSTEM=="usb"
DRIVER=="option"
ATTR{bInterfaceNumber}=="00"
ATTR{bAlternateSetting}==" 0"
ATTR{bNumEndpoints}=="03"
ATTR{bInterfaceClass}=="ff"
ATTR{bInterfaceSubClass}=="01"
ATTR{bInterfaceProtocol}=="01"
ATTR{modalias}=="usb:v12D1p1506d0000dc00dsc00dp00icFFisc01ip01"
ATTR{supports_autosuspend}=="0"

從此時起,所有節點都具有相同的資訊。節點之間唯一不同的是 bInterfaceNumber 屬性和設備路徑。所以,我想通過開發路徑編寫規則。

現在,由於某種原因,所有這些節點都匹配了以下規則。

ACTION=="add", DEV="/devices/platform/pxa27x-ohci/usb1/1-2/1-2.2/1-2.2:1.0" SYMLINK+="huawey0"

所以基本上,huawey0指向列舉的最後一個節點。設備創建了從 ttyUSB2 到 6 的節點,這個連結指向 USB6。

所以,我嘗試了核心節點:

ACTION=="add", KERNEL=="1-2.2:1.0" SYMLINK+="huawey0"

現在,/dev 上什麼也沒有出現。

在此之後,我嘗試使用 bInterfaceNumber 將它們分開。我使用了以下規則

ACTION=="add", DEV="/devices/platform/pxa27x-ohci/usb1/1-2/1-2.2/1-2.2:1.[0-4]" ATTR{bInterfaceNumber}=="00" SYMLINK+="huawey0"

而且,什麼也沒有發生。我什至嘗試了一個精簡版的規則..

ACTION=="add", ATTR{bInterfaceNumber}=="00" SYMLINK+="huawey0"

仍然沒有任何反應。為什麼不匹配?

您的規則都存在語法錯誤:

  1. =is for assignment==是為了比較,所以您實際上並沒有查看DEV等於什麼,而是分配了它。
  2. 您需要,在所有語句之間,之前沒有SYMLINK+=

拳法

ACTION=="add", DEV=="/devices/platform/pxa27x-ohci/usb1/1-2/1-2.2/1-2.2:1.0", SYMLINK+="huawey0"

第二條規則

ACTION=="add", KERNEL=="1-2.2:1.0", SYMLINK+="huawey0"

第三條規則

ACTION=="add", DEV=="/devices/platform/pxa27x-ohci/usb1/1-2/1-2.2/1-2.2:1.[0-4]", ATTR{bInterfaceNumber}=="00", SYMLINK+="huawey0"

第四條規則

ACTION=="add", ATTR{bInterfaceNumber}=="00", SYMLINK+="huawey0"

所有這些規則現在都應該做你想做的(我個人會使用第一個)。

引用自:https://unix.stackexchange.com/questions/86728