Skip to content

Releases

Adafruit Fruit Jam RP2350 Linux playground build 2026-06-17

Choose a tag to compare

Fruit Jam RP2350 Linux playground build for Adafruit Fruit Jam RP2350B.

Highlights:

  • Adds the Adafruit Playground getting-started guide link, credited to Mikey Sklar.
  • Makes SD-card web hosting the default / route and keeps the built-in hardware playground at /playground.
  • Adds the Berry fruitjam hardware module plus finite/fake-hardware examples.
  • Hardens AirLift diagnostics with a lock file and cached read-only status paths, while preserving the merged telnet PTY work from PR #6.
  • Reduces serial console noise with the UART login wrapper and adds clear/cls shell helpers.
  • Adds small no-MMU-friendly helpers: fruitjam-mem/free, fruitjam-hidkeys, and expanded fruitjam-usbhost diagnostics.
  • Includes the staged USB-host PIO bridge/probe patch stack through 0057.

Validation:

  • Source validation: ./scripts/validate-fruitjam-examples.sh passed after rebasing on origin/master.
  • Docker Buildroot image rebuild completed from commit a293dbb after the PR #6 merge.
  • UF2 conversion used picotool uf2 convert --family rp2350-riscv.
  • Release UF2 was flashed using software BOOTSEL plus picotool load -fu, then rebooted.
  • Post-flash smoke test on hardware reported Linux (none) 6.15.0 #2 Wed Jun 17 00:44:56 UTC 2026 riscv32.
  • Hardware smoke confirmed airliftctl, fruitjam-hidkeys, and /root/berry/fruitjam.be are present; fruitjam-services status runs; fruitjam-usbhost status, self-rx, setup-token-self-rx, and setup-data-self-rx-drain pass.

Known incomplete:

  • USB host is still diagnostic/probe work, not finished HID enumeration. Self-RX/setup-data probes pass, but live IN/enumeration/HID polling is still incomplete.
  • AirLift remains a NINA coprocessor path, not a Linux wlan0 network device.
  • Full DVI/framebuffer console and streamed PCM audio are still future work.

UF2 SHA256:
3c7ec262ff476167065486cd964ff5d13238d2bd1caaec90f08c4b374e87453c

Adafruit Fruit Jam RP2350 Linux USB-host web probe build 2026-06-17

Choose a tag to compare

Prerelease probe build for people following the Fruit Jam Linux bring-up work.

What changed

  • The /playground web UI now exposes USB-host Combo Skip ACK and Reset Combo probe buttons.
  • Direct CGI and the AirLift direct HTTP API now accept the same new USB-host commands: get-device-8-combo-skipack and reset-get-device-8-combo-skipack.
  • The validation script now checks USB-host command parity across the helper, CGI, and AirLift paths so the browser path does not drift from the command-line path again.

Validation

  • Docker Buildroot rebuild completed for adafruit_fruit_jam_rp2350 from this source tree.
  • Exported flash-image.bin from the Docker output volume and converted it with picotool uf2 convert --family rp2350-riscv.
  • ./scripts/validate-fruitjam-examples.sh passed.
  • git diff --check HEAD~1..HEAD passed.
  • UF2 SHA256: 6e2c847ca292469e374ca48a690fc101dbe6fa40229cd0129a74c75ce81c3863.

Hardware status

This exact UF2 was not flashed after the rebuild. During validation, the AirLift/web software BOOTSEL action returned success, but the RP2350 did not enumerate as ROM BOOTSEL, and the running network/serial services stopped responding usefully. Use physical BOOTSEL/reset for flashing this build.

The previously installed image did serve the SD-card web root at /, the hardware playground at /playground, and USB-host status through the AirLift direct path before the BOOTSEL attempt. USB host remains in probe/debug status: HID dongle enumeration is not complete yet.

Credit

The repository README links to the Adafruit Playground getting-started guide Linux on Fruit Jam by Mikey Sklar.

Fruit Jam RP2350 Linux USB host web decode 20260617

Choose a tag to compare

Prerelease UF2 for Adafruit Fruit Jam RP2350 Linux.

Since fruitjam-rp2350-linux-usbhost-web-probe-20260617, this release adds a few forum-testable quality-of-life fixes:

  • Web UI USB host probe output now decodes last_rx_hex into USB PID, DATA payload length, CRC presence, and device/config/interface descriptor hints.
  • fruitjam-usbhost decode [RX-HEX] can decode bridge-prefixed USB RX packets from the shell.
  • BOOTSEL requests from CGI/AirLift use the direct restart2("bootsel") syscall path instead of spawning fruitjamctl, which keeps the web BOOTSEL action no-MMU friendlier.
  • AirLift inbound service now writes a heartbeat, and fruitjam-services airlift-monitor restarts it if it stalls.
  • The README links to Mikey Sklar's Adafruit Playground getting started guide: https://adafruit-playground.com/u/mikeysklar/pages/linux-on-fruit-jam

Validation performed for this artifact:

  • ./scripts/validate-fruitjam-examples.sh
  • git diff --check
  • Embedded web script syntax checked with node --check
  • Docker Buildroot rebuild using fruitjam-br-output
  • Exported flash-image.bin, converted with picotool uf2 convert --family rp2350-riscv
  • Confirmed the packaged rootfs.tar contains the new USB host web decode helper

UF2 SHA256:

f6dfb26e9169a2daba5471dc0fd6219017495c710330bddc0935f9966f81d1ee  adafruit-fruitjam-rp2350-linux-usbhost-web-decode-20260617.uf2

Known limits:

  • This exact UF2 was not freshly flashed on hardware during release packaging because no accessible RP2040/RP2350 BOOTSEL device or RP2350 volume was visible; only /dev/cu.usbmodem101 was present.
  • USB host support is still probe/debug level, not a finished HID keyboard stack. The useful thing to share from this build is the decoded last_rx_hex output after the USB host probe buttons.

Fruit Jam RP2350 Linux USB keyboard smoke and FTP active mode 20260617

Choose a tag to compare

Prerelease UF2 for Adafruit Fruit Jam RP2350 Linux, following fruitjam-rp2350-linux-berry-board-control-20260617.

The previous USB-host prerelease reached kbd-find, live text/events, and kbd-auto-shell, but the release notes still called out the same practical blocker: the image had not been flashed in that pass and live USB-keyboard smoke was blocked by lack of a usable board shell/BOOTSEL path. This build adds a focused host-side smoke runner so that proof can be run over either CDC or AirLift telnet as soon as the board is reachable.

What changed:

  • Added scripts/usbhost-keyboard-smoke.py, a focused USB boot-keyboard smoke runner for kbd-find, the Berry USB keyboard helper, kbd-auto-text, kbd-auto-events, and kbd-auto-shell.
  • The new runner supports CDC and AirLift telnet transports, plus --require-input for the live typed text/event/echo USBKBD_SMOKE proof.
  • The runner now reports transport failures as normal FAIL rows, which makes current board access problems easier to paste into release/debug notes.
  • Added active-mode support to the optional loopback fruitjam-ftpd: PORT, EPRT, EPSV, APPE, RNFR/RNTO, RMD, and improved LIST/NLST behavior.
  • Extended host validation for passive and active FTP transfers, and image validation for the new FTP command markers.
  • Updated docs to point at the focused USB keyboard runner as the next hardware proof path.

Validation performed:

  • Read the latest USB-host release notes to confirm the previous checkpoint and remaining gap.
  • git diff --check
  • ./scripts/usbhost-keyboard-smoke.py --self-test --require-input
  • ./scripts/validate-fruitjam-examples.sh, including fake /dev/fruitjam-usbhost tests for keyboard auto-find/live text/events/shell and the new focused smoke runner self-test.
  • Docker Buildroot rebuild with fruitjam-utils-dirclean; fresh fruitjam-ftpd and helper binaries were rebuilt and installed into the target rootfs.
  • Exported Docker-built images from fruitjam-br-output.
  • Converted UF2 with picotool uf2 convert buildroot-output-docker-images/flash-image.bin buildroot-output-docker-images/flash-image.uf2 --family rp2350-riscv.
  • ./scripts/validate-fruitjam-image.sh buildroot-output-docker-images.
  • Secret scan found only empty/example MQTT password placeholders, not the broker password.

UF2 SHA256:

1e2543800811517b6e19a3623c62135dc2e44138de2bd95cc3ab8008db6367da  adafruit-fruitjam-rp2350-linux-usbhost-smoke-ftpd-active-20260617.uf2

Hardware status and known limits:

  • Current board access is still not sufficient for the live USB-keyboard proof: picotool info -a sees no BOOTSEL device, /Volumes/RP2350 is not mounted, CDC is present as /dev/cu.usbmodem101//dev/tty.usbmodem101 but did not provide a usable shell, AirLift ping responds at 192.168.1.7, and telnet resets before a shell.
  • Running ./scripts/usbhost-keyboard-smoke.py --transport telnet --telnet-host 192.168.1.7 --seconds 1 currently reports six telnet reset failures, so this UF2 is build/image validated but not flashed or live-keyboard validated in this pass.
  • USB host remains intentionally narrow: direct boot-protocol keyboard only. Hubs, mass storage, arbitrary HID devices, full composite-device support, and Linux input/console integration remain incomplete.
  • kbd-auto-shell is still a tiny polling helper shell, not a kernel TTY, evdev, or general console driver.
  • The active FTP changes apply to the optional loopback fruitjam-ftpd; AirLift FTP remains the separate NINA-backed service path.

Fruit Jam RP2350 Linux USB keyboard shell and MQTT 20260617

Choose a tag to compare

Prerelease UF2 for Adafruit Fruit Jam RP2350 Linux, following fruitjam-rp2350-linux-usbhost-kbd-live-20260617.

The previous release stopped at live boot-keyboard polling with a hardcoded address-1/endpoint-1 path and no live board flash. This release moves that USB host work one step closer to usable console input.

What changed:

  • fruitjam-usbhost now accepts parameterized boot-keyboard targets: kbd-init [addr config iface], kbd-poll [addr ep], and kbd-init-poll [addr config iface ep].
  • fruitjam-usbhost kbd-text, kbd-events, and kbd-monitor can use the same optional address/config/interface/endpoint tuple while preserving the old defaults.
  • Added fruitjam-usbhost kbd-shell, a tiny USB-keyboard-driven command loop with cd, echo, exit, help, and status builtins plus direct /bin, /usr/bin, /sbin, and /usr/sbin command execution.
  • The kernel fruitjam-usbhost bridge now accepts parameterized keyboard init/poll commands instead of forcing the helper to address 1 endpoint 1 forever.
  • Added tiny MQTT subscribe support: mosquitto_sub, airliftctl mqtt-sub, username/password support for pub/sub, and Berry MQTT publish/subscribe examples.
  • Docs now link the Adafruit Playground getting started guide by Mikey Sklar, with author credit.

Validation performed:

  • Read the prior USB-host prerelease notes to confirm the last checkpoint and remaining gaps.
  • git diff --check
  • ./scripts/validate-fruitjam-examples.sh, including fake /dev/fruitjam-usbhost tests for kbd-text, kbd-events, kbd-shell, MQTT pub/sub auth checks, and kernel bridge source guards.
  • Docker Buildroot rebuild with the USB host kernel patch applied and drivers/misc/fruitjam_usbhost.o compiled; regenerated rootfs and flash image.
  • Exported Docker-built flash-image.bin, then ran picotool uf2 convert buildroot-output-docker-images/flash-image.bin buildroot-output-docker-images/flash-image.uf2 --family rp2350-riscv.
  • scripts/validate-fruitjam-image.sh buildroot-output-docker-images

UF2 SHA256:

e7774473db5c730c02b5d716eef0ea3e3a518e6928c3ff4ddab252b5db9b4c28  adafruit-fruitjam-rp2350-linux-usbhost-shell-mqtt-20260617.uf2

Hardware status and known limits:

  • This UF2 is build/image validated but was not flashed in this pass. picotool info -a found no BOOTSEL device, /Volumes/RP2350 was not mounted, and a software BOOTSEL attempt through /dev/cu.usbmodem101 did not make the ROM loader visible.
  • USB host support is still intentionally narrow: direct boot-protocol keyboard only. Hubs, composite devices, mass storage, general HID parsing, and Linux input/console integration remain incomplete.
  • kbd-shell is a small polling helper shell, not a kernel TTY or evdev stack.
  • MQTT subscribe is host-protocol/build validated in this pass; AirLift publish was previously hardware verified, but current-board AirLift subscribe still needs live broker verification.

Adafruit Fruit Jam RP2350 Linux USB-host probe build 2026-06-17

Choose a tag to compare

USB-host diagnostic prerelease for the Adafruit Fruit Jam RP2350 Linux image.

Changes:

  • Adds a kernel get-device-8-combo-skipack probe that sends the combined SETUP token/DATA0 stage, skips making success depend on the tight ACK receive window, then immediately sends the control IN token for the first descriptor packet.
  • Adds reset-get-device-8-combo-skipack for the same probe after active reset/SOF recovery.
  • Exposes both commands through fruitjam-usbhost and extends the host validation guard.

Validation:

  • Docker Buildroot rebuild from source completed.
  • ./scripts/validate-fruitjam-examples.sh passed.
  • git diff --check passed.
  • UF2 SHA256: 0f50fb1027af16daa2067b903ad1c2c360fcfb0bccbae6c5d0be17fbf736f953.

Hardware note:

  • This image was not flashed/smoke-tested in this pass. The local board did not appear in BOOTSEL/picotool, macOS still showed /dev/cu.usbmodem101, and opening that CDC device hung before a shell command could be sent.

Status:

  • This is a diagnostic probe build, not a confirmed USB HID keyboard fix.

Fruit Jam RP2350 Linux USB keyboard shell editing 20260617

Choose a tag to compare

Prerelease UF2 for Adafruit Fruit Jam RP2350 Linux, following fruitjam-rp2350-linux-shell-path-completion-20260617.

This release returns to the USB-host keyboard milestone. The previous USB-host notes had reached the narrow boot-protocol keyboard path, but the remaining practical gap was still hands-on validation through a usable board shell. This build makes the helper shell itself more usable while keeping the scope intentionally small.

What changed:

  • fruitjam-usbhost kbd-shell and kbd-auto-shell now support a four-entry command history.
  • The USB keyboard shell now handles HID up/down arrows for history recall.
  • The USB keyboard shell now supports tab completion for commands and paths, matching the tiny telnet shell ergonomics without adding a general Linux input stack.
  • scripts/usbhost-keyboard-smoke.py now has a telnet transport wrapper that speaks the tiny fruitjam-shell protocol directly with newline-separated commands and the status builtin, instead of assuming POSIX shell semicolons and $?.
  • Documentation and image validation now call out the USB keyboard helper shell history/completion support.

Validation performed:

  • Read the latest USB-host release notes to confirm the last checkpoint and remaining gap.
  • Confirmed BOOTSEL was not reachable by software telnet attempt before the board was put into BOOTSEL physically: telnet reset and picotool info -a still saw no ROM loader.
  • Confirmed physical/button BOOTSEL with picotool info -a showing RP2350 boot type bootsel.
  • git diff --check.
  • ./scripts/validate-fruitjam-examples.sh, including fake /dev/fruitjam-usbhost tests for live keyboard text/events, kbd-find, kbd-shell, history recall, path tab completion, and the focused smoke runner self-test.
  • Docker Buildroot rebuild with fruitjam-utils-dirclean, regenerated rootfs/images, and rebuilt fruitjam-usbhost.
  • Exported Docker-built images from fruitjam-br-output.
  • Converted UF2 with picotool uf2 convert buildroot-output-docker-images/flash-image.bin buildroot-output-docker-images/flash-image.uf2 --family rp2350-riscv.
  • ./scripts/validate-fruitjam-image.sh buildroot-output-docker-images.
  • Flashed this UF2 with picotool load -fu buildroot-output-docker-images/flash-image.uf2 and rebooted into application mode.
  • Post-flash, CDC initially echoed CODEX_FLASH_OK; CDC and AirLift telnet both reported fruitjam-usbhost status with USB-host power on, full-speed device, PIO ready/configured, and boot-keyboard packet path available.
  • Secret scan found only the intentional validate-secret sentinel, not the broker password.

UF2 SHA256:

e3c12593971040f97de2f7aa40f12fb3bc166662be31f50c3aff37932b5703fa  adafruit-fruitjam-rp2350-linux-usbhost-kbd-shell-editing-20260617.uf2

Hardware status and known limits:

  • This UF2 was flashed on the current board after physical/button BOOTSEL.
  • Live USB-host status after flashing confirms a full-speed device is seen and the PIO boot-keyboard path is ready/configured.
  • The focused typed-input smoke was not completed in this pass. After initial successful CDC/telnet checks, repeated host opens left CDC hanging in macOS serial configuration and AirLift telnet accepting connections but returning no bytes. A fresh reset window is still needed to run ./scripts/usbhost-keyboard-smoke.py --transport telnet --telnet-host <board-ip> --require-input or the CDC equivalent.
  • USB host remains intentionally narrow: direct boot-protocol keyboard only. Hubs, mass storage, arbitrary HID devices, full composite-device support, and Linux input/console integration remain incomplete.
  • kbd-shell/kbd-auto-shell are still tiny polling helper shells, not a kernel TTY, evdev device, or general console driver.

Fruit Jam RP2350 Linux USB host boot-keyboard probe 20260617

Choose a tag to compare

Prerelease UF2 for Adafruit Fruit Jam RP2350 Linux with the first narrow live USB host boot-keyboard probe path.

What changed:

  • The Fruit Jam USB host bridge now ACKs valid DATA0/DATA1 packets immediately from the RX-EOP path, avoiding the late post-bookkeeping ACK path that was too slow for live polling.
  • Low-speed devices now get keepalive pulses instead of full-speed SOF bursts when the bridge detects low-speed line state.
  • Added experimental direct boot-keyboard commands: fruitjam-usbhost kbd-init, kbd-poll, and kbd-init-poll. These reset the root port, use address 1, set configuration 1, request boot protocol on interface 0, set idle, and poll interrupt IN endpoint 1.
  • The same kbd-* bridge commands are allowed through the web CGI and AirLift HTTP API paths.
  • USB host documentation now describes the current status as experimental boot-keyboard probing, not a hub/composite/general Linux input stack.
  • The README continues to credit Mikey Sklar and link the Adafruit Playground getting-started guide: https://adafruit-playground.com/u/mikeysklar/pages/linux-on-fruit-jam

Forum feedback status:

  • Open PR #4 from Mikey Sklar is still open and GitHub reports it as conflicting against current master; the underlying ttyAMA0 console-noise issue is already addressed in-tree with fruitjam-uart-login, which waits for Enter before execing hush.
  • clear and cls are present in /etc/profile.d/cls.sh.
  • airliftctl serializes SPI access through /run/airliftctl.lock and reports the owning process when busy.

Validation performed:

  • git diff --cached --check on non-patch source/docs, plus patch -p1 --dry-run for the new kernel patch.
  • Docker Buildroot rebuild after linux-dirclean, fruitjam-utils-dirclean, and fruitjam-airlift-dirclean.
  • scripts/validate-fruitjam-image.sh buildroot-output-docker-images
  • ./scripts/validate-fruitjam-examples.sh
  • Rootfs/kernel string spot checks confirmed kbd-init, kbd-poll, and kbd-init-poll are present in the built artifacts.

UF2 SHA256:

27f4980ab95d750926911e2f5de921a8d6c2eb5cef6eccc3cd20cb981af69432  adafruit-fruitjam-rp2350-linux-usbhost-kbd-probe-20260617.uf2

Known limits:

  • This UF2 was build/image validated but not hardware-flashed in this release pass. picotool info -a found no BOOTSEL device, /Volumes/RP2350 was not mounted, and the visible /dev/cu.usbmodem101 CDC path timed out during the software BOOTSEL attempt.
  • USB host support is still experimental and narrow: one direct boot-protocol keyboard path at address 1 endpoint 1. Hubs, composite devices, endpoint/configuration parsing beyond this probe, and Linux input event integration remain incomplete.

Fruit Jam RP2350 Linux USB keyboard live poll 20260617

Choose a tag to compare

Prerelease UF2 for Adafruit Fruit Jam RP2350 Linux with the next USB host boot-keyboard usability step.

What changed:

  • fruitjam-usbhost now has live boot-keyboard helpers: kbd-text [seconds], kbd-events [seconds], and kbd-monitor [seconds].
  • The live helpers run the existing kbd-init path, repeatedly issue kbd-poll, decode DATA0/DATA1 last_rx_hex packets as 8-byte boot-keyboard reports, suppress held-key repeats, and emit either text or press/release events.
  • fruitjam-shell now has a tiny four-entry command history, up/down history recall, command-name tab completion for builtins and /bin//usr/bin//sbin//usr/sbin, plus a history builtin.
  • USB host and shell docs now describe the new live keyboard and line-editing paths.

Validation performed:

  • git diff --check
  • ./scripts/validate-fruitjam-examples.sh, including a PTY-backed fake /dev/fruitjam-usbhost test for kbd-text and kbd-events.
  • Docker Buildroot rebuild after fruitjam-utils-dirclean, with regenerated rootfs and flash image.
  • picotool uf2 convert buildroot-output-docker-images/flash-image.bin buildroot-output-docker-images/flash-image.uf2 --family rp2350-riscv
  • scripts/validate-fruitjam-image.sh buildroot-output-docker-images
  • Rootfs string spot checks confirmed kbd-text, kbd-events, and the telnet shell history/completion strings are present in the built image.

UF2 SHA256:

7e612154a710caf691c99ba561cae29ffeb6506931d340e042682e72aaeae151  adafruit-fruitjam-rp2350-linux-usbhost-kbd-live-20260617.uf2

Hardware status and known limits:

  • This UF2 was build/image validated but not flashed in this pass. picotool info -a found no BOOTSEL device, /Volumes/RP2350 was not mounted, and a one-way /dev/cu.usbmodem101 software-BOOTSEL command did not make the board visible to picotool.
  • AirLift at 192.168.1.7 still opens TCP/23 but resets before a usable shell, so no live board command channel was available for flashing or USB keyboard smoke testing.
  • USB host support remains deliberately narrow: one direct boot-protocol keyboard path at address 1 endpoint 1. Hubs, composite devices, endpoint/configuration parsing beyond this probe, and Linux input/console integration remain incomplete.

Fruit Jam RP2350 Linux USB HID decode helpers 20260617

Choose a tag to compare

Prerelease UF2 for Adafruit Fruit Jam RP2350 Linux with small USB HID decode helpers and Berry-facing HID decode examples.

What's new:

  • fruitjam-usbhost decode now prints HID boot-keyboard hints for DATA0/DATA1 bridge captures.
  • New fruitjam-usbhost hid [RX-HEX|REPORT-HEX] decodes either raw 8-byte boot-keyboard reports or last_rx_hex USB DATA packets.
  • fruitjam-hidkeys accepts DATA0/DATA1 last_rx_hex packets when their payload is an 8-byte boot-keyboard report, while still rejecting descriptor packets.
  • The built-in web playground auto-decodes USB RX descriptor and HID keyboard hints.
  • Berry is a little more first-class: /root/berry/fruitjam.be now includes fruitjam.usbhost_hid_report(), with /root/berry/08-usbhost-hid-decode.be added to the finite Berry examples and HTTP/AirLift Berry whitelists.
  • Added /root/sh/17-usbhost-hid-decode.sh for target-side shell validation.
  • The README links Mikey Sklar's Adafruit Playground getting-started guide, Linux on Fruit Jam, with credit to Mikey Sklar.

Validation performed:

  • ./scripts/validate-fruitjam-examples.sh
  • Docker Buildroot rebuild after fruitjam-utils-dirclean and fruitjam-airlift-dirclean
  • scripts/validate-fruitjam-image.sh buildroot-output-docker-images
  • Rootfs spot checks for /root/berry/08-usbhost-hid-decode.be, /root/sh/17-usbhost-hid-decode.sh, fruitjam-usbhost, and fruitjam-hidkeys

UF2 SHA256:

d14d246953425f6bf380271419b34f77c1a0da81742d469bef8bc6c9699bef06  adafruit-fruitjam-rp2350-linux-usbhost-hid-decode-20260617.uf2

Known limits:

  • This exact UF2 was build/image validated but not re-flashed and hardware-smoked in this release pass.
  • USB host live enumeration and report polling are still in progress; this release improves decode tooling for bridge captures and HID report translation.