2013-10-04 9 views
2

Я пытаюсь использовать udev для присвоения имен имен USB-последовательным устройствам, но теперь мне повезло.Правило udev с bInterfaceNumber не работает

# lsusb -d 04e2:1412 -v 

    Bus 004 Device 028: ID 04e2:1412 Exar Corp. 
    Device Descriptor: 
     bLength    18 
     bDescriptorType   1 
     bcdUSB    2.00 
     bDeviceClass   239 Miscellaneous Device 
     bDeviceSubClass   2 Common Class 
     bDeviceProtocol   1 Interface Association 
     bMaxPacketSize0  64 
     idVendor   0x04e2 Exar Corp. 
     idProduct   0x1412 
     bcdDevice   0.02 
     iManufacturer   0 
     iProduct    0 
     iSerial     0 
     bNumConfigurations  1 
     Configuration Descriptor: 
     bLength     9 
     bDescriptorType   2 
     wTotalLength   141 
     bNumInterfaces   4 
     bConfigurationValue  1 
     iConfiguration   0 
     bmAttributes   0xa0 
      (Bus Powered) 
      Remote Wakeup 
     MaxPower    94mA 
     Interface Association: 
      bLength     8 
      bDescriptorType  11 
      bFirstInterface   0 
      bInterfaceCount   2 
      bFunctionClass   2 Communications 
      bFunctionSubClass  2 Abstract (modem) 
      bFunctionProtocol  0 None 
      iFunction    0 
     Interface Descriptor: 
      bLength     9 
      bDescriptorType   4 
      bInterfaceNumber  0 
      bAlternateSetting  0 
      bNumEndpoints   1 
      bInterfaceClass   2 Communications 
      bInterfaceSubClass  2 Abstract (modem) 
      bInterfaceProtocol  1 AT-commands (v.25ter) 
      iInterface    0 
      CDC Header: 
      bcdCDC    1.10 
      CDC ACM: 
      bmCapabilities  0x06 
       sends break 
       line coding and serial state 
      CDC Union: 
      bMasterInterface  0 
      bSlaveInterface   1 
      CDC Call Management: 
      bmCapabilities  0x01 
       call management 
      bDataInterface   1 
      Endpoint Descriptor: 
      bLength     7 
      bDescriptorType   5 
      bEndpointAddress  0x85 EP 5 IN 
      bmAttributes   3 
       Transfer Type   Interrupt 
       Synch Type    None 
       Usage Type    Data 
      wMaxPacketSize  0x0040 1x 64 bytes 
      bInterval    2 
     Interface Descriptor: 
      bLength     9 
      bDescriptorType   4 
      bInterfaceNumber  1 
      bAlternateSetting  0 
      bNumEndpoints   2 
      bInterfaceClass  10 CDC Data 
      bInterfaceSubClass  0 Unused 
      bInterfaceProtocol  0 
      iInterface    0 
      Endpoint Descriptor: 
      bLength     7 
      bDescriptorType   5 
      bEndpointAddress  0x01 EP 1 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  0x81 EP 1 IN 
      bmAttributes   2 
       Transfer Type   Bulk 
       Synch Type    None 
       Usage Type    Data 
      wMaxPacketSize  0x0040 1x 64 bytes 
      bInterval    0 
     Interface Association: 
      bLength     8 
      bDescriptorType  11 
      bFirstInterface   2 
      bInterfaceCount   2 
      bFunctionClass   2 Communications 
      bFunctionSubClass  2 Abstract (modem) 
      bFunctionProtocol  0 None 
      iFunction    0 
     Interface Descriptor: 
      bLength     9 
      bDescriptorType   4 
      bInterfaceNumber  2 
      bAlternateSetting  0 
      bNumEndpoints   1 
      bInterfaceClass   2 Communications 
      bInterfaceSubClass  2 Abstract (modem) 
      bInterfaceProtocol  1 AT-commands (v.25ter) 
      iInterface    0 
      CDC Header: 
      bcdCDC    1.10 
      CDC ACM: 
      bmCapabilities  0x06 
       sends break 
       line coding and serial state 
      CDC Union: 
      bMasterInterface  2 
      bSlaveInterface   3 
      CDC Call Management: 
      bmCapabilities  0x01 
       call management 
      bDataInterface   3 
      Endpoint Descriptor: 
      bLength     7 
      bDescriptorType   5 
      bEndpointAddress  0x86 EP 6 IN 
      bmAttributes   3 
       Transfer Type   Interrupt 
       Synch Type    None 
       Usage Type    Data 
      wMaxPacketSize  0x0040 1x 64 bytes 
      bInterval    2 
     Interface Descriptor: 
      bLength     9 
      bDescriptorType   4 
      bInterfaceNumber  3 
      bAlternateSetting  0 
      bNumEndpoints   2 
      bInterfaceClass  10 CDC Data 
      bInterfaceSubClass  0 Unused 
      bInterfaceProtocol  0 
      iInterface    0 
      Endpoint Descriptor: 
      bLength     7 
      bDescriptorType   5 
      bEndpointAddress  0x02 EP 2 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  0x82 EP 2 IN 
      bmAttributes   2 
       Transfer Type   Bulk 
       Synch Type    None 
       Usage Type    Data 
      wMaxPacketSize  0x0040 1x 64 bytes 
      bInterval    0 
    Device Status:  0x0000 
     (Bus Powered) 

правила Udev Пытаюсь являются:

KERNEL=="ttyUSB[0-9]*", SUBSYSTEMS=="usb", ATTRS{bInterfaceNumber}=="01", ATTRS{idVendor}=="04e2", ATTRS{idProduct}=="1412", ACTION=="add", SYMLINK+="test_USB0" 
    KERNEL=="ttyUSB[0-9]*", SUBSYSTEMS=="usb", ATTRS{bInterfaceNumber}=="01", ATTRS{idVendor}=="04e2", ATTRS{idProduct}=="1412", ACTION=="add", SYMLINK+="test_USB1" 
    KERNEL=="ttyUSB[0-9]*", SUBSYSTEMS=="usb", ATTRS{bInterfaceNumber}=="02", ATTRS{idVendor}=="04e2", ATTRS{idProduct}=="1412", ACTION=="add", SYMLINK+="test_USB2" 
    KERNEL=="ttyUSB[0-9]*", SUBSYSTEMS=="usb", ATTRS{bInterfaceNumber}=="03", ATTRS{idVendor}=="04e2", ATTRS{idProduct}=="1412", ACTION=="add", SYMLINK+="test_USB3" 

Когда я использую только первое правило Udev без атрибута bInterfaceNumber, например, так:

KERNEL=="ttyUSB[0-9]*", SUBSYSTEMS=="usb", ATTRS{idVendor}=="04e2", ATTRS{idProduct}=="1412", ACTION=="add", SYMLINK+="test_USB0" 

Он работает нормально. Я могу создать символическую ссылку/dev/test_USB0, которая указывает на/dev/ttyUSB0, но как насчет других устройств ttyUSB, созданных при подключении этого USB-устройства?

Мое предположение заключается в использовании атрибута bInterfaceNumber, но когда я его вставляю, ничего не происходит и кажется, что он полностью обходит мое правило.

Может ли кто-нибудь помочь мне с этим?

ответ

6

Возможно, что устройство с подсистемой «usb» не получает никакого файла устройства , только самого устройства USB. Вы можете увидеть события udev , созданные вместе с переменными, при подключении вашего устройства с помощью udevadm monitor.

Я вижу, что событие для устройства, соответствующий узел sysfs, который может иметь bInterfaceNumber атрибут не имеет переменное имя_устройство, которая вероятно означает, что нет файла устройства. Тот же самый узел sysfs также не имеет файла «dev», что усиливает это.

Затем, я думаю, вы не хотите создавать символическую ссылку на голый «USB-устройство», а скорее на устройство «tty», поэтому вместо этого вы должны соответствовать подсистеме «tty».

Я был в состоянии соответствовать моему одного интерфейсу терминального конвертер с этим правилом:

SUBSYSTEM=="tty", ACTION=="add", \ 
    ENV{ID_VENDOR_ID}=="067b", ENV{ID_MODEL_ID}=="2303", \ 
    ENV{ID_USB_INTERFACE_NUM}=="00", SYMLINK+="test_USB0" 

Но тогда «ID_USB_INTERFACE_NUM» становится присваиваемыми правилами Udev на моей системы (Debian Jessie) и ваших, однако маловероятно, возможно, их не будет. Тем не менее, вы должны иметь возможность создать такое правило, возможно, сначала сопоставив интерфейсное устройство usb и присвоив bInterfaceNumber переменной , а затем используя ее в правиле, соответствующем устройству tty.

+0

ENV {ID_USB_INTERFACE_NUM} работает для меня на Fedora 18. ATTRS {bInterfaceNumber} нет. – GioMac