Releases: jetpax/PiZZa
Release list
Arduino loader images v0.5.0
Ready-to-flash SD images for the PiZZa Arduino loader, one per board. Flash with Raspberry Pi Imager (Use custom) or balenaEtcher.
pizza-loader-rpi_zero_2w-v0.5.0.img.xz— Pi Zero 2 Wpizza-loader-rpi_zero_w-v0.5.0.img.xz— Pi Zero W (original); first image with working WiFi (brcmfmac + CLM regulatory blob, domain GB)
SHA-256:
c2e043305ea757a3657f2dcdd292a24a870f118b00002ce448689b11a0fa887frpi_zero_2wa164bd909d67bdbb53144eeb2513f7ce06a734c1eabe036253d41845c99fd207rpi_zero_w
Pair with Boards Manager core 0.5.0 (arduino-core-v0.5.0).
Arduino core v0.5.0 — Zero W WiFi
PiZZa Arduino core 0.5.0.
- Pi Zero W (original): WiFi is live — same
WiFilibrary / brcmfmac driver as the Zero 2 W. The loader now downloads the CLM regulatory database that the on-module BCM43430A1 trim-on-build firmware ships without; without it the radio silently stays disabled. Regulatory domain defaults to GB in this build. - Loader exports
NET_REQUEST_WIFI_SCAN(both boards). - Zero 2 W: no functional change; loader rebuilt from the same tree.
Both loaders hardware-verified with WPA2 join + DHCP + HTTP before publishing. Install via Boards Manager; flash the matching v0.5.0 loader image from the arduino-loader-v0.5.0 release.
arduino-loader v0.4.0 (Pi Zero 2 W + Pi Zero W SD images)
Pre-built SD-card images for the PiZZa Arduino loader — flash once, then upload sketches from the Arduino IDE.
- pizza-loader-rpi_zero_2w-v0.4.0.img.xz — Raspberry Pi Zero 2 W (BCM2710, AArch64). SHA-256
6e97fbed3ef5d1ff0d1c005cdcb46cc149c82865a81db08898cc9a0683ea1c6d - pizza-loader-rpi_zero_w-v0.4.0.img.xz — original Raspberry Pi Zero W (BCM2835, AArch32 ARM1176). SHA-256
29d6c9af0bc81997784268371382c630caabdc4084666d02b29027c70e3bf65e
Flash with Raspberry Pi Imager (Choose OS → Use custom → pick the .img.xz) or balenaEtcher. Both read .img.xz directly, no unzip needed.
See the main README for the full workflow.
arduino-core v0.4.0 (Pi Zero W support)
PiZZa Arduino core v0.4.0 — adds original Pi Zero W (BCM2835/ARMv6) as a second board under the same Boards Manager entry.
New:
- Second board
pizza:zephyr:pizza_zero_walongside the existingpizza:zephyr:pizza(Zero 2 W). - Blink + USB-CDC Serial hardware-verified end-to-end on real Pi Zero W silicon.
Zephyr upstream compiler-flag fixes shipped in the packaged loader:
-mno-unaligned-accessforCPU_AARCH32_ARMV6— ARM1176 silently returns misaligned LDR results rotated instead of faulting; GCC's optimisation of byte-shift load idioms into a single LDR corrupts data on misaligned pointers.-mthumbno longer forced intoLLEXT_APPEND_FLAGSon ARMv6-A — sketches now build in ARM mode to match the loader.
Install via Boards Manager using the URL in the README.
PiZZA Arduino loader — SD image v0.3.1 (Pi Zero 2 W)
Ready-to-flash SD image that boots the PiZZA Arduino loader on a Raspberry Pi Zero 2 W.
Flash with Raspberry Pi Imager (Use custom) or balenaEtcher → boot the Pi → install the PiZZA board in the Arduino IDE (Boards Manager) → upload sketches over USB-CDC. No Raspberry Pi OS install, no manual copying.
- Asset:
pizza-loader-rpi_zero_2w-v0.3.1.img.xz— SHA-256a88834b9405c92bca9da6e61d1f8f10dac95a6b3c51452858a0c4286aade95cf - Loader built with Zephyr SDK 1.0.1; matches ArduinoCore-pizza v0.3.x.
- Boards Manager URL: https://raw.githubusercontent.com/jetpax/pizza-boards-index/main/package_pizza_index.json
Built reproducibly by PiZZa/os/Arduino/loader-image/make-image.sh.
PiZZA Arduino core v0.3.2 — reset-on-swap + IDE Serial Monitor fix
What's new
Reset-on-swap loader architecture. Each sketch starts on a freshly-booted kernel — eliminates the whole class of loader-side state leaks across sketches (brcmfmac/netif, k_work/k_timer callbacks, GPIO ISRs, sockets, DMA). Replaces the previous in-process llext_unload+load swap.
BCM2710 sys_arch_reboot driver. New ~15-line strong override that uses the PM-block watchdog full-reset path (mirrors Linux drivers/watchdog/bcm2835_wdt.c). MMU-maps the PM block at 0x3f100000. CONFIG_REBOOT=y enabled in the variant.
IDE Serial Monitor echo fixed on macOS. SerialUSB::write/flush no longer gates on DTR — the Arduino IDE Serial Monitor doesn't always assert DTR on this platform, which previously made HelloSerial appear silent. operator bool() still reports DTR for sketches that explicitly while (!Serial);.
Flash the new loader
The packaged loader binary is at firmwares/zephyr-rpi_zero_2w_bcm2710.bin inside the tarball. Flash via:
cp .../firmwares/zephyr-rpi_zero_2w_bcm2710.bin /Volumes/PIZZA/zephyr.bin && diskutil eject /Volumes/PIZZA
Boards Manager URL (now self-hosted in PiZZA repo)
https://raw.githubusercontent.com/jetpax/PiZZa/dev/os/Arduino/package_pizza_index.json
PiZZa v0.4.1 — USB-CDC on the Pi Zero W
USB-CDC console comes to the original Pi Zero W.
What's new since v0.4.0
- USB-CDC on the Pi Zero W. The original 2017 Pi Zero W now boots
PizzaShell with its shell on USB CDC ACM (/dev/cu.usbmodem*),
matching the 2W's single-cable experience. Boot logs + LOG_* stay
on the AUX mini-UART. New DT nodes inbcm2835.dtsi(VC mailbox +
firmware + DWC2 USB) share the upstream-cleanrpi_fwAPI the
v0.4.0 convergence introduced — pure DT + Kconfig wiring on the
PizzaShell side, no driver code added. - Console / Logs labels gated on CDC. The
pizzapanel's
ConsoleandLogslines now reflect whether
CONFIG_USBD_CDC_ACM_CLASSis enabled, instead of being hardcoded
per SoC. Same source, both boards.
Flash
Standard PiZZa workflow — see the README
for SD imaging via PINN and install-to-sdcard.sh.
Two binaries:
pizza-v0.4.1-rpi_zero_w.bin— original Pi Zero W (BCM2835, ARMv6), USB-CDC consolepizza-v0.4.1-rpi_zero_2w.bin— Pi Zero 2 W (BCM2710, AArch64), behaviorally identical to v0.4.0
PiZZa v0.4.0 — pizero convergence + Pi Zero W image
PizzaShell on the upstream-clean Zephyr tree, plus a Pi Zero W image.
What's new since v0.3
- Pi Zero W image. PizzaShell now ships a second binary for the
original 2017 Pi Zero W (BCM2835, ARM1176, ARMv6) — console-only
(Display / Storage / Wi-Fi all--by design). One PizzaShell source,
both boards. - Upstream-clean Zephyr tree. v0.3 was built against the
pizza
Zephyr branch (legacybcm2835_propertyVC mailbox API). v0.4.0
builds against thepizerobranch — upstream Zephyr main plus the
rpi_zero_2w board + ARMv6 + BCM driver work prepared for upstream PR.
Newrpi_fwfirmware API throughout; chained multi-tag
rpi_fw_fb_setuphelper for the VideoCore framebuffer; DWC2 USB PHY
power-on quirk ported torpi_fw_transfer(RPI_FW_TAG_SET_POWER_STATE). - Real EDID monitor detection.
pizzanow probes
RPI_FW_TAG_GET_EDID_BLOCKand reportsDisplay: (no monitor detected)
when nothing is on the HDMI cable. v0.3 reportedHDMI 640x480(the
VC fallback surface whenhdmi_force_hotplug=1is on). - DNS resolution.
net dns google.comresolves from the shell on
the 2W.
Flash
Standard PiZZa workflow — see the README
for SD imaging via PINN and install-to-sdcard.sh.
Two binaries:
pizza-v0.4.0-rpi_zero_w.bin— original Pi Zero W (BCM2835, ARMv6)pizza-v0.4.0-rpi_zero_2w.bin— Pi Zero 2 W (BCM2710, AArch64)
PiZZa v0.3 — HDMI display
HDMI display support via the VideoCore-firmware framebuffer.
What's new since v0.1-preview
- HDMI output. New
brcm,bcm2835-fbdriver requests a framebuffer
from the VideoCore GPU via a single chained property request
(SET_PHYS_WH + SET_VIRT_WH + SET_DEPTH + SET_PIXEL_ORDER +
ALLOCATE_BUFFER + GET_PITCH) and maps it into the ARM MMU with
K_MEM_CACHE_NONE. Auto-detects the monitor's native mode via VC's
EDID negotiation (GET_PHYSICAL_WIDTH_HEIGHT). - Splash on boot. The pizza sample paints CMYKWRGB bars onto the
scanout immediately after the banner; no monitor attached = silent
no-op. - Display line in the
pizzapanel.Display: HDMI <W>x<H>
replaces the static Wi-Fi-hardware line. Local IP still shows the
live network state. - I²C bus (BSC1 on GPIO 2/3, 100 kHz default) on the 40-pin header.
- Quieter boot console. CDC line-state / line-coding debug prints
removed; VC board-serial query demoted from INF to DBG (was firing
twice per boot for the USB iSerialNumber descriptor). hdmi_force_hotplug=1added to the bundledconfig.txtso HDMI
comes up even with no monitor attached at power-on.
Flash
Standard PiZZa workflow — see the README
for SD imaging via PINN and the install-to-sdcard.sh script.
Built from jetpax/zephyr@efcd8a2 on the `pizza` branch.
PiZZa v0.1-preview — Zephyr on the Raspberry Pi Zero 2 W
Pre-built Zephyr image for the Raspberry Pi Zero 2 W, ready to drop onto a
PINN-imaged microSD card.
Install steps live in jetpax/PiZZa. TL;DR:
git clone https://github.com/jetpax/PiZZa.git
cd PiZZa
./install-to-sdcard.sh /Volumes/RECOVERY <path-to-zephyr.bin>Then eject, insert into the Pi, and plug a micro-USB cable from the Pi to your
laptop. The Pi powers itself from the cable and presents a USB-CDC ACM
serial device (/dev/tty.usbmodem* on macOS, /dev/ttyACM0 on Linux, COM port
on Windows). Mini-UART @ 115200 on GPIO 14/15 is the fallback / log console.
A peace-symbol neofetch banner shows up on every host re-connect and pizza
gives you a device summary.
Build provenance
- Source:
jetpax/zephyr@026e063c596(branchpizza-v0.1, offrpi-zero-2w-portHEAD726037c7a94) - hal_broadcom:
jetpax/hal_broadcom@5e1318dd - Toolchain: Zephyr SDK 1.0.1 / aarch64-zephyr-elf-gcc 14.3.0
- Sample:
samples/boards/raspberrypi/rpi_zero_2w_pizza
Built with:
EXTRA_ZEPHYR_MODULES=$HOME/zephyrproject/modules/hal/broadcom \
west build -p always -b rpi_zero_2w \
-s samples/boards/raspberrypi/rpi_zero_2w_pizzaImage checksum
b0b7d56e00e6137bd0e6902810ed3e5e2db095dafa7abe5b45abbd8507e3a991 zephyr.bin
Verify after download:
shasum -a 256 -c zephyr.bin.sha256What's enabled
- BCM2710 SoC + rpi_zero_2w board
- Primary console: USB-CDC ACM over the micro-USB port
- Fallback console: mini-UART (uart1) on GPIO 14/15 @ 115200
- microSD card (external slot) via BCM283x SDHost — mountable FAT / LittleFS
- SDIO Wi-Fi (CYW43439) via brcmfmac — WPA2-PSK scan / connect / RSSI / multicast RX
- DMA, SPI, I²S
- HWINFO (64-bit OTP board serial via VC firmware)
- VC die-temperature sensor
- Networking: TCP/IP, DNS, DHCPv4, HTTP server
- Shell with
pizza(neofetch-style device summary),device list,kernel,
hwinfo,sensor,wifi,net,mount, plus per-subsystem commands.
What's not in this image
- SMP (single-core only — upstream Zephyr BCM2710 limitation, on the roadmap)
- Bluetooth (CYW43439 BT side not exercised)
- HDMI / display
- USB host (the USB-OTG port runs in device mode for the CDC console)
Hardware compatibility
- Raspberry Pi Zero 2 W — ✅ supported and tested.
- Original Pi Zero / Pi Zero W — ❌ not compatible (BCM2835 / ARM11 ARMv6 32-bit; this image is aarch64).
- Pi 3 / 3B / 3B+ —
⚠️ untested. Same Pi 3 family / BCM27xx silicon; likely needs config tweaks for the different Wi-Fi blob and Ethernet PHY. - Pi 4 / Pi 5 — use the upstream
rpi_4b/rpi_5boards, not this image.
Known limitations
- Pi runs at the BCM2710's idle clock (~600 MHz) when powered from a laptop
USB-2 port. Use a separate 5 V supply for higher sustained clock if you're
CPU-bound. - Boot to shell takes ~6 s (Pi firmware + Wi-Fi firmware upload).
- CDC-connect banner uses a colour-matched fake
uart:~$placeholder; the
real shell takes over the moment you press a key (see source comments in
samples/boards/raspberrypi/rpi_zero_2w_pizza/src/main.cfor the
shell-from-non-shell-thread rationale).
Source PRs / RFC
This image bundles the contribution that's being staged into upstream Zephyr.
The umbrella RFC is at
zephyrproject-rtos/zephyr#109880.
Three smallest PRs already open:
| PR | What |
|---|---|
| #108775 | drivers: timer: arm_arch: allow custom interrupt controller |
| #108776 | drivers: serial: uart_bcm2711: return -1 from poll_in when no char |
| #108777 | drivers: serial: uart_bcm2711: read-modify-write IER bits |
The remaining ZP-3..16 PRs (board, drivers, brcmfmac) are staged on branches
at jetpax/zephyr pending the RFC
outcome.
License
Apache-2.0 for the Zephyr binary content. The brcmfmac firmware bytes inside
zephyr.bin come from
rpi-distro/firmware-nonfree
under their original non-redistributable license, fetched via
west blobs fetch hal_broadcom at build time and compile-time-included in the
kernel image.