Dear maintainer,
The packaged avrdude does not work reliably out of the box for linuxgpio bit-banging on current Raspberry Pi OS / Debian-based Raspberry Pi systems with recent kernels.
This is a real regression for existing Raspberry Pi setups that use avrdude directly from the GPIO header to program AVR/ATmega devices.
Problem
=======
On current Raspberry Pi OS kernels, the old global sysfs GPIO numbering is no longer stable. Raspberry Pi GPIO controllers are no longer forced to start at global GPIO base 0. On some systems the GPIO base is 512 or another non-zero value.
As a result, old linuxgpio/sysfs setups using BCM GPIO numbers such as:
reset = 1;
sck = 12;
sdo = 24;
sdi = 23;
may fail because linuxgpio tries to use /sys/class/gpio/export with these numbers directly.
A typical failure with the packaged avrdude/linuxgpio path is:
avrdude OS error: cannot export GPIO 1, already exported/busy?: Invalid argument
avrdude error: unable to open programmer linuxgpio on port unknown
Trying to work around this by using sysfs global GPIO numbers such as base + BCM GPIO is also problematic. For example, if the GPIO base is 512, the mapping becomes:
BCM GPIO1 -> 513
BCM GPIO12 -> 524
BCM GPIO24 -> 536
BCM GPIO23 -> 535
But some avrdude builds reject such GPIO numbers in avrdude.conf with an error like:
pin must be in the range 0-400
So the old sysfs workaround is blocked by an artificial compile-time pin limit as well.
Expected behavior
=================
On current Raspberry Pi OS / Debian systems, avrdude -c linuxgpio should work using the modern Linux GPIO character device ABI via libgpiod, not the deprecated sysfs GPIO interface.
The package should be built with working libgpiod support for linuxgpio.
The package should also ship or document a usable linuxgpio configuration for Raspberry Pi systems, for example:
default_linuxgpio = "gpiochip0";
programmer
id = "linuxgpio";
desc = "Use Linux GPIO via libgpiod";
type = "linuxgpio";
prog_modes = PM_ISP;
reset = 1;
sck = 12;
sdo = 24;
sdi = 23;
;
With this configuration, avrdude should use:
/dev/gpiochip0 line 1
/dev/gpiochip0 line 12
/dev/gpiochip0 line 24
/dev/gpiochip0 line 23
instead of relying on unstable sysfs global GPIO numbers.
Actual behavior
===============
The packaged avrdude/linuxgpio setup is not usable reliably on current Raspberry Pi OS systems. Depending on the exact package build and configuration, one of these happens:
- linuxgpio is missing from the usable programmer configuration;
- linuxgpio still uses the deprecated sysfs GPIO path;
- GPIO export fails with "Invalid argument";
- using base+GPIO sysfs numbers is rejected by the avrdude pin limit;
- the user has to rebuild avrdude manually with libgpiod support.
Local working fix
=================
I rebuilt avrdude manually on Debian Trixie arm64 with libgpiod development files installed and linuxgpio enabled.
The resulting binary links against libgpiod:
libgpiod.so.3 => /lib/aarch64-linux-gnu/libgpiod.so.3
At runtime it prints:
using libgpiod for linuxgpio
With this /etc/avrdude.conf configuration:
default_linuxgpio = "gpiochip0";
programmer
id = "linuxgpio";
desc = "Use Linux GPIO via libgpiod";
type = "linuxgpio";
prog_modes = PM_ISP;
reset = 1;
sck = 12;
sdo = 24;
sdi = 23;
;
This command works correctly without specifying -P or -C:
avrdude -p m1280 -c linuxgpio -U flash:w:/home/pi/NetBeansProjects/SAS/dist/uart_9bit_converter.ino.mega.hex -U lock:w:0x3C:m
The important part is that linuxgpio now uses libgpiod and /dev/gpiochip0, while the pin numbers remain normal BCM GPIO line numbers.
Suggested fix
=============
Please change the Debian/Raspberry Pi OS avrdude package so that:
1. avrdude is built with working libgpiod support for linuxgpio;
2. linuxgpio is usable out of the box or clearly documented;
3. the default documentation explains use of -P gpiochip0 or default_linuxgpio = "gpiochip0";
4. the avrdude.conf linuxgpio example uses normal GPIO line numbers, not deprecated sysfs global GPIO numbers;
5. if sysfs linuxgpio remains supported, the artificial PIN_MAX / "0-400" limit should be increased enough to allow systems where GPIO base is 512 or higher.
The preferred fix is libgpiod support. Increasing the pin-number limit only helps legacy sysfs users and does not solve the underlying problem with unstable global GPIO numbering.
Why this matters
================
A common Raspberry Pi use case is programming AVR/ATmega devices directly through the 40-pin GPIO header using avrdude linuxgpio. This worked for years on older Raspberry Pi OS releases. On current Raspberry Pi OS systems, the old sysfs GPIO numbering model is no longer reliable, so the packaged avrdude should follow the current Linux GPIO model and use libgpiod.
This is not just a documentation issue. For embedded installations, a normal OS/kernel/package upgrade can break the ability to reprogram attached microcontrollers in the field.
References
==========
There are public reports of the same class of problem:
- avrdude linuxgpio failing on Raspberry Pi with "cannot export GPIO ... Invalid argument":
https://github.com/avrdudes/avrdude/issues/1748
- Raspberry Pi forum discussion about avrdude linuxgpio/linuxspi and sysfs GPIO behavior:
https://forums.raspberrypi.com/viewtopic.php?t=365362
Please build the package with libgpiod-enabled linuxgpio support and provide a working configuration path for current Raspberry Pi OS systems.
Regards,
Sergey