USB-HUB上制定生成的設備號(一種解決方法)


環境:

在USB-HUB上插上16個usb2serial,每次重啓後,

每個usb2serial獲得的ttyUSB*設備號都不一樣,而且有時也會自動隨機變化。


解決:

通過uevent機制來解決。在/sys上保留當前設備的信息。

uevent獲取設備熱插拔信息後,通過/sys下的具體設備信息生成設備號。

uevent通過讀取/etc/udev/rules.d/50-usb-serial.rules文件。來處理對當前熱插拔設備的操作。


文件50-usb-serial.rules內容如下:
test@TEST:/etc/udev/rules.d$ cat 50-usb-serial.rules
KERNEL=="ttyUSB*", ACTION=="add", RUN+="/usr/local/test/add_ttyUSB.sh %k %p"
KERNEL=="ttyUSB*", ACTION=="remove", RUN+="/usr/local/test/remove_ttyUSB.sh %k %p"
test@TEST:/etc/udev/rules.d$

%k:ttyUSB*
%p:/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2.1/2-1.2.1.2/2-1.2.1.2:1.0/ttyUSB*/tty/ttyUSB*
add_ttyUSB.sh:獲取ttyUSB設備插入時的操作。
remove_ttyUSB.sh:移除ttyUSB設備時的操作。

參考:add_ttyUSB.sh內容:
#!/bin/bash
DEVICE_NAME=$1
NUM1=$(echo $2 | cut -d '/' -f 7)
NUM2=$(echo $2 | cut -d '/' -f 8)
NUM3=$(echo $2 | cut -d '/' -f 9)

HUB_INDEX=$(echo $NUM1 | cut -d '.' -f 2)
NUM_J=$(echo $NUM2 | cut -d '.' -f 3)
NUM_K=$(echo $NUM3 | cut -d '.' -f 4)

let "PORT=($NUM_J-1)*4+$NUM_K"

LINK_NAME=USBHUB${HUB_INDEX}-${PORT}
ln -sf /dev/$DEVICE_NAME /dev/$LINK_NAME


參考:remove_ttyUSB.sh內容:
#!/bin/bash

DEVICE_NAME=$1
NUM1=$(echo $2 | cut -d '/' -f 7)
NUM2=$(echo $2 | cut -d '/' -f 8)
NUM3=$(echo $2 | cut -d '/' -f 9)

HUB_INDEX=$(echo $NUM1 | cut -d '.' -f 2)
NUM_J=$(echo $NUM2 | cut -d '.' -f 3)
NUM_K=$(echo $NUM3 | cut -d '.' -f 4)

let "PORT=($NUM_J-1)*4+$NUM_K"

LINK_NAME=USBHUB${HUB_INDEX}-${PORT}
rm -f /dev/$LINK_NAME



參考鏈接:http://reactivated.net/writing_udev_rules.html


發佈了62 篇原創文章 · 獲贊 9 · 訪問量 31萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章