svf: initial SVF player + svf_play command

New modules/svf/ plays the single-device SVF subset over the bscan_*
primitives: SIR/SDR with masked TDO compare, RUNTEST (TCK/SEC), STATE
(RESET/IDLE), ENDIR/ENDDR (IDLE only), HIR/HDR/TIR/TDR (length 0), TRST,
FREQUENCY. Exposed as `svf_play <file>`. It warms up the FTDI link
first — the MPSSE's first data read after open returns stale FIFO
content, normally hidden because jtag_scan runs before anything.

Also adds the bscan_tap_reset prototype. Validated on the live IGLOO2
M2GL010T: a hand-written IDCODE-check SVF passes (masked compare) and a
deliberately wrong one is caught at the mismatching bit. A generic
program dispatch off the prog tag, multi-device chains and non-IDLE end
states are still TODO.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-05-24 14:36:41 +02:00
parent 37efccaf50
commit c77d86efd0
7 changed files with 541 additions and 0 deletions

View File

@@ -242,6 +242,18 @@ progress and partial ops. The equivalent SVF ("indirect flash") is huge
### The SVF player (the real work)
**Status: initial implementation in `modules/svf/` + the `svf_play <file>`
command.** Supports the single-device subset: `SIR`/`SDR` with
`TDI`/`TDO`/`MASK`/`SMASK` and the masked TDO compare, `RUNTEST`
(TCK/SCK + SEC), `STATE` (RESET/IDLE), `ENDIR`/`ENDDR` (IDLE only),
`HIR/HDR/TIR/TDR` (length 0 only), `TRST`, `FREQUENCY`. Built on the
`bscan_*` primitives (`shift_ir`/`shift_dr`/`tap_reset`/`idle_cycles`).
Validated on the live IGLOO2 with a hand-written IDCODE-check SVF (pass
and a deliberate mismatch). `svf_play` warms up the FTDI link first (its
first data read after open returns stale FIFO content). Not yet wired
into a generic `program` dispatch off the `prog` tag; no multi-device
headers, no non-IDLE end states. Remaining design below.
A player is more than shifting bits. It must handle:
- `SIR`/`SDR` with `TDI`/`TDO`/`MASK` — the **masked TDO compare** is
what detects prog/erase failures; that's the main addition over