
With the successful completion of the humble hacker keyboard, I’ve decided to modify one of my Kinesis Contoured Keyboard keyboards so that I can use my firmware to gain additional programmability. I’m going to replace the existing controller with one based on the Teensy++. I’m starting with my second Kinesis board, a “Professional QD”. I don’t remember exactly when I bought this board, but the date on the controller board is 03/18/99.
Step One – determine the matrix
First, we have to discover the keyboard matrix – which is basically how individual keys map to pins on the keyboard connector. For a good description of how a keyboard matrix works, visit Dave Dribin’s Keyboard Matrix Help page.
With a normal keyboard, I would just wire the pins from the keyboard connector to my Teensy++, then load my firmware built in “Matrix Discovery Mode” (see bottom of linked page). Once installed, the matrix can be found simply by pressing keys on the keyboard. But the kinesis is a special case, in that there are essentially 6 individual keyboards joined together. To find the complete matrix, each individual board matrix must first be determined, then the main board has to be mapped out to find out how these are to be combined.
That last bit is not strictly necessary, as I am free to map each individual board however I want, but I thought it best to stick with the original layout. At the very least, someone else may find this information useful.
Below are the individual keyboard matrices. For the most part, I’ve labeled components as they are labeled on the PCBs.
Left hand

Exceptions to the board labeling are:
- The main connector
PL2had no label - Labels with more than two characters have been shortened (e.g.
SHIFT→LS,TAB→TB, etc.)
PL2/J2
| 6 | 7 | 8 | 10 | 11 | 12 | |
|---|---|---|---|---|---|---|
| 1 | \ |
IN |
LT |
RT |
||
| 2 | LS |
Z |
X |
C |
V |
B |
| 3 | CP |
A |
S |
D |
F |
G |
| 5 | TB |
Q |
W |
E |
R |
T |
| 13 | = |
1 |
2 |
3 |
4 |
5 |
Right hand

Note that the square brackets are labeled incorrectly on the PCB. That is, the left bracket is labeled as the right, and vice versa.
PR2/J7
| 1 | 2 | 3 | 6 | 12 | 13 | |
|---|---|---|---|---|---|---|
| 4 | UP |
DN |
[ |
] |
||
| 7 | NS |
, |
M |
RS |
. |
/ |
| 8 | H |
K |
J |
' |
L |
; |
| 9 | Y |
I |
U |
\ |
O |
P |
| 10 | 6 |
8 |
7 |
- |
9 |
0 |
Thumbs
![]()
Left thumb
PL1/J5
| 1 | 2 | 3 | 8 | |
|---|---|---|---|---|
| 4 | SL3 |
SL6 |
SL4 |
|
| 5 | SL1 |
SL5 |
SL2 |
Right thumb
PR1/J6
| 3 | 4 | 5 | 6 | |
|---|---|---|---|---|
| 7 | SR1 |
SR2 |
SR5 |
|
| 8 | SR4 |
SR3 |
SR6 |
Left function keys

PL3/J3
| 2 | 3,6,10 | 4,7,11 | |
|---|---|---|---|
| 1 | ESC |
F1 |
F2 |
| 8 | F3 |
F4 |
F5 |
| 5 | F6 |
F7 |
F8 |
Right function keys

PR2/J4
| 5 | 8,11 | 7,10 | |
|---|---|---|---|
| 8 | PB |
PG |
KY |
| 1 | F9 |
F10 |
F11 |
| 5 | F12 |
PS |
SL |
The two keys PG(Program) and KY(Keypad) in the table above are not actually connected as shown. They serve special purposes and are not part of the normal key matrix when using the Kinesis controller. Instead, they are connected as follows:
| 1 | 2 | |
|---|---|---|
| 3 | PG |
KY |
To add them to the matrix above, make the following connections:
J4-1 → J4-8J4-2 → J4-7J4-3 → J4-4
The combined matrix
This is the combined matrix based on how each individual keyboard is connected to the controller board.
Keys X1 and X2 in cells 5A and 4L do not exist. These are placeholders for the addition of extra keys below the shift keys.
| A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | = | 1 | 2 | 3 | 4 | 5 | F6 | F7 | F8 | ||||||
| 2 | TB | Q | W | E | R | T | F3 | F4 | F5 | ||||||
| 3 | CP | A | S | D | F | G | ESC | F1 | F2 | ||||||
| 4 | LS | Z | X | C | V | B | UP | DN | [ | ] | X1 | F9 | F10 | F11 | |
| 5 | X2 | ` | IN | LT | RT | 6 | 7 | 8 | 9 | 0 | - | F12 | PS | SL | |
| 6 | SL1 | SL2 | SL5 | Y | U | I | O | P | PB | PG | KY | ||||
| 7 | SR4 | SR3 | SR6 | SL4 | SL3 | SL6 | H | J | K | L | ; | ‘ | |||
| 8 | SR1 | SR2 | SR5 | N | M | , | . | / | RS |
Since I’m not using the original controller, I’ve rearranged the different blocks and shifted some rows and columns to arrive at the more sensible matrix below.
| A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | = | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | ESC | F1 | F2 |
| 2 | TB | Q | W | E | R | T | Y | U | I | O | P | F3 | F4 | F5 | |
| 3 | CP | A | S | D | F | G | H | J | K | L | ; | ‘ | F6 | F7 | F8 |
| 4 | LS | Z | X | C | V | B | N | M | , | . | / | RS | F9 | F10 | F11 |
| 5 | X2 | ` | IN | LT | RT | UP | DN | [ | ] | X1 | F12 | PS | SL | ||
| 6 | SL1 | SL2 | SL5 | SR4 | SR3 | SR6 | PB | PG | KY | ||||||
| 7 | SL4 | SL3 | SL6 | SR1 | SR2 | SR5 |
To obtain this matrix, the rows and columns must be connected as follows:
| Row | Connection |
|---|---|
| 1 | J2-13; J7-10; J3-1 |
| 2 | J2-5; J7-9; J3-8 |
| 3 | J2-3; J7-8; J3-5 |
| 4 | J2-2; J7-7; J4-6 |
| 5 | J2-1; J7-4; J4-9 |
| 6 | J5-5; J6-8; J4-3,4 |
| 7 | J5-4; J6-7 |
| Col | Connections |
|---|---|
| A | J2-6 |
| B | J2-7 |
| C | J2-8; J5-2 |
| D | J2-10; J5-8 |
| E | J2-11; J5-1 |
| F | J2-12; J5-3 |
| G | J7-1; J6-3 |
| H | J7-3; J6-4 |
| I | J7-2; J6-5 |
| J | J7-12; J6-6 |
| K | J7-13 |
| L | J7-6 |
| M | J3-2; J4-5 |
| N | J3-3,6,10; J4-1,8,11 |
| O | J3-4,7,11; J4-2,7,10 |
Next up: building a replacement controller board!