Regras do Udev para um dispositivo com várias interfaces

2

Então, estou me aprofundando no udev e me deparando com um problema.

Acho que entendo a premissa básica (por favor, corrija-me se estiver errado). O dispositivo está conectado devido ao seu sistema inicializar ou algum tempo depois. Udev passa por todas as regras procurando por correspondências. depois de encontrar uma correspondência, ela executa todas as ações solicitadas e continua descendo a lista de regras até chegar à última. Então começa no próximo dispositivo.

Agora, tenho um dispositivo USB que cria duas interfaces. Quando eu o anoto, recebo um can0 e can1 quando olho em /sys/class/net/ . Mas em /dev , há apenas uma entrada para isso abaixo de /dev/bus/usb/002/00X .

Agora, aqui é onde vem o meu problema. Eu quero nomear cada uma dessas interfaces algo específico. Eu sei que sempre surge antes do outro. Se eu não fizer nada, eles recebem o nome can0 e can1 . Se eu colocar uma regra do udev, o primeiro que aparecer será renomeado corretamente, mas olhando para o dmesg logs, o segundo errará porque o nome do kernel também é can0 (já que não há can1 ) .

Como alguém poderia contornar isso? udevadm não ajuda, pois há apenas um dispositivo listado em /dev , então parece que não posso diferenciá-los por atributos.

saída de lsusb -v abaixo:

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)
    
por engineer14 01.09.2017 / 05:47

1 resposta

1

Como visto em lsusb -v , suas interfaces têm nomes diferentes. Isso pode ser verificado adicionalmente por

udevadm info -a -p $(udevadm info -q path -n can0)
udevadm info -a -p $(udevadm info -q path -n can1)

Portanto, você pode usar ATTR{interface} para diferenciá-los.

SUBSYSTEM=="usb", ATTRS{idVendor}=="0c72", ATTRS{idProduct}=="0011", ATTR{interface}=="PCAN-USB Pro FD CAN"

Observe que, acima, usamos uma combinação específica das chaves ATTR e ATTRS , o que é importante porque procuramos valores no dispositivo atual ou atual e no dispositivo pai, consulte link .

Se os nomes de interfaces forem os mesmos, eles poderão ser distinguidos por ATTR{bInterfaceNumber} .

    
por 12.04.2018 / 06:13

Tags