PR #9 (merged as edea99c, 2026-09-07) added nine examples and rewrote uvc_display.py to prefer MJPEG through jpegio. It was merged on a static review: every _usbif call checked against the C module's locals, argument tables and tuple layouts, the usbif.uac_audio / usbif.hid_keyboard / events surfaces checked, all twelve files compiled, and host_enum.py run on desktop CPython (where it reports no capabilities on WSL, as expected). Nothing was run on a board.
The PR's own test plan, still unchecked:
Two things a run may surface that the static pass could not: soundcard.py reads I2S pins and codec hooks from board_peripherals under several guessed names and falls back to _output_power / _codec_call; and usb_mic.py / usb_speaker.py read the negotiated format through getattr(..., "format") with a .stream fallback. Whichever branch a real board takes should be the one that stays.
PR #9 (merged as
edea99c, 2026-09-07) added nine examples and rewroteuvc_display.pyto prefer MJPEG throughjpegio. It was merged on a static review: every_usbifcall checked against the C module's locals, argument tables and tuple layouts, theusbif.uac_audio/usbif.hid_keyboard/eventssurfaces checked, all twelve files compiled, andhost_enum.pyrun on desktop CPython (where it reports no capabilities on WSL, as expected). Nothing was run on a board.The PR's own test plan, still unchecked:
soundcard.py— Speakers appear on a PC; audio audibleusb_speaker.pyhosting the P4 — tone on the P4 speakerhid_keyboard.py/hid_mouse.pyagainst a PChid_host.pywith a keyboard (M1 events)uvc_display.pywith jpegio firmware (MJPEG) and without (YUY2) — this one was a working example before the rewrite, so it is the first to runhost_enum.pyon a boardusb_serial.py,usb_mic.py,ram_drive.pycostume_selftest.pystill 31/31Two things a run may surface that the static pass could not:
soundcard.pyreads I2S pins and codec hooks fromboard_peripheralsunder several guessed names and falls back to_output_power/_codec_call; andusb_mic.py/usb_speaker.pyread the negotiated format throughgetattr(..., "format")with a.streamfallback. Whichever branch a real board takes should be the one that stays.