Skip to content

PicoMite V6.03.02b3

Choose a tag to compare

@UKTailwind UKTailwind released this 07 Sep 17:14
· 99 commits to main since this release

Updated 7 September 2026. The user manual PDF attached to this release has been replaced. It now states that a constant created with CONST inside a subroutine or function is local to that routine, and cross-references the existing description of functions that return a whole array. The firmware binaries are unchanged - only re-download the manual.

Beta for testing. A bug-fix beta on top of V6.03.02b2, fixing two faults reported against the b2 USB-host builds. Please try it against your existing programs and report anything that behaves differently — particularly around the file manager and USB devices.

Fixed: file manager freezing when copying directories

Copying several directories from a USB flash drive to A: could freeze the firmware or drop out with *** FAULT PC=.... Listing directories was fine, and copying small individual files usually worked, which made it look like a file-system or USB problem. It was neither.

cmd_fm() had a 5824-byte stack frame — 72% of the whole 8 KB core 0 stack — and called the copy machinery from inside it. A recursive directory copy pushed the stack past its limit and into the C heap and static data below. Whatever happened to be sitting there got overwritten, which is why the symptoms looked so unrelated to each other: sometimes an out-of-memory abort, and on at least one board a bogus "Hardware limit switch trip - emergency stop" from the stepper module — on hardware with no stepper connected at all.

The panel cache's type index (1 KB per panel, 2 KB for the pair) has moved to the MMBasic heap, cutting the frame to 3796 bytes and roughly doubling the stack left for the copy itself.

Fixed: recoverable USB errors no longer kill the interpreter

Three recoverable conditions in the RP2 USB host driver — a data-toggle mismatch and two "buffer already available" cases — were handled with a hard panic(). Because PicoMite doesn't route the SDK's console output anywhere, the panic text was discarded and all that reached you was a bare *** FAULT PC=... line with no indication of what happened. On RP2040 it was even less helpful, since CFSR/HFSR don't exist on Cortex-M0+ and always printed as zero.

These now recover and report themselves on the console instead, for example:

[USB DATA_SEQ x1]

The line is capped at a few occurrences so a persistent fault can't flood the console. If you see one, please include it in any report — it names exactly which condition occurred.

Changed: MMBasic heap 4 KB smaller on four USB builds

The USB host stack's growth in b2 left very little room for the C heap that the file system and audio decoders allocate from. To restore that headroom the MMBasic heap is 4 KB smaller on:

  • PicoMiteRP2040USB (132 → 128 KB)
  • PicoMiteRP2040VGAUSB (100 → 96 KB)
  • PicoMiteRP2350USB (300 → 296 KB)
  • PicoMiteRP2350VGAUSB (164 → 160 KB)

This also reduces the maximum program size on those four builds by the same 4 KB. No other variant is affected.

For anyone building from source

  • The TinyUSB patches in tinyusb-patches/ have been updated: the three host-path panic() calls now recover and record, and the RP2040 EPX round-robin no longer preempts a transfer that has already moved data. The patches are still diffs against stock TinyUSB 0.21.0 — re-run tinyusb-patches/setup-tinyusb.sh if you want a clean tree.
  • Two new CMake options, both off by default and diagnostic only: -DFORCE_EPX_SOF=ON makes an RP2350 build take the RP2040 EPX code path so it can be exercised on RP2350 hardware, and -DEPX_PREEMPT_UNGUARDED=ON restores stock 0.21.0 preemption behaviour for A/B testing.