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