USB hub 多usb接口重映射:udev 规则
你在开发的过程中是否会出现 USB端口号会发生变化。 例如: 机器人底盘与雷达都是 ttyUSB* .其序号与接入的先后有关。 对于写好的launch每次修改对应接口是不是
很麻法,或者每次得先插入一个再插另外一个。才能保证ttyUSB0 ttyUSB1. 但是如果你重启系统,说不定还是有问题出现。。
==》 不如将端口重映射到新的固定的名字,并且设置其权限为可读。 这样不管你的先后插入,符合对应id的硬件端口自动的映射到新定义的名字。
一. 单一的USB映射说明
参见:http://blog.csdn.net/zyh821351004/article/details/41577105
lsusb 命令查看所有usb端口信息。
- yhzhao@yhzhao:~$ lsusb
- Bus 002 Device 002: ID 0bda:0411 Realtek Semiconductor Corp.
- Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
- Bus 001 Device 004: ID 04f2:b48c Chicony Electronics Co., Ltd
- Bus 001 Device 009: ID 046d:c31c Logitech, Inc. Keyboard K120
- Bus 001 Device 010: ID 10c4:ea60 Cygnal Integrated Products, Inc. CP210x UART Bridge / myAVR mySmartUSB light
- Bus 001 Device 005: ID 0bda:5411 Realtek Semiconductor Corp.
- Bus 001 Device 008: ID 24ae:1100
- Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
- yhzhao@yhzhao:~$ lsusb
- Bus 002 Device 002: ID 0bda:0411 Realtek Semiconductor Corp.
- Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
- Bus 001 Device 004: ID 04f2:b48c Chicony Electronics Co., Ltd
- Bus 001 Device 009: ID 046d:c31c Logitech, Inc. Keyboard K120
- Bus 001 Device 010: ID 10c4:ea60 Cygnal Integrated Products, Inc. CP210x UART Bridge / myAVR mySmartUSB light
- Bus 001 Device 005: ID 0bda:5411 Realtek Semiconductor Corp.
- Bus 001 Device 008: ID 24ae:1100
- Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
udev的规则说明,可以参考博客说明:http://blog.csdn.net/cokewei/article/details/8281239
简单说明:
$kernel, %k:设备的内核设备名称,例如:sda、cdrom。
ID 10c4:ea60 表示usb设备的ID(这个ID由芯片制造商设置,可以唯一表示该设备)
10c4 usb_device_descriptor.idVendor
ea60 usb_device_descriptor.idProduct
依据这些信息,就可以简单的写udev规则了:rplidar.rules
sudo gedit /etc/udev/rules.d/rplidar.rules
- # set the udev rule , make the device_port be fixed by rplidar
- #
- KERNEL=="ttyUSB*", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", MODE:="0777", SYMLINK+="rplidar"
- # set the udev rule , make the device_port be fixed by rplidar
- #
- KERNEL=="ttyUSB*", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", MODE:="0777", SYMLINK+="rplidar"
创建生效后重新插拔USB。
用下面的命令就可以查看对应的映射结果了。
- yhzhao@yhzhao:~$ ls -l /dev |grep ttyUSB
- lrwxrwxrwx 1 root root 7 Apr 14 13:18 rplidar -> ttyUSB0
- crwxrwxrwx 1 root uucp 188, 0 Apr 14 13:18 ttyUSB0
- yhzhao@yhzhao:~$
- yhzhao@yhzhao:~$ ls -l /dev |grep ttyUSB
- lrwxrwxrwx 1 root root 7 Apr 14 13:18 rplidar -> ttyUSB0
- crwxrwxrwx 1 root uucp 188, 0 Apr 14 13:18 ttyUSB0
- yhzhao@yhzhao:~$
二. USB hub的多端口映射:
同一个hub连接设备base和laser, 将其重映射换名称到 slamtec_base_ 和 slamtec_laser_
- yhzhao@yhzhao:~$ lsusb
- Bus 002 Device 002: ID 0bda:0411 Realtek Semiconductor Corp.
- Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
- Bus 001 Device 004: ID 04f2:b48c Chicony Electronics Co., Ltd
- Bus 001 Device 009: ID 046d:c31c Logitech, Inc. Keyboard K120
- Bus 001 Device 011: ID 10c4:ea60 Cygnal Integrated Products, Inc. CP210x UART Bridge / myAVR mySmartUSB light
- Bus 001 Device 012: ID 10c4:ea60 Cygnal Integrated Products, Inc. CP210x UART Bridge / myAVR mySmartUSB light
- Bus 001 Device 005: ID 0bda:5411 Realtek Semiconductor Corp.
- Bus 001 Device 008: ID 24ae:1100
- Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
- yhzhao@yhzhao:~$ lsusb
- Bus 002 Device 002: ID 0bda:0411 Realtek Semiconductor Corp.
- Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
- Bus 001 Device 004: ID 04f2:b48c Chicony Electronics Co., Ltd
- Bus 001 Device 009: ID 046d:c31c Logitech, Inc. Keyboard K120
- Bus 001 Device 011: ID 10c4:ea60 Cygnal Integrated Products, Inc. CP210x UART Bridge / myAVR mySmartUSB light
- Bus 001 Device 012: ID 10c4:ea60 Cygnal Integrated Products, Inc. CP210x UART Bridge / myAVR mySmartUSB light
- Bus 001 Device 005: ID 0bda:5411 Realtek Semiconductor Corp.
- Bus 001 Device 008: ID 24ae:1100
- Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
可以看到hub的信息,同时hub上连接了两个串口转USB的设备,并且两者硬件使用的是一样的, 一种是依据设备的device配合一起分别定义udev规则,同上。
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
现提供固定hub的每个端口的映射。
udevadm info --attribute-walk --path=/sys/bus/usb-serial/devices/ttyUSB0
说明参见: http://askubuntu.com/questions/49910/how-to-distinguish-between-identical-usb-to-serial-adapters
可以找到hub端口的不同:
- yhzhao@yhzhao:~$ udevadm info --attribute-walk --path=/sys/bus/usb-serial/devices/ttyUSB1
-
- Udevadm info starts with the device specified by the devpath and then
- walks up the chain of parent devices. It prints for every device
- found, all possible attributes in the udev rules key format.
- A rule to match, can be composed by the attributes of the device
- and the attributes from one single parent device.
-
- looking at device '/devices/pci0000:00/0000:00:14.0/usb1/1-2/1-2.2/1-2.2:1.0/ttyUSB1':
- KERNEL=="ttyUSB1"
- SUBSYSTEM=="usb-serial"
- DRIVER=="cp210x"
- ATTR{port_number}=="0"
-
- looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-2/1-2.2/1-2.2:1.0':
- KERNELS=="1-2.2:1.0"
- SUBSYSTEMS=="usb"
- DRIVERS=="cp210x"
- ATTRS{bInterfaceClass}=="ff"
- yhzhao@yhzhao:~$ udevadm info --attribute-walk --path=/sys/bus/usb-serial/devices/ttyUSB1
-
- Udevadm info starts with the device specified by the devpath and then
- walks up the chain of parent devices. It prints for every device
- found, all possible attributes in the udev rules key format.
- A rule to match, can be composed by the attributes of the device
- and the attributes from one single parent device.
-
- looking at device '/devices/pci0000:00/0000:00:14.0/usb1/1-2/1-2.2/1-2.2:1.0/ttyUSB1':
- KERNEL=="ttyUSB1"
- SUBSYSTEM=="usb-serial"
- DRIVER=="cp210x"
- ATTR{port_number}=="0"
-
- looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-2/1-2.2/1-2.2:1.0':
- KERNELS=="1-2.2:1.0"
- SUBSYSTEMS=="usb"
- DRIVERS=="cp210x"
- ATTRS{bInterfaceClass}=="ff"
- yhzhao@yhzhao:~$ udevadm info --attribute-walk --path=/sys/bus/usb-serial/devices/ttyUSB0
-
- Udevadm info starts with the device specified by the devpath and then
- walks up the chain of parent devices. It prints for every device
- found, all possible attributes in the udev rules key format.
- A rule to match, can be composed by the attributes of the device
- and the attributes from one single parent device.
-
- looking at device '/devices/pci0000:00/0000:00:14.0/usb1/1-2/1-2.1/1-2.1:1.0/ttyUSB0':
- KERNEL=="ttyUSB0"
- SUBSYSTEM=="usb-serial"
- DRIVER=="cp210x"
- ATTR{port_number}=="0"
-
- looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-2/1-2.1/1-2.1:1.0':
- KERNELS=="1-2.1:1.0"
- SUBSYSTEMS=="usb"
- DRIVERS=="cp210x"
- ATTRS{bInterfaceClass}=="ff"
- yhzhao@yhzhao:~$ udevadm info --attribute-walk --path=/sys/bus/usb-serial/devices/ttyUSB0
-
- Udevadm info starts with the device specified by the devpath and then
- walks up the chain of parent devices. It prints for every device
- found, all possible attributes in the udev rules key format.
- A rule to match, can be composed by the attributes of the device
- and the attributes from one single parent device.
-
- looking at device '/devices/pci0000:00/0000:00:14.0/usb1/1-2/1-2.1/1-2.1:1.0/ttyUSB0':
- KERNEL=="ttyUSB0"
- SUBSYSTEM=="usb-serial"
- DRIVER=="cp210x"
- ATTR{port_number}=="0"
-
- looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-2/1-2.1/1-2.1:1.0':
- KERNELS=="1-2.1:1.0"
- SUBSYSTEMS=="usb"
- DRIVERS=="cp210x"
- ATTRS{bInterfaceClass}=="ff"
#参考 http://askubuntu.com/questions/49910/how-to-distinguish-between-identical-usb-to-serial-adapters
#lsusb
#udevadm info --attribute-walk --path=/sys/bus/usb-serial/devices/ttyUSB0
- SUBSYSTEMS=="usb"
- DRIVERS=="cp210x"
- ATTRS{bInterfaceClass}=="ff"
- ATTRS{bInterfaceSubClass}=="00"
- ATTRS{bInterfaceProtocol}=="00"
- ATTRS{bNumEndpoints}=="02"
- ATTRS{supports_autosuspend}=="1"
- ATTRS{bAlternateSetting}==" 0"
- ATTRS{bInterfaceNumber}=="00"
- ATTRS{interface}=="CP2102 USB to UART Bridge Controller"
- KERNEL=="ttyUSB*", KERNELS=="1-2.1", MODE:="0777",SYMLINK+="slamtec_base_"
- KERNEL=="ttyUSB*", KERNELS=="1-2.2", MODE:="0777",SYMLINK+="slamtec_laser_"
- SUBSYSTEMS=="usb"
- DRIVERS=="cp210x"
- ATTRS{bInterfaceClass}=="ff"
- ATTRS{bInterfaceSubClass}=="00"
- ATTRS{bInterfaceProtocol}=="00"
- ATTRS{bNumEndpoints}=="02"
- ATTRS{supports_autosuspend}=="1"
- ATTRS{bAlternateSetting}==" 0"
- ATTRS{bInterfaceNumber}=="00"
- ATTRS{interface}=="CP2102 USB to UART Bridge Controller"
- KERNEL=="ttyUSB*", KERNELS=="1-2.1", MODE:="0777",SYMLINK+="slamtec_base_"
- KERNEL=="ttyUSB*", KERNELS=="1-2.2", MODE:="0777",SYMLINK+="slamtec_laser_"
重新拔插。可以看到:
ls -l /dev
- yhzhao@yhzhao:~$ ls -l /dev|grep ttyUSB
- lrwxrwxrwx 1 root root 7 Apr 14 13:45 rplidar -> ttyUSB1
- lrwxrwxrwx 1 root root 7 Apr 14 13:45 slamtec_base_ -> ttyUSB0
- lrwxrwxrwx 1 root root 7 Apr 14 13:45 slamtec_laser_ -> ttyUSB1
- crwxrwxrwx 1 root uucp 188, 0 Apr 14 13:45 ttyUSB0
- crwxrwxrwx 1 root dialout 188, 1 Apr 14 13:45 ttyUSB1
- yhzhao@yhzhao:~$ ls -l /dev|grep ttyUSB
- lrwxrwxrwx 1 root root 7 Apr 14 13:45 rplidar -> ttyUSB1
- lrwxrwxrwx 1 root root 7 Apr 14 13:45 slamtec_base_ -> ttyUSB0
- lrwxrwxrwx 1 root root 7 Apr 14 13:45 slamtec_laser_ -> ttyUSB1
- crwxrwxrwx 1 root uucp 188, 0 Apr 14 13:45 ttyUSB0
- crwxrwxrwx 1 root dialout 188, 1 Apr 14 13:45 ttyUSB1
参考:http://blog.csdn.net/zyh821351004/article/details/41577105