Questão Extra criado / dev / ttyUSB bloqueia o uso de arquivo-config customizado do udev


Eu sou um mergulhador e orgulhoso proprietário de 2 computadores de mergulho. Estes dois podem ser conectados a uma porta USB e com o programa de registro de mergulho SubSurface da Linus eu posso importar logs de mergulho deles. Um é um Cobalto Aquático Atômico e o outro é um Suunto D4i. Agora eu quero criar arquivos dev com o udev para cada um deles, para que eu possa conectá-los a qualquer porta USB e ainda usar o mesmo arquivo dev no software de registro. (Por exemplo, / dev / my_cobalt e / dev / my_d4i)

A mesma configuração (tipo de) é usada para ambos.
Para o D4i, o uso do arquivo dev é bloqueado por um / dev / ttyUSB0 criado automaticamente.
Para ambos os computadores de mergulho, o arquivo de desenvolvimento é criado e, para o Cobalt, funciona como desejado, mas não para o D4i.
Eu posso usar / dev / ttyUSB0 mas não / dev / my_d4i.

De alguma forma, parece (não tenho certeza) ser causada por uma diferença na forma como eles se apresentam ao barramento USB. Veja a saída de lsusb abaixo.

Se alguém puder me dizer o que causa essa diferença e / ou como resolver isso, eu realmente aprecio isso. (Por que quando conectando o d4i também é criado um arquivo-t ttyUSB?)

Abaixo estão algumas informações sobre descobertas / configurações.

/etc/udev/rules.d/dive-computers.rules

# My Cobalt2 DiveComputer
SUBSYSTEM=="usb", ATTR{idVendor}=="0471", ATTR{idProduct}=="0888", SYMLINK+="my_cobalt", GROUP="dialout", MODE="0660"
# My Suunto D4i DiveComputer
SUBSYSTEM=="usb", ATTR{idVendor}=="0403", ATTR{idProduct}=="6001", SYMLINK+="my_d4i", GROUP="dialout", MODE="0660"

arquivos dev após a conexão do Cobalt

lrwxrwxrwx   1 root root            15 mei 16 23:13 my_cobalt -> bus/usb/003/007
# no ttyUSB0 created

arquivos dev depois de conectar o d4i

lrwxrwxrwx   1 root root            15 mei 16 23:15 my_d4i -> bus/usb/003/009
crw-rw----   1 root dialout   188,   0 mei 16 23:15 ttyUSB0

lsusb -v -D / dev / bus / usb / 003/007 (Cobalto)

Dispositivo: ID 0471: 0888 Philips (ou NXP) Hantek DDS-3005 Gerador de Forma de Onda Arbitrária
Descritor de Dispositivo:
  bComprimento 18
  bDescriptorType 1
  bcdUSB 2,00
  Diagnóstico bDeviceClass 220
  bDeviceSubClass 1 Diagnóstico reprogramável
  bDeviceProtocol 1 Conformidade com USB2
  bMaxPacketSize0 16
  idVendor 0x0471 Philips (ou NXP)
  idProduct 0x0888 Gerador de formas de onda arbitrárias Hantek DDS-3005
  bcdDevice 0,02
  iManufacturer 1 ATOMIC AQUATICS
  iPRODU 2 COBALTO
  iSerial 3 123456789ABCDEF
  bNumConfigurations 1
  Descritor de Configuração:
    bComprimento 9
    bDescriptorType 2
    wTotalLength 39
    bNumInterfaces 1
    bConfigurationValue 1
    Console do iConfiguration 4
    bmAttributes 0xe0
      Auto Powered
      Despertador Remoto
    MaxPower 500mA
    Descritor de interface:
      bComprimento 9
      bDescriptorType 4
      bInterfaceNumber 0
      bAlternateSetting 0
      bNumEndpoints 3
      bInterfaceClass 220 Diagnóstico
      bInterfaceSubClass 160
      bInterfaceProtocol 176
      iInterface 0
      Descritor de terminal:
        bComprimento 7
        bDescriptorType 5
        bEndpointAddress 0x81 EP 1 IN
        bmAttributos 2
          Tipo de transferência em massa
          Tipo de Sincronismo Nenhum
          Dados do tipo de uso
        wMaxPacketSize 0x0040 1x 64 bytes
        bInterval 0
      Descritor de terminal:
        bComprimento 7
        bDescriptorType 5
        bEndpointAddress 0x02 EP 2 OUT
        bmAttributos 2
          Tipo de transferência em massa
          Tipo de Sincronismo Nenhum
          Dados do tipo de uso
        wMaxPacketSize 0x0040 1x 64 bytes
        bInterval 0
      Descritor de terminal:
        bComprimento 7
        bDescriptorType 5
        bEndpointAddress 0x82 EP 2 IN
        bmAttributos 2
          Tipo de transferência em massa
          Tipo de Sincronismo Nenhum
          Dados do tipo de uso
        wMaxPacketSize 0x0040 1x 64 bytes
        bInterval 0
Status do dispositivo: 0x0101
  Auto Powered

lsusb -v -D / dev / bus / usb / 003/009 (D4i)

Equipamento: ID 0403: 6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC
Descritor de Dispositivo:
  bComprimento 18
  bDescriptorType 1
  bcdUSB 2,00
  bDeviceClass 0 (definido no nível da interface)
  bDeviceSubClass 0
  bDeviceProtocol 0
  bMaxPacketSize0 8
  idVendor 0x0403 Future Technology Devices International, Ltd
  idProduct 0x6001 FT232 USB-Serial (UART) IC
  bcdDevice 6,00
  iManufacturer 1 Smartinterface
  Cabo USB Serial iProduct 2
  iSerial 3 DiYISDGK
  bNumConfigurations 1
  Descritor de Configuração:
    bComprimento 9
    bDescriptorType 2
    wTotalLength 32
    bNumInterfaces 1
    bConfigurationValue 1
    iConfiguração 0
    bmAtributos 0xa0
      (Alimentado por barramento)
      Despertador Remoto
    MaxPower 500mA
    Descritor de interface:
      bComprimento 9
      bDescriptorType 4
      bInterfaceNumber 0
      bAlternateSetting 0
      bNumEndpoints 2
      bInterfaceClass 255 Classe específica do fornecedor
      bInterfaceSubClass 255 Subclasse específica do fornecedor
      bInterfaceProtocol 255 Protocolo específico do fornecedor
      Cabo USB Serial iInterface 2
      Descritor de terminal:
        bComprimento 7
        bDescriptorType 5
        bEndpointAddress 0x81 EP 1 IN
        bmAttributos 2
          Tipo de transferência em massa
          Tipo de Sincronismo Nenhum
          Dados do tipo de uso
        wMaxPacketSize 0x0040 1x 64 bytes
        bInterval 0
      Descritor de terminal:
        bComprimento 7
        bDescriptorType 5
        bEndpointAddress 0x02 EP 2 OUT
        bmAttributos 2
          Tipo de transferência em massa
          Tipo de Sincronismo Nenhum
          Dados do tipo de uso
        wMaxPacketSize 0x0040 1x 64 bytes
        bInterval 0
Status do dispositivo: 0x0000
  (Alimentado por barramento)

registro do software (pelo que vale a pena)

Iniciando o download de / dev / my_d4i
Iniciando o encadeamento 0
[0.000126] ERRO: ioctl inapropriado para o dispositivo (25) [em ../../src/serial_posix.c:308 (dc_serial_open)]
[0.000156] ERRO: Falha ao abrir a porta serial. [in ../../src/suunto_d9.c:155 (suunto_d9_device_open)]
INFO: valor de erro dc_deveice_open de -6
Concluindo o Encadeamento Impossível abrir% s% s (% s) mergulhos baixados 0
Iniciando o download de / dev / ttyUSB0
Iniciando o encadeamento 0
INFO: valor de erro dc_deveice_open de 0
Terminando os mergulhos de thread baixados 0


0


origem


Você está ligando simbolicamente o dispositivo USB bruto em vez do dispositivo tty. Eu respondi uma pergunta praticamente semelhante antes, seja aqui ou em unix.stackexchange, mas não consigo encontrá-lo agora. Basicamente, você precisa alterar a regra do udev para o subsistema correto e usar ATTRS em vez de ATTR para corresponder ao caminho do dispositivo inteiro. Detalhes na resposta quando posso encontrá-lo. - dirkt


Respostas:


Então dirkt deu um comentário que me fez pensar e eu verifiquei alguns fatos novamente. Com monitor do udevadm e depois conectando os dispositivos eu recebi o seguinte:

Cobalto:

KERNEL[25393.161856] add      /devices/pci0000:00/0000:00:14.0/usb3/3-8 (usb)
KERNEL[25393.165873] add      /devices/pci0000:00/0000:00:14.0/usb3/3-8/3-8:1.0 (usb)
KERNEL[25393.165941] bind     /devices/pci0000:00/0000:00:14.0/usb3/3-8 (usb)
UDEV  [25393.183044] add      /devices/pci0000:00/0000:00:14.0/usb3/3-8 (usb)
UDEV  [25393.185175] add      /devices/pci0000:00/0000:00:14.0/usb3/3-8/3-8:1.0 (usb)
UDEV  [25393.186958] bind     /devices/pci0000:00/0000:00:14.0/usb3/3-8 (usb)

D4i

KERNEL[24333.615580] add      /devices/pci0000:00/0000:00:14.0/usb3/3-8 (usb)
KERNEL[24333.618406] add      /devices/pci0000:00/0000:00:14.0/usb3/3-8/3-8:1.0 (usb)
KERNEL[24333.618444] add      /devices/pci0000:00/0000:00:14.0/usb3/3-8/3-8:1.0/ttyUSB0 (usb-serial)
KERNEL[24333.618615] add      /devices/pci0000:00/0000:00:14.0/usb3/3-8/3-8:1.0/ttyUSB0/tty/ttyUSB0 (tty)
KERNEL[24333.618644] bind     /devices/pci0000:00/0000:00:14.0/usb3/3-8/3-8:1.0/ttyUSB0 (usb-serial)
KERNEL[24333.618685] bind     /devices/pci0000:00/0000:00:14.0/usb3/3-8/3-8:1.0 (usb)
KERNEL[24333.618729] bind     /devices/pci0000:00/0000:00:14.0/usb3/3-8 (usb)
UDEV  [24333.637591] add      /devices/pci0000:00/0000:00:14.0/usb3/3-8 (usb)
UDEV  [24333.639773] add      /devices/pci0000:00/0000:00:14.0/usb3/3-8/3-8:1.0 (usb)
UDEV  [24333.641366] add      /devices/pci0000:00/0000:00:14.0/usb3/3-8/3-8:1.0/ttyUSB0 (usb-serial)
UDEV  [24333.648159] add      /devices/pci0000:00/0000:00:14.0/usb3/3-8/3-8:1.0/ttyUSB0/tty/ttyUSB0 (tty)
UDEV  [24333.648969] bind     /devices/pci0000:00/0000:00:14.0/usb3/3-8/3-8:1.0/ttyUSB0 (usb-serial)
UDEV  [24333.649799] bind     /devices/pci0000:00/0000:00:14.0/usb3/3-8/3-8:1.0 (usb)
UDEV  [24333.650906] bind     /devices/pci0000:00/0000:00:14.0/usb3/3-8 (usb)

Com isso eu imaginei que os subsistemas udev corretos deveriam ser:

  • d4i -> tty
  • cobalto -> usb

E como dirkt mencionou, use ATTRS ao invés de ATTR para combinar em todo o devicepath. Então eu mudei as regras do udev para:

# My Cobalt2 DiveComputer
SUBSYSTEM=="usb", ATTR{idVendor}=="0471", ATTR{idProduct}=="0888", SYMLINK+="my_cobalt", GROUP="dialout", MODE="0660"
# My Suunto D4i DiveComputer
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="DiYISDGK", SYMLINK+="my_d4i", GROUP="dialout", MODE="0660"

Depois de reiniciar o udev e reconectar o dispositivo, recebi:

ls -l / dev / tty_d4i

lrwxrwxrwx   1 root root             7 mei 22 00:43 tty_d4i -> ttyUSB0

E isso fez funcionar como eu queria. Eu ainda não estou 100% certo porque, mas esse é o meu conhecimento limitado do udev, eu acho. Eu continuarei investigando o udev, mas por enquanto isso parece estar resolvido. Então, graças a dirkt pela dica.

Para referência, a saída de:

sudo udevadm info -a -n / dev / ttyUSB0

A informação do Udevadm começa com o dispositivo especificado pelo devpath e depois
percorre a cadeia de dispositivos pais. Imprime para todos os dispositivos
encontrado, todos os atributos possíveis no formato de chave de regras do udev.
Uma regra para combinar, pode ser composta pelos atributos do dispositivo
e os atributos de um único dispositivo pai.

  olhando para o dispositivo '/devices/pci0000:00/0000:00:14.0/usb3/3-7/3-7:1.0/ttyUSB0/tty/ttyUSB0':
    KERNEL == "ttyUSB0"
     SUBSISTEMA == "tty"
    DRIVER == ""

  olhando para o dispositivo pai '/devices/pci0000:00/0000:00:14.0/usb3/3-7/3-7:1.0/ttyUSB0':
    KERNELS == "ttyUSB0"
    SUBSISTEMAS == "usb-serial"
    DRIVERS == "ftdi_sio"
    ATTRS {latency_timer} == "16"
    ATTRS {port_number} == "0"

  olhando para o dispositivo pai '/devices/pci0000:00/0000:00:14.0/usb3/3-7/3-7:1.0':
    KERNELS == "3-7: 1.0"
    SUBSISTEMAS == "usb"
    DRIVERS == "ftdi_sio"
    ATTRS {autorizado} == "1"
    ATTRS {bAlternateSetting} == "0"
    ATTRS {bInterfaceClass} == "ff"
    ATTRS {bInterfaceNumber} == "00"
    ATTRS {bInterfaceProtocol} == "ff"
    ATTRS {bInterfaceSubClass} == "ff"
    ATTRS {bNumEndpoints} == "02"
    ATTRS {interface} == "Cabo serial USB"
    ATTRS {supports_autosuspend} == "1"

  olhando para o dispositivo pai '/devices/pci0000:00/0000:00:14.0/usb3/3-7':
    KERNELS == "3-7"
    SUBSISTEMAS == "usb"
    DRIVERS == "usb"
    ATTRS {autorizado} == "1"
    ATTRS {avoid_reset_quirk} == "0"
    ATTRS {bConfigurationValue} == "1"
    ATTRS {bDeviceClass} == "00"
    ATTRS {bDeviceProtocol} == "00"
    ATTRS {bDeviceSubClass} == "00"
    ATTRS {bMaxPacketSize0} == "8"
    ATTRS {bMaxPower} == "500mA"
    ATTRS {bNumConfigurations} == "1"
    ATTRS {bNumInterfaces} == "1"
    ATTRS {bcdDevice} == "0600"
    ATTRS {bmAttributes} == "a0"
    ATTRS {busnum} == "3"
    ATTRS {configuração} == ""
    ATTRS {devnum} == "14"
    ATTRS {devpath} == "7"
     ATTRS {idProduct} == "6001"
    ATTRS {idVendor} == "0403"
    ATTRS {ltm_capable} == "não"
    ATTRS {fabricante} == "Smartinterface"
    ATTRS {maxchild} == "0"
    ATTRS {product} == "Cabo Serial USB"
    ATTRS {quirks} == "0x0"
    ATTRS {removível} == "removível"
     ATTRS {serial} == "DiYISDGK"
    ATTRS {velocidade} == "12"
    ATTRS {urbnum} == "15"
    ATTRS {versão} == "2,00"

  olhando para o dispositivo pai '/devices/pci0000:00/0000:00:14.0/usb3':
    KERNELS == "usb3"
    SUBSISTEMAS == "usb"
    DRIVERS == "usb"
    ATTRS {autorizado} == "1"
    ATTRS {authorized_default} == "1"
    ATTRS {avoid_reset_quirk} == "0"
    ATTRS {bConfigurationValue} == "1"
    ATTRS {bDeviceClass} == "09"
    ATTRS {bDeviceProtocol} == "01"
    ATTRS {bDeviceSubClass} == "00"
    ATTRS {bMaxPacketSize0} == "64"
    ATTRS {bMaxPower} == "0mA"
    ATTRS {bNumConfigurations} == "1"
    ATTRS {bNumInterfaces} == "1"
    ATTRS {bcdDevice} == "0415"
    ATTRS {bmAttributes} == "e0"
    ATTRS {busnum} == "3"
    ATTRS {configuração} == ""
    ATTRS {devnum} == "1"
    ATTRS {devpath} == "0"
    ATTRS {idProduct} == "0002"
    ATTRS {idVendor} == "1d6b"
    ATTRS {interface_authorized_default} == "1"
    ATTRS {ltm_capable} == "não"
    ATTRS {fabricante} == "Linux 4.15.0-20-genérico xhci-hcd"
    ATTRS {maxchild} == "15"
    ATTRS {product} == "xHCI Host Controller"
    ATTRS {quirks} == "0x0"
    ATTRS {removível} == "desconhecido"
    ATTRS {serial} == "0000: 00: 14.0"
    ATTRS {velocidade} == "480"
    ATTRS {urbnum} == "264"
    ATTRS {versão} == "2,00"

  olhando para o dispositivo pai '/devices/pci0000:00/0000:00:14.0':
    KERNELS == "0000: 00: 14.0"
    SUBSISTEMAS == "pci"
    DRIVERS == "xhci_hcd"
    ATTRS {broken_parity_status} == "0"
    ATTRS {class} == "0x0c0330"
    ATTRS {consistent_dma_mask_bits} == "64"
    ATTRS {d3cold_allowed} == "1"
    ATTRS {dbc} == "desativado"
    ATTRS {device} == "0x8d31"
    ATTRS {dma_mask_bits} == "64"
    ATTRS {driver_override} == "(nulo)"
    ATTRS {enable} == "1"
    ATTRS {irq} == "19"
    ATTRS {local_cpulist} == "0-11"
    ATTRS {local_cpus} == "fff"
    ATTRS {msi_bus} == "1"
    ATTRS {numa_node} == "0"
    ATTRS {revisão} == "0x05"
    ATTRS {subsystem_device} == "0x7a54"
    ATTRS {subsystem_vendor} == "0x1462"
    ATTRS {vendor} == "0x8086"

  olhando para o dispositivo pai '/ devices / pci0000: 00':
    KERNELS == "pci0000: 00"
    SUBSISTEMAS == ""
    DRIVERS == ""

0