USB serial não aparece (solução de problemas do Udev)

USB serial não aparece (solução de problemas do Udev)

Estou tentando escrever uma regra udev para meu programador AVR baseado em USBtiny. Em outros sistemas não-Gentoo, o dispositivo usb aparecerá em /dev/ttyUSB0. Espero que apareça no meu sistema como algo semelhante, possivelmente /dev/ttyACM0ou algo assim.

Acredito que meu kernel esteja configurado corretamente porque posso conectar um conversor USB para serial e ele aparece como /dev/ttyUSB0.

Este é um sistema Gentoo openrc bastante atualizado com o eudev instalado.

Ao executar o "udevadm monitor", posso ver o seguinte acontecer quando conecto o dispositivo:

KERNEL[1859.422447] add      /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.1 (usb)
KERNEL[1859.422777] add      /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.1/1-1.1:1.0 (usb)
KERNEL[1859.423050] bind     /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.1 (usb)
UDEV  [1859.990399] add      /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.1 (usb)
UDEV  [1859.991792] add      /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.1/1-1.1:1.0 (usb)
UDEV  [1859.996016] bind     /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.1 (usb)

Peguei o "/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.1" e verifiquei as informações:

% udevadm info -a -p /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.1                                   

Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.

  looking at device '/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.1':
    KERNEL=="1-1.1"
    SUBSYSTEM=="usb"
    DRIVER=="usb"
    ATTR{configuration}==""
    ATTR{bMaxPacketSize0}=="8"
    ATTR{bDeviceClass}=="ff"
    ATTR{bcdDevice}=="0105"
    ATTR{bNumInterfaces}==" 1"
    ATTR{bConfigurationValue}=="1"
    ATTR{manufacturer}=="Adafruit"
    ATTR{bNumConfigurations}=="1"
    ATTR{authorized}=="1"
    ATTR{speed}=="1.5"
    ATTR{idProduct}=="0c9f"
    ATTR{urbnum}=="9"
    ATTR{devnum}=="6"
    ATTR{product}=="USBtiny"
    ATTR{maxchild}=="0"
    ATTR{bmAttributes}=="80"
    ATTR{bDeviceSubClass}=="00"
    ATTR{bMaxPower}=="100mA"
    ATTR{rx_lanes}=="1"
    ATTR{removable}=="removable"
    ATTR{idVendor}=="1781"
    ATTR{version}==" 1.10"
    ATTR{avoid_reset_quirk}=="0"
    ATTR{bDeviceProtocol}=="00"
    ATTR{tx_lanes}=="1"
    ATTR{ltm_capable}=="no"
    ATTR{devpath}=="1.1"
    ATTR{busnum}=="1"
    ATTR{quirks}=="0x0"

  looking at parent device '/devices/pci0000:00/0000:00:1a.0/usb1/1-1':
    KERNELS=="1-1"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{configuration}==""
    ATTRS{bMaxPacketSize0}=="64"
    ATTRS{bDeviceClass}=="09"
    ATTRS{bcdDevice}=="0000"
    ATTRS{bNumInterfaces}==" 1"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{authorized}=="1"
    ATTRS{speed}=="480"
    ATTRS{idProduct}=="0020"
    ATTRS{urbnum}=="193"
    ATTRS{devnum}=="2"
    ATTRS{maxchild}=="6"
    ATTRS{bmAttributes}=="e0"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bMaxPower}=="0mA"
    ATTRS{rx_lanes}=="1"
    ATTRS{removable}=="fixed"
    ATTRS{idVendor}=="8087"
    ATTRS{version}==" 2.00"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{bDeviceProtocol}=="01"
    ATTRS{tx_lanes}=="1"
    ATTRS{ltm_capable}=="no"
    ATTRS{devpath}=="1"
    ATTRS{busnum}=="1"
    ATTRS{quirks}=="0x0"

  looking at parent device '/devices/pci0000:00/0000:00:1a.0/usb1':
    KERNELS=="usb1"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{configuration}==""
    ATTRS{bMaxPacketSize0}=="64"
    ATTRS{bDeviceClass}=="09"
    ATTRS{bcdDevice}=="0505"
    ATTRS{bNumInterfaces}==" 1"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{manufacturer}=="Linux 5.5.1-gentoo ehci_hcd"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{authorized}=="1"
    ATTRS{speed}=="480"
    ATTRS{idProduct}=="0002"
    ATTRS{urbnum}=="134"
    ATTRS{devnum}=="1"
    ATTRS{product}=="EHCI Host Controller"
    ATTRS{maxchild}=="3"
    ATTRS{bmAttributes}=="e0"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bMaxPower}=="0mA"
    ATTRS{rx_lanes}=="1"
    ATTRS{removable}=="unknown"
    ATTRS{idVendor}=="1d6b"
    ATTRS{interface_authorized_default}=="1"
    ATTRS{authorized_default}=="1"
    ATTRS{version}==" 2.00"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{serial}=="0000:00:1a.0"
    ATTRS{bDeviceProtocol}=="00"
    ATTRS{tx_lanes}=="1"
    ATTRS{ltm_capable}=="no"
    ATTRS{devpath}=="0"
    ATTRS{busnum}=="1"
    ATTRS{quirks}=="0x0"

  looking at parent device '/devices/pci0000:00/0000:00:1a.0':
    KERNELS=="0000:00:1a.0"
    SUBSYSTEMS=="pci"
    DRIVERS=="ehci-pci"
    ATTRS{broken_parity_status}=="0"
    ATTRS{subsystem_device}=="0x2163"
    ATTRS{dma_mask_bits}=="32"
    ATTRS{vendor}=="0x8086"
    ATTRS{local_cpus}=="f"
    ATTRS{companion}==""
    ATTRS{class}=="0x0c0320"
    ATTRS{numa_node}=="-1"
    ATTRS{msi_bus}=="1"
    ATTRS{device}=="0x3b3c"
    ATTRS{local_cpulist}=="0-3"
    ATTRS{driver_override}=="(null)"
    ATTRS{d3cold_allowed}=="1"
    ATTRS{irq}=="23"
    ATTRS{revision}=="0x06"
    ATTRS{consistent_dma_mask_bits}=="32"
    ATTRS{ari_enabled}=="0"
    ATTRS{uframe_periodic_max}=="100"
    ATTRS{enable}=="1"
    ATTRS{subsystem_vendor}=="0x17aa"

  looking at parent device '/devices/pci0000:00':
    KERNELS=="pci0000:00"
    SUBSYSTEMS==""
    DRIVERS==""

Parece, então, que a seguinte regra do udev funcionaria:

# /etc/udev/rules.d/99-usbtiny.rules
SUBSYSTEM=="usb", ATTR{manufacturer}=="Adafruit", ATTR{product}=="USBtiny", ATTR{idProduct}=="0c9f", ATTR{idVendor}=="1781", MODE="0660", GROUP="plugdev", SYMLINK+="usbtiny%n"

É igual a outros que vi em outros lugares na internet. Uma diferença é que idVendor parece ser um ATTRS, mas não é um atributo do nó pai da saída "udevadm info".

Meu processo para recarregar as regras foi executar "udevadm control -R". Eu também tentei reiniciar o udev "/etc/init.d/udev restart" e apenas reiniciar. O dispositivo nunca faz uma entrada em /dev/. Eu tentei todos os itens acima sem a parte "SYMLINK" da regra do udev também.

Posso ver o dispositivo com lsusb:

 % lsusb                                                                                                             
Bus 002 Device 002: ID 8087:0020 Intel Corp. Integrated Rate Matching Hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 006: ID 1781:0c9f Multiple Vendors USBtiny

Eu sei que o kernel também vê isso com o final do dmesg:

[ 1859.351137] usb 1-1.1: new low-speed USB device number 6 using ehci-pci
[ 1859.440168] usb 1-1.1: New USB device found, idVendor=1781, idProduct=0c9f, bcdDevice= 1.05
[ 1859.440172] usb 1-1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[ 1859.440175] usb 1-1.1: Product: USBtiny
[ 1859.440177] usb 1-1.1: Manufacturer: Adafruit

Alguém tem alguma outra dica de solução de problemas? Como eu disse, o conversor serial usb que tenho é registrado como um dispositivo em /dev/ e posso vê-lo perfeitamente na saída "udevadm monitor". Sinto que estou perdendo alguma coisa pequena e estou batendo a cabeça nisso há alguns dias. Qualquer indicação seria apreciada.

Eu também tenho todos os drivers USB seriais integrados ao meu kernel:

  --- USB Serial Converter support
[*]   USB Serial Console device support
[*]   USB Generic Serial Driver
<*>   USB Serial Simple Driver
<*>   USB AIRcable Bluetooth Dongle Driver
<*>   USB ARK Micro 3116 USB Serial Driver
<*>   USB Belkin and Peracom Single Port Serial Driver
<*>   USB Winchiphead CH341 Single Port Serial Driver
<*>   USB ConnectTech WhiteHEAT Serial Driver
<*>   USB Digi International AccelePort USB Serial Driver
<*>   USB CP210x family of UART Bridge Controllers
<*>   USB Cypress M8 USB Serial Driver
<*>   USB Empeg empeg-car Mark I/II Driver
<*>   USB FTDI Single Port Serial Driver
<*>   USB Handspring Visor / Palm m50x / Sony Clie Driver
<*>   USB PocketPC PDA Driver
<*>   USB IR Dongle Serial Driver
<*>   USB Inside Out Edgeport Serial Driver
<*>   USB Inside Out Edgeport Serial Driver (TI device
<*>   USB Fintek F81232 Single Port Serial Driver
<*>   USB Fintek F81532/534 Multi-Ports Serial Driver
<*>   USB Garmin GPS driver
<*>   USB IPWireless (3G UMTS TDD) Driver
<*>   USB Infinity USB Unlimited Phoenix Driver
<*>   USB Keyspan PDA Single Port Serial Driver
<*>   USB Keyspan USA-xxx Serial Driver
<*>   USB KL5KUSB105 (Palmconnect) Driver
<*>   USB KOBIL chipcard reader
<*>   USB MCT Single Port Serial Driver
<*>   USB Metrologic Instruments USB-POS Barcode Scanner Driver
<*>   USB Moschip 7720 Serial Driver
<*>   USB Moschip 7840/7820 USB Serial Driver
<*>   USB Moxa UPORT Serial Driver
<*>   USB Navman GPS device
<*>   USB Prolific 2303 Single Port Serial Driver
<*>   USB Ours Technology Inc. OTi-6858 USB To RS232 Bridge Controller
<*>   USB Qualcomm Auxiliary Serial Port Driver
<*>   USB Qualcomm Serial modem
<*>   USB SPCP8x5 USB To Serial Driver
<*>   USB Safe Serial (Encapsulated) Driver
  [ ]     USB Secure Encapsulated Driver - Padded
<*>   USB Sierra Wireless Driver
<*>   USB Symbol Barcode driver (serial mode
<*>   USB TI 3410/5052 Serial Driver
<*>   USB REINER SCT cyberJack pinpad/e-com chipcard reader
<*>   USB Xircom / Entrega Single Port Serial Driver
<*>   USB driver for GSM and CDMA modems
<*>   USB ZyXEL omni.net LCD Plus Driver
<*>   USB Opticon Barcode driver (serial mode)
<*>   Xsens motion tracker serial interface driver
<*>   USB-Wishbone adapter interface driver
<*>   USB Quatech SSU-100 Single Port Serial Driver
<*>   USB Quatech Serial Driver for USB 2 devices
<*>   USB Renesas uPD78F0730 Single Port Serial Driver
<*>   USB Debugging Device

Examinei algumas outras perguntas aqui e estou realmente coçando a cabeça porque não consigo nem fazer o link simbólico aparecer no arquivo /dev/.

Os principais recursos que utilizei para isso são:

Responder1

Nem todos os dispositivos USB são apresentados como dispositivos semelhantes a portas seriais. Em particular, USBtinyISP não emula uma porta serial, mas é acessado por libusbmeio de comunicação USB nativa.

Eu também tenho USBtinyISP da Adafruit, com exatamente o mesmo fornecedor de USB e IDs de produto que os seus, 0x1781 e 0x0c9f respectivamente. Ele não produzirá /dev/ttyUSB*nenhum /dev/ttyACM*dispositivo, mas avrdudese comunicará perfeitamente com ele.

Bus 001 Device 006: ID 1781:0c9f Multiple Vendors USBtiny

No seu caso, o USBtinyISP foi detectado no Barramento 1, Dispositivo 6, portanto o nó do dispositivo usado libusbpara se comunicar com o dispositivo será /dev/bus/usb/001/006. Suas regras do udev podem já estar sendo aplicadas a esse dispositivo.

Além disso, pelo menos no Debian, o avrdudepacote já inclui um arquivo de regras udev. Ele será instalado /lib/udev/rules.d/60-avrdude.rulescomo qualquer arquivo de regra udev padrão do sistema, deixando /etc/udev/rules.dapenas personalizações/substituições locais. Esse arquivo já cobre o USBtinyISP.

Para saber avrdudecomo usar o USBtinyISP por padrão, você pode criar um ~/.avrdudercarquivo para você mesmo, contendo esta linha:

default_programmer = "usbtiny";

Isso eliminará a necessidade de especificar o tipo de programador em cada avrdudelinha de comando.

Responder2

Você menciona ATTR{idVendor}e similares. Deveria ser isso ATTRS{...}? Também descobri que regras mínimas são melhores.

Por exemplo, tenho o seguinte no meu sistema Debian:

% cat /etc/udev/rules.d/ols.rules               
#Rules for Openbench Logix Snifferslogic. Creates a nice link to the ols
ATTRS{idVendor}=="04d8", ATTRS{idProduct}=="fc92", MODE="0666", SYMLINK+="OpenLogicSniffer"

Então eu tentaria:

ATTRS{idVendor}=="1781", ATTRS{idProduct}=="0c9f", MODE="0660", GROUP="plugdev", SYMLINK+="usbtiny%n"

Responder3

Acho que você deveria usar MODE="0666" em vez de MODE="0660".

informação relacionada