Skip to the content
PCBKitNew board
2 layers53 × 72 mmIpod cf udma, the printed circuit board in 3D

FPGA interposer that makes flash storage fully work in FireWire iPods (1G/2G): CF or SD, restore, sync, playback. The UDMA-CRC ASIC/PLD that TI's TSB43AA82 reference design called for in 2001.

Size
53 × 72 mm
Copper layers
2
Thickness
1.6 mm
Parts
32
Nets
73
Pads
285
Tracks, vias
778, 92
Pours
2
Routed
Yes
KiCad
KiCad 10.0 (file 20260206)
Created
11 Jul 2026
Updated
20 Sep 2026

Overview

Ipod cf udma is an open-source printed circuit board by dantidote, from the dantidote/sphinxmoth repository on GitHub, published under the MIT licence. It is a 2-layer board of 53 × 72 mm with 32 parts on 73 nets, routed with 778 tracks and 92 vias.

It is built around the LCMXO2-2000HC-4TG100C and AP2112K-3.3. Its parts include 18 capacitors, 6 connectors, 5 resistors, 2 ICs and 1 diode. It belongs with the fPGA and programmable logic and retro computing and games boards and the FPGA and CPLD boards of this library.

Main components

2

README

README.md

Sphinxmoth

The little board that answers the iSphynxII: a working flash mod for FireWire iPods (1st/2nd gen)

An active FPGA interposer that lets flash storage (CF, or SD behind an adapter) fully replace the 1.8″ hard drive in a 1st/2nd-generation iPod: boot, standalone playback, and full-speed FireWire restore + iTunes sync.

This is the first time in the ~25 years since these iPods shipped that all of that works at once on flash storage. Passive adapters never could, and it turns out they never could have. The reason was documented by Texas Instruments in 2001.

A note on qualifications: I had none. This is the first PCB I've ever had made, I leaned on the autorouter more than any self-respecting layout engineer would admit, and before this project I'd never programmed an FPGA. This board isn't pretty; it was never meant to be. It exists to answer one question: is this possible at all?

frontback

The assembled v1 board: FPGA side and CF side. And the point of it all:

iPod About screen: 256 GB

Copying a 1.8 GB file to the iPod over FireWire, about 2 minutes

A 1.8 GB file at roughly 15 MB/s over FireWire, through the bridge. No, the 1st gen can't play it. That's not the point.

Buying an assembled board

Sphinxmoth is open source and stays that way: the gerbers, BOM, gateware and a hardware-validated bitstream are all in this repo, under licenses (MIT and CERN-OHL-P-2.0) that let you build your own, and sell them if you want to. Please do.

If you would rather not order a PCB, source a MachXO2, and go find a JTAG probe, I sell pre-assembled, pre-flashed boards at wunkuslabs.com.

Why the cheap green CF/IDE adapters never worked

FireWire-era iPods (1G/2G, and the 3G) use TI's TSB43AA82 "iSphynxII" FireWire-to-ATA bridge. From TI's own TSB43AA82 Storage Reference Design:

It should be noted that iSphynxII does not implement the 16-bit CRC value required at the end of ATA ultraDMA transfers. There are two ways to deal with this. The first is to use HDDs that allow transfers to continue even if the correct CRC value is not received. The second is to insert an ASIC/PLD between iSphynxII and the HDD that calculates the CRC as the transfer is taking place and drives it to the drive at the appropriate time. This reference design assumes the HDD does not require the CRC.

Apple took TI's first option: the original Toshiba 1.8″ drives tolerate the missing CRC. Every CF card enforces it. So the moment a flash device sees an Ultra-DMA burst from the iSphynxII, it (correctly) rejects the transfer with an interface-CRC error, and no passive adapter can ever fix that, because the CRC simply isn't on the wire.

This project is the "ASIC/PLD between iSphynxII and the HDD" that TI described, built 25 years later. A Lattice MachXO2 sits in the datapath, re-originates every UDMA burst, and supplies the CRC the iSphynxII omits.

But the CRC is only the first wall. Credit to Reddit user SquashHour9940, whose excellent investigation (Further research about flash modified iPod 1st/2nd Gen syncing problem) independently mapped two more layers:

  1. Removable vs. fixed media: consumer CF cards report themselves as removable media; the iPod firmware and iTunes want a fixed disk. Industrial CF cards (fixed-disk firmware) get past this gate; consumer cards don't.
  2. The TSB43AA82 falls back to slow PIO when it detects a CF card: staged 1 MB at a time through the iPod's tiny SRAM, capping passive-adapter FireWire transfers around 300 KB/s even when everything else works.

And our bring-up found a fourth layer nobody had hit before, because nobody had gotten this far:

  1. The PP5002 CPU (the retail OS) is a DMA host too: its UDMA write strobes are electrically hostile (ringing, data-dependent crosstalk) and corrupted the filesystem on every standalone boot until this bridge learned to detect that master and quietly demote it to PIO.

This bridge defeats all four: it originates the missing CRC, rewrites the card's IDENTIFY on the wire (media type and DMA capabilities, per master; a removable or CFA-signature word 0 becomes a classic fixed-disk value, checksum corrected), keeps the DMA path alive at full speed, and gives each of the iPod's two very different bus masters the bus discipline it actually needs. The fixed-disk rewrite has been tested end-to-end with a retail Lexar Professional 800x (32 GB, UDMA 7), the exact card class the community documented as removable-reporting: it restores and syncs through the bridge like any industrial card.

Status

v1 board (CF slot, board/)Working. Boots, plays, restores, syncs. Reads 19 MB/s, writes 4.6 MB/s over FireWire. Running a 256 GB SD (via FC1307A CF adapter) today.
Validated bitstreamreleases/v1.0-first-music/ (build outputs are not run-deterministic; this exact binary is the hardware-proven one)
v2 (native microSD)Being considered. microSD would be nice, but at first glance it needs a larger/more expensive FPGA (the v1 XO2-2000 is 89% full and the disk logic moves on-chip; the draft targets an XO2-7000). Exploratory work lives on the v2-native-sd branch: unfabbed, unvalidated, promise-free. Do not build it.

Tested on: iPod 1st gen (firmware 1.5), Transcend industrial 2 GB CF, FC1307A SD-CF adapter + 256 GB SD, Mac OS X 10.6 + iTunes over FireWire. 2G/3G iPods use the same TSB43AA82 and should work; reports welcome.

Rockbox

Rockbox runs on a Sphinxmoth iPod, with two board-specific wrinkles: the Rockbox 4.0 release crashes at boot on every 1G/2G (an unaligned store in the PP5002 scheduler, fixed upstream after 4.0), and Rockbox's stock IDE timing is too fast for the v1.1-mg132-fix3b bridge image, which adds about 45 ns to every register read through its PIO synchroniser (init fails with ATA error: -11 or -32). Newer bridge images pass PIO through the raw pads and need nothing but the crash fix.

Everything Rockbox-related lives in its own repo: sphinxmoth-rockbox: the ATA driver patch, tested builds for boards already in the field on fix3b, and a workflow that rebuilds them on each upstream Rockbox release. The same files are served from wunkuslabs.com/guide.

How it works (the short version)

The FPGA discovered during bring-up that it serves three masters, and it gives each a different personality:

MasterHow it's detectedWhat it gets
iSphynxII (FireWire)never issues EXECUTE DIAGNOSTICFull UDMA2 bridge: bursts re-timed through a FIFO, end-of-burst CRC generated, multi-burst writes, a deliberately "bouncy" flow-control throttle (it abandons bursts on long clean pauses)
PP5002 (retail OS)opens with C90 EXECUTE DIAGNOSTICIDENTIFY patched in flight (DMA capability words zeroed, checksum fixed) → the OS falls back to PIO READ/WRITE MULTIPLE through a transparent passthrough
CF cardn/aAlways runs UDMA2, regardless of what either host negotiated (SET FEATURES sector-count byte rewritten on the wire)

Plus the small in-flight surgeries each master demanded: BSY served for status polls mid-command, CS/DA forced idle at the card during bridged bursts, strict data setup/hold on every strobe edge, spec-ordered burst termination, and STANDBY/SLEEP commands rewritten to CHECK POWER MODE (retail cards honor them, then never wake the way the OS expects; the original drive woke transparently). The testbenches encode all of it: the card model sector-terminates, pauses, checks CRC and enforces tSS; the host model parks on the status register, polls, and rings its strobe line. Every cruelty in the sims reproduced a bug first found on real hardware during a two-day, fourteen-bug bring-up.

Building it

Or skip it: assembled, flashed and tested boards are for sale.

Board (v1): upload board/ipod-cf-udma-gerbers.zip to any fab (2 layer, 53×72 mm, 1.6 or 0.8 mm). CF socket (J2) is on the BACK; everything else on the front. board/BOM.csv + board/ipod-cf-udma-pos.csv for assembly.

Bitstream: Lattice Diamond 3.14, cd diamond && pnmainc rebuild.tcl → impl1/ipodboard_impl1.jed. Or just flash releases/v1.0-first-music/.

Programming: Tag-Connect TC2030-IDC-NL pads (J3, zero height) to any JTAG probe Diamond Programmer / openFPGALoader speaks. The MachXO2 configures from internal flash; program once, done.

Power: bus-powered from the iPod's 3.3 V. J6 shunt selects iPod (1-2) or bench USB-C (2-3); never both. The green LED blips a slow heartbeat when idle and flashes while data is moving through the bridge. The UART header (J5, 115200 8N1) streams the gateware's event log; if something misbehaves, that log is the microscope this whole project was debugged through.

Simulation: Icarus Verilog: cd gateware && iverilog -g2012 -DSIM -I rtl -o wr.vvp sim/tb_full_write.v rtl/*.v && vvp wr.vvp (likewise tb_full_read.v).

Repository layout

PathContents
board/v1 board: KiCad project, fabbed gerbers, BOM, schematic PDF, DRC/ERC
gateware/rtl/the bridge RTL (interposer_top + engines)
gateware/sim/hardware-calibrated torture testbenches
diamond/Lattice Diamond build project
releases/hardware-validated bitstreams
v2-native-sd branchexploratory native-microSD v2: board draft, ata_device/sd_host cores, design doc

Known v1 errata

  • J2 pin 39 (−CSEL) must be grounded (already fixed in these gerbers).
  • J2 pins 45/46 (−DASP/−PDIAG) float; some cards may care (10 k pull-ups to 3.3 V recommended).
  • The USB-C shield holes share the CF socket's courtyard; desoldering J4 heat-stresses socket joints (ask us how we know). v2 deletes both parts.
  • DD-bus ↔ control-line crosstalk exists at the margins; the gateware routes around it (PIO for the PP5002), v2 adds proper guarding.

Credits

License

Gateware and software: MIT. Hardware (schematics, board files, gerbers): CERN-OHL-P-2.0. No warranty; a 25-year-old iPod is involved.

Parts

32
QtyValueFootprintReferences
12100nFCapacitor_SMD:C_0402_1005MetricC1, C2, C3, C4, C6, C7, C8, C9, C11, C12, C13, C14
210kResistor_SMD:R_0402_1005MetricR1, R2
210uFCapacitor_SMD:C_0805_2012MetricC10, C16
21uFC_0402_1005MetricC17, C18
25.1kR_0402_1005MetricR8, R9
11uFCapacitor_SMD:C_0402_1005MetricC15
1330RResistor_SMD:R_0402_1005MetricR7
14.7uFCapacitor_SMD:C_0603_1608MetricC5
1AP2112K-3.3SOT-23-5U2
1CF socketConnector_Card:CF-Card_3M_N7E50-E516xx-30J2
1LCMXO2-2000HC-4TG100CPackage_QFP:TQFP-100_14x14mm_P0.5mmU1
1LEDLED_SMD:LED_0603_1608MetricD1
1PWR_SELPinHeader_1x03_P1.27mm_Vertical_SMD_Pin1LeftJ6
1TC2030Tag-Connect_TC2030-IDC-NL_2x03_P1.27mm_VerticalJ3
1UARTPinHeader_1x04_P1.27mm_Vertical_SMD_Pin1LeftJ5
1USB-CUSB_C_Receptacle_GCT_USB4125-xx-x_6P_TopMnt_HorizontalJ4
1iPod 1.8in 50-pininterposer:iPod_1.8in_50pinJ1

Questions

How big is the Ipod cf udma PCB?

It measures 53 × 72 mm and has 2 copper layers, 1.6 mm thick.

What parts does the Ipod cf udma use?

32 parts, built around the LCMXO2-2000HC-4TG100C and AP2112K-3.3. 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.

Where can I download the Ipod cf udma KiCad files?

From the dantidote/sphinxmoth repository on GitHub, at the commit this page was made from: the board is board/ipod-cf-udma.kicad_pcb and its schematic board/ipod-cf-udma.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the Ipod cf udma design in my own project?

Its repository publishes it under the MIT licence: you may reuse it on that licence's terms (keep the author's notice, and for a copyleft licence share your changes alike).

Similar boards

  • 2 layers26 × 30 mmMicrocontroller, the printed circuit board in 3D

    Microcontroller

    FrameworkComputer/ExpansionCards

    Reference designs and documentation to create Expansion Cards for the Framework Laptop

    34 parts1.1kCC-BY-4.0
  • 2 layers53.2 × 24.8 mmPicoLink, the printed circuit board in 3D

    PicoLink

    ErichStyger/mcuoneclipse

    McuOnEclipse projects and examples

    46 parts765
  • 2 layers36 × 20 mmCombined, the printed circuit board in 3D

    Combined

    adamb314/ServoProject

    Getting the most out of your hobby servo

    24 parts545
  • 2 layers25 × 25 mmSmallEncoder, the printed circuit board in 3D

    SmallEncoder

    DDeGonge/OS-ARM

    This arm is not industrial and it will not be fast, but that is not my goal. But it will hopefully be a very nice looking arm fully capable of 6dof motion, cheap enough to keep it accessable but capable enough to…

    17 parts498MIT
  • 4 layers70 × 72 mmSPINC AA Charger, the printed circuit board in 3D

    SPINC AA Charger

    CoretechR/SPINC

    DIY Automatic Battery Charger Using RP2040

    101 parts467GPL-3.0
  • 4 layers60.8 × 61.3 mmOS3M Mouse, the printed circuit board in 3D

    OS3M Mouse

    spoter368/os3m-hardware

    All the hardware needed to build your own OS3M Mouse!

    51 parts399
  • 4 layers74 × 104 mmBeepy, the printed circuit board in 3D

    Beepy

    sqfmi/beepy-hardware

    Beepy Hardware

    160 parts348MIT