Skip to the content
PCBKitNew board
4 layers100 × 55 mmProfile drive, the printed circuit board in 3D

This is a replacement for an Apple ProFile hard drive. It plugs into the cable from an Apple ][ ProFile interface card, answers the card the way a real ProFile does, and serves blocks from disk images on a microSD card.

Size
100 × 55 mm
Copper layers
4
Thickness
1.6 mm
Parts
127
Nets
185
Pads
541
Tracks, vias
1,427, 348
Pours
17
Routed
Yes
KiCad
KiCad 10.0 (file 20260206)
Created
25 Oct 2026
Updated
26 Oct 2026

Overview

Profile drive is an open-source printed circuit board by JorjBauer, from the JorjBauer/profile-emulator repository on GitHub, published under the MIT licence. It is a 4-layer board of 100 × 55 mm with 127 parts on 185 nets, routed with 1,427 tracks and 348 vias.

It is built around the LFE5U-12F-6TG144C, W25Q128JVSIQ and SMF5.0A. Its parts include 52 resistors, 39 capacitors, 9 diodes, 7 ICs and 7 connectors. It belongs with the FPGA and CPLD boards of this library.

Main components

3

README

README.md

ProFile emulator

This is a replacement for an Apple ProFile hard drive. It plugs into the cable from an Apple ][ ProFile interface card, answers the card the way a real ProFile does, and serves blocks from disk images on a microSD card.

How it got here

In 2021 I built a reader for my ProFile 10 around a Teensy 4.1, so I could get the drive's contents into a disk image. That's profile-dumper, and the build log is on Hackaday.

At the same time, I hand-wired a second Teensy board meant to turn that around and pretend to be the drive instead of the host. Its code wasn't finished until 2026. That's the Teensy version in teensy/, and it works on my //e. But it's at the limit of what the Teensy can do, and it took some clever optimization to get there.

So I moved it to an FPGA. I chose to make it FPGA-only, with no microcontroller, to keep the cost down. That drove the complexity up. I started on an Alchitry Cu (iCE40 HX), moved to the Alchitry Au (Artix-7) when the iCE40's carry chains became the bottleneck, and then moved to a ULX3S-12F (ECP5). If you find comments about the iCE40 or the Artix-7, that's why.

Then I built two boards of my own around the same ECP5 in a TQFP-144. r1 worked after some rework, but it had the wrong footprint for the flash chip, along with other mistakes. r2 fixed them, and it's been serving my //e since 2026-10-23.

All of my testing is on a //e with a ProFile card whose ROM is 341-0299-B. I haven't tried an Apple ///.

What's here

  • fpga/: the current design. Its README.md is the technical notebook: architecture, the serial report, the boot menu, and the tests.
    • src/ and sim/: the Verilog and its testbenches.
    • constraints/: pinouts for the ULX3S (ulx3s.lpf) and r2 (profile-drive-r2.lpf).
    • tools/: node scripts. One imports the selector's blobs into the build; the others check a card image against what the drive serves.
    • carrier/ULX3S-ADAPTER.md: wiring the interface board to a ULX3S.
    • hw-r2/profile-drive/: the r2 board. The KiCad project, the Gerber and stencil zips, a placement sheet and an assembly drawing.
    • hw-r2/BRINGUP-r2.md: building an r2 board and bringing it up.
    • hw-r2/enclosure/: a printed case shaped like a tiny ProFile.
  • teensy/: the Teensy 4.1 version. It still works.
  • selector/: a submodule with the 6502 boot menu that both versions serve, so you can pick an image from the //e.

The ProFile protocol, the DB-25 pinout and the interface card's behavior are documented in profile-dumper's PROTOCOL.md and HARDWARE.md. The READMEs here refer to them often.

Getting the code

The selector is a submodule, so clone with it:

text
git clone --recursive <this repo>

If you already cloned without it, run git submodule update --init.

Where to start

Preparing an SD card

Format it FAT32, put your images in a directory named HD, and create /profile.cfg by hand with any non-empty content. The drive can rewrite files, but it can't create them. The details are in fpga/README.md under "Preparing the SD card".

Building for a ULX3S

You need oss-cad-suite, which has yosys, nextpnr-ecp5, ecppack, iverilog, openFPGALoader and fujprog. You also need node, because the build uses it to import the selector's blobs. Then, in fpga/:

text
make sim-all    run the testbenches
make            build the bitstream
make prog       load it into SRAM, volatile
make flash      write it to the SPI flash

make sim-all stops at the first bench that fails. fpga/README.md has the full list of targets.

The ULX3S needs an interface board between it and the DB-25: two 74LVC245s that shift the 5V bus down to 3.3V. Mine was hand-wired on perfboard, and its design isn't in this repo. fpga/carrier/ULX3S-ADAPTER.md has the pin map from that board to the ULX3S, and the wiring mistakes that damage parts.

Ordering r2 boards

Everything is in fpga/hw-r2/profile-drive/.

  • profile-drive-r2-gerbers.zip is the board: 4 layers, 1.6 mm, lead-free HASL, 1 oz outer copper, 100 x 55 mm.
  • profile-drive-r2-stencil-reduced.zip is a top paste layer with the apertures on U1 and J1 shrunk by 0.04 mm. The full-size paste in the Gerber zip bridged their fine-pitch pins on my board. I ordered it in 4 mil stainless.
  • Every part is on the top side.
  • The silkscreen labels are 0.8 mm tall. That's below JLCPCB's standard 1.0 mm minimum, and at their limit for high-precision silkscreen (0.8 mm text with a 0.1 mm stroke), so ask for high-precision if you want the smallest labels crisp.

If you want JLCPCB to assemble it, upload these two as well:

  • profile-drive-r2-bom-jlcpcb.csv: the BOM, with the manufacturer part and the LCSC number for each line. Every LCSC number is the exact part in the schematic, except for the LEDs, which the schematic doesn't name. The BOM uses red ones (KENTO KT-0603R).
  • profile-drive-r2-cpl-jlcpcb.csv: the pick-and-place file, in the same coordinates as the Gerbers. I haven't had JLCPCB assemble one, so check every part's rotation in their preview before you pay. The TQFP, the SOT-23s, the TSSOPs and the connectors are the usual suspects.

J4, J5, J6, J7 and SW1 are optional and left out of both files. They're for programming, debugging and service, and you can solder them on later. A new board's flash is blank, though, so something has to reach J4's pads once to load it. I use a pogo-pin clip on J4. A 1x6 header soldered there works too.

As of 2026-10-24, three parts had no stock at JLCPCB: U1 (the FPGA), J1 (the USB-C socket) and J2 (the DB-25). You'll probably have to send those in yourself or solder them by hand. R31 (84.5k) had only 17 in stock.

The LCSC numbers are also in the schematic, as an LCSC field on each part, and J4, J5, J6, J7 and SW1 are marked DNP in both the schematic and the board. If you change the design, KiCad's own BOM and position exports pick both up, but the two CSV files here won't follow on their own.

The LEDs

The schematic gives each of the eight LEDs a 1k resistor (R35 to R42, in order for D1 to D8) and doesn't name a color. That's sized for ordinary red or yellow 0603 LEDs. The BOM uses red (KENTO KT-0603R, LCSC C2286). For yellow, NationStar NCD0603Y2 (LCSC C89811) works the same way.

The LEDs and their resistors are optional. Nothing else is on those nets, so leaving them off only loses the status display and the error codes.

If you use white, blue or true green LEDs, change their resistors to 330R. Those colors need about 3 V to light, which leaves only a few tenths of a volt across the resistor from a 3.3 V pin, so at 1k they're dim. On my board D1 to D4 matter most, so D1 is white, D2 is blue, D3 and D4 are emerald, and R35 to R38 are 330R.

Building one by hand

placement-r2.png is the assembly sheet. It shows where each part goes, marks pin 1 (and each LED's cathode) in red, and has a checklist BOM with quantities and part numbers. assembly-r2.pdf puts the values on the footprints. Use the reduced stencil.

fpga/hw-r2/BRINGUP-r2.md walks through the rest: paste and reflow, inspection, checking the power rails, first power, and programming.

Updating an r2 board

The flash holds two copies of the gateware: the one that runs, and a golden copy the board falls back to if the first is ever damaged. A new board gets both over JTAG, once. After that, an update can come from the SD card.

In fpga/, make r2-flash-dual builds the gateware and writes both copies, plus the record that points the FPGA at the golden one. The programmer is an FT4232H module on J4, through a pogo-pin clip or a header soldered there. The wiring is in fpga/README.md under "Building for the r2 board". Power the board from USB-C, not from J4. (make r2-prog loads SRAM instead, for testing.)

For an update from the SD card, make r2-update builds R2UPDATE.BIN. Copy it to the root of the card and power the board up. It waits until the drive is idle, so it never slows a boot. If the file holds a newer build than the one running, the LEDs fill up twice (once checking the file, once writing it) while the drive keeps serving. After five seconds with no activity from the //e, the board reboots into the new build. The file can stay on the card; it's skipped once it's the build that's running, and an older file is always skipped. Going back to an older build takes JTAG. fpga/README.md has the details under "Updating from the SD card".

To check which build a board is running, hold open-apple while the //e boots, and the image menu comes up. Row 2 shows the build ID and which copy it was loaded from, such as BUILD 80068B67 (PRIMARY). Build IDs only go up, so a higher one is newer. It says GOLDEN if the first copy was damaged and the board fell back. The bottom row shows what each copy in the flash holds, which only differs from row 2 when an update is waiting for its reboot. (The menu needs at least one image on the card.)

There are no prebuilt bitstreams yet, so you need the same tools as the ULX3S build.

The Teensy version

teensy/README.md covers the wiring, the arduino-cli build and the serial commands. The board was hand-wired, so its README is an as-built description, not a schematic.

What doesn't work yet

  • The SD card update passes its simulations, but I haven't tried it on a board yet. Neither the fallback to the golden copy nor the reboot at the end has been seen working on real hardware. JTAG works.
  • No prebuilt bitstreams.
  • The ULX3S interface board's design isn't published.
  • Nobody has tried it on an Apple ///.

License

MIT. See LICENSE.

Parts

127
QtyValueFootprintReferences
24100nCapacitor_SMD:C_0603_1608MetricC11, C12, C13, C14, C15, C16, C20, C21, C22, C23, C24, C25, C26, C27, C28, C29 +8
1010kResistor_SMD:R_0603_1608MetricR6, R7, R8, R13, R27, R28, R44, R45, R46, R47
910uCapacitor_SMD:C_0603_1608MetricC1, C7, C9, C18, C19, C33, C34, C38, C39
91kResistor_SMD:R_0603_1608MetricR25, R35, R36, R37, R38, R39, R40, R41, R42
94k7Resistor_SMD:R_0603_1608MetricR16, R17, R18, R19, R20, R21, R22, R23, R24
6100kResistor_SMD:R_0603_1608MetricR5, R32, R49, R50, R51, R52
433RResistor_SMD:R_0603_1608MetricR9, R10, R11, R12
447Rdevice:R_Array_Convex_4x0603_Yageo_YC164RN1, RN2, RN3, RN4
4M3MountingHole_3.2mm_M3_PadH1, H2, H3, H4
3220RResistor_SMD:R_0603_1608MetricR1, R2, R3
322uCapacitor_SMD:C_1206_3216MetricC2, C3, C4
2100RResistor_SMD:R_0603_1608MetricR43, R48
21uCapacitor_SMD:C_0603_1608MetricC10, C37
21u0device:L_Murata_DFE252012FL1, L2
22k2Resistor_SMD:R_0603_1608MetricR4, R53
25k1Resistor_SMD:R_0603_1608MetricR29, R30
1100uCapacitor_SMD:CP_Elec_6.3x5.8C40
1120R@100MInductor_SMD:L_0603_1608MetricFB1
122RResistor_SMD:R_0603_1608MetricR26
125MHz XO 2520 3V3Oscillator:Oscillator_SMD_ECS_2520MV-xxx-xx-4Pin_2.5x2.0mmX1
1274kResistor_SMD:R_0603_1608MetricR33
147kResistor_SMD:R_0603_1608MetricR14
160k4Resistor_SMD:R_0603_1608MetricR34
174LVC245A CTRL-INPackage_SO:TSSOP-20_4.4x6.5mm_P0.65mmU3
174LVC245A DATAPackage_SO:TSSOP-20_4.4x6.5mm_P0.65mmU2
184.5kResistor_SMD:R_0603_1608MetricR31
1JTAG 1x6Connector_PinHeader_2.54mm:PinHeader_1x06_P2.54mm_VerticalJ4
1LED0LED_SMD:LED_0603_1608MetricD1
1LED1LED_SMD:LED_0603_1608MetricD2
1LED2LED_SMD:LED_0603_1608MetricD3
1LED3LED_SMD:LED_0603_1608MetricD4
1LED4LED_SMD:LED_0603_1608MetricD5
1LED5LED_SMD:LED_0603_1608MetricD6
1LED6LED_SMD:LED_0603_1608MetricD7
1LED7LED_SMD:LED_0603_1608MetricD8
1LFE5U-12F-6TG144CPackage_QFP:TQFP-144_20x20mm_P0.5mmU1
1NorComp 182-025-213R561device:DSUB-25_Female_Horizontal_NorComp_182-025-213R561J2
1PROGRAMN buttondevice:SW_Push_SameSky_TS18-5SW1
1PROGRAMN button header (optional)Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_VerticalJ7
1SMF5.0ADiode_SMD:D_SOD-123FD9
1TLV73325PDBV 2V5Package_TO_SOT_SMD:SOT-23-5_HandSolderingU7
1TPS62A01A 1V1Package_TO_SOT_SMD:SOT-23-6_HandsolderingU5
1TPS62A01A 3V3Package_TO_SOT_SMD:SOT-23-6_HandsolderingU6
1USB-C 16pdevice:USB_C_Receptacle_GCT_USB4105-xx-A_16P_TopMnt_HorizontalJ1
1W25Q128JVSIQdevice:SOIC-8_Dual_150-208mil_P1.27mmU4
1console UART 1x3Connector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_VerticalJ5
1flash service 1x7Connector_PinHeader_2.54mm:PinHeader_1x07_P2.54mm_VerticalJ6
1microSD MEM2075device:microSD_GCT_MEM2075J3

Questions

How big is the Profile drive PCB?

It measures 100 × 55 mm and has 4 copper layers, 1.6 mm thick.

What parts does the Profile drive use?

127 parts, built around the LFE5U-12F-6TG144C, W25Q128JVSIQ and SMF5.0A. 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 Profile drive KiCad files?

From the JorjBauer/profile-emulator repository on GitHub, at the commit this page was made from: the board is fpga/hw-r2/profile-drive/profile-drive.kicad_pcb and its schematic fpga/hw-r2/profile-drive/config.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the Profile drive 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

  • 4 layers155.7 × 147.6 mmSBSV-16 final, the printed circuit board in 3D

    SBSV-16 final

    Soham121-935/pcb-

    141 parts
  • 4 layers17.8 × 51.6 mmBonsai C4, the printed circuit board in 3D

    Bonsai C4

    customMK/Bonsai-C

    An open-source ARM-based microcontroller board

    59 parts71
  • 4 layers180.4 × 157.2 mmMx track, the printed circuit board in 3D

    Mx track

    freznel10/Zerf9

    Draft repo or Chunky v13 aka Zert9 MX_track

    300 parts20GPL-3.0
  • 4 layersCABadge V2 1, the printed circuit board in 3D

    CABadge V2 1

    nbtca/CABadge

    CABadge 计协电子吧唧:基于 ESP32-S3 的开源圆屏互动徽章,支持动态壁纸、触摸交互、Wi-Fi/BLE 和趣味小应用,提供 PCB、3D 打印外壳、固件及配套工具。

    110 parts15MIT
  • 4 layers80 × 80.2 mm7-REV1B, the printed circuit board in 3D

    7-REV1B

    DangerousPrototypes/BusPirate5-hardware

    Bus Pirate Hardware and accessories for v5 and higher

    251 parts125MIT
  • 2 layers149.9 × 122.2 mmCantaloupe, the printed circuit board in 3D

    Cantaloupe

    kitspace-test-repos/kicad6-file-collection

    118 partsMIT
  • 4 layers94 × 122 mmYuEEG 8CH RevE, the printed circuit board in 3D

    YuEEG 8CH RevE

    YuTaoV5/YuEEG

    自制ADS1299上位机程序,使用fluent绘制界面

    378 parts181
  • 2 layers54 × 85.6 mmBoard43, the printed circuit board in 3D

    Board43

    smartbank-inc/Board43

    Board43 is an RP2350A-based microcontroller development board. Flash PicoRuby or your favorite firmware and start hacking.

    583 parts30