ITT Courier 110169 Hall Effect Keyboard USB Conversion
Posted: 18 Nov 2020, 14:25
I did this conversion quite a while ago, but since this was a fun process, the keyboard is pretty interesting and because this could potentially be of interest to others, I still decided to write about it.
I found this keyboard on a local flea market, it was love at first sight. When I got it it looked like this:
Maybe a little bit yellowed, but overall in good condition, nothing a good old retr0bright can't fix. But before that I wanted to get that keyboard up and running, so the first thing I did was to disassemble the unit to get a glimpse at the PCB:
You can easily spot the Hall Effect sensors, which are arranged in a matrix of 13 columns and 8 rows. Other than that there isn't much going on here, the big IC in the middle is an Intel 8048 compatible microcontroller. 4 of its pins are connected to a demultiplexer located to its right which is used to strobe the columns of the switch matrix. The demultiplexer expects the column index through a binary encoding from its 4 input pins. This means that the microcontroller can strobe all columns with only 4 of its pins being used! For sensing the 8 rows of the matrix are directly connected to the microcontroller.
A nice side-effect from this design is the fact, that this board supports inherent N-Key Rollover. This is nothing I really need, but it's cool to see and for a Hall Effect keyboard I think such a feature is quite rare. Another useless but nevertheless really cool feature is the solenoid located on the lower right of the board.
In order to record my findings and to make working with this keyboard easier, I created a schematic of the circuit:
My first idea to get the keyboard working was to build a converter that can be plugged into the original cable. The original cable used a Micro D-Sub connector, something which I have never seen before, look how tiny it is compared to a regular D-Sub connector!
Since (at the time) I didn't have any advanced measuring equipment, which I could have used to reverse-engineer the protocol, I decided to desolder the microcontroller and read its ROM directly to figure out how everything works. Thankfully the MCS-48 line of microcontrollers has extensive documentation, so building a circuit with an Arduino to read it was straightforward.
After that I used a disassembler to convert the binary into a readable format. Up to this point everything went pretty well but unfortunately understanding the firmware was much harder than expected. I figured out, that I could use one of the pins of the connector to get the microcontroller to jump to the interrupt routine were it looked like some kind of IO could happen but from there on the code was much harder to understand because one instruction used an indirect jump. After some time I gave up on that approach and decided to do the conversion internally.
I decided to utilize a Teensy 2.0, because it has so many IO ports, that I only had to reroute a handful of signals and could leave most of the traces untouched. I also repurposed the connector on the board for a custom USB cable. Software-wise I decided to use the TMK Keyboard Firmware Core Library, which made everything pretty easy, especially when compared to reading antiquated 1970s assembler code. In the end the board looked like this:
After that the only thing left to do was retr0brighting and putting everything back together. Here is a picture of the keyboard after everything was done:
Chyrosran22 already did a fantastic job reviewing the unit so I'll leave a link to his video here. I agree with him that the switches are incredibly smooth, but unfortunately a little bit too heavy for me for daily use. The solenoid was a bit surprising, though. It not only is loud as hell when activated, but it also makes the whole keyboard slightly vibrate which makes the switches feel almost clicky. Overall this was a very fun and instructive undertaking and if there's someone else on this planet who owns this keyboard and is looking to convert it I hope this is a helpful resource. For the interested reader, I created a GitHub Repository for the code I wrote along with more detailed install instructions.
I found this keyboard on a local flea market, it was love at first sight. When I got it it looked like this:
Maybe a little bit yellowed, but overall in good condition, nothing a good old retr0bright can't fix. But before that I wanted to get that keyboard up and running, so the first thing I did was to disassemble the unit to get a glimpse at the PCB:
You can easily spot the Hall Effect sensors, which are arranged in a matrix of 13 columns and 8 rows. Other than that there isn't much going on here, the big IC in the middle is an Intel 8048 compatible microcontroller. 4 of its pins are connected to a demultiplexer located to its right which is used to strobe the columns of the switch matrix. The demultiplexer expects the column index through a binary encoding from its 4 input pins. This means that the microcontroller can strobe all columns with only 4 of its pins being used! For sensing the 8 rows of the matrix are directly connected to the microcontroller.
A nice side-effect from this design is the fact, that this board supports inherent N-Key Rollover. This is nothing I really need, but it's cool to see and for a Hall Effect keyboard I think such a feature is quite rare. Another useless but nevertheless really cool feature is the solenoid located on the lower right of the board.
In order to record my findings and to make working with this keyboard easier, I created a schematic of the circuit:
My first idea to get the keyboard working was to build a converter that can be plugged into the original cable. The original cable used a Micro D-Sub connector, something which I have never seen before, look how tiny it is compared to a regular D-Sub connector!
Since (at the time) I didn't have any advanced measuring equipment, which I could have used to reverse-engineer the protocol, I decided to desolder the microcontroller and read its ROM directly to figure out how everything works. Thankfully the MCS-48 line of microcontrollers has extensive documentation, so building a circuit with an Arduino to read it was straightforward.
After that I used a disassembler to convert the binary into a readable format. Up to this point everything went pretty well but unfortunately understanding the firmware was much harder than expected. I figured out, that I could use one of the pins of the connector to get the microcontroller to jump to the interrupt routine were it looked like some kind of IO could happen but from there on the code was much harder to understand because one instruction used an indirect jump. After some time I gave up on that approach and decided to do the conversion internally.
I decided to utilize a Teensy 2.0, because it has so many IO ports, that I only had to reroute a handful of signals and could leave most of the traces untouched. I also repurposed the connector on the board for a custom USB cable. Software-wise I decided to use the TMK Keyboard Firmware Core Library, which made everything pretty easy, especially when compared to reading antiquated 1970s assembler code. In the end the board looked like this:
After that the only thing left to do was retr0brighting and putting everything back together. Here is a picture of the keyboard after everything was done:
Chyrosran22 already did a fantastic job reviewing the unit so I'll leave a link to his video here. I agree with him that the switches are incredibly smooth, but unfortunately a little bit too heavy for me for daily use. The solenoid was a bit surprising, though. It not only is loud as hell when activated, but it also makes the whole keyboard slightly vibrate which makes the switches feel almost clicky. Overall this was a very fun and instructive undertaking and if there's someone else on this planet who owns this keyboard and is looking to convert it I hope this is a helpful resource. For the interested reader, I created a GitHub Repository for the code I wrote along with more detailed install instructions.