Chr*_*ien 35 usb udev serial-port
我在我的笔记本电脑 (Ubuntu 9.10) 上使用了许多相同的 USB 转串口适配器。这些适配器由 Sabrent 制造,并围绕 Prolific PL2303 IC 构建,如下所示lsusb
:
Bus 001 Device 008: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port
Bus 001 Device 007: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port
Bus 001 Device 006: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port
Run Code Online (Sandbox Code Playgroud)
显示的所有属性udevadm
似乎都不是特定适配器独有的:
foo@bar:~$ udevadm info --attribute-walk --path=/sys/bus/usb-serial/devices/ttyUSB0
looking at device
'/devices/pci0000:00/0000:00:1d.7/usb1/1-4/1-4.1/1-4.1:1.0/ttyUSB0':
KERNEL=="ttyUSB0"
SUBSYSTEM=="usb-serial"
DRIVER=="pl2303"
ATTR{port_number}=="0"
looking at parent device
'/devices/pci0000:00/0000:00:1d.7/usb1/1-4/1-4.1/1-4.1:1.0':
KERNELS=="1-4.1:1.0"
SUBSYSTEMS=="usb"
DRIVERS=="pl2303"
ATTRS{bInterfaceNumber}=="00"
ATTRS{bAlternateSetting}==" 0"
ATTRS{bNumEndpoints}=="03"
ATTRS{bInterfaceClass}=="ff"
ATTRS{bInterfaceSubClass}=="00"
ATTRS{bInterfaceProtocol}=="00"
ATTRS{modalias}=="usb:v067Bp2303d0300dc00dsc00dp00icFFisc00ip00"
ATTRS{supports_autosuspend}=="1"
looking at parent device
'/devices/pci0000:00/0000:00:1d.7/usb1/1-4/1-4.1':
KERNELS=="1-4.1"
SUBSYSTEMS=="usb"
DRIVERS=="usb"
ATTRS{configuration}==""
ATTRS{bNumInterfaces}==" 1"
ATTRS{bConfigurationValue}=="1"
ATTRS{bmAttributes}=="80"
ATTRS{bMaxPower}=="100mA"
ATTRS{urbnum}=="538"
ATTRS{idVendor}=="067b"
ATTRS{idProduct}=="2303"
ATTRS{bcdDevice}=="0300"
ATTRS{bDeviceClass}=="00"
ATTRS{bDeviceSubClass}=="00"
ATTRS{bDeviceProtocol}=="00"
ATTRS{bNumConfigurations}=="1"
ATTRS{bMaxPacketSize0}=="64"
ATTRS{speed}=="12"
ATTRS{busnum}=="1"
ATTRS{devnum}=="6"
ATTRS{version}==" 1.10"
ATTRS{maxchild}=="0"
ATTRS{quirks}=="0x0"
ATTRS{authorized}=="1"
ATTRS{manufacturer}=="Prolific Technology Inc."
ATTRS{product}=="USB-Serial Controller"
<snip>
foo@bar:~$ udevadm info --attribute-walk --path=/sys/bus/usb-serial/devices/ttyUSB1
looking at device
'/devices/pci0000:00/0000:00:1d.7/usb1/1-4/1-4.5/1-4.5:1.0/ttyUSB1':
KERNEL=="ttyUSB1"
SUBSYSTEM=="usb-serial"
DRIVER=="pl2303"
ATTR{port_number}=="0"
looking at parent device
'/devices/pci0000:00/0000:00:1d.7/usb1/1-4/1-4.5/1-4.5:1.0':
KERNELS=="1-4.5:1.0"
SUBSYSTEMS=="usb"
DRIVERS=="pl2303"
ATTRS{bInterfaceNumber}=="00"
ATTRS{bAlternateSetting}==" 0"
ATTRS{bNumEndpoints}=="03"
ATTRS{bInterfaceClass}=="ff"
ATTRS{bInterfaceSubClass}=="00"
ATTRS{bInterfaceProtocol}=="00"
ATTRS{modalias}=="usb:v067Bp2303d0300dc00dsc00dp00icFFisc00ip00"
ATTRS{supports_autosuspend}=="1"
looking at parent device
'/devices/pci0000:00/0000:00:1d.7/usb1/1-4/1-4.5':
KERNELS=="1-4.5"
SUBSYSTEMS=="usb"
DRIVERS=="usb"
ATTRS{configuration}==""
ATTRS{bNumInterfaces}==" 1"
ATTRS{bConfigurationValue}=="1"
ATTRS{bmAttributes}=="80"
ATTRS{bMaxPower}=="100mA"
ATTRS{urbnum}=="69"
ATTRS{idVendor}=="067b"
ATTRS{idProduct}=="2303"
ATTRS{bcdDevice}=="0300"
ATTRS{bDeviceClass}=="00"
ATTRS{bDeviceSubClass}=="00"
ATTRS{bDeviceProtocol}=="00"
ATTRS{bNumConfigurations}=="1"
ATTRS{bMaxPacketSize0}=="64"
ATTRS{speed}=="12"
ATTRS{busnum}=="1"
ATTRS{devnum}=="7"
ATTRS{version}==" 1.10"
ATTRS{maxchild}=="0"
ATTRS{quirks}=="0x0"
ATTRS{authorized}=="1"
ATTRS{manufacturer}=="Prolific Technology Inc."
ATTRS{product}=="USB-Serial Controller"
<snip>
Run Code Online (Sandbox Code Playgroud)
所有适配器都插入一个 USB 集线器。由于我无法区分适配器本身,有什么方法可以编写 udev 规则,根据适配器插入的集线器上的哪个物理端口来修复每个适配器的名称?
Chr*_*ien 29
有什么方法可以编写 udev 规则,根据适配器插入的集线器上的哪个物理端口来修复每个适配器的名称?
是的,事实证明是这样。考虑上面第二个示例中显示的设备层次结构的最后一部分:
查看父设备'/devices/pci0000:00/0000:00:1d.7/usb1/1-4/1-4.5':内核=="1-4.5"
子系统=="usb"
驱动程序=="usb "
ATTRS{configuration}==""
ATTRS{bNumInterfaces}==" 1"
ATTRS{bConfigurationValue}=="1"
ATTRS{bmAttributes}=="80"
ATTRS{bMaxPower}=="100mA"
ATTRS{urbnum}= ="69"
ATTRS{idVendor}=="067b"
ATTRS{idProduct}=="2303"
ATTRS{bcdDevice}=="0300"
ATTRS{bDeviceClass}=="00"
ATTRS{bDeviceSubClass}=="00"
ATTRS {bDeviceProtocol}=="00"
ATTRS{bNumConfigurations}=="1"
ATTRS{bMaxPacketSize0}=="64"
ATTRS{speed}=="12"
ATTRS{busnum}=="1"
ATTRS{devnum}=="7" ATTRS{version}==" 1.10" ATTRS{maxchild}=="0" ATTRS{quirks}=="0x0"
ATTRS{authorized}=="1"
ATTRS{manufacturer}= ="多产科技公司"
ATTRS{product}=="USB 串行控制器"
内核赋予该设备的名称 (KERNELS=="1-4.5") 表明该设备已插入集线器的第五个端口,该集线器连接到总线 1 上的端口 4(有关如何解码的更多信息,请参阅此常见问题解答sysfs USB 设备层次结构)。借助本指南编写 udev 规则的一些帮助,我为我的 USB 到串行端口转换器提出了以下一组 udev 规则:
内核=="ttyUSB*", 内核=="1-8.1.5", NAME="ttyUSB0
" 内核=="ttyUSB*", 内核=="1-8.1.6", NAME="ttyUSB1" 内核
= ="ttyUSB*", 内核=="1-8.1.1", NAME="ttyUSB2" 内核
=="ttyUSB*", 内核=="1-8.1.2", NAME="ttyUSB3"
这些规则有一个明显的缺点:它们假设所有 USB 到串行转换器都将插入同一个集线器(“1-8.1.*”)。如果将 USB 到串行转换器插入另一个 USB 端口,则可以为其分配名称“ttyUSB0”,这将与上述命名方案冲突。但是,由于我将所有转换器都插入集线器,因此我可以忍受这种限制。
Cas*_*Cas 18
尽管在这种特定情况下无济于事,但某些适配器被分配了唯一的序列号:
udevadm info -a -n /dev/ttyUSB1 | grep '{serial}'
Run Code Online (Sandbox Code Playgroud)
示例适配器序列号:
ATTRS{serial}=="A6008isP"`
Run Code Online (Sandbox Code Playgroud)
然后 udev 规则将包含:
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="A6008isP", SYMLINK+="arduino"
Run Code Online (Sandbox Code Playgroud)
小智 5
由于最初的问题是 3 年前提出的,因此这可能不是针对提问者的,但我会将其发布以供将来参考。
有一种方法可以通过访问 FTDI 芯片的 EEPROM 来重新编程序列号,Silicon labs 提供了一个工具,但它仅适用于 Windows:
产品页面->工具->固定功能自定义实用程序
可以在 remotehq 找到说明:
http://remoteqth.com/wiki/index.php?page=How+to+set+usb+device+SerialNumber
Sourceforge 上还有一个 Unix 库。它只用CP2101 / CP2102 / CP2103 测试过,我没有亲自尝试过。
http://sourceforge.net/projects/cp210x-program/
归档时间: |
|
查看次数: |
84858 次 |
最近记录: |