所以,我正在深入研究 udev 并遇到一个问题。
我认为我理解基本前提(如果我错了,请纠正我)。设备在系统启动时或之后某个时间被连接。 Udev 会仔细检查所有规则来寻找匹配项。一旦找到匹配项,它就会执行所请求的任何操作,并继续沿着规则列表向下查找,直到到达最后一个。然后它在下一个设备上开始。
现在,我有一个创建 2 个接口的 USB 设备。当我附加它时,当我查看时,我同时得到了 can0 和 can1 /sys/class/net/
。但在 中/dev
,只有一个条目与此相关/dev/bus/usb/002/00X
。
现在,这就是我的问题所在。我想为这些接口中的每一个命名特定的名称。我知道一个总是先于另一个出现。如果我什么都不做,他们就会被命名为can0
和can1
。如果我放入 udev 规则,出现的第一个规则会被正确重命名,但查看日志dmesg
,第二个规则会出错,因为内核名称也是can0
(因为没有can1
)。
如何解决这个问题呢?udevadm
没有帮助,因为 中只列出了一个设备/dev
,所以我似乎无法通过属性来区分它们。
输出lsusb -v
如下:
Bus 001 Device 011: ID 0c72:0011 PEAK System
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 2.00
bDeviceClass 0 (Defined at Interface level)
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 64
idVendor 0x0c72 PEAK System
idProduct 0x0011
bcdDevice 0.00
iManufacturer 1 PEAK-System Technik GmbH
iProduct 2 PCAN-USB Pro FD
iSerial 0
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 111
bNumInterfaces 2
bConfigurationValue 1
iConfiguration 4 Config00
bmAttributes 0x80
(Bus Powered)
MaxPower 240mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 6
bInterfaceClass 0 (Defined at Interface level)
bInterfaceSubClass 0
bInterfaceProtocol 0
iInterface 5 PCAN-USB Pro FD CAN
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0200 1x 512 bytes
bInterval 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x01 EP 1 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0200 1x 512 bytes
bInterval 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x82 EP 2 IN
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0200 1x 512 bytes
bInterval 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x02 EP 2 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0200 1x 512 bytes
bInterval 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x83 EP 3 IN
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x03 EP 3 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0200 1x 512 bytes
bInterval 0
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 1
bAlternateSetting 0
bNumEndpoints 6
bInterfaceClass 0 (Defined at Interface level)
bInterfaceSubClass 0
bInterfaceProtocol 0
iInterface 6 PCAN-USB Pro FD LIN
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x84 EP 4 IN
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x04 EP 4 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x85 EP 5 IN
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x05 EP 5 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x86 EP 6 IN
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x06 EP 6 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 0
Device Qualifier (for other device speed):
bLength 10
bDescriptorType 6
bcdUSB 2.00
bDeviceClass 0 (Defined at Interface level)
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 64
bNumConfigurations 1
Device Status: 0x0000
(Bus Powered)
答案1
如 中所示lsusb -v
,您的接口具有不同的名称。这可以通过以下方式额外检查
udevadm info -a -p $(udevadm info -q path -n can0)
udevadm info -a -p $(udevadm info -q path -n can1)
因此您可以使用ATTR{interface}
来区分它们。
SUBSYSTEM=="usb", ATTRS{idVendor}=="0c72", ATTRS{idProduct}=="0011", ATTR{interface}=="PCAN-USB Pro FD CAN"
请注意,上面我们使用了ATTR
和ATTRS
键的特定组合,这很重要,因为我们在当前或当前和父设备中查找值,请参阅http://www.reactivated.net/writing_udev_rules.html。
如果接口名称相同则可以通过 来区分ATTR{bInterfaceNumber}
。