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

26 KiB
Raw Blame History

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; 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.