环境:
在USB-HUB上插上16个usb2serial,每次重启后,
每个usb2serial获得的ttyUSB*设备号都不一样,而且有时也会自动随机变化。
解决:
通过uevent机制来解决。在/sys上保留当前设备的信息。
uevent获取设备热插拔信息后,通过/sys下的具体设备信息生成设备号。
uevent通过读取/etc/udev/rules.d/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