summaryrefslogtreecommitdiff
path: root/keyboards/model01
diff options
context:
space:
mode:
Diffstat (limited to 'keyboards/model01')
-rw-r--r--keyboards/model01/config.h38
-rw-r--r--keyboards/model01/info.json87
-rw-r--r--keyboards/model01/keymaps/default/config.h19
-rw-r--r--keyboards/model01/keymaps/default/keymap.c124
-rw-r--r--keyboards/model01/keymaps/default/readme.md3
-rw-r--r--keyboards/model01/keymaps/default/rules.mk2
-rw-r--r--keyboards/model01/keymaps/dshields/config.h30
-rw-r--r--keyboards/model01/keymaps/dshields/keymap.c53
-rw-r--r--keyboards/model01/keymaps/dshields/readme.md10
-rw-r--r--keyboards/model01/keymaps/dshields/rules.mk3
-rw-r--r--keyboards/model01/leds.c169
-rw-r--r--keyboards/model01/leds.h22
-rw-r--r--keyboards/model01/matrix.c94
-rw-r--r--keyboards/model01/model01.c38
-rw-r--r--keyboards/model01/model01.h50
-rw-r--r--keyboards/model01/readme.md37
-rw-r--r--keyboards/model01/rules.mk64
-rw-r--r--keyboards/model01/wire-protocol-constants.h53
18 files changed, 896 insertions, 0 deletions
diff --git a/keyboards/model01/config.h b/keyboards/model01/config.h
new file mode 100644
index 0000000000..167310731f
--- /dev/null
+++ b/keyboards/model01/config.h
@@ -0,0 +1,38 @@
+/*
+Copyright 2018 James Laird-Wah
+
+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 0x1209
+#define PRODUCT_ID 0x2301
+#define DEVICE_VER 0x0001
+#define MANUFACTURER Keyboardio
+#define PRODUCT Model 01
+#define DESCRIPTION (QMK)
+
+/* key matrix size; rows are doubled for split */
+#define MATRIX_ROWS 8
+#define MATRIX_COLS 8
+
+/* The scanners already debounce for us */
+#define DEBOUNCING_DELAY 0
+
+/* RGB matrix constants */
+#define DRIVER_LED_TOTAL 64
diff --git a/keyboards/model01/info.json b/keyboards/model01/info.json
new file mode 100644
index 0000000000..60c914d5c0
--- /dev/null
+++ b/keyboards/model01/info.json
@@ -0,0 +1,87 @@
+{
+ "keyboard_name": "model01",
+ "keyboard_folder": "model01",
+ "url": "https://keyboard.io",
+ "maintainer": "qmk",
+ "width": 18.5,
+ "height": 7.5,
+ "layouts": {
+ "LAYOUT": {
+ "layout": [
+ {"label":"PROG", "x":0, "y":0.4, "h":1.3},
+ {"label":"1", "x":1, "y":0.2, "h":1.5},
+ {"label":"2", "x":2, "y":0.1, "h":1.1},
+ {"label":"3", "x":3, "y":0},
+ {"label":"4", "x":4, "y":0.1},
+ {"label":"5", "x":5, "y":0.3},
+
+ {"label":"6", "x":12.5, "y":0.3},
+ {"label":"7", "x":13.5, "y":0.1},
+ {"label":"8", "x":14.5, "y":0},
+ {"label":"9", "x":15.5, "y":0.1, "h":1.1},
+ {"label":"0", "x":16.5, "y":0.2, "h":1.5},
+ {"label":"NUM", "x":17.5, "y":0.4, "h":1.3},
+
+ {"label":"GRAVE", "x":0, "y":1.7},
+ {"label":"Q", "x":1, "y":1.7},
+ {"label":"W", "x":2, "y":1.2},
+ {"label":"E", "x":3, "y":1},
+ {"label":"R", "x":4, "y":1.1},
+ {"label":"T", "x":5, "y":1.3},
+ {"label":"LED", "x":6, "y":0.6, "h":1.5},
+
+ {"label":"ANY", "x":11.5, "y":0.6, "h":1.5},
+ {"label":"Y", "x":12.5, "y":1.3},
+ {"label":"U", "x":13.5, "y":1.1},
+ {"label":"I", "x":14.5, "y":1},
+ {"label":"O", "x":15.5, "y":1.2},
+ {"label":"P", "x":16.5, "y":1.7},
+ {"label":"EQUAL", "x":17.5, "y":1.7},
+
+ {"label":"PAGEUP", "x":0, "y":2.7},
+ {"label":"A", "x":1, "y":2.7},
+ {"label":"S", "x":2, "y":2.2},
+ {"label":"D", "x":3, "y":2},
+ {"label":"F", "x":4, "y":2.1},
+ {"label":"G", "x":5, "y":2.3},
+ {"label":"TAB", "x":6, "y":2.1, "h":1.3},
+
+ {"label":"ENTER", "x":11.5, "y":2.1, "h":1.3},
+ {"label":"H", "x":12.5, "y":2.3},
+ {"label":"J", "x":13.5, "y":2.1},
+ {"label":"K", "x":14.5, "y":2},
+ {"label":"L", "x":15.5, "y":2.2},
+ {"label":"SEMICOLON", "x":16.5, "y":2.7},
+ {"label":"QUOTE", "x":17.5, "y":2.7},
+
+ {"label":"PAGEDOWN", "x":0, "y":3.7, "h":1.2},
+ {"label":"Z", "x":1, "y":3.7},
+ {"label":"X", "x":2, "y":3.2, "h":1.15},
+ {"label":"C", "x":3, "y":3},
+ {"label":"V", "x":4, "y":3.1},
+ {"label":"B", "x":5, "y":3.3},
+ {"label":"ESC", "x":6, "y":3.4, "h":1.1},
+
+ {"label":"BUTTERFLY", "x":11.5, "y":3.4, "h":1.1},
+ {"label":"N", "x":12.5, "y":3.3},
+ {"label":"M", "x":13.5, "y":3.1},
+ {"label":"COMMA", "x":14.5, "y":3},
+ {"label":"DOT", "x":15.5, "y":3.2, "h":1.15},
+ {"label":"SLASH", "x":16.5, "y":3.7},
+ {"label":"MINS", "x":17.5, "y":3.7, "h":1.2},
+
+ {"label":"LCTL", "x":4.75, "y":4.3},
+ {"label":"RCTL", "x":12.75, "y":4.3},
+ {"label":"BACKSPACE", "x":5.75, "y":4.5},
+ {"label":"SPACE", "x":11.75, "y":4.5},
+ {"label":"LGUI", "x":6.75, "y":4.7},
+ {"label":"RALT", "x":10.75, "y":4.7},
+ {"label":"LSHIFT", "x":7.75, "y":5.1},
+ {"label":"RSHIFT", "x":9.75, "y":5.1},
+
+ {"label":"FN", "x":6.25, "y":6.1, "h":1.4},
+ {"label":"FN", "x":11.25, "y":6.1, "h":1.4}
+ ]
+ }
+ }
+}
diff --git a/keyboards/model01/keymaps/default/config.h b/keyboards/model01/keymaps/default/config.h
new file mode 100644
index 0000000000..8ab9d8b025
--- /dev/null
+++ b/keyboards/model01/keymaps/default/config.h
@@ -0,0 +1,19 @@
+/* Copyright 2018 James Laird-Wah
+ *
+ * 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
+
+/* place overrides here */
diff --git a/keyboards/model01/keymaps/default/keymap.c b/keyboards/model01/keymaps/default/keymap.c
new file mode 100644
index 0000000000..a6e5303fe8
--- /dev/null
+++ b/keyboards/model01/keymaps/default/keymap.c
@@ -0,0 +1,124 @@
+/* Copyright 2018 James Laird-Wah
+ *
+ * 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 constants */
+enum {
+ DEF = 0,
+ NUM,
+ FUN,
+};
+
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+[DEF] = LAYOUT(
+ RESET , KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , TG(NUM),
+ KC_GRV , KC_Q , KC_W , KC_E , KC_R , KC_T , RGB_MOD, _______, KC_Y , KC_U , KC_I , KC_O , KC_P , KC_EQL ,
+ KC_PGUP, KC_A , KC_S , KC_D , KC_F , KC_G , KC_TAB , KC_ENT , KC_H , KC_J , KC_K , KC_L , KC_SCLN, KC_QUOT,
+ KC_PGDN, KC_Z , KC_X , KC_C , KC_V , KC_B , KC_ESC , _______, KC_N , KC_M , KC_COMM, KC_DOT , KC_SLSH, KC_MINS,
+ KC_LCTL, KC_RCTL,
+ KC_BSPC, KC_SPC ,
+ KC_LGUI, KC_RALT,
+ KC_LSFT, KC_RSFT,
+ MO(FUN), MO(FUN)
+ ),
+[NUM] = LAYOUT(
+ _______, _______, _______, _______, _______, _______, _______, KC_P7 , KC_P8 , KC_P9 , KC_PMNS, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_P4 , KC_P5 , KC_P6 , KC_PPLS, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_P1 , KC_P2 , KC_P3 , KC_PEQL, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_P0 , KC_PDOT, KC_PAST, KC_PSLS, KC_PENT,
+ _______, _______,
+ _______, _______,
+ _______, _______,
+ _______, _______,
+ _______, _______
+ ),
+[FUN] = LAYOUT(
+ _______, KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_F5 , KC_F6 , KC_F7 , KC_F8 , KC_F9 , KC_F10 , KC_F11 ,
+ KC_TAB , _______, KC_MS_U, _______, KC_BTN3, _______, RGB_TOG, KC_MPRV, KC_MNXT, KC_LCBR, KC_RCBR, KC_LBRC, KC_RBRC, KC_F12 ,
+ KC_HOME, KC_MS_L, KC_MS_D, KC_MS_R, KC_BTN1, _______, _______, KC_MPLY, KC_LEFT, KC_DOWN, KC_UP , KC_RGHT, _______, _______,
+ KC_END , KC_PSCR, KC_INS , _______, KC_BTN2, _______, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, KC_BSLS, KC_PIPE,
+ _______, _______,
+ KC_DEL , KC_ENT ,
+ _______, _______,
+ _______, _______,
+ _______, _______
+ )
+};
+
+/* template for new layouts:
+LAYOUT(
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______,
+ _______, _______,
+ _______, _______,
+ _______, _______,
+ _______, _______
+ )
+*/
+
+static void set_numpad_colours(int on, void (*write)(int, uint8_t, uint8_t, uint8_t)) {
+ if (!on) {
+ for (int i=44; i<=60; i++)
+ write(i, 0, 0, 0);
+ write(63, 0, 0, 0);
+ return;
+ }
+
+ /* main number keys */
+ for (int i=44; i<=47; i++)
+ write(i, 255, 0, 0);
+ for (int i=49; i<=54; i++)
+ write(i, 255, 0, 0);
+
+ /* accessory keys */
+ write(48, 128, 128, 0);
+ for (int i=55; i<=59; i++)
+ write(i, 128, 128, 0);
+
+ // enter
+ write(63, 0, 128, 0);
+
+ // num key
+ write(60, 128, 0, 128);
+}
+
+#ifdef RGB_MATRIX_ENABLE
+/* the RGB matrix effects will overwrite the numpad indicator.
+ * this handy mechanism allows to override the matrix effects.
+ */
+void rgb_matrix_indicators_user(void) {
+ if (layer_state & (1<<NUM)) {
+ set_numpad_colours(1, &rgb_matrix_set_color);
+ }
+}
+#else /* no RGB matrix support */
+
+uint32_t layer_state_set_user(uint32_t state) {
+ if (state & (1<<NUM)) {
+ set_numpad_colours(1, &set_led_to);
+ } else {
+ set_numpad_colours(0, &set_led_to);
+ }
+
+ return state;
+}
+#endif
+
+/* vim: set ts=2 sw=2 et: */
diff --git a/keyboards/model01/keymaps/default/readme.md b/keyboards/model01/keymaps/default/readme.md
new file mode 100644
index 0000000000..740515a268
--- /dev/null
+++ b/keyboards/model01/keymaps/default/readme.md
@@ -0,0 +1,3 @@
+# The default keymap for Keyboardio's Model01
+
+This implements all of their default keymap, except for mouse warping.
diff --git a/keyboards/model01/keymaps/default/rules.mk b/keyboards/model01/keymaps/default/rules.mk
new file mode 100644
index 0000000000..4d1abd88ad
--- /dev/null
+++ b/keyboards/model01/keymaps/default/rules.mk
@@ -0,0 +1,2 @@
+# used by default keymap
+MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
diff --git a/keyboards/model01/keymaps/dshields/config.h b/keyboards/model01/keymaps/dshields/config.h
new file mode 100644
index 0000000000..1c78217f2f
--- /dev/null
+++ b/keyboards/model01/keymaps/dshields/config.h
@@ -0,0 +1,30 @@
+#pragma once
+
+#define RGB_MATRIX_KEYPRESSES
+#define RGB_DIGITAL_RAIN_DROPS 18
+#define USB_MAX_POWER_CONSUMPTION 100
+#define ONESHOT_TAP_TOGGLE 2
+#define ONESHOT_TIMEOUT 3000
+
+#define MOUSEKEY_INTERVAL 20
+#define MOUSEKEY_DELAY 0
+#define MOUSEKEY_TIME_TO_MAX 40
+#define MOUSEKEY_MAX_SPEED 7
+#define MOUSEKEY_WHEEL_DELAY 0
+
+// dynamic macro keys
+#define DM_PLAY DYN_MACRO_PLAY1
+#define DM_STRT DYN_REC_START1
+#define DM_STOP DYN_REC_STOP
+
+// one-shot layer keys
+#define OSL_FUN OSL(FUN)
+
+// one-shot modifier keys
+#define OSMLCTL OSM(MOD_LCTL)
+#define OSMRCTL OSM(MOD_RCTL)
+#define OSMLALT OSM(MOD_LALT)
+#define OSMRALT OSM(MOD_RALT)
+#define OSMLSFT OSM(MOD_LSFT)
+#define OSMRSFT OSM(MOD_RSFT)
+
diff --git a/keyboards/model01/keymaps/dshields/keymap.c b/keyboards/model01/keymaps/dshields/keymap.c
new file mode 100644
index 0000000000..3a89d062b5
--- /dev/null
+++ b/keyboards/model01/keymaps/dshields/keymap.c
@@ -0,0 +1,53 @@
+#include QMK_KEYBOARD_H
+
+enum { DEF, FUN };
+enum { DYNAMIC_MACRO_RANGE = SAFE_RANGE };
+
+#include "dynamic_macro.h"
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+[DEF] = LAYOUT(
+ RESET , KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , _______,
+ KC_GRV , KC_Q , KC_W , KC_E , KC_R , KC_T , RGB_TOG, DM_PLAY, KC_Y , KC_U , KC_I , KC_O , KC_P , KC_EQL ,
+ KC_PGUP, KC_A , KC_S , KC_D , KC_F , KC_G , KC_TAB , KC_ENT , KC_H , KC_J , KC_K , KC_L , KC_SCLN, KC_QUOT,
+ KC_PGDN, KC_Z , KC_X , KC_C , KC_V , KC_B , KC_ESC , _______, KC_N , KC_M , KC_COMM, KC_DOT , KC_SLSH, KC_MINS,
+ OSMLCTL, KC_RCTL,
+ KC_BSPC, KC_SPC ,
+ KC_LGUI, OSMRALT,
+ OSMLSFT, OSMRSFT,
+ OSL_FUN, OSL_FUN
+ ),
+[FUN] = LAYOUT(
+ _______, KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_F5 , KC_F6 , KC_F7 , KC_F8 , KC_F9 , KC_F10 , KC_F11 ,
+ KC_TAB , _______, KC_MS_U, _______, KC_BTN3, _______, RGB_MOD, DM_STRT, _______, KC_LCBR, KC_RCBR, KC_LBRC, KC_RBRC, KC_F12 ,
+ KC_HOME, KC_MS_L, KC_MS_D, KC_MS_R, KC_BTN1, _______, _______, DM_STOP, KC_LEFT, KC_DOWN, KC_UP , KC_RGHT, _______, _______,
+ KC_END , KC_PSCR, KC_INS , _______, KC_BTN2, _______, _______, _______, _______, _______, _______, _______, KC_BSLS, KC_PIPE,
+ _______, _______,
+ KC_DEL , KC_ENT ,
+ _______, _______,
+ _______, _______,
+ _______, _______
+ )
+};
+
+uint32_t layer_state_set_user(uint32_t state) {
+ switch (biton32(state)) {
+ case DEF:
+ set_all_leds_to(0,0,0);
+ break;
+ case FUN:
+ // TODO light the fn keys
+ // set_led_to(?, 0, 128, 0);
+ // set_led_to(?, 0, 128, 0);
+ break;
+ }
+ return state;
+}
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ if (!process_record_dynamic_macro(keycode, record)) {
+ return false;
+ }
+ return true;
+}
+
diff --git a/keyboards/model01/keymaps/dshields/readme.md b/keyboards/model01/keymaps/dshields/readme.md
new file mode 100644
index 0000000000..ead1c1aad2
--- /dev/null
+++ b/keyboards/model01/keymaps/dshields/readme.md
@@ -0,0 +1,10 @@
+
+About
+------
+
+A lightly modded version of the default keymap.
+
+- One-shot modifiers and layers.
+- Dynamic macros
+- No num lock layer
+
diff --git a/keyboards/model01/keymaps/dshields/rules.mk b/keyboards/model01/keymaps/dshields/rules.mk
new file mode 100644
index 0000000000..d3754cc1fc
--- /dev/null
+++ b/keyboards/model01/keymaps/dshields/rules.mk
@@ -0,0 +1,3 @@
+MOUSEKEY_ENABLE = yes
+EXTRAKEY_ENABLE = no
+CONSOLE_ENABLE = no
diff --git a/keyboards/model01/leds.c b/keyboards/model01/leds.c
new file mode 100644
index 0000000000..7a62c7424c
--- /dev/null
+++ b/keyboards/model01/leds.c
@@ -0,0 +1,169 @@
+/* Copyright 2018 James Laird-Wah
+ *
+ * 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 <quantum.h>
+#include <i2c_master.h>
+#include <led_tables.h>
+#include <rgb_matrix.h>
+#include <string.h>
+#include "model01.h"
+
+#define I2C_TIMEOUT 1000
+
+void set_all_leds_to(uint8_t r, uint8_t g, uint8_t b) {
+ uint8_t buf[] = {
+ TWI_CMD_LED_SET_ALL_TO,
+ b, g, r
+ };
+ i2c_transmit(I2C_ADDR(LEFT), buf, sizeof(buf), I2C_TIMEOUT);
+ i2c_transmit(I2C_ADDR(RIGHT), buf, sizeof(buf), I2C_TIMEOUT);
+ _delay_us(10);
+}
+
+void set_led_to(int led, uint8_t r, uint8_t g, uint8_t b) {
+ uint8_t buf[] = {
+ TWI_CMD_LED_SET_ONE_TO,
+ led & 0x1f,
+ b, g, r
+ };
+ int hand = (led >= 32) ? RIGHT : LEFT;
+ i2c_transmit(I2C_ADDR(hand), buf, sizeof(buf), I2C_TIMEOUT);
+ _delay_us(10);
+}
+
+#ifdef RGB_MATRIX_ENABLE
+
+__attribute__ ((weak))
+const rgb_led g_rgb_leds[DRIVER_LED_TOTAL] = {
+ {{0x73}, { 3, 35}, 0},
+ {{0x72}, { 0, 26}, 0},
+ {{0x71}, { 0, 17}, 0},
+ {{0x70}, { 0, 6}, 0},
+ {{0x60}, { 14, 5}, 0},
+ {{0x61}, { 15, 16}, 0},
+ {{0x62}, { 16, 25}, 0},
+ {{0x63}, { 17, 34}, 0},
+ {{0x53}, { 31, 29}, 0},
+ {{0x52}, { 31, 19}, 0},
+ {{0x51}, { 30, 11}, 0},
+ {{0x50}, { 30, 1}, 0},
+ {{0x40}, { 45, 0}, 0},
+ {{0x41}, { 45, 8}, 0},
+ {{0x42}, { 46, 17}, 0},
+ {{0x43}, { 46, 27}, 0},
+ {{0x33}, { 60, 27}, 0},
+ {{0x32}, { 60, 18}, 0},
+ {{0x31}, { 60, 9}, 0},
+ {{0x30}, { 60, 0}, 0},
+ {{0x20}, { 74, 2}, 0},
+ {{0x21}, { 74, 11}, 0},
+ {{0x22}, { 75, 20}, 0},
+ {{0x23}, { 74, 28}, 0},
+ {{0x12}, { 89, 30}, 0},
+ {{0x11}, { 89, 19}, 0},
+ {{0x10}, { 89, 7}, 0},
+ {{0x00}, { 70, 38}, 1},
+ {{0x01}, { 82, 41}, 1},
+ {{0x02}, { 93, 45}, 1},
+ {{0x03}, {104, 50}, 1},
+ {{0x13}, { 74, 64}, 1},
+ {{0x67}, {149, 64}, 1},
+ {{0x77}, {119, 50}, 1},
+ {{0x76}, {130, 45}, 1},
+ {{0x75}, {141, 41}, 1},
+ {{0x74}, {153, 38}, 1},
+ {{0x64}, {134, 7}, 0},
+ {{0x65}, {134, 19}, 0},
+ {{0x66}, {134, 30}, 0},
+ {{0x57}, {149, 28}, 0},
+ {{0x56}, {148, 20}, 0},
+ {{0x55}, {149, 11}, 0},
+ {{0x54}, {149, 2}, 0},
+ {{0x44}, {163, 0}, 0},
+ {{0x45}, {163, 9}, 0},
+ {{0x46}, {163, 18}, 0},
+ {{0x47}, {163, 27}, 0},
+ {{0x37}, {177, 27}, 0},
+ {{0x36}, {177, 17}, 0},
+ {{0x35}, {178, 8}, 0},
+ {{0x34}, {178, 0}, 0},
+ {{0x24}, {193, 1}, 0},
+ {{0x25}, {193, 11}, 0},
+ {{0x26}, {192, 19}, 0},
+ {{0x27}, {192, 29}, 0},
+ {{0x17}, {206, 34}, 0},
+ {{0x16}, {207, 25}, 0},
+ {{0x15}, {208, 16}, 0},
+ {{0x14}, {209, 5}, 0},
+ {{0x04}, {224, 6}, 0},
+ {{0x05}, {223, 17}, 0},
+ {{0x06}, {223, 26}, 0},
+ {{0x07}, {220, 35}, 0},
+};
+
+static struct {
+ uint8_t b;
+ uint8_t g;
+ uint8_t r;
+} __attribute__((packed)) led_state[64];
+
+static void set_color(int index, uint8_t r, uint8_t g, uint8_t b) {
+ led_state[index].r = r;
+ led_state[index].g = g;
+ led_state[index].b = b;
+}
+
+static void set_color_all(uint8_t r, uint8_t g, uint8_t b) {
+ for (int i=0; i<DRIVER_LED_TOTAL; i++)
+ set_color(i, r, g, b);
+}
+
+static void init(void) {
+ // Enable high current pathway to LEDs - this does violate the USB spec though! (1.6 amps...)
+ DDRE |= _BV(6);
+ PORTE &= ~_BV(6);
+
+ // Overcurrent check input
+ DDRB &= ~_BV(4);
+ PORTB &= ~_BV(4);
+}
+
+static void flush(void) {
+ uint8_t *bank_data = (uint8_t*)&led_state[0];
+ uint8_t command[1 + 8*3];
+ for (int hand=0; hand<2; hand++) {
+ int addr = I2C_ADDR(hand);
+
+ for (int bank=0; bank<4; bank++) {
+ command[0] = TWI_CMD_LED_BASE + bank;
+ memcpy(&command[1], bank_data, 8*3);
+ i2c_transmit(addr, command, sizeof(command), I2C_TIMEOUT);
+ _delay_us(100);
+
+ bank_data += 8*3;
+ }
+ }
+}
+
+const rgb_matrix_driver_t rgb_matrix_driver = {
+ .init = init,
+ .flush = flush,
+ .set_color = set_color,
+ .set_color_all = set_color_all
+};
+
+#endif
+
+/* vim: set ts=2 sw=2 et: */
diff --git a/keyboards/model01/leds.h b/keyboards/model01/leds.h
new file mode 100644
index 0000000000..405bdf328a
--- /dev/null
+++ b/keyboards/model01/leds.h
@@ -0,0 +1,22 @@
+/* Copyright 2018 James Laird-Wah
+ *
+ * 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>
+#include <rgb_matrix.h>
+
+void set_all_leds_to(uint8_t r, uint8_t g, uint8_t b);
+void set_led_to(int led, uint8_t r, uint8_t g, uint8_t b);
diff --git a/keyboards/model01/matrix.c b/keyboards/model01/matrix.c
new file mode 100644
index 0000000000..f1f9024c7c
--- /dev/null
+++ b/keyboards/model01/matrix.c
@@ -0,0 +1,94 @@
+/* Copyright 2018 James Laird-Wah
+ *
+ * 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 <quantum.h>
+#include <i2c_master.h>
+#include <string.h>
+#include "model01.h"
+
+/* If no key events have occurred, the scanners will time out on reads.
+ * So we don't want to be too permissive here. */
+#define I2C_TIMEOUT 10
+
+static matrix_row_t rows[MATRIX_ROWS];
+#define ROWS_PER_HAND (MATRIX_ROWS / 2)
+
+inline
+uint8_t matrix_rows(void) {
+ return MATRIX_ROWS;
+}
+
+inline
+uint8_t matrix_cols(void) {
+ return MATRIX_COLS;
+}
+
+static int i2c_read_hand(int hand) {
+ uint8_t buf[5];
+ i2c_status_t ret = i2c_receive(I2C_ADDR(hand), buf, sizeof(buf), I2C_TIMEOUT);
+ if (ret != I2C_STATUS_SUCCESS)
+ return 1;
+
+ if (buf[0] != TWI_REPLY_KEYDATA)
+ return 2;
+
+ int start_row = hand ? ROWS_PER_HAND : 0;
+ uint8_t *out = &rows[start_row];
+ memcpy(out, &buf[1], 4);
+ return 0;
+}
+
+static int i2c_set_keyscan_interval(int hand, int delay) {
+ uint8_t buf[] = {TWI_CMD_KEYSCAN_INTERVAL, delay};
+ i2c_status_t ret = i2c_transmit(I2C_ADDR(hand), buf, sizeof(buf), I2C_TIMEOUT);
+ return ret;
+}
+
+void matrix_init(void) {
+ /* Ensure scanner power is on - else right hand will not work */
+ DDRC |= _BV(7);
+ PORTC |= _BV(7);
+
+ i2c_init();
+ i2c_set_keyscan_interval(LEFT, 2);
+ i2c_set_keyscan_interval(RIGHT, 2);
+ memset(rows, 0, sizeof(rows));
+
+ matrix_init_quantum();
+}
+
+uint8_t matrix_scan(void) {
+ uint8_t ret = 0;
+ ret |= i2c_read_hand(LEFT);
+ ret |= i2c_read_hand(RIGHT);
+ matrix_scan_quantum();
+ return ret;
+}
+
+inline
+matrix_row_t matrix_get_row(uint8_t row) {
+ return rows[row];
+}
+
+void matrix_print(void) {
+ print("\nr/c 0123456789ABCDEF\n");
+ for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
+ phex(row); print(": ");
+ pbin_reverse16(matrix_get_row(row));
+ print("\n");
+ }
+}
+
+/* vim: set ts=2 sw=2 et: */
diff --git a/keyboards/model01/model01.c b/keyboards/model01/model01.c
new file mode 100644
index 0000000000..29615ca866
--- /dev/null
+++ b/keyboards/model01/model01.c
@@ -0,0 +1,38 @@
+/* Copyright 2018 James Laird-Wah
+ *
+ * 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 <quantum.h>
+#include <i2c_master.h>
+#include <string.h>
+#include "model01.h"
+
+void matrix_init_kb(void) {
+ /* the bootloader can leave LEDs on, so */
+ set_all_leds_to(0, 0, 0);
+ matrix_init_user();
+}
+
+void matrix_scan_kb(void) {
+ matrix_scan_user();
+}
+
+__attribute__ ((weak))
+void matrix_scan_user(void) {
+}
+
+__attribute__ ((weak))
+void matrix_init_user(void) {
+}
+
diff --git a/keyboards/model01/model01.h b/keyboards/model01/model01.h
new file mode 100644
index 0000000000..a83e33cd86
--- /dev/null
+++ b/keyboards/model01/model01.h
@@ -0,0 +1,50 @@
+/* Copyright 2018 James Laird-Wah
+ *
+ * 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>
+
+#define LAYOUT( \
+ L07, L06, L05, L04, L03, L02, R05, R04, R03, R02, R01, R00, \
+ L17, L16, L15, L14, L13, L12, L01, R06, R15, R14, R13, R12, R11, R10, \
+ L27, L26, L25, L24, L23, L22, L11, R16, R25, R24, R23, R22, R21, R20, \
+ L37, L36, L35, L34, L33, L32, L21, R26, R35, R34, R33, R32, R31, R30, \
+ L00, R07, \
+ L10, R17, \
+ L20, R27, \
+ L30, R37, \
+ L31, R36 \
+ ) { \
+ {L00, L01, L02, L03, L04, L05, L06, L07}, \
+ {L10, L11, L12, L13, L14, L15, L16, L17}, \
+ {L20, L21, L22, L23, L24, L25, L26, L27}, \
+ {L30, L31, L32, L33, L34, L35, L36, L37}, \
+ {R00, R01, R02, R03, R04, R05, R06, R07}, \
+ {R10, R11, R12, R13, R14, R15, R16, R17}, \
+ {R20, R21, R22, R23, R24, R25, R26, R27}, \
+ {R30, R31, R32, R33, R34, R35, R36, R37} \
+ }
+
+#include "wire-protocol-constants.h"
+#define I2C_ADDR_LEFT (0x58 << 1)
+#define I2C_ADDR_RIGHT (I2C_ADDR_LEFT + 6)
+#define I2C_ADDR(hand) ((hand) ? I2C_ADDR_RIGHT : I2C_ADDR_LEFT)
+#define LEFT 0
+#define RIGHT 1
+
+#include "leds.h"
+
+/* vim: set ts=2 sw=2 et: */
diff --git a/keyboards/model01/readme.md b/keyboards/model01/readme.md
new file mode 100644
index 0000000000..34bd291e2e
--- /dev/null
+++ b/keyboards/model01/readme.md
@@ -0,0 +1,37 @@
+# Keyboardio Model 01
+
+A split keyboard.
+
+Keyboard Maintainer: QMK Community
+Hardware Supported: Keyboardio Model 01
+Hardware Availability: [Keyboardio](https://shop.keyboard.io)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make model01:default
+
+See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information.
+Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
+
+## Programming the Keyboard
+
+To program the keyboard, if you have avrdude installed:
+
+ make model01:default:avrdude
+
+When prompted to reset your keyboard, press the prog key at upper left. If the
+keyboard does not reset, you can hold the prog key while plugging it into your
+computer. The prog key will light up red in programming mode.
+
+## Features
+
+This implements the standard keymap, including mousekeys.
+
+It doesn't do cursor warping - QMK does not support absolute mouse positioning.
+
+LED support is limited. Gamma compensation and the high speed batch update
+functions supported by the hardware are not implemented. The high current power
+switch is also not implemented, so if you try and turn all the LEDs on at full
+brightness, something may conk out.
+
+Hotplugging the two halves works but is not extensively tested.
diff --git a/keyboards/model01/rules.mk b/keyboards/model01/rules.mk
new file mode 100644
index 0000000000..49ab981d14
--- /dev/null
+++ b/keyboards/model01/rules.mk
@@ -0,0 +1,64 @@
+SRC += i2c_master.c \
+ leds.c \
+ matrix.c
+
+# MCU name
+MCU = atmega32u4
+
+# Processor frequency.
+# This will define a symbol, F_CPU, in all source code files equal to the
+# processor frequency in Hz. You can then use this symbol in your source code to
+# calculate timings. Do NOT tack on a 'UL' at the end, this will be done
+# automatically to create a 32-bit value in your source code.
+#
+# This will be an integer division of F_USB below, as it is sourced by
+# F_USB after it has run through any CPU prescalers. Note that this value
+# does not *change* the processor frequency - it should merely be updated to
+# reflect the processor speed set externally so that the code can use accurate
+# software delays.
+F_CPU = 16000000
+
+
+#
+# LUFA specific
+#
+# Target architecture (see library "Board Types" documentation).
+ARCH = AVR8
+
+# Input clock frequency.
+# This will define a symbol, F_USB, in all source code files equal to the
+# input clock frequency (before any prescaling is performed) in Hz. This value may
+# differ from F_CPU if prescaling is used on the latter, and is required as the
+# raw input clock is fed directly to the PLL sections of the AVR for high speed
+# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+# at the end, this will be done automatically to create a 32-bit value in your
+# source code.
+#
+# If no clock division is performed on the input clock inside the AVR (via the
+# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_USB = $(F_CPU)
+
+# Interrupt driven control endpoint task(+60)
+OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
+
+BOOTLOADER = caterina
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000)
+MOUSEKEY_ENABLE = no # Mouse keys(+4700)
+EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
+CONSOLE_ENABLE = yes # Console for debug(+400)
+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
+MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config)
+UNICODE_ENABLE = no # Unicode
+
+CUSTOM_MATRIX = yes
+
+# You can set RGB_MATRIX_ENABLE = no in your rules.mk to disable this and save the Flash
+RGB_MATRIX_ENABLE = custom # Enable RGB matrix effects (+10000).
diff --git a/keyboards/model01/wire-protocol-constants.h b/keyboards/model01/wire-protocol-constants.h
new file mode 100644
index 0000000000..90a528582a
--- /dev/null
+++ b/keyboards/model01/wire-protocol-constants.h
@@ -0,0 +1,53 @@
+/*
+ * This file is taken from the KeyboardioScanner module:
+ * https://github.com/keyboardio/KeyboardioScanner/blob/master/wire-protocol-constants.h
+ *
+ * Copyright (C) 2015-2018 Keyboard.io, Inc
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#pragma once
+
+#define TWI_CMD_NONE 0x00
+#define TWI_CMD_VERSION 0x01
+#define TWI_CMD_KEYSCAN_INTERVAL 0x02
+#define TWI_CMD_LED_SET_ALL_TO 0x03
+#define TWI_CMD_LED_SET_ONE_TO 0x04
+#define TWI_CMD_COLS_USE_PULLUPS 0x05
+#define TWI_CMD_LED_SPI_FREQUENCY 0x06
+
+#define LED_SPI_FREQUENCY_4MHZ 0x07
+#define LED_SPI_FREQUENCY_2MHZ 0x06
+#define LED_SPI_FREQUENCY_1MHZ 0x05
+#define LED_SPI_FREQUENCY_512KHZ 0x04
+#define LED_SPI_FREQUENCY_256KHZ 0x03
+#define LED_SPI_FREQUENCY_128KHZ 0x02
+#define LED_SPI_FREQUENCY_64KHZ 0x01
+#define LED_SPI_OFF 0x00
+
+
+// 512KHZ seems to be the sweet spot in early testing
+// so make it the default
+#define LED_SPI_FREQUENCY_DEFAULT LED_SPI_FREQUENCY_512KHZ
+
+
+#define TWI_CMD_LED_BASE 0x80
+
+#define TWI_REPLY_NONE 0x00
+#define TWI_REPLY_KEYDATA 0x01