Skip to main content

Adafruit ItsyBitsy 32u4 issues on Archlinux

A couple months back I started working on an “Okay to Wake” clock for my son.

Yeah, yeah, honey – I know I could just buy one on [insert website named after rainforest], but that’s no fun.

I decided on an ItsyBitsy 32u4 for a few reasons; inexpensive, more powerful than a Pro Micro, lots of PWM pins, ‘native’ USB, etc. It’s also really tiny.

Anyway, it should just be plug-and-play on any Linux machine, but instead… it’s had issues with all my computers, covering Windows 10, Fedora, and Archlinux. Maybe it’s just a finicky device? I don’t know, but I figured out how to get it working with my Archlinux install after way too long spent on troubleshooting.

The main issue I had was due to permissions on the /dev/ttyACM0 device. In Arch, the default ownership is root:uucp with wr-wr---- , so you would think ‘add your user to uucp and off we go’… but no. After power-cycling into the bootloader mode, for only a short second, the device is set to root:root and wr-------w , so it doesn’t matter which groups my user is in, I can’t access it. That results in this nice error when I try to upload to the board:

avrdude: Version 6.3-20190619
         Copyright (c) 2000-2005 Brian Dean,
         Copyright (c) 2007-2014 Joerg Wunsch

         System wide configuration file is "/home/brandon/.arduino15/packages/arduino/tools/avrdude/6.3.0-arduino17/etc/avrdude.conf"
         User configuration file is "/home/brandon/.avrduderc"
         User configuration file does not exist or is not a regular file, skipping

         Using Port                    : /dev/ttyACM0
         Using Programmer              : avr109
         Overriding Baud Rate          : 57600
avrdude: ser_open(): can't open device "/dev/ttyACM0": Permission denied

avrdude done.  Thank you.

I chased a theory for way too long on this: the bootloader enumerates with a difference USB productID , so I figured my system needed a udev rule added to set the permissions correctly for the bootloader device. A couple hours of learning udev rules and I realized that the device, no matter what I did, would always be root:root for a short time after. I finally did get a udev rule to set the user and group, and the permissions to rw-rw-rw- , but it wasn’t instant so the device was still locked off to avrdude .

The easy way

Eventually, I ended up in the #arduino channel on freenode asking, when I realized that I just need the IDE to wait a moment before trying to upload the code using avrdude . I was looking around in the Arduino IDE code for where it calls avrdude, when a moment of clarity came:

replace the avrdude executable with a script that waits a second, then calls avrdude.

Yup, that’s what this whole post leads up to. I hope it’s helpful to someone. Here are the (very simple) two steps to fix this issue if you hit the same problem:

First, move the avrdude binary in the Arduino folder, the path will change with new IDE releases:

$ cd ~/.arduino15/packages/arduino/tools/avrdude/6.3.0-arduino17/bin/
$ mv avrdude avrdude-bin

Then, create this script named avrdude instead:


sleep 1
$0-bin "${@:1}"

Now the Arduino IDE will have to wait one second after noticing that /dev/ttyACM0 exists before trying to upload your code, and hopefully the device has settled by then. You can try increasing the sleep duration if you still have issues, but it really shouldn’t require longer than 2 seconds – you likely have a different problem if 2 doesn’t work.