diff options
Diffstat (limited to 'keyboards/model01')
-rw-r--r-- | keyboards/model01/config.h | 38 | ||||
-rw-r--r-- | keyboards/model01/info.json | 87 | ||||
-rw-r--r-- | keyboards/model01/keymaps/default/config.h | 19 | ||||
-rw-r--r-- | keyboards/model01/keymaps/default/keymap.c | 124 | ||||
-rw-r--r-- | keyboards/model01/keymaps/default/readme.md | 3 | ||||
-rw-r--r-- | keyboards/model01/keymaps/default/rules.mk | 2 | ||||
-rw-r--r-- | keyboards/model01/keymaps/dshields/config.h | 30 | ||||
-rw-r--r-- | keyboards/model01/keymaps/dshields/keymap.c | 53 | ||||
-rw-r--r-- | keyboards/model01/keymaps/dshields/readme.md | 10 | ||||
-rw-r--r-- | keyboards/model01/keymaps/dshields/rules.mk | 3 | ||||
-rw-r--r-- | keyboards/model01/leds.c | 169 | ||||
-rw-r--r-- | keyboards/model01/leds.h | 22 | ||||
-rw-r--r-- | keyboards/model01/matrix.c | 94 | ||||
-rw-r--r-- | keyboards/model01/model01.c | 38 | ||||
-rw-r--r-- | keyboards/model01/model01.h | 50 | ||||
-rw-r--r-- | keyboards/model01/readme.md | 37 | ||||
-rw-r--r-- | keyboards/model01/rules.mk | 64 | ||||
-rw-r--r-- | keyboards/model01/wire-protocol-constants.h | 53 |
18 files changed, 896 insertions, 0 deletions
diff --git a/keyboards/model01/config.h b/keyboards/model01/config.h new file mode 100644 index 000000000..167310731 --- /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 000000000..60c914d5c --- /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 000000000..8ab9d8b02 --- /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 000000000..a6e5303fe --- /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 000000000..740515a26 --- /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 000000000..4d1abd88a --- /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 000000000..1c78217f2 --- /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 000000000..3a89d062b --- /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 000000000..ead1c1aad --- /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 000000000..d3754cc1f --- /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 000000000..7a62c7424 --- /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 000000000..405bdf328 --- /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 000000000..f1f9024c7 --- /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 000000000..29615ca86 --- /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 000000000..a83e33cd8 --- /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 000000000..34bd291e2 --- /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 000000000..49ab981d1 --- /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 000000000..90a528582 --- /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 |