我在从 udev 分配规则时遇到一些问题。
我有2个FTDI232安装在我的板上的芯片(总共有 3 个,但我现在对其中的 2 个感兴趣),内核通过驱动程序管理它们ftdi_sio,将它们命名为ttyUS0和ttyUSB1我正在应用这些规则以便将它们命名为USBS1和USBS2:
KERNELS=="1-2.1" KERNEL=="ttyUSB0" ATTR{idVendor}=="0403" ATTR{idProduct}=="6001" SUBSYSTEMS=="usb" NAME="usbS1"
KERNELS=="1-2.2" KERNEL=="ttyUSB1" ATTR{idVendor}=="0403" ATTR{idProduct}=="6001" SUBSYSTEMS=="usb" NAME="usbS2"
根据来自的信息消息
[ 4.676116] usb 1-2.1: new full-speed USB device number 3 using ehci-omap
[ 4.811920] usb 1-2.1: New USB device found, idVendor=0403, idProduct=6001
[ 4.819244] usb 1-2.1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 4.826965] usb 1-2.1: Product: FT232R USB UART
[ 4.831726] usb 1-2.1: Manufacturer: FTDI
[ 4.835968] usb 1-2.1: SerialNumber: A101XRTT
[ 4.963256] usb 1-2.2: new full-speed USB device number 4 using ehci-omap
[ 5.102355] usb 1-2.2: New USB device found, idVendor=0403, idProduct=6001
[ 5.109649] usb 1-2.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 5.117370] usb 1-2.2: Product: FT232R USB UART
[ 5.122161] usb 1-2.2: Manufacturer: FTDI
[ 5.126403] usb 1-2.2: SerialNumber: A101XRTQ
...
[ 16.839935] usbserial: USB Serial support registered for FTDI USB Serial Device
[ 16.848327] ftdi_sio 1-2.1:1.0: FTDI USB Serial Device converter detected
[ 16.856781] usb 1-2.1: Detected FT232RL
[ 16.977935] usb 1-2.1: FTDI USB Serial Device converter now attached to ttyUSB0
[ 16.986785] ftdi_sio 1-2.2:1.0: FTDI USB Serial Device converter detected
[ 16.994720] usb 1-2.2: Detected FT232RL
[ 17.099914] usb 1-2.2: FTDI USB Serial Device converter now attached to ttyUSB1
[ 17.108581] ftdi_sio 1-2.7:1.0: FTDI USB Serial Device converter detected
[ 17.116485] usb 1-2.7: Detected FT232RL
[ 17.165710] i2c 2-005c: Driver mt9v032 requests probe deferral
[ 17.187561] twl4030_madc 48070000.i2c:twl@48:madc: clk disabled, enabling
[ 17.228759] usb 1-2.7: FTDI USB Serial Device converter now attached to ttyUSB2
但这不起作用。我不知道为什么。
在较旧的系统(内核为 2.6.34)上,我只是应用了这些规则:
KERNELS=="2-2.1" SUBSYSTEMS=="usb" NAME="usbS1"
KERNELS=="2-2.2" SUBSYSTEMS=="usb" NAME="usbS2"
它在该系统上运行良好,但在我现在正在开发的系统上运行不正常(当然,内核参数已更改)。
我的规则文件有什么问题?
答案1
可能是以下情况之一:
- 在规则中,您通过内核名称(KERNEL=)直接引用这些设备,并且内核可能不会调用您的设备
ttyUSB?
,因此,该规则不适用 udev
不或无法读取您编写规则的文件。udev
对于相同的设备,已经有另一条规则覆盖您的规则,并将ttyUSB?
名称应用于它们。
所以,我建议你...
- 检查是否内核名称您的设备确实是
ttyUSB?
- 检查是否有其他规则对
udev
同一设备进行任何其他重命名,从而可能会覆盖您的规则。 - 检查是否确实
udev
加载了新规则(如果可能的话,使用其他设备进行测试)并且udev
可以读取新规则所在的文件...或者通过将这些规则放入现有规则文件中来测试这些规则是否被读取。
答案2
为了帮助调试,您可以(不是作为 root):
udevadm monitor
然后插入设备以查看 udev 看到了什么事件。您可能会发现您的规则与多个add
事件匹配。
您可以将设备名称转换为路径,例如
udevadm info -q path -n /dev/ttyUSB0
然后将此输出路径提供给
udevadm test <path>
跟踪 udev 正在读取哪些文件及其遵循的规则。它实际上并不运行命令等,因此它只是一个提示。
答案3
我是这样解决的:
KERNELS=="1-2.1", SUBSYSTEMS=="usb", ATTRS{idProduct}=="6001", ATTRS{idVendor}=="0403", SYMLINK+="usbS0"
KERNELS=="1-2.2", SUBSYSTEMS=="usb", ATTRS{idProduct}=="6001", ATTRS{idVendor}=="0403", SYMLINK+="usbS1"
KERNELS=="1-2.7", SUBSYSTEMS=="usb", ATTRS{idProduct}=="6001", ATTRS{idVendor}=="0403", SYMLINK+="usbS3"
逗号和 SYMLINK 指令使其起作用。