Repository navigation
Releases
Adafruit Fruit Jam RP2350 Linux playground build 2026-06-17
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
fruitjamhardware 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/clsshell helpers. - Adds small no-MMU-friendly helpers:
fruitjam-mem/free,fruitjam-hidkeys, and expandedfruitjam-usbhostdiagnostics. - Includes the staged USB-host PIO bridge/probe patch stack through
0057.
Validation:
- Source validation:
./scripts/validate-fruitjam-examples.shpassed after rebasing onorigin/master. - Docker Buildroot image rebuild completed from commit
a293dbbafter 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.beare present;fruitjam-services statusruns;fruitjam-usbhost status,self-rx,setup-token-self-rx, andsetup-data-self-rx-drainpass.
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
wlan0network 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
Prerelease probe build for people following the Fruit Jam Linux bring-up work.
What changed
- The
/playgroundweb UI now exposes USB-hostCombo Skip ACKandReset Comboprobe buttons. - Direct CGI and the AirLift direct HTTP API now accept the same new USB-host commands:
get-device-8-combo-skipackandreset-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_rp2350from this source tree. - Exported
flash-image.binfrom the Docker output volume and converted it withpicotool uf2 convert --family rp2350-riscv. ./scripts/validate-fruitjam-examples.shpassed.git diff --check HEAD~1..HEADpassed.- 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
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_hexinto 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 spawningfruitjamctl, which keeps the web BOOTSEL action no-MMU friendlier. - AirLift inbound service now writes a heartbeat, and
fruitjam-services airlift-monitorrestarts 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.shgit diff --check- Embedded web script syntax checked with
node --check - Docker Buildroot rebuild using
fruitjam-br-output - Exported
flash-image.bin, converted withpicotool uf2 convert --family rp2350-riscv - Confirmed the packaged
rootfs.tarcontains 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
RP2350volume was visible; only/dev/cu.usbmodem101was 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_hexoutput after the USB host probe buttons.
Fruit Jam RP2350 Linux USB keyboard smoke and FTP active mode 20260617
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 forkbd-find, the Berry USB keyboard helper,kbd-auto-text,kbd-auto-events, andkbd-auto-shell. - The new runner supports CDC and AirLift telnet transports, plus
--require-inputfor the live typed text/event/echo USBKBD_SMOKEproof. - 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 improvedLIST/NLSTbehavior. - 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-usbhosttests for keyboard auto-find/live text/events/shell and the new focused smoke runner self-test.- Docker Buildroot rebuild with
fruitjam-utils-dirclean; freshfruitjam-ftpdand 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 -asees no BOOTSEL device,/Volumes/RP2350is not mounted, CDC is present as/dev/cu.usbmodem101//dev/tty.usbmodem101but did not provide a usable shell, AirLift ping responds at192.168.1.7, and telnet resets before a shell. - Running
./scripts/usbhost-keyboard-smoke.py --transport telnet --telnet-host 192.168.1.7 --seconds 1currently 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-shellis 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
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-usbhostnow accepts parameterized boot-keyboard targets:kbd-init [addr config iface],kbd-poll [addr ep], andkbd-init-poll [addr config iface ep].fruitjam-usbhost kbd-text,kbd-events, andkbd-monitorcan 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 withcd,echo,exit,help, andstatusbuiltins plus direct/bin,/usr/bin,/sbin, and/usr/sbincommand execution. - The kernel
fruitjam-usbhostbridge 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-usbhosttests forkbd-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.ocompiled; regenerated rootfs and flash image. - Exported Docker-built
flash-image.bin, then ranpicotool 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 -afound no BOOTSEL device,/Volumes/RP2350was not mounted, and a software BOOTSEL attempt through/dev/cu.usbmodem101did 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-shellis 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
USB-host diagnostic prerelease for the Adafruit Fruit Jam RP2350 Linux image.
Changes:
- Adds a kernel
get-device-8-combo-skipackprobe 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-skipackfor the same probe after active reset/SOF recovery. - Exposes both commands through
fruitjam-usbhostand extends the host validation guard.
Validation:
- Docker Buildroot rebuild from source completed.
./scripts/validate-fruitjam-examples.shpassed.git diff --checkpassed.- 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
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-shellandkbd-auto-shellnow 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.pynow has a telnet transport wrapper that speaks the tinyfruitjam-shellprotocol directly with newline-separated commands and thestatusbuiltin, 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 -astill saw no ROM loader. - Confirmed physical/button BOOTSEL with
picotool info -ashowing RP2350 boot typebootsel. git diff --check../scripts/validate-fruitjam-examples.sh, including fake/dev/fruitjam-usbhosttests 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 rebuiltfruitjam-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.uf2and rebooted into application mode. - Post-flash, CDC initially echoed
CODEX_FLASH_OK; CDC and AirLift telnet both reportedfruitjam-usbhost statuswith USB-host power on, full-speed device, PIO ready/configured, and boot-keyboard packet path available. - Secret scan found only the intentional
validate-secretsentinel, 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-inputor 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-shellare 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
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, andkbd-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 withfruitjam-uart-login, which waits for Enter before execinghush. clearandclsare present in/etc/profile.d/cls.sh.airliftctlserializes SPI access through/run/airliftctl.lockand reports the owning process when busy.
Validation performed:
git diff --cached --checkon non-patch source/docs, pluspatch -p1 --dry-runfor the new kernel patch.- Docker Buildroot rebuild after
linux-dirclean,fruitjam-utils-dirclean, andfruitjam-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, andkbd-init-pollare 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 -afound no BOOTSEL device,/Volumes/RP2350was not mounted, and the visible/dev/cu.usbmodem101CDC 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
Prerelease UF2 for Adafruit Fruit Jam RP2350 Linux with the next USB host boot-keyboard usability step.
What changed:
fruitjam-usbhostnow has live boot-keyboard helpers:kbd-text [seconds],kbd-events [seconds], andkbd-monitor [seconds].- The live helpers run the existing
kbd-initpath, repeatedly issuekbd-poll, decode DATA0/DATA1last_rx_hexpackets as 8-byte boot-keyboard reports, suppress held-key repeats, and emit either text or press/release events. fruitjam-shellnow 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 ahistorybuiltin.- 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-usbhosttest forkbd-textandkbd-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-riscvscripts/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 -afound no BOOTSEL device,/Volumes/RP2350was not mounted, and a one-way/dev/cu.usbmodem101software-BOOTSEL command did not make the board visible topicotool. - AirLift at
192.168.1.7still 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
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 decodenow 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 orlast_rx_hexUSB DATA packets. fruitjam-hidkeysaccepts DATA0/DATA1last_rx_hexpackets 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.benow includesfruitjam.usbhost_hid_report(), with/root/berry/08-usbhost-hid-decode.beadded to the finite Berry examples and HTTP/AirLift Berry whitelists. - Added
/root/sh/17-usbhost-hid-decode.shfor 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-dircleanandfruitjam-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, andfruitjam-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.