问题是这样的,LINUX平台的USB串口在开发或者使用时,会因为USB串口插入的时间不同,发生 USB端口号变化的情况。有些情况,这种问题不好规避。
目前一个有效的解决方法是利用udev的规则来USB串口按硬件信息自动映射,但是嵌入式linux只有busybox提供的mdev,这里说下如何利用mdev来USB串口按通道不同来自动映射。
mdev的基本原理是监测linux文件系统的sys目录下属性文件的变化,自动地创建和删除设备文件。创建/删除的触发,需要满足以下3点:
1、属性文件变化发生在/sys/class 或者sys/block目录。
2、变化内容是创建/删除了一个以设备名device_name作为名称的目录。
3、device_name至少包含一个名为 dev属性文件,dev的内容是"major:minor"
直接说USB串口的情况,在插入USB串口时,会再/sys/class/tty/ttyUSB0生成以下文件。
-r--r--r-- 1 root root 4096 Jul 28 1974 dev
lrwxrwxrwx 1 root root 0 Dec 31 16:03 device -> ../../../devices/platform/EHCI-NationalChip.0/usb1
lrwxrwxrwx 1 root root 0 Dec 31 16:03 subsystem -> ../../usb_device
-rw-r--r-- 1 root root 4096 Dec 31 16:03 uevent
重点是uevet,查看它的内容,可以看到PHYSDEVPATH属性项中描述了US的物理通道"1-1/1-1:1.0",利用这一属性,串口属于哪个端口就确定了。
[root@gx3201 ttyUSB0]# cat dev
188:0
[root@gx3201 ttyUSB0]# cat uevent
MAJOR=188
MINOR=0
PHYSDEVPATH=/devices/platform/EHCI-NationalChip.0/usb1/1-1/1-1:1.0/ttyUSB0
PHYSDEVBUS=usb-serial
PHYSDEVDRIVER=option1
[root@gx3201 ttyUSB0]#
我的实现方法是这样的,在mdev的规则文件mdev.conf中添加新的正则表达式规则
ttyUSB[0-9] 0:5 666 * /etc/hotplug/usb/myusb.sh $MDEV $ACTION
这样当系统有添加ttyUSB*设备时,就会执行/etc/hotplug/usb/myusb.sh脚本。
myusb.sh脚本 的内容
#!/bin/sh
module4g_96c_0='1-1/1-1:1.0'
module4g_96c_1='1-1/1-1:1.1'
module4g_96c_2='1-1/1-1:1.2'
module4g_96c_3='1-1/1-1:1.3'
ucom_96c_0='1-2/1-2.1/1-2.1:1.0'
ucom_96c_1='1-2/1-2.2/1-2.2:1.0'
ucom_96c_2='1-2/1-2.3/1-2.3:1.0'
ucom_96c_3='1-2/1-2.4/1-2.4:1.0'
if [ $2 = "add" ]; then
#获取tty所用hub通道
utty=`cat /sys/class/tty/$1/uevent | busybox grep ttyUSB| sed 's/^.*EHCI-NationalChip.0\/usb1\///g' | sed 's/\/ttyUSB.*$//g'`
else
# echo "not add uevent" > /dev/ttyS0
exit 0
fi
if [ $utty = $module4g_96c_0 ]; then
ln -sf /dev/$1 /dev/4g96c_0
elif [ $utty = $module4g_96c_1 ]; then
ln -sf /dev/$1 /dev/4g96c_1
elif [ $utty = $module4g_96c_2 ]; then
ln -sf /dev/$1 /dev/4g96c_2
elif [ $utty = $module4g_96c_3 ]; then
ln -sf /dev/$1 /dev/4g96c_3
elif [ $utty = $ucom_96c_0 ]; then
ln -sf /dev/$1 /dev/tty96C_0
elif [ $utty = $ucom_96c_1 ]; then
ln -sf /dev/$1 /dev/tty96C_1
elif [ $utty = $ucom_96c_2 ]; then
ln -sf /dev/$1 /dev/tty96C_2
elif [ $utty = $ucom_96c_3 ]; then
ln -sf /dev/$1 /dev/tty96C_3
fi
利用mdev让USB串口按USB通道自动映射 - 代码先锋网
# mount usb devices
sd[a-z] 0:0 660 * if [ $ACTION = "add" ]; then /etc/hotplug/udisk_insert; elif [ $ACTION = 'remove' ]; then /etc/hotplug/udisk_remove; fi
sd[a-z][1-9] 0:0 660 * if [ $ACTION = "add" ]; then /etc/hotplug/udisk_insert_s; elif [ $ACTION = 'remove' ]; then /etc/hotplug/udisk_remove; fi