summaryrefslogtreecommitdiff
path: root/keyboards/keyboardio/model01
diff options
context:
space:
mode:
Diffstat (limited to 'keyboards/keyboardio/model01')
-rw-r--r--keyboards/keyboardio/model01/config.h38
-rw-r--r--keyboards/keyboardio/model01/info.json87
-rw-r--r--keyboards/keyboardio/model01/keymaps/default/config.h19
-rw-r--r--keyboards/keyboardio/model01/keymaps/default/keymap.c124
-rw-r--r--keyboards/keyboardio/model01/keymaps/default/readme.md3
-rw-r--r--keyboards/keyboardio/model01/keymaps/dshields/config.h4
-rw-r--r--keyboards/keyboardio/model01/keymaps/dshields/keymap.c28
-rw-r--r--keyboards/keyboardio/model01/keymaps/dshields/readme.md10
-rw-r--r--keyboards/keyboardio/model01/keymaps/tw1t611/config.h19
-rw-r--r--keyboards/keyboardio/model01/keymaps/tw1t611/keymap.c50
-rw-r--r--keyboards/keyboardio/model01/keymaps/tw1t611/readme.md5
-rw-r--r--keyboards/keyboardio/model01/leds.c132
-rw-r--r--keyboards/keyboardio/model01/leds.h22
-rw-r--r--keyboards/keyboardio/model01/matrix.c94
-rw-r--r--keyboards/keyboardio/model01/model01.c38
-rw-r--r--keyboards/keyboardio/model01/model01.h50
-rw-r--r--keyboards/keyboardio/model01/readme.md37
-rw-r--r--keyboards/keyboardio/model01/rules.mk35
-rw-r--r--keyboards/keyboardio/model01/wire-protocol-constants.h53
19 files changed, 848 insertions, 0 deletions
diff --git a/keyboards/keyboardio/model01/config.h b/keyboards/keyboardio/model01/config.h
new file mode 100644
index 0000000000..c2160979cd
--- /dev/null
+++ b/keyboards/keyboardio/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 DEBOUNCE 0
+
+/* RGB matrix constants */
+#define DRIVER_LED_TOTAL 64
diff --git a/keyboards/keyboardio/model01/info.json b/keyboards/keyboardio/model01/info.json
new file mode 100644
index 0000000000..66bea171d2
--- /dev/null
+++ b/keyboards/keyboardio/model01/info.json
@@ -0,0 +1,87 @@
+{
+ "keyboard_name": "model01",
+ "keyboard_folder": "keyboardio/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/keyboardio/model01/keymaps/default/config.h b/keyboards/keyboardio/model01/keymaps/default/config.h
new file mode 100644
index 0000000000..8ab9d8b025
--- /dev/null
+++ b/keyboards/keyboardio/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/keyboardio/model01/keymaps/default/keymap.c b/keyboards/keyboardio/model01/keymaps/default/keymap.c
new file mode 100644
index 0000000000..5ee865972e
--- /dev/null
+++ b/keyboards/keyboardio/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 */
+
+layer_state_t layer_state_set_user(layer_state_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/keyboardio/model01/keymaps/default/readme.md b/keyboards/keyboardio/model01/keymaps/default/readme.md
new file mode 100644
index 0000000000..740515a268
--- /dev/null
+++ b/keyboards/keyboardio/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/keyboardio/model01/keymaps/dshields/config.h b/keyboards/keyboardio/model01/keymaps/dshields/config.h
new file mode 100644
index 0000000000..fdb23d46ba
--- /dev/null
+++ b/keyboards/keyboardio/model01/keymaps/dshields/config.h
@@ -0,0 +1,4 @@
+#pragma once
+
+#define RGB_DIGITAL_RAIN_DROPS 18
+
diff --git a/keyboards/keyboardio/model01/keymaps/dshields/keymap.c b/keyboards/keyboardio/model01/keymaps/dshields/keymap.c
new file mode 100644
index 0000000000..04887124f9
--- /dev/null
+++ b/keyboards/keyboardio/model01/keymaps/dshields/keymap.c
@@ -0,0 +1,28 @@
+#include QMK_KEYBOARD_H
+#include "dshields.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_REC1, 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 , DM_PLY1, KC_N , KC_M , KC_COMM, KC_DOT , KC_SLSH, KC_MINS,
+ OSMLCTL, OSMRCTL,
+ KC_BSPC, KC_SPC ,
+ KC_LGUI, OSMRALT,
+ OSMLSFT, OSMRSFT,
+ OSL_FUN, OSL_FUN
+ ),
+[FUN] = LAYOUT(
+ EEP_RST, 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_REC2, _______, KC_LCBR, KC_RCBR, KC_LBRC, KC_RBRC, KC_F12 ,
+ KC_HOME, KC_MS_L, KC_MS_D, KC_MS_R, KC_BTN1, _______, RGB_HUI, DM_RSTP, KC_LEFT, KC_DOWN, KC_UP , KC_RGHT, _______, _______,
+ KC_END , KC_PSCR, KC_INS , _______, KC_BTN2, _______, RGB_HUD, DM_PLY2, _______, _______, _______, _______, KC_BSLS, KC_PIPE,
+ _______, _______,
+ KC_DEL , KC_ENT ,
+ _______, _______,
+ _______, _______,
+ _______, _______
+ )
+};
+
diff --git a/keyboards/keyboardio/model01/keymaps/dshields/readme.md b/keyboards/keyboardio/model01/keymaps/dshields/readme.md
new file mode 100644
index 0000000000..ead1c1aad2
--- /dev/null
+++ b/keyboards/keyboardio/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/keyboardio/model01/keymaps/tw1t611/config.h b/keyboards/keyboardio/model01/keymaps/tw1t611/config.h
new file mode 100644
index 0000000000..8ab9d8b025
--- /dev/null
+++ b/keyboards/keyboardio/model01/keymaps/tw1t611/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/keyboardio/model01/keymaps/tw1t611/keymap.c b/keyboards/keyboardio/model01/keymaps/tw1t611/keymap.c
new file mode 100644
index 0000000000..b4bd53e3fe
--- /dev/null
+++ b/keyboards/keyboardio/model01/keymaps/tw1t611/keymap.c
@@ -0,0 +1,50 @@
+#include QMK_KEYBOARD_H
+#include "keymap_german.h"
+
+/* layer constants */
+enum {
+ DEF = 0,
+ MOD,
+};
+
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+[DEF] = LAYOUT(
+ _______, KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , DE_SS ,
+ KC_ESC , KC_Q , KC_W , KC_E , KC_R , KC_T , RGB_MOD, KC_MUTE, KC_Y , KC_U , KC_I , KC_O , KC_P , DE_AE ,
+ KC_TAB , KC_A , KC_S , KC_D , KC_F , KC_G , DE_PARA, _______, KC_H , KC_J , KC_K , KC_L , DE_SLSH, DE_OE ,
+ DE_PIPE, KC_Z , KC_X , KC_C , KC_V , KC_B , _______, _______, KC_N , KC_M , DE_COMM, DE_DOT , DE_MINS, DE_UE ,
+ KC_LALT, KC_LGUI,
+ KC_SPC , KC_ENT ,
+ KC_LSFT, MO(MOD),
+ KC_BSPC, KC_DEL ,
+ KC_LCTL, KC_RCTL
+ ),
+[MOD] = LAYOUT(
+ KC_F12 , KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_F5 , KC_F6 , KC_F7 , KC_F8 , KC_F9 , KC_F10 , KC_F11 ,
+ DE_CIRC, DE_QUOT, DE_DQOT, DE_LCBR, DE_RCBR, DE_GRV , RGB_TOG, _______, KC_HOME, KC_PGDN, KC_PGUP, KC_END , DE_EQL , DE_PERC,
+ DE_TILD, DE_EXLM, DE_DLR , DE_LPRN, DE_RPRN, DE_AMPR, _______, _______, KC_LEFT, KC_DOWN, KC_UP , KC_RGHT, DE_QST , DE_ASTR,
+ DE_BSLS, DE_HASH, DE_LESS, DE_LBRC, DE_RBRC, DE_MORE, _______, RESET , DE_AT , DE_EURO, DE_SCLN, DE_COLN, DE_UNDS, DE_PLUS,
+ _______, _______,
+ _______, _______,
+ _______, _______,
+ _______, _______,
+ _______, _______
+ )
+};
+
+/* template for new layouts:
+LAYOUT(
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______,
+ _______, _______,
+ _______, _______,
+ _______, _______,
+ _______, _______
+ )
+*/
+
+/* vim: set ts=2 sw=2 et: */
diff --git a/keyboards/keyboardio/model01/keymaps/tw1t611/readme.md b/keyboards/keyboardio/model01/keymaps/tw1t611/readme.md
new file mode 100644
index 0000000000..b9d728831c
--- /dev/null
+++ b/keyboards/keyboardio/model01/keymaps/tw1t611/readme.md
@@ -0,0 +1,5 @@
+# Keymap for Keyboardio's Model01 by tw1t611
+
+Features:
+- german keymap
+- vim optimized
diff --git a/keyboards/keyboardio/model01/leds.c b/keyboards/keyboardio/model01/leds.c
new file mode 100644
index 0000000000..b21c1a5c8a
--- /dev/null
+++ b/keyboards/keyboardio/model01/leds.c
@@ -0,0 +1,132 @@
+/* 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))
+led_config_t g_led_config = { {
+ { 27, 26, 20, 19, 12, 11, 4, 3 },
+ { 28, 25, 21, 18, 13, 10, 5, 2 },
+ { 29, 24, 22, 17, 14, 9, 6, 1 },
+ { 30, 31, 23, 16, 15, 8, 7, 0 },
+ { 60, 59, 52, 51, 44, 43, 37, 36 },
+ { 61, 58, 53, 50, 45, 42, 38, 35 },
+ { 62, 57, 54, 49, 46, 41, 39, 34 },
+ { 63, 56, 55, 48, 47, 40, 32, 33 }
+}, {
+ { 3, 35 }, { 0, 26 }, { 0, 17 }, { 0, 6 }, { 14, 5 }, { 15, 16 }, { 16, 25 }, { 17, 34 },
+ { 31, 29 }, { 31, 19 }, { 30, 11 }, { 30, 1 }, { 45, 0 }, { 45, 8 }, { 46, 17 }, { 46, 27 },
+ { 60, 27 }, { 60, 18 }, { 60, 9 }, { 60, 0 }, { 74, 2 }, { 74, 11 }, { 75, 20 }, { 74, 28 },
+ { 89, 30 }, { 89, 19 }, { 89, 7 }, { 70, 38 }, { 82, 41 }, { 93, 45 }, { 104, 50 }, { 74, 64 },
+ { 149, 64 }, { 119, 50 }, { 130, 45 }, { 141, 41 }, { 153, 38 }, { 134, 7 }, { 134, 19 }, { 134, 30 },
+ { 149, 28 }, { 148, 20 }, { 149, 11 }, { 149, 2 }, { 163, 0 }, { 163, 9 }, { 163, 18 }, { 163, 27 },
+ { 177, 27 }, { 177, 17 }, { 178, 8 }, { 178, 0 }, { 193, 1 }, { 193, 11 }, { 192, 19 }, { 192, 29 },
+ { 206, 34 }, { 207, 25 }, { 208, 16 }, { 209, 5 }, { 224, 6 }, { 223, 17 }, { 223, 26 }, { 220, 35 }
+}, {
+ 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4
+} };
+
+
+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/keyboardio/model01/leds.h b/keyboards/keyboardio/model01/leds.h
new file mode 100644
index 0000000000..405bdf328a
--- /dev/null
+++ b/keyboards/keyboardio/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/keyboardio/model01/matrix.c b/keyboards/keyboardio/model01/matrix.c
new file mode 100644
index 0000000000..f1f9024c7c
--- /dev/null
+++ b/keyboards/keyboardio/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/keyboardio/model01/model01.c b/keyboards/keyboardio/model01/model01.c
new file mode 100644
index 0000000000..29615ca866
--- /dev/null
+++ b/keyboards/keyboardio/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/keyboardio/model01/model01.h b/keyboards/keyboardio/model01/model01.h
new file mode 100644
index 0000000000..a83e33cd86
--- /dev/null
+++ b/keyboards/keyboardio/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/keyboardio/model01/readme.md b/keyboards/keyboardio/model01/readme.md
new file mode 100644
index 0000000000..5f55a88128
--- /dev/null
+++ b/keyboards/keyboardio/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 keyboardio/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 keyboardio/model01:default:flash
+
+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/keyboardio/model01/rules.mk b/keyboards/keyboardio/model01/rules.mk
new file mode 100644
index 0000000000..29c028ac85
--- /dev/null
+++ b/keyboards/keyboardio/model01/rules.mk
@@ -0,0 +1,35 @@
+# MCU name
+MCU = atmega32u4
+
+# Bootloader selection
+# Teensy halfkay
+# Pro Micro caterina
+# Atmel DFU atmel-dfu
+# LUFA DFU lufa-dfu
+# QMK DFU qmk-dfu
+# ATmega32A bootloadHID
+# ATmega328P USBasp
+BOOTLOADER = caterina
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration
+MOUSEKEY_ENABLE = yes # Mouse keys
+EXTRAKEY_ENABLE = yes # 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
+MIDI_ENABLE = no # MIDI support
+UNICODE_ENABLE = no # Unicode
+
+CUSTOM_MATRIX = yes
+QUANTUM_LIB_SRC += i2c_master.c
+SRC += leds.c \
+ matrix.c
+
+# 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.
diff --git a/keyboards/keyboardio/model01/wire-protocol-constants.h b/keyboards/keyboardio/model01/wire-protocol-constants.h
new file mode 100644
index 0000000000..90a528582a
--- /dev/null
+++ b/keyboards/keyboardio/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