Repository navigation
Releases
SD card image v2 — console sized for VGA, GPIO release fix
SD card image: copy IMAGE, DTB and ROOTFS to the root of a FAT32 card. The tarball holds all three plus a README.
What changed from v1
/usr/bin/ttysize, run at boot asttysize 30 53, so nano and other full-screen programs fit the VGA screen. Over USB serial, runttysize 24 80.blink.luaandgpio_toggle.crelease GPIO line 0 when they finish. Before,gpiosetreported the line busy until reboot./root/help.txt,blink.lua,gpio_set.candgpio_toggle.care rewritten to fit 53 columns. Read the help withnano -v /root/help.txt.
Same kernel and binaries as v1: networking removed from the kernel, Lua 5.4.7 with sys.sleep/sys.ms/sys.raw, c4 with for and write, Tiny BASIC with BYE, minesweeper, and the libgpiod tools.
Pair with firmware pico-rv32ima-boards-v6. v5 boots this card too, but nano over VGA is unusable on v5.
Status: verified on real hardware on 2026-09-16 with boards-v6: nano on VGA, Lua, GPIO, c4, BASIC and minesweeper.
ttysize and sdcard-help.txt are also attached as loose files. Checksums are in SHA256SUMS.
pico-rv32ima boards v6 — VT102 VGA terminal, nano works on VGA
Firmware for all four boards (pico, pico_w, pico2, pico2_w), built from 090b8b8.
What changed from v5
- The VGA terminal is rewritten as a VT102 emulator (
console/terminal/vt.c). It handles scroll regions, insert/delete, deferred wrap and reverse video, so GNU nano draws correctly on the 53x30 screen. On v5, nano over VGA was unusable. - Unknown escape sequences are swallowed instead of being printed as junk.
- PS/2: Home, End, Insert, Delete, Page Up and Page Down now work. Page Down used to send Ctrl+Z, and Delete used to act as Backspace.
- Arrow keys follow the program's cursor-key mode, which nano turns on.
Pair with sdcard-v2, which sets the console to 53x30 at boot.
Status: pico verified on real hardware on 2026-09-16: nano draws correctly on the VGA screen. The RP2350 builds have never been flashed.
Flash: hold BOOTSEL while plugging in the Pico, then copy the .uf2 to the RPI-RP2 drive.
SD card image v1 — no-network kernel, Lua sleep, c4, BASIC exit
The full SD card image for a riscv-pico build: copy IMAGE, DTB and ROOTFS to the root of a FAT32 microSD card (4–32 GB) and pair it with the pico-rv32ima-boards-v5 firmware. The same three files boot in the desktop harness.
Status: verified in the desktop harness on this exact image. First boot on real hardware is pending. The previous kernel and rootfs,
kernel-gpio-v2, are hardware-verified if you need that.
Updated 2026-09-15: riscv-pico-sdcard-v1.tar.gz, lua and SHA256SUMS were re-uploaded to add minesweeper (/root/mines.lua) and the sys.raw() call it needs for arrow keys. Same kernel. If you downloaded this release on the 14th, grab the tarball again for the game.
What's new
| Kernel without networking | CONFIG_NET off. About 1 MB of RAM back on a 16 MB machine. |
Lua 5.4.7 with sys |
sys.sleep(seconds) and sys.ms(). GPIO through /sys/class/gpio. |
| c4 | A C compiler that runs on the Pico. Adds for and write to stock c4, and compiles itself. |
| Tiny BASIC | BYE, EXIT, QUIT or SYSTEM returns to the shell. |
| Minesweeper | lua /root/mines.lua. Arrow keys move, space digs, f flags, q quits. |
Examples in /root: lua blink.lua, c4 gpio_set.c 1, c4 gpio_toggle.c, c4 hello.c, plus c4.c itself.
curl, ping and ifconfig are still in the rootfs but have no network stack to use.
Files
| File | |
|---|---|
riscv-pico-sdcard-v1.tar.gz |
IMAGE, DTB, ROOTFS, README.txt |
lua, c4, basic |
The same binaries as loose bFLT executables |
SHA256SUMS |
Checksums for all of the above |
Run sync or halt before pulling power, or the ext2 root filesystem can be damaged.
pico-rv32ima boards v5 — GPIO CSR handler added
Adds CSR 0x1a0-0x1a3 GPIO handling (pins 1, 9, 15, 22) for the new tinyrv32-gpio kernel driver. Requires a matching kernel/IMAGE rebuild with the 0004-gpio-driver.patch series applied - see PLAN.md.
Kernel + rootfs v2 — sysfs GPIO, root-rw fix, libgpiod, sleep
Image + rootfs.ext2 for the tiny-rv32ima NOMMU target.
- CONFIG_GPIO_SYSFS added alongside the existing chardev GPIO driver — /sys/class/gpio/exportN gives lock-free file-based GPIO access (echo/cat), better suited to shell/BASIC/Lua scripting than the exclusive-request chardev model. Coexists with /dev/gpiochip0, nothing removed.
- Fixed root filesystem read-only bug: /etc/inittab's remount-rw step was both disabled and, once enabled, mis-ordered before /proc was mounted (busybox mount -o remount needs /proc/mounts). Root now actually persists writes across reboots.
- libgpiod 1.6.4 tools added: gpiodetect, gpioinfo, gpioget, gpioset, gpiofind, gpiomon.
- busybox CONFIG_SLEEP/CONFIG_FEATURE_FANCY_SLEEP enabled (sleep 0.5, sleep 2m etc now work; previously missing entirely).
DTB unchanged from pico-rv32ima-boards-v4/v5 — no device-tree edits needed for these changes, reuse the existing DTB.
Kernel with tinyrv32-gpio driver
Linux 6.6.18 with the new 0004-gpio-driver.patch applied (CONFIG_GPIO_TINYRV32IMA=y, CONFIG_GPIOLIB=y, CONFIG_GPIO_CDEV=y). Verified in the desktop harness: /dev/gpiochip0, label tinyrv32gpio, 4 lines. Pairs with boards-v5 firmware.
Prebuilt userspace apps v2 (basic fix, lua, libgpiod tools, gpiotest)
Supersedes apps-v1 for basic/lua/gpiotest — nano and sysinfo unchanged, still on apps-v1.
- basic: fixed a real bug — do_gosub pushed the GOSUB line's own index onto the return stack instead of pc+1, so RETURN landed back on GOSUB itself instead of the next line, hanging any FOR...GOSUB...NEXT loop forever. Fixed.
- lua: real Lua 5.4.7, -DLUA_32BITS=1, rebuilt fresh (was previously injected ad hoc, not archived until now).
- gpiotest: GPIO_V2 chardev smoke test (request line 0 as output, set high, read back).
- gpiodetect/gpioinfo/gpioget/gpioset/gpiofind/gpiomon: libgpiod 1.6.4 CLI tools.
- hello: dropped — redundant with sysinfo, removed from the real hardware SD card.
All built with riscv32-buildroot-linux-uclibc-gcc (toolchain-v2), -mabi=ilp32 -fPIE -pie -static -march=rv32ima.
pico-rv32ima boards v4 — OLED enabled by default
CONSOLE_OLED default flipped back to 1 after confirming the fix for the PSRAM-bus-destabilization bug (single-point 3V3 supply — see PLAN.md). All four boards, PSRAM at 20 MHz.
pico-rv32ima firmware v3 — 16 MB + SSD1306 status panel
Prebuilt .uf2 firmware for all four board targets, built from 77fe1c9.
Same as v2 (two PSRAM chips, 16 MB, 20 MHz SPI, verified booting Linux on real hardware) plus an optional SSD1306 128×64 I2C status panel.
Status panel
Wire four jumpers — there is no free adjacent GPIO pair left on the board:
| Module | Pico |
|---|---|
VCC |
3V3(OUT), pin 36 |
GND |
GND, pin 28 |
SDA |
GP28, pin 34 |
SCL |
GP21, pin 27 |
riscv-pico rv32ima
RAM 16 MB / 2 chip
PSRAM 20 MHz
STATE running
SPEED 1.42 MIPS
INSTR 1247 M
UP 00:04:11
CLK 400 MHz
It's a stats panel, not a console — 128×64 at a 6×8 cell is 21×8, and an 80-column kernel message wraps to four lines of it. USB-CDC stays the console.
With nothing attached these builds behave exactly like v2. The driver probes at boot and disables itself if nothing ACKs. If a panel is wired but stays blank, it's probably at I2C address 0x3D — one line in hw_config.h, then rebuild with firmware/build.sh.
Runs on core 0, which the emulator doesn't use, so the guest pays nothing for it.
Also included
sdtest.uf2 — standalone SD-over-SPI diagnostic, unchanged from v2.
Flashing
Hold BOOTSEL while plugging in the Pico, then copy the matching .uf2 onto the RPI-RP2 drive. The SD card needs IMAGE, DTB and ROOTFS in the root of a FAT32 partition — see the net-v1 release.
pico-rv32ima UF2s v2 (two-chip PSRAM, 16 MB — first hardware-verified build)
First firmware images verified booting Linux on real hardware — Pico H, two APS6404L SPI PSRAM chips (16 MB), SD card over SPI. v1 was build-verified only, and was the single-chip 8 MB config.
Built from c230fab.
Verified on hardware (2026-08-27)
- Kernel memory map reports exactly 16 MB —
[mem 0x0000000080000000-0x0000000080ffefff] - Root mounted from SD at 15.9 s (
254:0, the custom-CSR block device) - Chip 2 data path proven under load: 4 MB written to devtmpfs, read back, freed, no fault. Peak usage ~10016 KB against chip 1's 8192 KB capacity, so ≥1.8 MB necessarily lived on chip 2
- Full-screen GNU nano runs and saves files
Config baked in
| Setting | Value |
|---|---|
PSRAM_TWO_CHIPS |
1 (chip-select GP13 / GP14) |
EMULATOR_RAM_MB |
16 |
PSRAM_SPI_SPEED_MHZ |
20 (stable on flying leads) |
CONSOLE_CDC |
1 (USB serial, 115200) |
PSRAM ERR. For a single 8 MB chip set PSRAM_TWO_CHIPS 0 / EMULATOR_RAM_MB 8 and rebuild — mismatching them is a compile-time #error, not a silent address-wrap bug.
Contents
| File | Board | Size |
|---|---|---|
pico-rv32ima-pico.uf2 |
Pico (RP2040) | 141312 |
pico-rv32ima-pico_w.uf2 |
Pico W (RP2040) | 138752 |
pico-rv32ima-pico2.uf2 |
Pico 2 (RP2350) | 131584 |
pico-rv32ima-pico2_w.uf2 |
Pico 2 W (RP2350) | 131584 |
sdtest.uf2 |
standalone SD-over-SPI diagnostic — not the emulator | 74240 |
SD card is plain FAT32 with IMAGE + DTB + ROOTFS in the root — grab those from net-v1.
Wiring tables are in the bundled README.txt and the repo README. One trap worth repeating: on the SD module, MOSI and CLK cross — its header order does not match the Pico's pin order.
Supersedes pico-rv32ima-boards-v1.