C GPIO Toggle
This guide walks you through building and running the C GPIO toggle reference on Avocado OS. The app uses libgpiod v2 to toggle a GPIO line every second on a Raspberry Pi 5.
Prerequisites
- macOS 10.12+ or Linux (Ubuntu 22.04+, Fedora 39+)
- Docker Desktop installed and running
- The latest version of the Avocado CLI
- Raspberry Pi 5
- SD card
Initialize
Clone the reference or initialize a new project from it:
avocado init --reference c-gpio c-gpio
cd c-gpio
Install
Install the SDK toolchain, extension dependencies, and runtime packages:
avocado install -f
This pulls the SDK container image with the Meson build system, cross-compilation toolchain, and libgpiod-dev headers.
Build
Build the extensions and assemble the runtime image:
avocado build
The build step runs app-compile.sh inside the SDK container, which generates Meson cross-compilation files from the SDK environment and runs meson setup + ninja to cross-compile gpio-toggle for aarch64. Then app-install.sh runs ninja install to copy the binary into the extension sysroot at /usr/bin/gpio-toggle.
Deploy
SD card
Insert your SD card and provision:
avocado provision -r dev --profile sd
Insert the SD card into the Raspberry Pi 5 and apply power.
Verify
SSH into the Pi or connect via serial console. Log in as root with an empty password. The app service starts automatically on boot.
Check the service is running:
systemctl status app
Watch GPIO toggle logs:
journalctl -u app -f
You should see output like:
gpio-toggle starting
GPIO chips:
gpiochip0 [pinctrl-bcm2712] (54 lines)
gpiochip4 [pinctrl-rp1] (54 lines)
Opening /dev/gpiochip0, line 17
Toggling line 17 every 1s
[1711234567] line 17 = HIGH
[1711234568] line 17 = LOW
To verify the GPIO is toggling, attach an LED (with a resistor) or a multimeter to GPIO 17.
Customize
Change the GPIO chip or line
Edit app/src/main.c:
#define DEFAULT_CHIP "/dev/gpiochip0"
#define DEFAULT_LINE 17
#define TOGGLE_INTERVAL_S 1
Or pass them as command-line arguments by editing app/overlay/usr/lib/systemd/system/app.service:
ExecStart=/usr/bin/gpio-toggle /dev/gpiochip4 22
Rebuild after changes
After any change, rebuild and reprovision:
avocado build
avocado provision -r dev --profile sd