Skip to the content
PCBKitNew board
2 layers108.3 × 80.5 mmOpenkey cps1, the printed circuit board in 3D

CPS 1/1.5 B-21 programmer

Size
108.3 × 80.5 mm
Copper layers
2
Thickness
1.6 mm
Parts
20
Nets
170
Pads
362
Tracks, vias
919, 3
Pours
1
Routed
Yes
KiCad
KiCad 9.0 (file 20241229)
Created
5 Nov 2022
Updated
26 Oct 2025

Overview

Openkey cps1 is an open-source printed circuit board by jwestfall69, from the jwestfall69/openkey-cps1 repository on GitHub, published under the Unlicense licence. It is a 2-layer board of 108.3 × 80.5 mm with 20 parts on 170 nets, routed with 919 tracks and 3 vias.

Its parts include 10 connectors, 1 capacitor, 1 IC and 1 switch. It belongs with the AVR (ATmega, ATtiny) boards of this library.

README

README.md

openkey-cps1


Overview

This is an open source/hardware implementation of an on the fly CPS B-21 chip programmer that consists of a PCB that sits between CPS1/1.5 B and C boards.

board pics board pics

Installed:
board pics

This project is providing the same functionality as Undamned's InfiniKey-CPS1. The lack of supply is what prompted me to make openkey-cps1. If they ever end up coming back in stock please consider purchasing those to support Undamned's work.

Details on how to program the CPS B-21 chip configuration can be found in Eduardo Cruz's write up and youtube video. Additional information is also comes from cps2-reverse project which has details on the CPS B-21 chip.

Details on what to program can be found in MAME's code for the CPS1.

Project Status

PCB: Done

Firmware: Need to get untested games tested

Documentation: Done

Supported C Boards

The following unmodified C Boards are supported

CPS 1 Case

openkey-cps1 will not fit in the CPS 1 case. As far as I know only Varith and Capcom World 2 came in a case. You can still use openkey-cps1 to desuicide the C board. Replace the battery then boot up the game with openkey-cps1 installed. Verify it runs as expected, then power off, remove openkey-cps1 and reinstall the board in the case.

Supported Games / B-XX Chips

openkey-cps1 supports either having a 5 position switch or using solder jumpers for picking what to program into the B-21 Chip. For the switch, ensure the switches are fully set. You should hear a click sound as you change the position.

Below is a list of supported configurations/games and what switches/jumpers must be used for each.

CPS 1

Switch
12345
Program ROM LabelsGame NameTested / Working
00000CCE
CCJ
CCU
Captain CommandoYES
00001KDE
KDJ
KDU
The King of Dragons
00010KR_23E
KR_23J
KR_23U
Knights of the RoundYES
00011Q5Capcom World 2YES
00100QDUQuiz & DragonsYES
00101RTE
RTJ
RTU
Three WondersYES
00110VAE
VAJ
VAU
VarthYES

CPS 1.5

Switch
12345
Program ROM LabelsGame NameTested / Working
00111CDE
CDJ
CDT
CDU
Cadillacs & DinosaursYES
01000MBE
MBJ
MBU
Slam Masters / Muscle BomberYES
01001MBDE
MBDJ
Muscle Bomber Duo
01010PSE
PSH
PSJ
PSU
PunisherYES
01011TK2E
TK2J
TK2U
Warriors of Fate

B-XX

For B-XX chips prior to B-21 the configurations were hard coded into the chip. Its possible to program the B-21 to mimic these older chips.

Some older B-XX boards will have the number stamped on instead of etched into the chip. These stamped numbers maybe incorrect. For example I have a final fight board that has 04 stamped on as the XX number. Picking B-04 on openkey-cps1 didn't work. After dumping the program roms I was able to determine it was the ffightua romset. Mame shows this romset actually uses B-01. Switching to B-01 made the game work.

Switch
12345
B-XXTested / Working
01100B-01YES
01101B-02
01110B-03
01111B-04YES
10000B-05
10001B-11YES
10010B-12YES
10011B-13YES
10100B-14YES
10101B-15
10110B-16YES
10111B-17YES
11000B-18
11001B-21YES

Hardware

PCB Manufacturing

There are no special requirements for manufacturing.

I've been using jlcpcb for PCB manufacturing. Just watch out that by default they will add an order number to the silk screen unless you tell them not to.

BOM

QuantityDescriptionPart NumberDigiKeyMouserNotes
1ATtiny404 20MhzATTINY404-SSNATTINY404-SSN-ND556-ATTINY404-SSNROther ATtiny tinyAVR 0/1/2-series models should be viable as well. The code compiles to just under 1.5K in size, so any that have 2k or more of flash should work. Just note I have only tested with 404s
1100nf / 0.1uf SMD Ceramic Capacitor 0805 Size
15 Position Slide SwitchWürth Elektronik 416131160805732-3855-2-ND710-416131160805Optional not needed if using the solder jumpers to pick the game.
4CPS1: 2x20 Pin Male IDC connector
CPS1.5: 2x20pin Male Header (no shroud)
SBH11-PBPC-D20-ST-BK
N/A
S9175-ND
2x20 Pin Header
??This is just a standard IDE male connector
This is just a normal 2x20 Pin header you might find for a PI's GPIO pins
42x20 Pin Female socketSFH11-PBPC-D20-ST-BKS9200-ND??

IMPORTANT For the 2x20 Pin Female socket, if you choose a different part, make sure you get ones that have the extra plastic on the edge as seen below.

40 pin female

The extra plastic prevents the connector from being inserted off-by-one. An off-by-one insertion will cause a direct short to ground. This can cause catastrophic damage to your Game PCB if your power supply doesn't have short circuit protection.

Don't be fooled into thinking you don't need the extra plastic because you see the key. The bottom connector for example is too skinny for the key to actually prevent off-by-one insertion. Ask me how I know ;)

Assembly

CPS 1

Nothing special is needed when assembling a openkey-cps1 that will be used in a normal non-case'd CPS1 board. Install SMD components first, then install the 40 pin male/female connectors.

CPS 1.5

Installing openkey-cps1 in a CPS 1.5 case is a tight fit height wise. The pins that stick out of the C board are at the point of touching the top of the case. If you are ok with this just use the 40 pin IDE style connectors. Otherwise you can do the following.

To deal with this the best course of action is to only have raw pins for the male 40 pin connectors instead of ones with the plastic shroud. This will allow the C board to sit flush with the openkey-cps1 board and reduce the height enough to not touch the top of the case. Below is what has worked well for me, but there maybe better ways.

Some things to consider:

  • The normal pin length of a male pin is 6mm
  • The max pin height above the openkey-cps1 board should not exceed 7mm. Any longer and the pin will bottom out on the female connector on the C Board. This will cause the C board to not sit flush to the openkey-cps1 board and defeat the purpose of using raw pins.
  • You can't just install the normal 40pin IDE style connector then remove the shroud. The resulting pin length ends up being 8mm.
  • You can't just install a normal 40 pin header and remove the plastic. The resulting pin length ends up being 8mm.
  • The total length of metal pin on most headers is going to be 11.5mm
  • PCB thickness should be 1.6mm, which leave about 10mm worth of metal pin length we must deal with.

This method targets having 7mm above and 3mm below the openkey-cps1 board. I've tried 6mm/4mm, but that 4mm is long enough there is risk it could hit/damage components on the B board.

You will want 4 normal 2x20 pin headers where the total metal length is 11.5mm. Additionally you will want something you can use as a 1.5mm spacer. I'm using the 2 black 24AWG wires in the picture below.

cps15 parts

You will want to install 2 of the 2x20 pin header upside into board. I would advise doing the 2 outer ones first. Put the 1.5mm spacer between the board and the plastic part of the connector as seen below.

cps15 spacer

Now flip the board over to the side we will be soldering. It should look something like this.

cps15 pins

The length of the pins should be 3mm, which will mean 7mm on the top.

At this point I would tack 2 pins on each connector then verify spacing of the connectors looks good. It should look something like this (with the spacer wires removed)

cps15 top plastic

If you measure the pin lengths they should be right at 7mm.

Fully solder those 2 connectors. Its extra importing you check your soldering that this point. The next steps will involve removing the plastic part of the connectors which will make every pin independent and a pita to solder.

To protect the board I would put down some painters tape. Additionally I use this chip lifter as my pry tool. The grove makes it possible to get in between the pins to when prying up the plastic.

cps15 plastic prepare pry

If you have a hot air station you can use it to heat (200C) up the plastic to make it easier to get off. You will want to do the removable in a couple passes with your pry tool, lifting up the plastic a few mm per pass.

cps15 plastic pry 1

As you get the plastic higher up on the pins it can be helpful to add a spacer under you pry tool. I'm just using a old prototype board.

cps15 plastic pry 2

cps15 plastic pry 3

Once you get both plastics off it should looks like this

cps15 pair1 done

Then you can go onto the middle 2 connectors. You can bypass using the 1.5mm spacer on these. Instead just put the connects in the PCB upside down as before, then flip PCB over as if you were going to solder them. The already soldered connectors will hold the PCB 7mm off your table, which will mean your to be installed connectors will also be 7mm off your table. Tack, verify and then fully solder.

Repeat the process to remove the plastic

cps15 inner pair

When you are all done you should have this

cps15 pins done

Now do a test fit of the C board and it should be flush with the openkey-cps1 PCB

cps15 test fit

Install the SMD components and female 40 pin connectors. This one was going on my Punisher board, so I just used the solder jumpers instead of installing the 5 position switch.

cps15 finished

Programming

The latest firmware will work on both revisions of openkey-cps1 hardware.

Hardware

Programming is done with a UPDI programmer. I've been using this one:

Serial UPDI Programmer for ATmega 0-Series, or ATtiny 0-Series or 1-Series, or AVR DA or AVR DB

Note: This programmer (and likely others) has a switch for 3.3V and 5V. Set it to 5V.

The openkey-cps1 programming port is setup so you can wedge the pins from the above programmer directly into them to programming.

programming adapter

Of course be sure you properly orient the board so the labeled pin/holes match up. vcc to vcc, gnd to gnd, and updi to updi.

Software

For software I've been using the Arduino IDE with megaTinyCore, which adds support for tinyAVR 0/1/2-Series MCUs.

To install the megaTinyCore you, should just need to add http://drazzy.com/package_drazzy.com_index.json to "Additional Boards Manager URLs" in the settings for the Arduino IDE.

From there you need to configure the board/programming settings. I've been using these:

arduino ide settings NOTE: The "Startup Time" was adjusted from my previous picture of the settings, from 0ms to 1ms. In testing I found when using a 0ms startup there is a small chance the ATtiny won't even execute any code.

Installation

CPS 1

Nothing really special here. Use the dip switches or solder jumpers to pick your game/chip and put the openkey-cps1 board between your C and B boards. The male/female connectors should prevent you from installing incorrectly.

CPS 1.5

This is assuming you are using an openkey-cps1 board with the raw pin headers on top. There is nothing preventing you from install the C board incorrectly.

Use the dip switches or solder jumpers to pick your game.

Verify you have the C board oriented the correct way as seen below.

cps15 install orientation

The C board female connector will prevent you from installing it to high or low, but it will not prevent installation to the left or the right by one.

Check both sides of the female C board connector to verify you dont see any of the pins.

cps15 install good1

other side cps15 install good2

If its off by one of the sides will look like this cps15 install bad

Reset Header (optional)

In openkey-cps1 hardware revision 2025-10-18 an optional reset header was added to allow hooking up openkey to the reset line of the A board. Its unlikley you would need this and I would avoid using it.

Openkey-cps1 is dependent on being able to re-program on the B-21 chip while the cps1 board is in reset. This is because 2 of the pins related to programming are part of the data bus used by the main CPU to talk to the B-21 chip. If openkey-cps1 were to try and do any of its programming outside of reset it would cause a bus conflict with the main CPU also trying to use those 2 pins and programming will fail.

Reset Capacitor Locations

The length of time the cps1 board is in reset is highly dependent on the reset capacitor located on the A board. If this capacitor is faulty or going bad it can greatly reduce the amount of time the board is in reset when power is applied. Before trying to use the reset header on the openkey-cps1 I would first try replacing the reset capacitor.

Long A Board:
long board reset cap location

Short A Board:
short board reset cap location

On both boards its a 1uf/16V ceramic capacitor (higher voltages are ok).

Reset Signal Locations

The location provided for each A board type is a through hole. I would advise installing a right angle header instead of directly soldering a wire. This will make it easy to connect/disconnect the cable both on the A board and openkey-cps1.

Long A Board:
long board reset header location Long A Board Installed:
long board reset header install

Short A Board:
short board reset header location Short A Board Installed:
short board reset header install

Reset Cable

Once you've added the reset header on the A board, run a cable from it to pin 1 on the reset header of the openkey-cps1 as shown below.

reset line installed

Then install the C board onto openkey-cps1 as you normally would.

Reset Delay Jumper

With the reset cable hooked up, openkey-cps1 will hold the cps1 board in reset while its programming, then release when complete. Pins 2 and 3 of the reset header on openkey-cps1 are a jumper that will cause openkey-cps1 to keep the cps1 board in reset longer. When jumped the firmware will hold the cps1 board in reset for 1 second before and after programming.

IMPORTANT: If this jumper is jumped and the reset cable is not hooked up, programming will fail 100% of the time!

Reverting a modified C Board

Its pretty common to find one of the required C boards as having been modified to disable using the programmable configuration. This forces them to use their default configuration.

The tale tale sign of a modified C board are pins 45 and 46 will have cut traces (normally they go to ground) and a wire from them to some point on the C board that is supplying 5 volts. For example

modified c board

The way I normally revert them is to remove the wire, and then put a solder blob so that pins 45, 46, and 47 (ground) are bridged together. This puts the board back in its original state with all 3 of those pins being tied to ground.

reverted_c_board

Here is a close up of the solder blob on the pins

reverted c board zoomed

You can also see where they had cut the traces for pins 45 and 46, which would normally connect to that ground plane to the right.

Parts

20
QtyValueFootprintReferences
5SolderJumper_2_Openopenkey:SolderJumper-2_P1.3mm_Open_Pad1.0x0.6mmJP1, JP2, JP3, JP4, JP5
1100nFopenkey:C_0805_2012Metric_Pad1.18x1.45mm_HandSolderC1
1ATtinyxx4openkey:SOIC-14_3.9x8.7mm_P1.27mmU1
1CNA Bottomopenkey:PinSocket_2x20_P2.54mm_Vertical_1.3mmJ7
1CNA Topopenkey:IDC-Header_2x20_P2.54mm_Vertical_1.3mmJ3
1CNB Bottomopenkey:PinSocket_2x20_P2.54mm_Vertical_1.3mmJ8
1CNB Topopenkey:IDC-Header_2x20_P2.54mm_Vertical_1.3mmJ4
1CNC Bottomopenkey:PinSocket_2x20_P2.54mm_Vertical_1.3mmJ6
1CNC Topopenkey:IDC-Header_2x20_P2.54mm_Vertical_1.3mmJ2
1CND Bottomopenkey:PinSocket_2x20_P2.54mm_Vertical_1.3mmJ5
1CND Topopenkey:IDC-Header_2x20_P2.54mm_Vertical_1.3mmJ1
1Conn_01x03_Femaleopenkey:PinHeader_1x03_P2.54mm_VerticalJ9
1Conn_01x03_Pinopenkey:PinHeader_1x03_P2.54mm_VerticalJ11
1SW_DIP_x05openkey:SW_DIP_SPSTx05_Slide_Wurth_416131160805_W7.62mm_P1.27mmSW1

The 18 most common of 20 parts.

Questions

How big is the Openkey cps1 PCB?

It measures 108.3 × 80.5 mm and has 2 copper layers, 1.6 mm thick.

What parts does the Openkey cps1 use?

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

Where can I download the Openkey cps1 KiCad files?

From the jwestfall69/openkey-cps1 repository on GitHub, at the commit this page was made from: the board is hardware/openkey-cps1.kicad_pcb and its schematic hardware-dev/openkey-cps1-dev.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the Openkey cps1 design in my own project?

Its repository publishes it under the Unlicense 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 layers66.9 × 74.5 mmDeskHop Rev1, the printed circuit board in 3D

    DeskHop Rev1

    hrvach/deskhop

    Fast Desktop Switching Device

    20 parts7.9kGPL-3.0
  • 2 layers86.4 × 64.8 mmSlot machine, the printed circuit board in 3D

    Slot machine

    google/google-ctf

    Google CTF

    20 parts5.1kApache-2.0
  • 2 layers36.2 × 26.8 mmEsp32 minimal, the printed circuit board in 3D

    Esp32 minimal

    atopile/atopile

    Design circuit boards with code! ✨ Get software-like design reuse 🚀, validation, version control and collaboration in hardware; starting with electronics ⚡️

    20 parts4kMIT
  • 2 layers108.1 × 393.8 mmSweep compact ble, the printed circuit board in 3D

    Sweep compact ble

    davidphilipbarr/Sweep

    Sweep - a small promicro based keyboard inspired by the Ferris.

    20 parts2.1k
  • 2 layers26 × 15.9 mmTPS54340 Buck Regulator, the printed circuit board in 3D

    TPS54340 Buck Regulator

    rusefi/rusefi

    rusefi - GPL internal combustion engine control unit

    20 parts1.2k
  • 2 layers67.6 × 30.5 mmRgb to hdmi, the printed circuit board in 3D

    Rgb to hdmi

    hoglet67/RGBtoHDMI

    Bare-metal Raspberry Pi project that provides pixel-perfect sampling of Retro Computer RGB/YUV video and conversion to HDMI

    20 parts1kGPL-3.0
  • 2 layers44.3 × 28.7 mmLin bus adapter esp32, the printed circuit board in 3D

    Lin bus adapter esp32

    hackclub/OnBoard

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

    20 parts915
  • 2 layers89.5 × 61.6 mmFreeDeck TH 2020-02, the printed circuit board in 3D

    FreeDeck TH 2020-02

    FreeYourStream/freedeck-hardware

    all the stuff you need to build your own FreeDeck

    20 parts772