STATS command (0xAA 0xFE 0x08 0x02 'STATS') returns frames accepted/rejected,
bytes discarded, RX FIFO overruns and motion frame/sample counters;
controller-uart-bridge --debug-uart prints them beside host send counts.
The bridge no longer zeroes the gyro from its first 200 samples: like the
AIO's Bluepad32 path, controller-calibrated values are forwarded unchanged.
The bridge now forwards each SDL sensor sample once instead of re-sending
its last window at 500 Hz, and the firmware pools pending samples per slot
until a USB report retires them. A stalled or slow sensor stream can no
longer be re-integrated as continuous rotation in quaternion mode.
--debug-imu reports the sample rate, |a| in g and bias lock state.
The regular firmware now answers the EP0 vendor INFO and BOOTSEL reboot
requests with the AIO wire protocol, so switch-pico-config reboot bootsel
works when the Pico's USB side is on a PC. Wire constants move to
usb_management_protocol.h; other operations stall.
The bridge sends 0xAA 0xFE 0x08 0x01 'BOOTSEL' ck; the firmware verifies
checksum and magic and calls reset_usb_boot(). Exposed as
controller-uart-bridge --reboot-bootsel PORT and build.py --uart-port PORT,
which waits for the ROM loader before running picotool.
UART protocol v3 adds a slot byte to input frames (v2 still accepted as
slot 0) and slot-tagged BB 03 rumble frames. The regular firmware exposes
SWITCH_PICO_UART_CONTROLLERS (default 4) Switch Pro interfaces like the
AIO build. The bridge shares one serial port across controllers, maps
index:port[:slot], and demuxes rumble by slot.
Decode Nintendo HD-rumble words once in firmware into conventional low/high magnitudes and normalize stripped control SET_REPORT vs complete interrupt OUT reports through one path.