
24g2usb rp2350zero
joypad-ai/joypad-os
Universal controller firmware for building adapters, dongles, and custom controllers.

Neo Geo Pocket Color link cable, reverse-engineered — play NGP/NGPC games linked online in your browser.
Ngpc link sniffer is an open-source printed circuit board by caioluders, from the caioluders/ngp-link repository on GitHub. It is a 2-layer board of 60 × 24 mm with 4 parts on 5 nets, routed with 53 tracks and 10 vias.
A single passive 2-layer PCB that replaces the Neo Geo Pocket Color link
cable: it wires two NGPC EXT ports together as a null-modem crossover while
exposing every signal on passive tap headers for a logic analyzer or 3.3 V
USB-UART adapter. No original cable required. See ../ngpc-link-sniffer-spec.md
for the full design rationale.
Generated and validated with KiCad 10.0.5. DRC and ERC both pass with 0 violations.
| File | What it is |
|---|---|
ngpc-link-sniffer.kicad_pro | Project |
ngpc-link-sniffer.kicad_sch | Schematic (4 connectors + net labels) |
ngpc-link-sniffer.kicad_pcb | Board layout |
symbols/ngpc.kicad_sym | Local symbol library |
footprints/ngpc.pretty/ | Custom footprints (edge connector + tap header) |
gerbers/ | Fabrication output (gerbers + Excellon drill) |
scripts/gen_pcb.py | Regenerates the .kicad_pcb (run with KiCad's python) |
scripts/gen_sch.py | Regenerates the .kicad_sch (run with system python3) |
preview_*.png | 3D renders |
Physical NGPC EXT pinout (identical on both consoles):
1=TXD0 2=RXD0 3=GND 4=/RTS0 5=/CTS0 — GND is the centre contact (pin 3)
(see docs/reference/cable.md).
Null-modem crossover (in copper, not in the pad numbering):
SIDE A 1 TXD ───────────── cross ───────────── 2 RXD SIDE B
SIDE A 2 RXD ───────────── cross ───────────── 1 TXD SIDE B
SIDE A 3 GND ─────────── straight ─────────── 3 GND SIDE B
SIDE A 4 /RTS ───────────── cross ───────────── 5 /CTS SIDE B
SIDE A 5 /CTS ───────────── cross ───────────── 4 /RTS SIDE BThe two crossing pairs (TXD/RXD and /CTS//RTS) run on opposite copper layers, so they cross without shorting and without signal vias — exactly the trick the spec suggests. GND is straight on F.Cu.
Tap headers each expose their own side's five signals before the
crossover, labeled TX / RX / GND / RTS / CTS. Each header pin sits directly on
its signal trace (fan out to 2.54 mm, tap, fan back) — no stubs.
TAP A (J3): SIDE A signalsTAP B (J4): SIDE B signalsFor "PC as fake console" mode (spec Scenario 2), wire a 3.3 V USB-UART to TAP A:
UART TX → RX pin, UART RX → TX pin, RTS → CTS pin, CTS → RTS pin,
GND → GND.
Each of the 5 edge contacts has a pad on both F.Cu and B.Cu, tied together by a via placed inside the body at X=9 mm / X=51 mm — deliberately kept out of the pad's sliding-contact zone so there's no hole in the gold where the console spring touches.
The spec lists several EXT-port dimensions as still TBD. This board uses these
placeholder values (edit scripts/gen_pcb.py and the footprint, then rerun):
| Symbol | Meaning | Value used | Status |
|---|---|---|---|
| C | pin pitch | 1.5 mm | measured (spec) |
| G | slot opening width | 12 mm → tongue = 11.5 mm | measured (female slot) |
| E | pad width | 1.0 mm | PLACEHOLDER |
| F | pad length | 5.0 mm | PLACEHOLDER (from GB-link reference) |
| D | first-pin offset | pads centered on tongue | PLACEHOLDER |
| B | insertion depth | tongue = 8 mm, pads 1 mm from tip | PLACEHOLDER |
| H | keying/notch | none | not yet known |
Board is currently 60 mm × 24 mm, tongues 8 mm long × 11.5 mm wide (to fill the measured 12 mm slot with ~0.25 mm clearance per side), 1 mm insertion chamfers. The 6 mm pad cluster stays centred in the tongue. Overall length is arbitrary (rigid bridge between two consoles) — set it to whatever suits your bench.
Also verify with a multimeter that pin 3 (centre) = GND against the TMP95C061 SIO0 pins on the mainboard, and confirm the left-to-right pad order and which board face the port contacts, before committing to fab. This is why pads are on both faces and why the revision is v0.1.
gerbers/ to JLCPCB / OSHPark / PCBWay# PCB (needs KiCad's bundled python / pcbnew):
flatpak run --command=python3 org.kicad.KiCad scripts/gen_pcb.py
# Schematic (plain python3):
python3 scripts/gen_sch.py
# Validate:
flatpak run --command=kicad-cli org.kicad.KiCad pcb drc ngpc-link-sniffer.kicad_pcb
flatpak run --command=kicad-cli org.kicad.KiCad sch erc ngpc-link-sniffer.kicad_schMIT / CERN-OHL-P (permissive open hardware).
| Qty | Value | Footprint | References |
|---|---|---|---|
| 2 | NGPC_EXT | NGPC_EXT_EdgeConnector | J1, J2 |
| 2 | Tap_1x05 | PinHeader_1x05_P2.54mm_Tap | J3, J4 |

joypad-ai/joypad-os
Universal controller firmware for building adapters, dongles, and custom controllers.


hackclub/OnBoard
💡 Join 1,000 teenagers and make your first PCB with a $100 grant!

tardate/LittleArduinoProjects
a collection of "Little Electronic & Arduino Projects", most involving electronics or an Arduino in one way or another!

drandyhaas/KiCadRoutingTools
A set of Python/Rust tools to aid routing in KiCad

osy/XG_Mobile_Station
Open source eGPU dock for ROG Ally and ROG Flow

Luos-io/luos_engine
Open-source and real-time orchestrator for cyber-physical-systems, to easily design, test and deploy embedded applications and digital twins.

NVNTLabs/switch2-SDEX2M2
Micro SD Express to M.2 NVME Adapter for Nintendo Switch 2
It measures 60 × 24 mm and has 2 copper layers, 1 mm thick.
4 parts. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.
From the caioluders/ngp-link repository on GitHub, at the commit this page was made from: the board is ngpc_link_sniffer/hardware/ngpc-link-sniffer.kicad_pcb and its schematic ngpc_link_sniffer/hardware/ngpc-link-sniffer.kicad_sch. PCBKit opens the board in the browser, with nothing to install.
Its repository states no licence, so its author keeps all rights: ask caioluders before reusing the design.