創建符號連結時 udev 重新編號
我將 USB 蜂窩調製解調器連接到執行 voyage linux(基於 Debian Squeeze)的 ALIX 3d2 板上。調製解調器將自己註冊為 TTY 設備,因此預設情況下,udev 將在
/dev
. 但是,可能還連接了其他 USB 轉串列設備,我想知道調製解調器的參考。因此,我編寫了一個簡單的 udev 規則來建立從調製解調器到的連結,/dev/ttyModem{0-3}
但是,我能找到自動處理編號的唯一方法是通過%n
udev 中的變數,它存在創建/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-walk
port0 、 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 埠,則有效)是否適用於您的目的。