Tty

創建符號連結時 udev 重新編號

  • January 18, 2016

我將 USB 蜂窩調製解調器連接到執行 voyage linux(基於 Debian Squeeze)的 ALIX 3d2 板上。調製解調器將自己註冊為 TTY 設備,因此預設情況下,udev 將在/dev. 但是,可能還連接了其他 USB 轉串列設備,我想知道調製解調器的參考。因此,我編寫了一個簡單的 udev 規則來建立從調製解調器到的連結,/dev/ttyModem{0-3}但是,我能找到自動處理編號的唯一方法是通過%nudev 中的變數,它存在創建/dev/ttyModem{4-7}四埠 USB 轉在調製解調器之前列舉串列適配器。我%e在舊的 udev 文件中發現了一些對變數的引用,這些引用可以滿足我的需要,

幸運的是,每個 tty 設備都有一個可以從設備引用的埠號,所以我應該能夠手動處理編號。我可以根據埠號創建連結,但每當我嘗試同時使用埠號和 USB vendorID+productID 時,該規則就不再適用。我懷疑我可能在某處違反了“單個父設備”規則,因為這些屬性在不同的設備中被辨識udevadm info,但據我所知,所有屬性都應該來自一個設備及其父設備。

以下是我應用的規則:

此規則有效,並且是我開始使用的,但它生成的數字可能不是從 0 開始。

SUBSYSTEMS=="usb", KERNEL=="ttyUSB*", ATTRS{idVendor}=="1199", ATTRS{idProduct}=="0028", SYMLINK+="ttyUSBID%n"

因此,我嘗試使用像這樣的四個規則來指定埠號,但是,這失敗了,我認為是因為它違反了“一個單父設備”規則。

SUBSYSTEMS=="usb", KERNEL=="ttyUSB*", ATTRS{port_number}=="0", ATTRS{idVendor}=="1199", ATTRS{idProduct}=="0028", SYMLINK+="ttyFailingPort0"

此規則的每個條件都應來自同一個節點,因此此規則(如您所料)應該能夠引用父節點。

SUBSYSTEMS=="usb-serial", KERNELS=="ttyUSB*", ATTRS{port_number}=="0", SYMLINK+="ttyPortNumberChild0"

但是,這條規則失敗了,我不知道為什麼。

SUBSYSTEMS=="usb-serial", KERNELS=="ttyUSB*", ATTRS{idVendor}=="1199" ATTRS{port_number}=="0", SYMLINK+="ttyFailingPortNumber0

這是udevadm info --attribute-walkport0 port1 port2 port3輸出。從上數第二個設備包含埠號,第四個設備包含辨識 USB 資訊。

我意識到這是一個XY 問題,所以如果您知道給調製解調器一個常量名稱的更好方法,請隨時將其發佈為您的答案。

我最終通過在多個規則之間拆分配置來解決“只有一個父級”的限制。對於那些感興趣的人,這是我最終得到的程式碼:

ACTION!="add", GOTO="modem_rules_end"
SUBSYSTEM!="tty" GOTO="modem_rules_end"

#ModemType1
ATTRS{idVendor}=="1199", ATTRS{idProduct}=="0028", GOTO="type1_rules_begin"
GOTO="type1_rules_end"
LABEL="type1_rules_begin"

ATTRS{port_number}=="0", SYMLINK:="ttyType1_0"
ATTRS{port_number}=="1", SYMLINK:="ttyType1_1"
ATTRS{port_number}=="2", SYMLINK:="ttyType1_2"
ATTRS{port_number}=="3", SYMLINK:="ttyType1_3"

LABEL="type1_rules_end"
LABEL="modem_rules_end"

調製解調器規則應與ACTION=="add", SUBSYSTEM=="tty"idVendor、idProduct 和 port_number 屬性相結合:

ACTION=="add", SUBSYSTEM=="tty", ATTRS{idVendor}=="1199", ATTRS{idProduct}=="0028", ATTRS{port_number}=="0", SYMLINK+="ttyPort0"
ACTION=="add", SUBSYSTEM=="tty", ATTRS{idVendor}=="1199", ATTRS{idProduct}=="0028", ATTRS{port_number}=="1", SYMLINK+="ttyPort1"
ACTION=="add", SUBSYSTEM=="tty", ATTRS{idVendor}=="1199", ATTRS{idProduct}=="0028", ATTRS{port_number}=="2", SYMLINK+="ttyPort2"
ACTION=="add", SUBSYSTEM=="tty", ATTRS{idVendor}=="1199", ATTRS{idProduct}=="0028", ATTRS{port_number}=="3", SYMLINK+="ttyPort3"

還要檢查任何現有的符號連結/dev/serial/by-id(如果您的調製解調器具有唯一的序列號,則有幫助)或/dev/serial/by-path(如果您始終將調製解調器插入同一個 USB 埠,則有效)是否適用於您的目的。

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