2020/04/10

Diagnosticando avrdude + USBasp + arduino IDE

Estaba intentando programar un ATMega328p para un proyecto y quise usar ArduinoIDE en lugar del baremetal que había usado para otro proyecto de próxima publicación.


Elegí:

Board: Arduino Duemilanove por que tiene ATMega328p
Processor: ATMega328p
Port: /dev/ttyS0
Programmer: USBasp



Cuando quise hacer el burn con Sketch -> Upload Using Programmer, me dijo:


An error occurred while uploading the sketch
avrdude: Warning: cannot open USB device: Permission denied
avrdude: error: could not find USB device with vid=0x16c0 pid=0x5dc vendor='www.fischl.de' product='USBasp'



Pensé que la corrección había sido modificar una regla de udev tal que agregara un symlink, pero al final probé sin ese symlink y ArduinoIDE pudo programar ok, ya que según comprendí luego, avrdude sabe como hallar el programador, probablemente utilizando libusb.

Realmente no sé que fué lo que cambió para que funcionara.




Lo que sigue son mis aventuras diagnosticando y probando, habiendo asumido  que tenía que aparecer /dev/ttyACM0.


Lo primero fue fijarme si aparecía de algún modo como dispositivo usb, si:

$ lsusb
Bus 003 Device 007: ID 16c0:05dc Van Ooijen Technische Informatica shared ID for use with libusb

Luego con más detalles

$ sudo lsusb -v

Bus 003 Device 007: ID 16c0:05dc Van Ooijen Technische Informatica shared ID for use with libusb
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               1.10
  bDeviceClass          255 Vendor Specific Class
  bDeviceSubClass         0
  bDeviceProtocol         0
  bMaxPacketSize0         8
  idVendor           0x16c0 Van Ooijen Technische Informatica
  idProduct          0x05dc shared ID for use with libusb
  bcdDevice            1.02
  iManufacturer           1 www.fischl.de
  iProduct                2 USBasp
  iSerial                 0
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength           18
    bNumInterfaces          1
    bConfigurationValue     1
    iConfiguration          0
    bmAttributes         0x80
      (Bus Powered)
    MaxPower               50mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           0
      bInterfaceClass         0 (Defined at Interface level)
      bInterfaceSubClass      0
      bInterfaceProtocol      0
      iInterface              0
Device Status:     0x0000
  (Bus Powered)


Para verificar si aparecía en algún lado de /dev, hice unos finds y diffs:



$ find /dev > ~/antes

conecté el programador

$ find /dev > ~/despues

diff ~/antes ~/despues --side-by-side

$ diff ~/antes ~/despues  --side-by-side | grep ">"

                        >    /dev/vboxusb/003/007
                        >    /dev/char/189:262
                        >    /dev/bus/usb/003/007


Ese vboxusb me hizo pensar que quizás virtualbox estaba apropiándose del dispositivo, tal como le pasó a alguien con modemmanager.


$ sudo service virtualbox stop
$ sudo service virtualbox-guest-utils stop

¿Podría ser que aún estando apagada alguna virtual tuviera un filtro y me estuviera tomando el dispositivo? Revisé la configuración de cada virtual y ninguna tenía configurados filtros usb.

Tambien ejecuté :

$ VBoxManage list usbfilters
Global USB Device Filters:
<none>

Luego hice el mismo proceso para un teensy que anda ok:



    >    /dev/serial
    >    /dev/serial/by-path
    >    /dev/serial/by-path/pci-0000:00:12.0-usb-0:1:1.0
    >    /dev/serial/by-id
    >    /dev/serial/by-id/usb-Teensyduino_USB_Serial_12345-if00
    >    /dev/ttyACM0
    >    /dev/vboxusb/003/007
    >    /dev/char/166:0
    >    /dev/char/189:262
    >    /dev/bus/usb/003/007

No es virtualbox.


Pasé a ver que ocurría con udev.



$ sudo udevadm monitor

# USBasp

KERNEL[x.x] add /devices/pci0000:00/0000:00:12.0/usb3/3-1 (usb)
KERNEL[x.x] add /devices/pci0000:00/0000:00:12.0/usb3/3-1/3-1:1.0 (usb)
UDEV  [x.x] add /devices/pci0000:00/0000:00:12.0/usb3/3-1 (usb)
UDEV  [x.x] add /devices/pci0000:00/0000:00:12.0/usb3/3-1/3-1:1.0 (usb))



# Como curiosidad, iCEstick con máquina recién iniciada

KERNEL[x.x] add /module/usbserial (module)
KERNEL[x.x] add /bus/usb-serial (bus)
KERNEL[x.x] add /bus/usb/drivers/usbserial (drivers)
KERNEL[x.x] add /bus/usb/drivers/usbserial_generic (drivers)
KERNEL[x.x] add /bus/usb-serial/drivers/generic (drivers)
UDEV  [x.x] add /module/usbserial (module)
UDEV  [x.x] add /bus/usb-serial (bus)
UDEV  [x.x] add /bus/usb/drivers/usbserial (drivers)
UDEV  [x.x] add /bus/usb/drivers/usbserial_generic (drivers)
UDEV  [x.x] add /bus/usb-serial/drivers/generic (drivers)
KERNEL[x.x] add /module/ftdi_sio (module)
KERNEL[x.x] add /bus/usb/drivers/ftdi_sio (drivers)
KERNEL[x.x] add /bus/usb-serial/drivers/ftdi_sio (drivers)
KERNEL[x.x] add /devices/pci0000:00/0000:00:12.2/usb1/1-1/1-1:1.0/ttyUSB0 (usb-serial)
UDEV  [x.x] add /module/ftdi_sio (module)
KERNEL[x.x] add /devices/pci0000:00/0000:00:12.2/usb1/1-1/1-1:1.0/ttyUSB0/tty/ttyUSB0 (tty)
UDEV  [x.x] add /bus/usb-serial/drivers/ftdi_sio (drivers)
KERNEL[x.x] add /devices/pci0000:00/0000:00:12.2/usb1/1-1/1-1:1.1/ttyUSB1 (usb-serial)
UDEV  [x.x] add /bus/usb/drivers/ftdi_sio (drivers)
KERNEL[x.x] add /devices/pci0000:00/0000:00:12.2/usb1/1-1/1-1:1.1/ttyUSB1/tty/ttyUSB1 (tty)
UDEV  [x.x] add /devices/pci0000:00/0000:00:12.2/usb1/1-1/1-1:1.1 (usb)
UDEV  [x.x] add /devices/pci0000:00/0000:00:12.2/usb1/1-1/1-1:1.1/ttyUSB1 (usb-serial)
UDEV  [x.x] add /devices/pci0000:00/0000:00:12.2/usb1/1-1/1-1:1.1/ttyUSB1/tty/ttyUSB1 (tty)
UDEV  [x.x] add /devices/pci0000:00/0000:00:12.2/usb1/1-1/1-1:1.0 (usb)
UDEV  [x.x] add /devices/pci0000:00/0000:00:12.2/usb1/1-1/1-1:1.0/ttyUSB0 (usb-serial)
UDEV  [x.x] add /devices/pci0000:00/0000:00:12.2/usb1/1-1/1-1:1.0/ttyUSB0/tty/ttyUSB0 (tty)

# iCEstick antes de reiniciar, los demás drivers ya los había cargado hace semanas.

KERNEL[x.x] add /devices/pci0000:00/0000:00:10.0/usb5/5-2 (usb)
KERNEL[x.x] add /devices/pci0000:00/0000:00:10.0/usb5/5-2/5-2:1.0 (usb)
KERNEL[x.x] add /devices/pci0000:00/0000:00:10.0/usb5/5-2/5-2:1.0/ttyUSB0 (usb-serial)
KERNEL[x.x] add /devices/pci0000:00/0000:00:10.0/usb5/5-2/5-2:1.0/ttyUSB0/tty/ttyUSB0 (tty)
KERNEL[x.x] add /devices/pci0000:00/0000:00:10.0/usb5/5-2/5-2:1.1 (usb)
KERNEL[x.x] add /devices/pci0000:00/0000:00:10.0/usb5/5-2/5-2:1.1/ttyUSB1 (usb-serial)
KERNEL[x.x] add /devices/pci0000:00/0000:00:10.0/usb5/5-2/5-2:1.1/ttyUSB1/tty/ttyUSB1 (tty)


# Así se vé un teensy:

KERNEL[x.x] add /devices/pci0000:00/0000:00:12.0/usb3/3-1 (usb)
KERNEL[x.x] add /devices/pci0000:00/0000:00:12.0/usb3/3-1/3-1:1.0 (usb)
KERNEL[x.x] add /devices/pci0000:00/0000:00:12.0/usb3/3-1/3-1:1.1 (usb)
UDEV  [x.x] add /devices/pci0000:00/0000:00:12.0/usb3/3-1 (usb)
UDEV  [x.x] add /devices/pci0000:00/0000:00:12.0/usb3/3-1/3-1:1.1 (usb)
KERNEL[x.x] add /module/cdc_acm (module)
UDEV  [x.x] add /module/cdc_acm (module)
KERNEL[x.x] add /devices/pci0000:00/0000:00:12.0/usb3/3-1/3-1:1.0/tty/ttyACM0 (tty)
KERNEL[x.x] add /bus/usb/drivers/cdc_acm (drivers)
UDEV  [x.x] add /devices/pci0000:00/0000:00:12.0/usb3/3-1/3-1:1.0 (usb)
UDEV  [x.x] add /bus/usb/drivers/cdc_acm (drivers)
UDEV  [x.x] add /devices/pci0000:00/0000:00:12.0/usb3/3-1/3-1:1.0/tty/ttyACM0 (tty)


Información específica del dispositivo, el número cambia con respecto a otros listados por ser distintas inserciones

$ sudo udevadm  info -a -n /dev/bus/usb/003/003 ;

  looking at device '/devices/pci0000:00/0000:00:12.0/usb3/3-1':
    KERNEL=="3-1"
    SUBSYSTEM=="usb"
    DRIVER=="usb"
    ATTR{authorized}=="1"
    ATTR{avoid_reset_quirk}=="0"
    ATTR{bConfigurationValue}=="1"
    ATTR{bDeviceClass}=="ff"
    ATTR{bDeviceProtocol}=="00"
    ATTR{bDeviceSubClass}=="00"
    ATTR{bMaxPacketSize0}=="8"
    ATTR{bMaxPower}=="50mA"
    ATTR{bNumConfigurations}=="1"
    ATTR{bNumInterfaces}==" 1"
    ATTR{bcdDevice}=="0102"
    ATTR{bmAttributes}=="80"
    ATTR{busnum}=="3"
    ATTR{configuration}==""
    ATTR{devnum}=="3"
    ATTR{devpath}=="1"
    ATTR{idProduct}=="05dc"
    ATTR{idVendor}=="16c0"
    ATTR{ltm_capable}=="no"
    ATTR{manufacturer}=="www.fischl.de"
    ATTR{maxchild}=="0"
    ATTR{product}=="USBasp"
    ATTR{quirks}=="0x0"
    ATTR{removable}=="unknown"
    ATTR{speed}=="1.5"
    ATTR{urbnum}=="9"
    ATTR{version}==" 1.10"



Probé un montón de combinaciones de rules, sin éxito, en particular comprobé que estaba siendo llamda con un RUN:


SUBSYSTEM=="usb", ACTION=="add", RUN+="/trigger.sh"


trigger.sh sólo imprime un archivo.


Miré con más detalle:


$ sudo udevadm monitor -k -u -p


UDEV  [1025.922712] add      /devices/pci0000:00/0000:00:12.0/usb3/3-1 (usb)
ACTION=add
BUSNUM=003
DEVNAME=/dev/bus/usb/003/003
DEVNUM=003
DEVPATH=/devices/pci0000:00/0000:00:12.0/usb3/3-1
DEVTYPE=usb_device
DRIVER=usb
ID_BUS=usb
ID_MODEL=USBasp
ID_MODEL_ENC=USBasp
ID_MODEL_FROM_DATABASE=shared ID for use with libusb
ID_MODEL_ID=05dc
ID_REVISION=0102
ID_SERIAL=www.fischl.de_USBasp
ID_VENDOR=www.fischl.de
ID_VENDOR_ENC=www.fischl.de
ID_VENDOR_FROM_DATABASE=Van Ooijen Technische Informatica
ID_VENDOR_ID=16c0
MAJOR=189
MINOR=258
PRODUCT=16c0/5dc/102
SEQNUM=2787
SUBSYSTEM=usb
TYPE=255/0/0
USEC_INITIALIZED=1025910393



Compará con un Teensy:



UDEV  [1129.307311] add      /devices/pci0000:00/0000:00:12.0/usb3/3-1 (usb)
ACTION=add
BUSNUM=003
DEVNAME=/dev/bus/usb/003/004
DEVNUM=004
DEVPATH=/devices/pci0000:00/0000:00:12.0/usb3/3-1
DEVTYPE=usb_device
DRIVER=usb
ID_BUS=usb
ID_MM_DEVICE_IGNORE=1
ID_MM_PORT_IGNORE=1
ID_MODEL=USB_Serial
ID_MODEL_ENC=USB\x20Serial
ID_MODEL_FROM_DATABASE=Teensyduino Serial
ID_MODEL_ID=0483
ID_REVISION=0100
ID_SERIAL=Teensyduino_USB_Serial_12345
ID_SERIAL_SHORT=12345
ID_USB_INTERFACES=:020201:0a0000:
ID_VENDOR=Teensyduino
ID_VENDOR_ENC=Teensyduino
ID_VENDOR_FROM_DATABASE=Van Ooijen Technische Informatica
ID_VENDOR_ID=16c0
MAJOR=189
MINOR=259
MTP_NO_PROBE=1
PRODUCT=16c0/483/100
SEQNUM=2791
SUBSYSTEM=usb
TYPE=2/0/0
USEC_INITIALIZED=1129295449





Me fije que no estuviera en blacklist

$ grep -i 16c0 /lib/udev/rules.d/77-mm-usb-device-blacklist.rules
$ grep -i 05dc /lib/udev/rules.d/77-mm-usb-device-blacklist.rules



Listé el hardware:

$ sudo lshw

              *-usb:0 UNCLAIMED
                   description: Generic USB device
                   product: USBasp
                   vendor: www.fischl.de
                   physical id: 1
                   bus info: usb@3:1
                   version: 1.02
                   capabilities: usb-1.10
                   configuration: maxpower=50mA speed=1Mbit/s

Bien, es lo que estaba suponiendo.

Finalmente asocié el UNCLAIMED con ID_MODEL_FROM_DATABASE=shared ID for use with libusb, dejé de intentar que aparezca /dev/ttyACM0 y probé y funcionó. Así que todo esto servirá para diagnosticar otro problema en otro momento.


Me he servido al menos de:


  • https://andreasrohner.at/posts/Electronics/How-to-fix-device-permissions-for-the-USBasp-programmer/
  • https://forums.virtualbox.org/viewtopic.php?f=35&t=82639
  • https://wiki.webevaluation.nl/arduino_programmers_errors
  • https://opensource.com/article/18/11/udev

No hay comentarios:

Publicar un comentario