我正在使用调制解调器发送 SMS,它有 16 个(ttyUSB0
至ttyUSB15
)端口。我想制定udev
规则来给出设备名称AMPM
和端口应命名为Port1
, Port2
,... Port16
。
查看port 上的lsusb
和命令的输出。udevadm
ttyUSB0
kk@kk:~$ lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 006 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 007 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 004: ID 0461:4d22 Primax Electronics, Ltd
Bus 001 Device 015: ID 0409:005a NEC Corp. HighSpeed Hub
Bus 001 Device 016: ID 0403:6011 Future Technology Devices International, Ltd FT4232H Quad HS USB-UART/FIFO IC
Bus 003 Device 003: ID 413c:2003 Dell Computer Corp. Keyboard
Bus 001 Device 017: ID 0403:6011 Future Technology Devices International, Ltd FT4232H Quad HS USB-UART/FIFO IC
Bus 001 Device 018: ID 0403:6011 Future Technology Devices International, Ltd FT4232H Quad HS USB-UART/FIFO IC
Bus 001 Device 019: ID 0403:6011 Future Technology Devices International, Ltd FT4232H Quad HS USB-UART/FIFO IC
kk@kk:~$
kk@kk:~$ udevadm info -q all -n /dev/ttyUSB0
P: /devices/pci0000:00/0000:00:1a.7/usb1/1-3/1-3.1/1-3.1:1.0/ttyUSB0/tty/ttyUSB0
N: ttyUSB0
S: serial/by-id/usb-FTDI_Quad_RS232-HS-if00-port0
S: serial/by-path/pci-0000:00:1a.7-usb-0:3.1:1.0-port0
E: DEVLINKS=/dev/serial/by-id/usb-FTDI_Quad_RS232-HS-if00-port0 /dev/serial/by-path/pci-0000:00:1a.7-usb-0:3.1:1.0-port0
E: DEVNAME=/dev/ttyUSB0
E: DEVPATH=/devices/pci0000:00/0000:00:1a.7/usb1/1-3/1-3.1/1-3.1:1.0/ttyUSB0/tty/ttyUSB0
E: ID_BUS=usb
E: ID_MM_CANDIDATE=1
E: ID_MODEL=Quad_RS232-HS
E: ID_MODEL_ENC=Quad\x20RS232-HS
E: ID_MODEL_FROM_DATABASE=FT4232H Quad HS USB-UART/FIFO IC
E: ID_MODEL_ID=6011
E: ID_PATH=pci-0000:00:1a.7-usb-0:3.1:1.0
E: ID_PATH_TAG=pci-0000_00_1a_7-usb-0_3_1_1_0
E: ID_REVISION=0800
E: ID_SERIAL=FTDI_Quad_RS232-HS
E: ID_TYPE=generic
E: ID_USB_DRIVER=ftdi_sio
E: ID_USB_INTERFACES=:ffffff:
E: ID_USB_INTERFACE_NUM=00
E: ID_VENDOR=FTDI
E: ID_VENDOR_ENC=FTDI
E: ID_VENDOR_FROM_DATABASE=Future Technology Devices International, Ltd
E: ID_VENDOR_ID=0403
E: MAJOR=188
E: MINOR=0
E: SUBSYSTEM=tty
E: UDEV_LOG=3
E: USEC_INITIALIZED=7668235100
我无法遵守udev
规则。
SUBSYSTEMS=="usb", KERNEL=="ttyUSB[0-15]*", ATTRS{idVendor}=="0403", ATTRS{product}=="6011", NAME=="AMPM" , SYMLINK=="AMPM", GROUP="tty", MODE="0660"
答案1
等等——我明白了。两件事情:
ATTRS{product}=="6011"
当你的意思是你用了ATTRS{idProduct}=="6011"
。那个缺失id
将会打破它。复制并粘贴以udevadm info --attribute-walk
防止此类拼写错误。- 你的模式是错误的;它应该是
KERNEL=="ttyUSB[0-9]*"
。它是一个(非常有限的)正则表达式,因此[0-15]*
意味着“任何字符 0–1 或 5,重复任意次数”。
另外,您可能想使用SYMLINK+=
而不是SYMLINK==
保留其他链接。您是对的,它需要SUBSYSTEMS=="usb"
与产品/供应商相匹配。
为了给您的 AMPM 设备编号,您需要提供udev
该编号。不幸的是,这是设备的一部分usb-serial
,而不是设备usb
本身。所以你不能只使用%s{port_number}
/ $attr{port_number}
。相反,借用60-persistent-serial.rules
新版本中的技巧udev
,并执行如下操作:
SUBSYSTEMS=="usb-serial", ENV{.LOCAL_PORT_NUM}="$attr{port_number}"
SUBSYSTEMS=="usb", KERNEL=="ttyUSB[0-9]*", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6011", SYMLINK+="AMPM$env{.LOCAL_PORT_NUM}"
在较旧的版本上,udev
您可能必须使用.%E{…}
$env{…}
或者,如果您udev
足够新,只需使用/dev/serial/by-id
:
$ ls -l /dev/serial/by-id/
total 0
lrwxrwxrwx 1 root root 13 Jan 4 06:02 usb-067b_2303-if00-port0 -> ../../ttyUSB0
您应该在那里看到您的供应商/产品代码以及所有端口。
答案2
有类似需求;将许多 FTDI USB 串行设备映射到唯一的名称,以便脚本可以唯一地引用它们。
在 Ubuntu 13.04 上,经过一些修补后,以下内容对我有用。
希望可以有所帮助:
#######################################################################################################################################
# Creating unique symbolic links to usb-serial devices based on their "serial" number and other such as "bInterfaceNumber" attributes.
# Use udevadm [e.g. udevadm info -a -p $(udevadm info -q path -n ttyUSB0)] to find the subsystems that match and their attributes.
#######################################################################################################################################
SUBSYSTEMS=="usb", ATTRS{serial}=="0000:00:1d.0", ENV{.LOCAL_serial}="$attr{serial}"
SUBSYSTEMS=="usb", ENV{.LOCAL_ifNum}="$attr{bInterfaceNumber}"
SUBSYSTEMS=="usb", KERNEL=="ttyUSB[0-9]*", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6010", ENV{.LOCAL_serial}=="0000:00:1d.0", ENV{.LOCAL_ifNum}=="00", SYMLINK+="ttyPapilioJTAG", MODE="0660"
SUBSYSTEMS=="usb", KERNEL=="ttyUSB[0-9]*", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6010", ENV{.LOCAL_serial}=="0000:00:1d.0", ENV{.LOCAL_ifNum}=="01", SYMLINK+="ttyPapilioConsole", MODE="0660"