<feed xmlns='http://www.w3.org/2005/Atom'>
<title>tinyusb.git, branch etmtrace-rp2350</title>
<subtitle>Unnamed repository; edit this file 'description' to name the repository.</subtitle>
<id>http://cgit.235523.xyz/tinyusb.git/atom/?h=etmtrace-rp2350</id>
<link rel='self' href='http://cgit.235523.xyz/tinyusb.git/atom/?h=etmtrace-rp2350'/>
<link rel='alternate' type='text/html' href='http://cgit.235523.xyz/tinyusb.git/'/>
<updated>2026-08-26T10:06:07Z</updated>
<entry>
<title>pico2_etm_trace: point board metadata at the carrier's PCB repo</title>
<updated>2026-08-26T10:06:07Z</updated>
<author>
<name>hathach</name>
<email>thach@tinyusb.org</email>
</author>
<published>2026-08-26T10:06:07Z</published>
<link rel='alternate' type='text/html' href='http://cgit.235523.xyz/tinyusb.git/commit/?id=b396e322633984b08d2d92eb0551ae445817ea8f'/>
<id>urn:sha1:b396e322633984b08d2d92eb0551ae445817ea8f</id>
<content type='text'>
</content>
</entry>
<entry>
<title>idea: cmake profiles for pico2_etm_trace</title>
<updated>2026-08-26T10:02:18Z</updated>
<author>
<name>hathach</name>
<email>thach@tinyusb.org</email>
</author>
<published>2026-08-26T10:02:18Z</published>
<link rel='alternate' type='text/html' href='http://cgit.235523.xyz/tinyusb.git/commit/?id=e9bd924396c8a5d441e50d2dba1b1057daf814a7'/>
<id>urn:sha1:e9bd924396c8a5d441e50d2dba1b1057daf814a7</id>
<content type='text'>
</content>
</entry>
<entry>
<title>docs: name the msc-host retry handoff after its PR</title>
<updated>2026-08-26T09:59:35Z</updated>
<author>
<name>hathach</name>
<email>thach@tinyusb.org</email>
</author>
<published>2026-08-26T09:59:35Z</published>
<link rel='alternate' type='text/html' href='http://cgit.235523.xyz/tinyusb.git/commit/?id=61740be39db510928b1d724e3f22b4d2b115eaba'/>
<id>urn:sha1:61740be39db510928b1d724e3f22b4d2b115eaba</id>
<content type='text'>
</content>
</entry>
<entry>
<title>rp2040: remove family_configure_sys_clock(), keep the pico-sdk clock</title>
<updated>2026-08-26T09:58:24Z</updated>
<author>
<name>hathach</name>
<email>thach@tinyusb.org</email>
</author>
<published>2026-08-26T04:21:33Z</published>
<link rel='alternate' type='text/html' href='http://cgit.235523.xyz/tinyusb.git/commit/?id=e316a13d3fe0668812f5cc2d20a20c899e9f53cf'/>
<id>urn:sha1:e316a13d3fe0668812f5cc2d20a20c899e9f53cf</id>
<content type='text'>
With the 12 x n MHz rule gone (previous commit), nothing needs a
non-stock clock: every board runs whatever pico-sdk's platform_defs.h
selects (125 MHz rp2040, 150 MHz rp2350), set from crt0 by the SDK's own
runtime_init_clocks(). The per-platform PLL table this file carried only
existed to force other rates, so it goes too.

Overriding is still possible the way the SDK documents it - pass
SYS_CLK_KHZ together with PLL_SYS_VCO_FREQ_HZ / PLL_SYS_POSTDIV1 /
PLL_SYS_POSTDIV2 from scripts/vcocalc.py - which is what the etm-trace
notes now tell you to do for the higher trace rates.

The removed function and its measured PLL values stay in git history if a
board ever needs a pinned clock again.
</content>
</entry>
<entry>
<title>rp2350: ETM trace on the pico2 trace carrier, at the pico-sdk stock clock</title>
<updated>2026-08-26T09:58:24Z</updated>
<author>
<name>hathach</name>
<email>thach@tinyusb.org</email>
</author>
<published>2026-08-26T04:57:34Z</published>
<link rel='alternate' type='text/html' href='http://cgit.235523.xyz/tinyusb.git/commit/?id=35c27a4637480161e5f89d314147942159bc108e'/>
<id>urn:sha1:35c27a4637480161e5f89d314147942159bc108e</id>
<content type='text'>
Adds board pico2_etm_trace - a Pico 2 seated on the pico2 trace
motherboard carrier (MIPI-20 Cortex Debug+ETM, 27 Ohm source-terminated,
GND-guarded) - and the trace reference that goes with it.

Firmware needs almost no trace support: J-Link's built-in RP2350 device
script declares the off-ROM-table trace components (funnel/TPIU/ETM) and
re-arms the whole chip-side path via OnTraceStart at every resume, so
TRACE_ETM=1 does one thing only - keep the UART console TX-only when the
console RX would sit on a trace pin. The carrier moves the console to
GP12/13 (GP1 = TRACECLK), so it keeps a full-duplex console while
tracing. Never set a custom JLinkScript here: it replaces the built-in
one and pin trace stops working.

Validated on the carrier at the rp2350 stock 150 MHz (75 MHz TRACECLK,
width 4): cdc_msc enumeration burst 3/3, zero overflow, data sampling
+1 ns (idle eye -1000..+2000 ps), 33M fetches per 10 s capture. Higher
rates measured too: 180 MHz (90 MHz TRACECLK, +4..+5 ns) and 240 MHz
(120 MHz TRACECLK, +3.5 ns) - the latter is the J-Trace PRO V2 ceiling,
which is the probe at its documented limit rather than a board limit.

board_init() no longer switches clk_sys on either chip, and boards run
the pico-sdk default (125 MHz rp2040, 150 MHz rp2350). The 12 x n MHz
PIO-USB rule that motivated the old forced clock is not real - it is the
Pico-PIO-USB author's day-one design note (4d952cb, Dec 2021), never
enforced by an assert, and contradicted by measurement: MSC dd over
PIO-USB at ten clocks from 120 to 240 MHz on rp2350 gives 62 KB/s at
every one; rp2040 CDC bulk loopback is byte-exact at 120/125/133/156/180
MHz; adafruit_fruit_jam passes 19/19 HIL at its stock 150 MHz including
usbtest 30/30 and PIO-USB host+dual. CircuitPython ships PIO-USB at
these same defaults.

Two earlier fly-wire-era workarounds are dropped after A/B on the PCB:
the TIMER0/1 DBGPAUSE clear (captures profile healthy firmware without
it) and 12 mA fast-slew trace pads (default pads pass with a wider eye).
A runtime clk_sys switch does still silently truncate a capture at the
switch, which is why nothing sets the clock at runtime.

Also included: docs/superpowers/followup/pr0000-msc-host-tur-retry.md -
an unbounded Test Unit Ready / Request Sense retry in the MSC host
driver, found while sweeping clocks and deferred to its own PR.
</content>
</entry>
<entry>
<title>test/hil: make main() readable and stop the suite sleeping (#3848)</title>
<updated>2026-08-26T06:41:05Z</updated>
<author>
<name>Ha Thach</name>
<email>thach@tinyusb.org</email>
</author>
<published>2026-08-26T06:41:05Z</published>
<link rel='alternate' type='text/html' href='http://cgit.235523.xyz/tinyusb.git/commit/?id=b15c720ab0a36ee16c1cf7984c7c0f4ccf3a7015'/>
<id>urn:sha1:b15c720ab0a36ee16c1cf7984c7c0f4ccf3a7015</id>
<content type='text'>
Three readability changes with no behaviour change on the healthy path —
every pre-existing test passes untouched.

main() was 368 lines with try/finally three deep, its two abort paths
near-identical 40-line blocks; _abort_report holds that shape once, and the
controller-hint cache and pool construction move to their own helpers.
368 -&gt; 279, test_board 180 -&gt; 151, test_device_usbtest 164 -&gt; 125.

test_hil_bounded.py cost 78s on every commit under test/hil/, mostly one 3s
post-flash settle paid by ten tests against a fake rig. Now 37s.

Fixes two pre-existing defects the extraction exposed: _write_failed_spec was
unguarded inside the abort path, so an OSError there replaced the caller's
RuntimeError and no report was written at all; _save_controller_hints overlaid
a startup snapshot onto the re-read cache, clobbering a concurrent job's newer
values. Also five comments that stated the opposite of the code, and both table
renderers measuring width with len() against two-column status marks.</content>
</entry>
<entry>
<title>hil: make hil_report.md a rendering of hil_report.json (#3840)</title>
<updated>2026-08-25T08:04:42Z</updated>
<author>
<name>Ha Thach</name>
<email>thach@tinyusb.org</email>
</author>
<published>2026-08-25T08:04:42Z</published>
<link rel='alternate' type='text/html' href='http://cgit.235523.xyz/tinyusb.git/commit/?id=375e20090a0a60fd2d47ba6553d189e05482dfea'/>
<id>urn:sha1:375e20090a0a60fd2d47ba6553d189e05482dfea</id>
<content type='text'>
hil_report.json and hil_report.md were written independently. Four writers
produced the markdown and three wrote no JSON at all -- and those three are the
paths where a run died, so a JSON consumer saw nothing exactly when it mattered:
the per-board verdicts an agent hands back reported the whole fleet as "no
report row" while a human read the real story from the markdown.

Every writer now goes through render_report(), so a table can never contain
something the JSON does not. The document gains `scope` (a three-board PR run
and a full run that lost 24 boards were indistinguishable) and `caveat` (how the
run ended). `banner` carries rig health across an --accumulate retry; `caveat`
records how a run ended and must not -- conflating them made a clean retry
publish an abandonment that never happened.

helper/hil_report.py owns the document end to end, dissolving the import cycle
that forced write_timeout_report to compose its own markdown and removing a
duplicate cell classifier kept in sync by hand. hil_summary.py is deleted; its
CLI moves there. hil_ci.sh uploads the sidecar so a remote --accumulate has a
merge bas</content>
</entry>
<entry>
<title>README sponsor list and triage labels (#3842)</title>
<updated>2026-08-25T03:50:36Z</updated>
<author>
<name>Ha Thach</name>
<email>thach@tinyusb.org</email>
</author>
<published>2026-08-25T03:50:36Z</published>
<link rel='alternate' type='text/html' href='http://cgit.235523.xyz/tinyusb.git/commit/?id=60194f8d10ebc9ec1aeba559e359ebe3ca9b756b'/>
<id>urn:sha1:60194f8d10ebc9ec1aeba559e359ebe3ca9b756b</id>
<content type='text'>
</content>
</entry>
<entry>
<title>ci_select: fix the membrowse test's env dependence, and stop HIL unit tests taking the rig (#3846)</title>
<updated>2026-08-25T03:35:45Z</updated>
<author>
<name>Ha Thach</name>
<email>thach@tinyusb.org</email>
</author>
<published>2026-08-25T03:35:45Z</published>
<link rel='alternate' type='text/html' href='http://cgit.235523.xyz/tinyusb.git/commit/?id=b610ff039bafa1040c19d6a11cb04adcb22936e5'/>
<id>urn:sha1:b610ff039bafa1040c19d6a11cb04adcb22936e5</id>
<content type='text'>
test_the_upload_board_can_diverge_from_the_built_board called
get_family_boards without ci=True, so it pinned the developer's set, not the
runner's: the CI skip lists move the one-first pick on three families. It
held locally and went red on its first CI run. Pass ci=True, as
_prune_buildable already does, and pin the runner's twelve.

Rule 2 is a bare test/hil/ prefix, so the harness's own unit tests booked the
full 27-board rig for diffs that cannot reach it. Carve test/hil/test/** out
to rule 1b, beside test/{fuzz,unit-test}/**; the harness itself is untouched.
A test pins that directory's file list, so anything added there that the rig
does read fails rather than silently skipping hardware. Rule table updated in
the spec and its carbon in the docstring.</content>
</entry>
<entry>
<title>ci: an empty selection must build nothing, plus selector follow-ups (#3845)</title>
<updated>2026-08-25T02:46:42Z</updated>
<author>
<name>Ha Thach</name>
<email>thach@tinyusb.org</email>
</author>
<published>2026-08-25T02:46:42Z</published>
<link rel='alternate' type='text/html' href='http://cgit.235523.xyz/tinyusb.git/commit/?id=da255b1d2db10b8f31332a779b2a526f579acee1'/>
<id>urn:sha1:da255b1d2db10b8f31332a779b2a526f579acee1</id>
<content type='text'>
ci: an empty selection must build nothing, plus selector follow-ups

A PR whose build axis legitimately selected nothing rebuilt everything.
build.yml reads .build.families twice - as a |-joined regex, and implicitly
as "is anything selected" - but tested only -z "$FAMILY_REGEX", which an
empty list and a charset-rejected one both satisfy while meaning opposite
things. ci_set_matrix had already returned the correct all-empty matrix;
the fall-open branch discarded it. #3842 and #3840 each spent 74 cmake legs
on it. Branch on the two cases instead, rename FAM_* to FAMILY_*, and cover
the block with a test that extracts it from build.yml and executes it - it
had no test at all, which is how this shipped through two merges.

Follow-ups to the same machinery: glob.escape the repo root at five sites,
so a checkout path containing [ or * stops failing closed; drop the ci-full
label, read after the matrix was already computed and so never functional;
delete 13 mcu:MKL25ZXX / mcu:SAME5X skip tokens matching no board; carry the
rule table in the module docstring, guarded against drift; and pin six
selection behaviours a mutation pass proved untested.

Cut the selector's cost 1.8x (26.0s -&gt; 14.6s) with 0 divergences over 260
paths, and stop scoping the membrowse upload by the PR example filter.</content>
</entry>
</feed>
