[Keyboard] Unicomp Mini M (#12892)

This commit is contained in:
Lander 2021-05-30 17:58:43 -04:00 committed by GitHub
parent 7b055dcc55
commit 2b8f1fcdfb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 842 additions and 0 deletions

View File

@ -0,0 +1,59 @@
/*
Copyright 2021 stevendlander
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#include "config_common.h"
/* USB Device descriptor parameter */
#define VENDOR_ID 0xFEED
#define PRODUCT_ID 0x0000
#define DEVICE_VER 0x0001
#define MANUFACTURER stevendlander
#define PRODUCT Unicomp Mini M
/* key matrix size */
#define MATRIX_ROWS 12
#define MATRIX_COLS 16
/*
* Keyboard Matrix Assignments
*
* Change this to how you wired your keyboard
* COLS: AVR pins used for columns, left to right
* ROWS: AVR pins used for rows, top to bottom
* DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode)
* ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode)
*
*/
#define MATRIX_ROW_PINS { F7, F6, F5, F4, F3, F2, F1, F0, E6, E7, B0, B1 }
#define MATRIX_COL_PINS { C7, C6, C5, C4, C3, C2, C1, C0, E1, E0, D7, B7, D5, D4, D3, D2 }
#define UNUSED_PINS
#define LED_PIN_ON_STATE 0
#define LED_NUM_LOCK_PIN B6
#define LED_CAPS_LOCK_PIN B5
#define LED_SCROLL_LOCK_PIN B4
/* COL2ROW, ROW2COL*/
#define DIODE_DIRECTION ROW2COL
/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed (5 is default) */
#define DEBOUNCE 5
/* The Mini M has no diodes */
#define MATRIX_HAS_GHOST

View File

@ -0,0 +1,462 @@
{
"keyboard_name": "Unicomp Mini M",
"url": "",
"maintainer": "stevendlander",
"width": 15.5,
"height": 7.5,
"layouts": {
"LAYOUT": {
"layout": [
{ "label": "Esc",
"x": 0,
"y": 0
},
{
"label": "F1",
"x": 2,
"y": 0
},
{
"label": "F2",
"x": 3,
"y": 0
},
{
"label": "F3",
"x": 4,
"y": 0
},
{
"label": "F4",
"x": 5,
"y": 0
},
{
"label": "F5",
"x": 6.5,
"y": 0
},
{
"label": "F6",
"x": 7.5,
"y": 0
},
{
"label": "F7",
"x": 8.5,
"y": 0
},
{
"label": "F8",
"x": 9.5,
"y": 0
},
{
"label": "F9",
"x": 11,
"y": 0
},
{
"label": "F10",
"x": 12,
"y": 0
},
{
"label": "F11",
"x": 13,
"y": 0
},
{
"label": "F12",
"x": 14,
"y": 0
},
{
"label": "PrtSc",
"x": 15.25,
"y": 0
},
{
"label": "Scroll Lock",
"x": 16.25,
"y": 0
},
{
"label": "Pause",
"x": 17.25,
"y": 0
},
{
"label": "~",
"x": 0,
"y": 1.5
},
{
"label": "!",
"x": 1,
"y": 1.5
},
{
"label": "@",
"x": 2,
"y": 1.5
},
{
"label": "#",
"x": 3,
"y": 1.5
},
{
"label": "$",
"x": 4,
"y": 1.5
},
{
"label": "%",
"x": 5,
"y": 1.5
},
{
"label": "^",
"x": 6,
"y": 1.5
},
{
"label": "&",
"x": 7,
"y": 1.5
},
{
"label": "*",
"x": 8,
"y": 1.5
},
{
"label": "(",
"x": 9,
"y": 1.5
},
{
"label": ")",
"x": 10,
"y": 1.5
},
{
"label": "_",
"x": 11,
"y": 1.5
},
{
"label": "+",
"x": 12,
"y": 1.5
},
{
"label": "Backspace",
"x": 13,
"y": 1.5,
"w": 2
},
{
"label": "Insert",
"x": 15.25,
"y": 1.5
},
{
"label": "Home",
"x": 16.25,
"y": 1.5
},
{
"label": "PgUp",
"x": 17.25,
"y": 1.5
},
{
"label": "Tab",
"x": 0,
"y": 2.5,
"w": 1.5
},
{
"label": "Q",
"x": 1.5,
"y": 2.5
},
{
"label": "W",
"x": 2.5,
"y": 2.5
},
{
"label": "E",
"x": 3.5,
"y": 2.5
},
{
"label": "R",
"x": 4.5,
"y": 2.5
},
{
"label": "T",
"x": 5.5,
"y": 2.5
},
{
"label": "Y",
"x": 6.5,
"y": 2.5
},
{
"label": "U",
"x": 7.5,
"y": 2.5
},
{
"label": "I",
"x": 8.5,
"y": 2.5
},
{
"label": "O",
"x": 9.5,
"y": 2.5
},
{
"label": "P",
"x": 10.5,
"y": 2.5
},
{
"label": "{",
"x": 11.5,
"y": 2.5
},
{
"label": "}",
"x": 12.5,
"y": 2.5
},
{
"label": "|",
"x": 13.5,
"y": 2.5,
"w": 1.5
},
{
"label": "Delete",
"x": 15.25,
"y": 2.5
},
{
"label": "End",
"x": 16.25,
"y": 2.5
},
{
"label": "PgDn",
"x": 17.25,
"y": 2.5
},
{
"label": "Caps Lock",
"x": 0,
"y": 3.5,
"w": 1.75
},
{
"label": "A",
"x": 1.75,
"y": 3.5
},
{
"label": "S",
"x": 2.75,
"y": 3.5
},
{
"label": "D",
"x": 3.75,
"y": 3.5
},
{
"label": "F",
"x": 4.75,
"y": 3.5
},
{
"label": "G",
"x": 5.75,
"y": 3.5
},
{
"label": "H",
"x": 6.75,
"y": 3.5
},
{
"label": "J",
"x": 7.75,
"y": 3.5
},
{
"label": "K",
"x": 8.75,
"y": 3.5
},
{
"label": "L",
"x": 9.75,
"y": 3.5
},
{
"label": ":",
"x": 10.75,
"y": 3.5
},
{
"label": "\"",
"x": 11.75,
"y": 3.5
},
{
"label": "Enter",
"x": 12.75,
"y": 3.5,
"w": 2.25
},
{
"label": "Shift",
"x": 0,
"y": 4.5,
"w": 2.25
},
{
"label": "Z",
"x": 2.25,
"y": 4.5
},
{
"label": "X",
"x": 3.25,
"y": 4.5
},
{
"label": "C",
"x": 4.25,
"y": 4.5
},
{
"label": "V",
"x": 5.25,
"y": 4.5
},
{
"label": "B",
"x": 6.25,
"y": 4.5
},
{
"label": "N",
"x": 7.25,
"y": 4.5
},
{
"label": "M",
"x": 8.25,
"y": 4.5
},
{
"label": "<",
"x": 9.25,
"y": 4.5
},
{
"label": ">",
"x": 10.25,
"y": 4.5
},
{
"label": "?",
"x": 11.25,
"y": 4.5
},
{
"label": "Shift",
"x": 12.25,
"y": 4.5,
"w": 2.75
},
{
"label": "\u2191",
"x": 16.25,
"y": 4.5
},
{
"label": "Ctrl",
"x": 0,
"y": 5.5,
"w": 1.5
},
{
"label": "Meta",
"x": 1.5,
"y": 5.5,
"w": 1
},
{
"label": "Alt",
"x": 2.5,
"y": 5.5,
"w": 1.5
},
{
"label": "Space",
"x": 4,
"y": 5.5,
"w": 5.75
},
{
"label": "Alt",
"x": 9.75,
"y": 5.5,
"w": 1.25
},
{
"label": "Meta",
"x": 11,
"y": 5.5,
"w": 1.5
},
{
"label": "Menu",
"x": 12.5,
"y": 5.5,
"w": 1
},
{
"label": "Ctrl",
"x": 13.5,
"y": 5.5,
"w": 1.5
},
{
"label": "\u2190",
"x": 15.25,
"y": 5.5
},
{
"label": "\u2193",
"x": 16.25,
"y": 5.5
},
{
"label": "\u2192",
"x": 17.25,
"y": 5.5
}
]
}
}
}

View File

@ -0,0 +1,106 @@
/* Copyright 2021 stevendlander
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include QMK_KEYBOARD_H
// Layer shortcuts
enum custom_layers {
_QWERTY,
_NUMPAD,
};
enum custom_keycodes {
NUMSLCK = SAFE_RANGE, // Num Lock on shift, Scroll Lock regularly
PAUSRST, // Resets keyboard on shift, Pause|break regularly
PSCSYSR, // Sends SYSREQ on alt, Print Screen regularly
};
// Mod key detection
#define MODS_SHIFT_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT))
#define MODS_ALT_MASK (MOD_BIT(KC_LALT)|MOD_BIT(KC_RALT))
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_QWERTY] = LAYOUT(
KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, PSCSYSR, NUMSLCK, PAUSRST,
KC_GRV, 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_NO, KC_BSPC, KC_INS, KC_HOME, KC_PGUP,
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_BSLS, KC_DEL, KC_END, KC_PGDN,
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_NO, KC_ENT,
KC_LSFT, KC_NO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_NO, KC_RSFT, KC_UP,
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
),
[_NUMPAD] = LAYOUT(
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, NUMSLCK, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_P7, KC_P8, KC_P9, KC_TRNS, KC_PMNS, KC_PPLS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_P4, KC_P5, KC_P6, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_P1, KC_P2, KC_P3, KC_PAST, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_P0, KC_TRNS, KC_PDOT, KC_PSLS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
),
};
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case NUMSLCK: {
if (record->event.pressed) {
if (keyboard_report->mods & MODS_SHIFT_MASK) {
tap_code(KC_NLCK);
} else {
register_code(KC_SLCK);
}
} else {
unregister_code(KC_SLCK);
}
break;
}
case PAUSRST: {
if (record->event.pressed) {
if (keyboard_report->mods & MODS_SHIFT_MASK) {
reset_keyboard();
} else {
register_code(KC_PAUS);
}
} else {
unregister_code(KC_PAUS);
}
break;
}
case PSCSYSR: {
if (record->event.pressed) {
if (keyboard_report->mods & MODS_ALT_MASK) {
tap_code(KC_SYSREQ);
} else {
register_code(KC_PAUS);
}
} else {
unregister_code(KC_PAUS);
}
break;
}
}
return true;
}
bool led_update_user(led_t led_state) {
static bool num_state = false;
if (num_state != led_state.num_lock) {
if (led_state.num_lock) {
layer_on(_NUMPAD);
} else {
layer_off(_NUMPAD);
}
num_state = led_state.num_lock;
}
return true;
}

View File

@ -0,0 +1 @@
# The default keymap for unicomp\_mini\_m

View File

@ -0,0 +1,127 @@
## Unicomp Mini M with Teensy2.0++ controller & QMK Firmware
### Overview
#### Goals
The goal of this project was to replace the stock control board of the Unicomp Mini M with a programmable one. The Mini
M was released by [Unicomp](https://www.pckeyboard.com) in Q1 of 2021 and is a re-release of The IBM Model M Space
Saving Keyboard (SSK) with some enhancements.
This guide strives to achieve the following:
* Make completely reversable changes, or in other words, no permanent modifications to the Mini M
* Allow full programmability of the Mini M via QMK
* Be able to flash firmware without having to take the board apart to hit the reset button
* Create a default keymap that works just like the stock keymap shipped from Unicomp, including the toggle-able number
pad
* Support all LEDs as normal
My guide will go a few steps further:
* Convert the wired connection from USB-A to USB-C
* Install a potentiometer to dim the LEDs if desired
#### Credits
The following resources were instrumental to the success of this project:
* Model M 101/102 write-up located in `qmk_firmware/keyboards/converter/modelm`
* [Model M Subreddit](https://modelm.reddit.com)
* Model M Discord
### Hardware
##### Parts
For a working Mini M with QMK *without* LEDs working, the following parts are necessary:
* 1 Adafruit Perma-Proto Full Sized Breadboard. Luckily, this board is a perfect fit for the Mini M case!
* 1 Teensy2.0++, with headers soldered on if you can find it
* 2 20-row x 1 column headers, if you can't find a Teensy with headers already soldered on
* 2 16-pin Ribbon connectors, PCB mount
* Hookup wire. I used 30AWG wire and while it worked, I should have used 1 gauge (or more) thicker
* A panel mount male USB-B to female USB-C extender
To get the Mini M working with LEDs, you will need:
* 3 1kOhm through-hole resistors
##### Tools
The following were absolutely critical for the project:
* Soldering iron, preferably one with a narrow tip for small connections
* Drill, preferably a hand-held rotary tool (such as a Dremel)
* Wire strippers/cutters
* A sharp knife
Optional, but worth having around:
* Helping-hands, PCB holder, preferably both
* Multi-meter for testing continuity of your connections
* Hot-glue gun for mounting the USB extender to the Perma-Proto
### Assembly
#### Solder Teensy to the Perma-Proto
1. Solder headers to Teensy
2. Solder headers to Perma-Proto
#### Solder ribbon connectors
* Rows on the Perma-Proto that line up with membrane ribbons
* Trim excess under board
* Test continuity
#### Solder in hookup wires
* Ribbon connector used for the right ribbon will need hookup wire to establish connections to the Teensy
* 12 required, 16 if you want full functionality
#### Optional: Solder in resistors
#### Caveat: D6 pin on the Teensy
There are a few ways to mount the Teensy to the Perma-Proto board. I chose to connect my 16 pin ribbon connector to the
Teensy pins starting at C7 and ending at D2. If you do this, beware that pin D6 will not work for the purposes of this
project. It is possible to modify it to make it so, but that is beyond the scope of this guide.
Bypassing D6 is necessary if you mount your ribbon connector as I have just described. Luckily, it is a simple process!
First, with a sharp knife, sever the connection between your ribbon connector pin that is connected to Teensy D6 pin. I
would recommend doing this at the closest possible point to the Teensy on the underside of the Perma-Proto board. Once
that is done, use a remaining point on the Perma-Proto bus for that ribbon connection (that was previously connected to
D6) to add a jumper wire connected to pin B7. If you are using the firmware files provided in this repository,
everything is already set for this configuration.
### Testing
### Software
#### Build firmware
See qmk documentation on getting your build environment working.
Compile the Mini M firmware files with the default keymap. It allows for the Mini M to be used with the same
functionality as shipped from the manufacturer.
```bash
$ qmk compile -kb unicomp/mini_m -km default
```
While plugged in, press the reset button on your Teensy and then:
```bash
$ qmk flash -kb unicomp/mini_m -km default
```
If everything works to this point, congratulations! You now have a programmable Mini M. If you are using the default
keymap, you can reset your Teensy by pressing Shift+Pause together, eliminating the need to take apart the case in order
to do so.
#### Keymaps
To build your own keymap, create a new directory in `keyboards/unicomp/mini_m/keymaps/<your name>`, copy the files from
`keyboards/unicomp/mini_m/default` into your new directory, and edit them as you wish. When you are ready to flash your
new keymap to the Mini M, the command will be `qmk flash -kb unicomp/mini_m -kb <your name>`.

View File

@ -0,0 +1,22 @@
# MCU name
MCU = at90usb1286
# Bootloader selection
BOOTLOADER = halfkay
# Build Options
# change yes to no to disable
#
BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration
MOUSEKEY_ENABLE = no # Mouse keys
EXTRAKEY_ENABLE = no # Audio control and System control
CONSOLE_ENABLE = yes # Console for debug
COMMAND_ENABLE = no # Commands for debug and configuration
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
NKRO_ENABLE = no # USB Nkey Rollover
BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
BLUETOOTH_ENABLE = no # Enable Bluetooth
AUDIO_ENABLE = no # Audio output

View File

@ -0,0 +1,16 @@
/* Copyright 2021 stevendlander
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "unicomp_mini_m.h"

View File

@ -0,0 +1,49 @@
/* Copyright 2021 stevendlander
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#include "quantum.h"
/* This a shortcut to help you visually see your layout.
* The first section contains "names" for physical keys of the keyboard
* and defines their position on the board.
* The second section defines position of the keys on the switch matrix
* (where COLUMNS and ROWS crosses). */
#define LAYOUT( \
K5A, K5B, K5C, K5D, K5E, K5F, K5G, K5H, K5I, K5J, K5K, K5L, K5M, K5N, K5O, K5P, \
\
K4A, K4B, K4C, K4D, K4E, K4F, K4G, K4H, K4I, K4J, K4K, K4L, K4M, K4N, K4O, K4P, K4Q, K4R, \
K3A, K3B, K3C, K3D, K3E, K3F, K3G, K3H, K3I, K3J, K3K, K3L, K3M, K3N, K3O, K3P, K3Q, \
K2A, K2B, K2C, K2D, K2E, K2F, K2G, K2H, K2I, K2J, K2K, K2L, K2M, K2N, \
K1A, K1B, K1C, K1D, K1E, K1F, K1G, K1H, K1I, K1J, K1K, K1L, K1M, K1N, K1O, \
K0A, K0B, K0C, K0D, K0E, K0F, K0G, K0H, K0I, K0J, K0K \
) \
{ \
/* 00 */ { K4A, K5A, K4F, K1M, K5C, K5D, K5E, K3K, KC_NO, KC_NO, KC_NO, KC_NO, K0C, K2N, KC_NO, KC_NO }, \
/* 01 */ { K2A, K1B, K3B, KC_NO, KC_NO, KC_NO, KC_NO, K4G, K5F, KC_NO, KC_NO, KC_NO, KC_NO, K2M, K0H, K1N, }, \
/* 02 */ { K2C, K2D, K5B, K2E, K2F, K1C, K1E, KC_NO, K1D, K1F, K1G, K2B, K3A, KC_NO, KC_NO, KC_NO }, \
/* 03 */ { KC_NO, KC_NO, K4B, KC_NO, KC_NO, KC_NO, KC_NO, K3G, K5G, KC_NO, KC_NO, K0B, KC_NO, KC_NO, KC_NO, KC_NO }, \
/* 04 */ { KC_NO, KC_NO, K4E, KC_NO, KC_NO, KC_NO, KC_NO, K3J, K5H, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, K0A, K1A, }, \
/* 05 */ { KC_NO, KC_NO, K3C, KC_NO, KC_NO, KC_NO, KC_NO, K4H, K5I, K3L, K0F, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \
/* 06 */ { KC_NO, KC_NO, K4C, KC_NO, KC_NO, KC_NO, KC_NO, K3H, K5J, K4M, K5K, K5L, K4L, K5N, KC_NO, KC_NO }, \
/* 07 */ { KC_NO, KC_NO, K4D, KC_NO, KC_NO, KC_NO, KC_NO, K3I, KC_NO, KC_NO, KC_NO, K5M, K4N, K5O, KC_NO, KC_NO }, \
/* 08 */ { KC_NO, KC_NO, K3F, KC_NO, KC_NO, KC_NO, KC_NO, K4K, KC_NO, K4O, K1O, K3P, K4P, KC_NO, KC_NO, KC_NO }, \
/* 09 */ { KC_NO, KC_NO, K3E, K0E, K0I, KC_NO, KC_NO, K4J, KC_NO, K3N, KC_NO, KC_NO, KC_NO, K4Q, KC_NO, KC_NO }, \
/* 0A */ { K0D, KC_NO, K3D, KC_NO, K0G, KC_NO, KC_NO, K4I, KC_NO, K3M, K0K, K0J, K4R, K3Q, KC_NO, KC_NO }, \
/* 0B */ { K1I, K1J, KC_NO, K1K, K1L, K2G, K2I, KC_NO, K2H, K2J, K2K, K1H, K2L, K3O, KC_NO, K5P, }, \
}
/* 0 1 2 3 4 5 6 7 8 9 A B C D E F */