Setting Up My TADA68 ISO UK Keybindings
In preparation for my new working from home regime I spent a lot of time looking for a new keyboard. I knew I wanted a mechanical keyboard, known for their robustness and customisability, and I ultimately settled on a TADA68.
The TADA68 hit a number of my key wants including customizable mechanical switches, QMK firmware to reprogram the keyboard, and a small 65% profile. Most important of all the TADA68 was available in the standard UK (ISO) layout unlike most other mechanical keyboards which are only available in the US (ANSI) standard.
I noticed during my first day using the TADA68 that the key that represents the backslash and pipe symbol wasn’t working. I decided to take the opportunity to play around with QMK to change the layout to suit my needs a little better. I initially tried to use the online QMK config tool to generate a layout, which surprisingly supports the TADA68 ISO layout. As the QMK config tool only produces .hex
files and the TADA68 requires a .bin
file to update its firmware I used the hex2bin utility to convert it.
Unfortunately, after flashing my new layout my #
stopped working. I also tried building the ISO-UK layout in the QMK repository and flashing the layout from there with the same effect. To test if my #
switch had bitten the dust during some part of the flashing process I added a new function to the tada68.c
file
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
xprintf("KL: row: %u, column: %u, pressed: %u\n", record->event.key.col, record->event.key.row, record->event.pressed);
return true;
}
This function prints to debug the row and column of the physical key switch that is being pressed (as opposed to the keycode which is controlled by the QMK firmware layout). After connecting up the keyboard to the QMK Toolbox I realised that the key switch underneath my #
key is connected to a pin in the 13th column of the PCB, despite other switches in that column of the keyboard being associated with the 12th. To fix this I forked the QMK repository and adjusted the ISO layout in tada68.h
and keymap.c
.
tada68.h
#define LAYOUT_iso( \
k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0d, k0e, \
k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1e, \
k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2d, k2e, \
k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, k3d, k3e, \
k40, k41, k42, k45, k49, k4a, k4b, k4c, k4d, k4e \
) \
{ \
{k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0d, k0e}, \
{k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1e}, \
{k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, XXX, k2d, k2e}, \
{k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, k3d, k3e}, \
{k40, k41, k42, XXX, XXX, k45, XXX, XXX, XXX, k49, k4a, k4b, k4c, k4d, k4e} \
}
keymap.c
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Keymap _BL: (Base Layer) Default Layer
* ,----------------------------------------------------------------.
* |Esc | 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backsp |~ ` |
* |----------------------------------------------------------------|
* |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| # |Del |
* |------------------------------------------------------- -----|
* |CAPS | A| S| D| F| G| H| J| K| L| ;| '| |Entr|PgUp|
* |----------------------------------------------------------------|
* |Shift| \ | Z| X| C| V| B| N| M| ,| .| /|Rshift|Up|PgDn|
* |----------------------------------------------------------------|
* |Ctrl|Win |Alt | Space |Alt| FN|Ctrl|Lef|Dow|Rig |
* `----------------------------------------------------------------'
*/
[_BL] = LAYOUT_iso(
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_GRV, \
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_NONUS_HASH, KC_DEL, \
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGUP, \
KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_PGDN, \
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(_FL), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
),
/* Keymap _FL1: Function Layer 1
* ,----------------------------------------------------------------.
* | | F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12| Delete| Ins|
* |----------------------------------------------------------------|
* | | | ↑ | | | | | | | | | | | |Home|
* |------------------------------------------------------- -----|
* | | ← | ↓ | → | | | | | | | | | | | End|
* |----------------------------------------------------------------|
* | | | | | L+|LED| L-| | V+| V-|Mut| | MsBtn|Up|MsBn|
* |----------------------------------------------------------------|
* | | | | | | | | Lt| Dn| Rt |
* `----------------------------------------------------------------'
*/
[_FL] = LAYOUT_iso(
_______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_INS, \
_______, _______, KC_UP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, \
_______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_END, \
_______, _______, _______, _______, BL_DEC, BL_TOGG, BL_INC, _______, KC_VOLU, KC_VOLD, KC_MUTE, _______, KC_BTN1, KC_MS_U, KC_BTN2, \
_______, _______, _______, _______, _______, _______, _______, KC_MS_L, KC_MS_D, KC_MS_R
),
};