Files
rebbarb/hardware/re-bba-rb/REVIEW.md
T
2026-07-31 22:06:21 +02:00

395 lines
26 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# re-bba-rb hardware review — coverage record
**Purpose of this file:** a complete log of *what has been reviewed and how*, so
a future session/agent does not re-do (or re-litigate) this work. Open action
items live in [TODO.md](TODO.md); this file records **coverage and verdicts**,
including everything that was checked and found *correct*.
**Maintenance rule (binding):** whenever a reviewed circuit is changed, or a new
review/verification is performed, update the relevant section here in the same
commit. If you change something listed as "verified correct", its entry here
must be re-verified or marked stale. TODO.md tracks *what to do*; REVIEW.md
tracks *what has been established*.
Review window: 2026-07-17 … 2026-07-18. Reviewed by Claude (sessions with
Dennis), commits `4704dfb…d0426b3`. Verification tooling: `kicad-cli` 10.0.4
netlist/ERC/DRC/BOM exports, ad-hoc netlist parsers (pins.py/nets.py — parse the
kicadxml netlist into per-component pin→net tables; recreate trivially), PDF
datasheet extraction, WebSearch/WebFetch for parts and reference designs.
---
## 1. Sources reviewed against
| Source | Where | Used for |
|---|---|---|
| TPS562201, TPS2116, TPS22810, AP2112K, FT2232H, 93LC46B, USBLC6-2SC6, W5100S, iCE40UP5K, W25Q32JV, MC-711-H72, PUSB3AB6 datasheets | `datasheets/` (restored from LFS; TPS22810 + PUSB3AB6 added from web) | pin functions, abs max, app circuits |
| WIZnet **W5100S reference schematic** V1.1.0 (signal.com.tr mirror) | fetched, read as image | entire MDI/magnetics section, notes 17 |
| SD Gecko wiring table (gc-forever wiki), SD2SP2-Pro schematic (github), SP1ETH (github), ETH2GC (github), webhdx IDE-EXI v2 thread (gc-forever t=4843) | fetched | SP1 DO/DI direction, 12 V rail viability |
| iceprog source (`YosysHQ/icestorm/iceprog/iceprog.c`) | fetched | FTDI pin convention |
| JLCPCB/LCSC part pages | fetched per part | every C-number claimed below |
## 2. Power sheet (`Power.kicad_sch`) — FULLY REVIEWED, PASS
- **TPS562201 (U3, 12V→GC_3V3 buck)**: EN tied to 12 V **checked against abs
max — legal (VIN/EN max 19 V)**. VFB ref 0.768 V; 33k/10k divider → 3.30 V,
matches DS Table 7-2 (33.2k/10k). L1 3.3 µH = recommended typ; 2×22 µF out
within 2068 µF window; VBST 100 nF pin-to-SW; input 2×10 µF+100 nF. All per
datasheet. Do not re-flag EN-at-12V.
- **TPS2116 (U2, GC/USB 3V3 mux)**: MODE tied to VIN1 = **priority mode**
(checked truth table); ST = open-drain "low when VIN1 not used" → GC_ON high
on GC power, R5 10k pull-up to 3V3 — polarity **correct** for U12-EN +
FPGA-GC_ON use. USB-only fallback verified via truth table (MODE≤0.35 V row).
PR1 divider was marginal (1.10 V vs VREF 1.0±8 %) → **fixed: R3=150k**
(switchover 2.302.70 V). Abs max (6 V) fine.
- **AP2112K-1.2 (U1) / AP2112K-3.3 (U4)**: 1 µF X5R in/out present (DS
requirement), 600 mA rating vs load fine, dropout headroom checked (1.2 V
version has 1.01.3 V dropout — OK from 3.3 V), EN=VIN OK.
- **TPS22810 (U12, ETH_3V3 switch)**: EN never floats (GC_ON has R5 pull-up);
QOD floating = valid config; **CT floating deliberately accepted** — DS
Table 2: rise ~98 µs at VIN=3.3 V even with CT=0 → ~0.5 A inrush into
~15 µF; a CT cap changes nothing at 3.3 V. Closed — do not re-open.
- **12 V input**: D3 SMAJ12A orientation/standoff correct; C65 100 µF is a
**25 V SMD electrolytic** (Lelon VZH101M1ETR-0607 — not THT, assembly OK);
C3/C4 25 V, C6 50 V — ratings verified in BOM.
- **12 V rail viability**: verified against webhdx IDE-EXI v2 / M.2 Loader
("3.3V@2A from 12V rail", gc-forever t=4843) — a shipping SP1 product runs
the same architecture at higher load. Only remaining bench check: inrush
into C65 at GC power-on (expected non-issue).
## 3. USB sheet (`Usb Connector.kicad_sch`) — FULLY REVIEWED, PASS after fixes
- **USB-C (J1, MC-711-H72)**: CC1/CC2 with individual 5.1k pull-downs (correct
UFP), A/B pairs tied, VBUS caps 10µ+1µ+100n, shield to GND. PASS.
- **USBLC6 (D1)**: in-line on D+/D, pass-through orientation correct (the
historic D+/D swap was fixed in an earlier session; verified again), VBUS
pin on USB_VBUS. PASS.
- **FT2232H (U8)**: all power pins verified against DS pin table —
**VPHY/VPLL are +3.3 V pins** (fed 3V3 via FB1/FB2 + 100 nF — CORRECT; an
earlier review note claiming they should be 1.8 V was wrong; do not "fix").
VREGIN=3V3, VREGOUT→VCORE (1.8 V) with 4.7 µF + 3×100 nF on pins 12/37/64;
4×VCCIO decoupled; REF = 12k 1 % to GND (DS requirement); RESET RC
(10k/100 nF); 12 MHz crystal Y1 (CL=12 pF part vs 18 pF caps — re-verified
2026-07-31 against the real YXC datasheet + LCSC page; correct, do not
change); TEST→GND, AGND→GND.
- **EEPROM 93LC46B (U7)**: interface **was wrong** (DO+DI both direct to
EEDATA) → fixed per DS Table 3.4: EE_DO net, R30 2.2k (C25879) to EE_DATA,
R31 10k (C25744) pull-up to 3V3, DI direct. 93LC46B = fixed 16-bit org =
correct for FT2232H. Verified in netlist.
- **EE_CS pull-down (R43, 10 kΩ) — ADDED 2026-07-31.** FT2232H DS Table 3.4
states EECS/EECLK/EEDATA are all **"Tri-State during device reset"**, so CS
floats while the FT2232H is in reset. The Microchip 93LC46B DS is explicit:
*"an external 10 kΩ pull-down protection resistor should be added to the CS
pin"*, and **CS is active-HIGH** (*"A high level selects the device; a low
level deselects the device and forces it into Standby mode"*). **It must be
a pull-DOWN — a pull-UP would hold the EEPROM permanently selected.** Netlist
verified: `EE_CS: R43.1, U7.1, U8.63`.
- **EE_CLK deliberately has NO pull resistor — do not add one.** With CS held
low the device is in Standby, and the 93LC46B DS states *"Before a Start
condition is detected, CS, CLK and DI may change in any combination…
without resulting in any device operation."* A floating clock is harmless
once CS is pulled down. (A reviewer suggested pull-ups on both EE_CLK and
EE_CS; only the CS pull-DOWN is correct.)
- **FT2232H oscillator needs no RExt / no external feedback resistor —
settled, do not add one.** DS Figure 6.5 shows crystal + 2 caps only; FTDI
publishes **no gm, no drive-level and no negative-resistance figure**, so a
drive resistor cannot be sized from their data and their reference does not
use one (feedback is internal). This is a genuine architectural difference
from the W5100S, which explicitly has *no* internal feedback resistor and
models RExt in its Figure 23. Y1 caps stay 18 pF (CL=12 pF part).
- **FTDI↔flash/FPGA config pins**: **rewired 2026-07-18** to stock iceprog
convention: SCK=ADBUS0, MOSI=ADBUS1, MISO=ADBUS2, FLASH_CS=ADBUS4,
CDONE=ADBUS6, CRESET=ADBUS7 (verified against iceprog.c; old ADBUS3/ACBUS0/
ACBUS1 now NC). R11/R12 10k pull-ups on CRESET/CDONE intact.
- **EEPROM contents decision**: ship blank (default 0403:6010 = what iceprog
opens). Documented in TODO.
## 4. FPGA sheet (`Fpga.kicad_sch`) — FULLY REVIEWED, PASS
- **iCE40UP5K (U9, 4 units)**: VCC=1V2 (pins 5/30); VCCIO_0/2 + SPI_VCCIO1 =
3V3, each decoupled; VPP_2V5 on 3V3 (standard practice, iCEbreaker does the
same); VCCPLL via 100 Ω + 100 nF + 10 nF (Lattice filter); CDONE/CRESET 10k
pull-ups; EP→GND.
- **SPI flash (U10 W25Q32JVSS)**: on the hard-SPI pins (1417), WP/HOLD 10k
pull-ups, shared correctly with FT2232 ADBUS0-2/4 (FTDI Hi-Z at reset; FPGA
held in CRESET during FTDI flashing — iCEbreaker-equivalent arrangement).
- **Clocks**: X1 12 MHz oscillator → CLK12 on pin 20 (**G3 global**); EXI_CLK
on pin 44 (**G6 global**). Both verified good pin choices.
- **Pin map** (authoritative, incl. 2026-07-18 debug additions): EXI_MOSI=4
(in), EXI_MISO=3 (out), EXI_CLK=44, EXI_CS=45, EXI_INT=46, ETH bus=2343,
CLK12=20, GC_ON=21, ETH_RST=2, UART FPGA-RX=18/TX=19 (net names are
FTDI-perspective!), LED_G=47, LED_R=48, DBG04=9/10/11/12/6.
- **Debug provisions added 2026-07-18**: D6/D7 LEDs + R37/R38, J4 header,
TP1/2/4/5 (TP3 on ethernet sheet). Netlist-verified (LED polarity, TPs on
global rails, not sheet-local orphans).
## 5. Ethernet sheet (`ethernet.kicad_sch`) — FULLY REVIEWED, PASS after fixes
- **W5100S straps/pins, all verified against DS pin table**: MOD[3:0]=0100 =
"010X" parallel bus ✓; SCLK→GND = documented requirement for bus mode ✓;
pin 32=MOSI/**A0**, pin 33=MISO/**A1** (matches WIZnet ref) ✓; CSn/RDn/WRn
internal pull-ups (IU), DAT0-7 IOU ✓; **INTn is push-pull (type OP)** — no
pull-up needed, do not add one ✓; RSTn is plain input (type IP) → R36 10k
to ETH_3V3 added 2026-07-18.
- **1V2 loop**: 1V2O → C61 4.7 µF → FB3 100 Ω ferrite → 1V2A+1V2D with 5×100 nF
— matches ref topology. 3V3A/3V3D common (ref's inter-rail ferrites are
marked optional; single-net accepted).
- **RSET_BG**: 12.4k 1 % — DS says 12.3k; ACCEPTED (E192 value, WIZnet ref
itself uses 12k+300R; 0.8 % immaterial). Closed.
- **Crystal Y2**: 25 MHz, CL=12 pF part (C9006) vs 18 pF caps → CL≈12 pF ✓
(DS Table 9 wants 12 pF); mandatory external 1 MΩ feedback (R17) present ✓
(DS: "W5100S has no feedback resistor"). **The caps are CORRECT: both
crystals are CL = 12 pF, and `CL = C/2 + Cstray` → 18 pF caps deliver
exactly 12 pF. An attempt on 2026-07-31 to "fix" the caps to 30 pF/10 pF
was a regression against this reviewed item and has been reverted. Do not
change the crystal caps.** The trigger for that mistake was wrong `CL`
metadata in the schematic symbol properties (Y1 said 18 pF, Y2 said 8 pF) —
those properties have now been corrected to match the parts (see below).
⚠️ **Where the CL = 12 pF figure actually comes from — read this before
"re-verifying" it.** It is NOT in `datasheets/Ysx321SL.pdf`. That is the
generic YSX321SL *series* datasheet and its Load Capacitance row reads
**"10pF, 20pF, or specify"** — so opening it and looking for 12 pF gives
the alarming impression that the fitted caps are wrong for either standard
option. These two parts are the "or specify" variants, and CL is fixed by
the **ordering code**, confirmed on the LCSC part pages (re-confirmed
2026-07-31):
- Y1 `X322512MOB4SI` (**C70565**): 12 MHz, **CL 12 pF**, ±10 ppm, ESR 80 Ω
- Y2 `X322525MOB4SI` (**C9006**): 25 MHz, **CL 12 pF**, ±10 ppm, ESR 50 Ω
Everything else in the series datasheet *does* corroborate the review
numbers used elsewhere in this file: C0 = 3 pF max, DL = 200 µW max
(100 µW typ — the basis for the R44 RExt decision), and the ESR bands
(1215 MHz → 80 Ω, 1631 MHz → 50 Ω). Only CL needs the part page.
**The common way to get this wrong** is to apply `C = 2 × CL` = 24 pF and
conclude 18 pF is too small. That omits stray capacitance. The correct
form is `C = 2 × (CL Cstray)` = 2 × (12 3) = **18 pF**, where Cstray
(PCB trace + oscillator pin capacitance) is ~3 pF. If a reviewer says the
caps are low, check whether they subtracted Cstray before re-opening this.
**Residual sensitivity (the real uncertainty, and it is acceptable):** the
match is exact only if Cstray is exactly 3 pF; the realistic range is
25 pF, giving CL_actual 1114 pF against the rated 12 pF. Pulling with
C0 = 3 pF and motional C1 ≈ 6 fF works out to roughly **+14 ppm to
24 ppm**. Against 100BASE-TX's ±100 ppm requirement on the 25 MHz
reference, the worst-case stack (±10 tolerance + ±20 temp + ±3/yr aging +
±24 load) is ~±60 ppm — inside spec with margin. For Y1 the FT2232H's USB
budget (±500 ppm high-speed, ±2500 ppm full-speed) is met by a wide
margin. No change warranted; measure at bring-up if convenient.
- **RExt on XTAL_O (R44, 49.9 Ω) — ADDED 2026-07-31, reverses the earlier
"no series RExt (ref uses 0 Ω) — accepted" decision.** New evidence that
was not available at the original review: the crystal datasheet only
entered the repo on 2026-07-31 and rates the part at **DL = 200 µW max**
(100 µW typ), whereas W5100S Table 9 tells you to select a crystal rated
**500 µW** — i.e. the fitted crystal can be overdriven ~2.5× by the chip.
RExt is the datasheet's own prescribed remedy ("RExt: Resistor for
limiting the drive level (DL)… Excess power can destroy the crystal") and
is modelled in DS Figure 23. Topology follows Figure 23 exactly — RF
(R17) across the **chip pins** XSCI↔XSCO, RExt between XSCO and the
crystal/CL2 node; this required splitting the old XTAL_O net, so U11 pin 11
now sits on a new **XSCO** net:
XTAL_I : C62(CL1), R17(RF), U11.12, Y2.1
XSCO : R17(RF), R44(RExt), U11.11
XTAL_O : C63(CL2), R44(RExt), Y2.3
Value 49.9 Ω chosen from the DS gain-margin formula with the REAL specs
(F=25 MHz, ESR=50 Ω per the 1631 MHz band, C0=3 pF max, CL=12 pF,
gm=16.7 mA/V): **margin 7.53×**, against a DS requirement of ≥5 (the
"6.99 dB" in Table 8 is 10·log₁₀5). **Ceiling is 100 Ω** — 120 Ω already
fails the startup spec. Fitted value is a starting point; part fields are
intentionally blank so it is re-selected/confirmed at bring-up by
measuring drive level.
- **Crystal symbol properties corrected 2026-07-31** (they were metadata-only
errors, no copper impact, but they caused the regression above):
Y1 CL 18 pF→**12 pF**, ESR 50 Ω→**80 Ω** (DS band 1215 MHz),
tol ±30 ppm→**±10 ppm**; Y2 CL 8 pF→**12 pF**, C0 7 pF→**3 pF**,
ESR 30 Ω→**50 Ω** (band 1631 MHz), tol ±50 ppm→**±10 ppm**.
- **Known deviation, accepted**: W5100S DS **Table 8 specifies a CL = 8 pF
crystal** (revision history logs "Modified Load capacitance value
(12p → 8p)"), while **Table 9 still says 12 pF** and was never updated.
The fitted part is 12 pF, matching Table 9. Frequency accuracy is
unaffected (the crystal sees exactly its rated load, so no pulling error);
the only cost is gain margin, which is 7.75× with R44 — well clear of the
≥5 requirement. Accepted; do not re-flag without bench evidence.
- **MDI section — now implements the WIZnet ref schematic item-for-item**:
49.9 Ω×4 (R26R29, C25120) + 100 nF×2 (C18/C19) termination on the PHY-side
nets; 3.3 Ω×4 series dampers (R32R35, C137986) — chain per line:
U11 pin → termination tap → 3.3 Ω → ESD → transformer; C20 100 nF + C21 1 µF
center-tap bypass at J2 pins 4/5. Net naming: PHY_* (chip side) / MDI_*
(damper→ESD) / ETH_* (ESD→jack); **all three groups are in the ETH_DP
netclass** (patterns in `re-bba-rb.kicad_pro`).
- **D4/D5 (USBLC6 on the pairs) — SETTLED, do not re-litigate**: keep. ST
rates USBLC6 for Ethernet; 2.53.5 pF OK at 100BASE-TX. Two deliberate
details: (1) **pin 5 floats on purpose** (lines are 3.3 V-biased and swing
above it; a tied rail would clip peaks; floating rail self-biases and the
6 V zener still clamps); (2) **split nets force flow-through routing**
(pins 1↔6/3↔4 are one internal node) — never merge the nets or stub the
diode. Full reasoning in TODO.md.
- **Magjack J2 (HR911105A)**: transformer spec verified vs DS Table 11
(1:1, 350 µH) ✓; LED wiring (R14/R15 330 Ω anodes to ETH_3V3, cathodes to
LNKn/ACTn pins 17/20) — *assumed* internal LED pinout 9/12=anodes,
10/11=cathodes: **confirm at bring-up** (no HR911105A datasheet in repo).
Pin 8 (Bob-Smith common) + shield tied directly to GND — deviation from
ref's 1 nF/2 kV chassis split, accepted deliberately (GC floats, no earth).
- **Ethernet layout (PCB) — reviewed twice (after rework + after insertion)**:
termination 13 mm from U11 MDI pins; dampers in-line, MDI stubs
1.451.48 mm; D4/D5 flow-through confirmed pad-by-pad; pair skew TX
0.66 mm / RX 1.81 mm (fine at 100M — do not "improve"); pairs on F.Cu over
solid In1 GND, one B.Cu crossover via per N line at the jack; **In1 plane
correctly voided under the magjack cable/isolation side** (deliberate, keep);
C20/C21 against the jack pin column (as close as the plane void allows);
30 GND stitch vias in the corner; RX pair passes ~34 mm from Y2 (accepted,
don't move closer); RSET_BG 2.8 mm with one via to B.Cu (plane-shielded, OK).
## 6. EXI sheet (`exi.kicad_sch`) — FULLY REVIEWED, PASS after DO/DI fix
- **DO/DI direction — SETTLED with hardware evidence, do not re-litigate**:
YAGCD SP1 naming is **console-perspective**: pin 6 DO = GC data out =
adapter MOSI *input*; pin 9 DI = GC data in = adapter MISO *output*.
Evidence: SD Gecko straight-through table (MC pin 5 "DO" → SD CMD input,
pin 7 "DI" → SD DAT0 output) + SD2SP2 (DO → OR gate → CMD). The board was
wired backwards (following a wrong table in `docs/gc_bba_fpga_design.md`,
since corrected); fixed as a pure rename + R21/R25 identity swap, zero
copper changes. Final: J3.6(DO)→R21 22 Ω→FPGA pin 4 = EXI_MOSI;
J3.9(DI)→R25 33 Ω→FPGA pin 3 = EXI_MISO.
- **PUSB3AB6 (D2)**: pinout verified vs Nexperia DS (1=CH1, 2=GND any-pin,
37=CH26); DFN2111-7 matches the SON50P110X213X50-7 footprint; 0.15 pF/ch;
rated for 3.3 V lines. Note: BOM part C49383400 is the **ElecSuper clone**
("(ES)"), pin-compatible — bring-up suspect only if ESD behaviour odd.
- **EXTIN**: 10k (R18) to **SP1_3V3 (the GC's own rail)** — correct, doesn't
back-power. **12 V**: J3.5 → **12V_RAW → U13 eFuse → 12V_EXI** (see next
bullet; was a straight J3.5→12V_EXI connection before 2026-07-31). J3.8
(second 3.3 V pin) deliberately NC. Series elements: R24 100 Ω on EXI_CLK
(input damping), R21/R25 as above. INT (J3.3) driven by FPGA pin 46 —
gateware should use open-drain emulation (TODO).
- **12 V inrush limiter (U13, TPS25961 eFuse) — ADDED 2026-07-31** to protect
the GameCube's 12 V supply from the surge charging C65+C3+C4+C6 (**120 µF**)
at plug-in/power-on. Topology (netlist-verified):
12V_RAW : J3.5, D3(TVS), C66(Cin 100nF), R46, U13.6 IN
12V_EXI : U13.1 OUT, C65, C3, C4, C6, U3.3 VIN, U3.5 EN
EFUSE_EN : R46, R47, U13.5 EN/UVLO
EFUSE_ILIM: R45, U13.3 ILIM
GND : U13.2 OVLO, U13.4 GND, R45.2, R47.2, C66.2
**D3 (SMAJ12A TVS) stays on the INPUT side on purpose** — it clamps
GC-side surges before they reach the eFuse's 21 V absolute maximum. **C65
is on the OUTPUT side on purpose** — it is the bulk cap whose inrush we are
rate-limiting; moving it upstream would defeat the whole circuit.
**U3 (buck) needed no change**: because the eFuse was inserted *upstream of
the existing 12V_EXI net name*, U3's VIN and EN both land on the switched
rail automatically.
- **Inrush is set by the device's INTERNAL slew rate, not an external cap.**
dV/dt = 5.17 V/ms (fixed, typical) ⇒ I = C·dV/dt = 120 µF × 5.17 V/ms =
**621 mA** over a 2.3 ms ramp. R_ILIM only matters if it is set *below*
that figure.
- **R45 = 100 kΩ ⇒ I_LIM ≈ 500 mA** (datasheet Equation 6: R_ILIM =
50000/I_LIM; 100 kΩ is one of TI's own characterised points, 0.516 A typ,
±18% ⇒ 0.420.61 A). This both caps inrush at 500 mA and gives **3.8×
headroom** over the ~130 mA steady-state 12 V draw. 100 kΩ is deliberately
inside a valid ON-resistance bin — **Table 7-1 forbids 58.866.7 kΩ,
111142 kΩ and 250500 kΩ**; do not "round" R45 into those bands.
- **Startup dissipation is safe**: FET energy = ½CV² = **8.65 mJ** regardless
of ramp rate ⇒ ~3.0 W average over 2.9 ms. Figure 6-31 puts time-to-thermal-
shutdown at ~3 W far beyond 100 ms. Steady-state loss is 106 mΩ × 0.13² =
**1.8 mW**, negligible.
- **R46/R47 = 620 k/100 k ⇒ UVLO on at 8.9 V typ (9.2 V worst case), off at
8.2 V**, 16.7 µA leakage. **This is deliberately well below 12 V — do not
"improve" it upward.** Two reasons: (a) the EN/UVLO threshold is specified
1.21.28 V, so an ~11.4 V setting has a worst case of 11.78 V and could
refuse to start on a healthy console once PSU tolerance is added; (b) more
importantly the falling threshold scales with it (91% of rising), and the
eFuse pulls 500 mA during the 2.9 ms ramp — at a ~11 V setting a source
impedance of only ~1.2 Ω would sag the rail below drop-out mid-ramp,
causing retry oscillation that may never complete startup. The 620 k/100 k
setting tolerates **3.85 V of sag**. If tighter supervision is ever wanted,
680 k/100 k (9.7 V on, 3.2 V sag margin) is the furthest to push it —
beyond that use an FPGA-read divider, not the eFuse enable.
- **OVLO tied directly to GND** = internal fixed OV threshold. Note the OVLO
pin's absolute maximum is only **6.5 V** — it must never see the 12 V rail.
- **Thermal pad must connect to the GND plane** (datasheet requirement); the
chosen footprint is the `_ThermalVias` variant for this reason.
- Symbol: no TPS25961 exists in the KiCad libraries (the stock `TPS2596xx`
is an 8-pin SO-8 with a different pinout — do not substitute it), so
`hardware/TPS25961.kicad_sym` was created and registered in
`sym-lib-table`. Footprint `Package_SON:WSON-6-1EP_2x2mm_P0.65mm_EP1x1.6mm_ThermalVias`.
- **EXI series-resistor assignment — VERIFIED AGAIN 2026-07-31 against the
netlist + gateware pin directions, do not swap.** The DO/DI fix above moved
the *driven* line from J3.6 to J3.9, and the R21/R25 identities were swapped
to follow it. Confirmed live:
EXI_MISO : U9.3 (synth.py dir="o", FPGA drives) -> R25 33 Ω -> J3.9 (DI)
EXI_MOSI : J3.6 (DO, GC drives) -> R21 22 Ω -> U9.4 (dir="i", FPGA rx)
**33 Ω belongs on MISO** because that is the only line this board drives, so
it is genuine source termination (33 Ω + ~30 Ω iCE40 output ≈ 60 Ω into a
~50 Ω trace — mildly over-damped, the safe direction for EMI on a short
run). **22 Ω belongs on MOSI**, where the GC is the driver at the far side
of a connector we do not control; source termination is impossible there, so
the resistor only limits clamp current and damps at the receiver, a role
where the exact value matters much less. Swapping them would under-terminate
the one line we actually drive. This is the exact trap a future reader may
fall into after seeing the console-perspective DO/DI naming — the values
are already on the correct lines.
- **CS deliberately has NO series resistor — known asymmetry, not an
oversight.** All three of EXI_CLK, EXI_MOSI and EXI_CS are GC-driven inputs,
but only CLK (R24 100 Ω) and MOSI (R21 22 Ω) carry damping; J3.10 goes
straight to U9.45. CS is essentially static within a transaction (it frames
the transfer rather than toggling per bit), so receiver ringing matters far
less than on the clock or data lines. Recorded so it is not "fixed" on the
assumption it was forgotten; add one only if bring-up shows CS-edge noise.
- **J3 footprint provenance**: 12 contacts, 1 mm effective pitch, two
staggered depth rows, **front side only**, fingers to the board edge (the
`.kicad_dru` has a J3 edge-clearance exception for this). Geometry comes
from the physical sp1_test_plug iterations — the test-plug project has no
reusable footprint to diff (it only carries FFC breakouts). Outline/
protrusion fit remain bench checks.
## 7. PCB global / JLCPCB — REVIEWED, PASS
- **DRC**: 0 errors / 0 unconnected / 0 parity as of each review point
(remaining parity items = the 11 debug/fix footprints awaiting placement +
3 FTDI reroutes + R3 value sync — all listed by F8). Warnings are
silkscreen cosmetics only (~150; JLC auto-clips).
- **JLC capability floor**: encoded as error-severity rules in
`re-bba-rb.kicad_dru` (0.09 mm trace/space, 0.15 mm drill, 0.2 mm
hole-to-copper etc.) — passing. Diff-pair impedance rules (USB 90 Ω,
ETH 100 Ω) are error-severity and passing; they police PHY_*/MDI_*/ETH_*
and FT_D*/USB_D* via netclass patterns.
- **Stackup**: 7628 prepreg 0.2104 mm / 0.6 mm core ≈ 1.14 mm total =
**JLC04121H-7628** (JLC nominal 1.2 mm, satisfies SP1 slot). Order with
ENIG + gold fingers + 45° bevel (copper_finish field says "None" —
cosmetic only). Board 102×33.4 mm.
- **Fiducials**: FID13 placed 2026-07-18 (board-only footprints) at
(195, 68.5)/(131, 48)/(163, 44.5) — track-clearance verified after a first
placement attempt collided with tracks (caught by DRC).
- **Zones**: In1.Cu = single solid GND plane; In2.Cu = 3V3 + ETH_3V3
(priority 1) islands. No other zones.
## 8. BOM — FULLY AUDITED (netlist-vs-BOM count check passes)
All orderable components carry Footprint+Value+MPN+LCSC+Manufacturer.
Deliberate `in_bom no`: J3 (gold fingers), J4, TP15 — the **only** allowed
netlist/BOM delta. Spot-verified on JLC/LCSC: crystals CL=12 pF (C70565/
C9006, Basic), 49.9 Ω C25120, 3.3 Ω C137986 (YAGEO, Extended), 2.2k C25879,
150k C25755, LEDs C72043/C2286 (Basic), 12 V-rail ratings, 1 % tolerances on
R1R4/R10/R16/R26R38. D2 = ElecSuper clone (see §6).
## 9. Explicitly NOT reviewed / remaining risk (don't claim coverage)
- **Mechanical fit** (outline vs slot, RJ45/USB-C protrusion) — bench only.
- **HR911105A internal LED pinout** — assumed, confirm at bring-up.
- **W5100S register map in the gateware** — written from memory per
CLAUDE.md; confirm at bring-up.
- **Actual power-on behaviour** (12 V inrush, mux transitions under load,
FT2232+iCE40 enumeration) — bench only.
- **Gateware** (board PCF, GC_ON gating, UART crossover, INT drive style,
LED/DBG driving) — tracked in TODO, not part of the hardware review.
- **`re-bba-rb.kicad_pcb.old.*` / `.history/`** — deleted/ignored, never
reviewed for content.
## 10. Session/history notes an agent may need
- `datasheets/` was once deleted by an errant commit and restored from the
local LFS object store; recovery recipe is in the git log of `4704dfb`.
- A stale case-colliding `power.kicad_sch` was removed (Windows checkout
hazard — never add files differing only in case).
- The SP1 pin table in `docs/gc_bba_fpga_design.md` was the root cause of the
DO/DI swap and has been corrected — trust it now; it carries a "do not
swap" note with the evidence.