在linux系统中,usb设备通常以ttyUSB*的方式在系统中挂载,如果同时连接多个usb设备,各个设备难以区分,而且存在读取权限的问题,在每次使用时都要对其进行权限修改,使用起来相当麻烦,因此,需要对usb设备进行命名,根据usb设备的产品号和设备号进行绑定,对于同类产品,可以通过对usb连接口的定义加以区分。

一. 单个USB设备

# 创建udev规则
sudo vim /etc/udev/rule.d/usb_xxx.rules
# 查询usb设备
lsusb
# 规则文件中写入样式
KERNEL=="ttyUSB*", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="5523", MODE:="0777", SYMLINK+="t214driver"

# 注意:lsusb中 xxx:xxx 前者为设备号,后者为产品号

# 查询单个usb 串口的详细信息
# 例如查询 ttyUSB0
udevadm info --attribute-walk --name=/dev/ttyUSB0

service udev reload
service udev restart

二. 多USB设备

多个相同设备会出现相同的产品号和相同的设备号,系统就无法与其中的一个设备进行绑定

为了解决多设备问题,可以利用usb串口id进行区分两个设备

例如:执行

udevadm info --attribute-walk --name=/dev/ttyUSB0

输出结果:

looking at device '/devices/pci0000:00/0000:00:14.0/usb1/1-5/1-5.2/1-5.2:1.0/ttyUSB0/tty/ttyUSB0':
    KERNEL=="ttyUSB0"
    SUBSYSTEM=="tty"
    DRIVER==""

  looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-5/1-5.2/1-5.2:1.0/ttyUSB0':
    KERNELS=="ttyUSB0"
    SUBSYSTEMS=="usb-serial"
    DRIVERS=="pl2303"
    ATTRS{port_number}=="0"

  looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-5/1-5.2/1-5.2:1.0':
    KERNELS=="1-5.2:1.0"
    SUBSYSTEMS=="usb"
    DRIVERS=="pl2303"
    ATTRS{authorized}=="1"
    ATTRS{bAlternateSetting}==" 0"
    ATTRS{bInterfaceClass}=="ff"
    ATTRS{bInterfaceNumber}=="00"
    ATTRS{bInterfaceProtocol}=="00"
    ATTRS{bInterfaceSubClass}=="00"
    ATTRS{bNumEndpoints}=="03"
    ATTRS{supports_autosuspend}=="1"

  looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-5/1-5.2':
    KERNELS=="1-5.2"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{authorized}=="1"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bDeviceClass}=="00"
    ATTRS{bDeviceProtocol}=="00"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bMaxPacketSize0}=="64"
    ATTRS{bMaxPower}=="100mA"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{bNumInterfaces}==" 1"
    ATTRS{bcdDevice}=="0300"
    ATTRS{bmAttributes}=="80"
    ATTRS{busnum}=="1"
    ATTRS{configuration}==""
    ATTRS{devnum}=="9"
    ATTRS{devpath}=="5.2"
    ATTRS{idProduct}=="2303"
    ATTRS{idVendor}=="067b"
    ATTRS{ltm_capable}=="no"
    ATTRS{manufacturer}=="Prolific Technology Inc."
    ATTRS{maxchild}=="0"
    ATTRS{product}=="USB-Serial Controller"
    ATTRS{quirks}=="0x0"
    ATTRS{removable}=="unknown"
    ATTRS{speed}=="12"
    ATTRS{urbnum}=="457"
    ATTRS{version}==" 1.10"

ATTRS{devpath}=="5.2"
# 代表五个usb的hub, 该设备插接在第二个usb接口上

所以, 可以将devpath 属性作为区分每个设备的关键词

多个相同设备可以这样写rule文件

KERNEL=="ttyUSB*", ATTRS{devpath}=="5.2", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", MODE:="0777",SYMLINK+="usb_dev_0"
KERNEL=="ttyUSB*", ATTRS{devpath}=="5.1", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", MODE:="0777",SYMLINK+="usb_dev_1"

在读取usb设备时可以应用绑定的名称进行读取,设备名称可以自己定义,

/dev/usb_dev_0
/dev/usb_dev_1

usb_rule设置完成后保存文件,更新设备

service udev reload
service udev restart

可以在/dev/中看到新定义的设备,设备名称为上文中自定义的设备名

enjoy!

更多推荐