aboutsummaryrefslogtreecommitdiff
path: root/keyboards/model01
diff options
context:
space:
mode:
authorJames Laird-Wah <james@laird-wah.net>2018-09-18 08:49:20 +1000
committerskullydazed <skullydazed@users.noreply.github.com>2018-09-17 15:49:20 -0700
commit03b8ce206d566bf7f75771b55e05aea6ea6dba2d (patch)
treeae1246b5a206f6c09e06041057c86d540064fd99 /keyboards/model01
parentec64be6622f73500f852149b7ab5460b6db5bac0 (diff)
downloadqmk_firmware-03b8ce206d566bf7f75771b55e05aea6ea6dba2d.tar.gz
qmk_firmware-03b8ce206d566bf7f75771b55e05aea6ea6dba2d.zip
Keyboard: add Keyboardio Model 01 (#3900)
* Keyboard: add Keyboardio Model01 This port implements key scanning and everything in their default keymap. It doesn't implement mouse warping; QMK can't do that (yet). LED control is mostly not implemented. The ability to set all LEDs is included because they can get stuck on coming from the bootloader otherwise. Single LED control is also implemented for numpad indication. The scanners also support batch LED transfer which is what you'd need if you wanted to do fast effects. Gamma correction is also not implemented, but is present in the original firmware. The necessary info for further implementation is in the KeyboardioScanner module for Kaleidoscope. To install on your keyboard: make model01:avrdude When prompted, hold the "prog" key on the keyboard to put it into programming mode. This can also be achieved by holding the "prog" key while plugging in the keyboard. This works even if the firmware is corrupt or missing. Hot plugging the halves seems to work fine, but there is no explicit support for eg. making sure the matrix scan rate is reconfigured. * model01: clean up includes and include guards Uses #pragma once everywhere. * model01: split LED and matrix code This makes space if someone wants to implement better LED support later on, the keyboard is a lot more capable than the current code. * model01: separate I2C timeouts for matrix vs. LED If the scanners have no data they don't ACK reads and just time out. So we want a pretty short timeout to keep scan rates high. Meanwhile the LED transfers might take longer - I don't know though, so here we are conservative. * model01: implement better LED control - gamma correction from the manufacturer's firmware - suitable delays to allow back to back LED writes - this is fast enough to write the whole keyboard without noticeable delay, in my experience - minor bug fix: RHS Fn key was not addressable * model01: add license to wire-protocol-constants.h * model01: replace gamma LUT The original was of unclear license origin. This one is functionally identical and includes a generator should people wish to adjust it. * model01: use the already-present CIE1931 lightness curve ...rather than baking in another gamma curve. It's said that CIE1931 is the right thing to be using rather than gamma. OK. Let it be so. * model01: call matrix_init_user() from matrix_init_kb() * model01: remove inapplicable config options from rules.mk * model01: readme.md: update build environment links
Diffstat (limited to 'keyboards/model01')
-rw-r--r--keyboards/model01/config.h35
-rw-r--r--keyboards/model01/info.json4
-rw-r--r--keyboards/model01/keymaps/default/config.h19
-rw-r--r--keyboards/model01/keymaps/default/keymap.c93
-rw-r--r--keyboards/model01/keymaps/default/readme.md3
-rw-r--r--keyboards/model01/keymaps/default/rules.mk2
-rw-r--r--keyboards/model01/leds.c57
-rw-r--r--keyboards/model01/leds.h25
-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.mk62
-rw-r--r--keyboards/model01/wire-protocol-constants.h53
14 files changed, 572 insertions, 0 deletions
diff --git a/keyboards/model01/config.h b/keyboards/model01/config.h
new file mode 100644
index 000000000..796653f45
--- /dev/null
+++ b/keyboards/model01/config.h
@@ -0,0 +1,35 @@
1/*
2Copyright 2018 James Laird-Wah
3
4This program is free software: you can redistribute it and/or modify
5it under the terms of the GNU General Public License as published by
6the Free Software Foundation, either version 2 of the License, or
7(at your option) any later version.
8
9This program is distributed in the hope that it will be useful,
10but WITHOUT ANY WARRANTY; without even the implied warranty of
11MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12GNU General Public License for more details.
13
14You should have received a copy of the GNU General Public License
15along with this program. If not, see <http://www.gnu.org/licenses/>.
16*/
17
18#pragma once
19
20#include <config_common.h>
21
22/* USB Device descriptor parameter */
23#define VENDOR_ID 0x1209
24#define PRODUCT_ID 0x2301
25#define DEVICE_VER 0x0001
26#define MANUFACTURER Keyboardio
27#define PRODUCT Model 01
28#define DESCRIPTION (QMK)
29
30/* key matrix size; rows are doubled for split */
31#define MATRIX_ROWS 8
32#define MATRIX_COLS 8
33
34/* The scanners already debounce for us */
35#define DEBOUNCING_DELAY 0
diff --git a/keyboards/model01/info.json b/keyboards/model01/info.json
new file mode 100644
index 000000000..daf51492d
--- /dev/null
+++ b/keyboards/model01/info.json
@@ -0,0 +1,4 @@
1{
2 "keyboard_name": "model01",
3 "url": "https://keyboard.io"
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 @@
1/* Copyright 2018 James Laird-Wah
2 *
3 * This program is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation, either version 2 of the License, or
6 * (at your option) any later version.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
16
17#pragma once
18
19/* 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..cdc050cd9
--- /dev/null
+++ b/keyboards/model01/keymaps/default/keymap.c
@@ -0,0 +1,93 @@
1/* Copyright 2018 James Laird-Wah
2 *
3 * This program is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation, either version 2 of the License, or
6 * (at your option) any later version.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
16#include QMK_KEYBOARD_H
17
18/* layer constants */
19enum {
20 DEF = 0,
21 NUM,
22 FUN,
23};
24
25
26const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
27[DEF] = LAYOUT(
28 RESET , KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , TG(NUM),
29 KC_GRV , KC_Q , KC_W , KC_E , KC_R , KC_T , _______, _______, KC_Y , KC_U , KC_I , KC_O , KC_P , KC_EQL ,
30 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,
31 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,
32 KC_LCTL, KC_RCTL,
33 KC_BSPC, KC_SPC ,
34 KC_LGUI, KC_RALT,
35 KC_LSFT, KC_RSFT,
36 MO(FUN), MO(FUN)
37 ),
38[NUM] = LAYOUT(
39 _______, _______, _______, _______, _______, _______, _______, KC_P7 , KC_P8 , KC_P9 , KC_PMNS, _______,
40 _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_P4 , KC_P5 , KC_P6 , KC_PPLS, _______,
41 _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_P1 , KC_P2 , KC_P3 , KC_PEQL, _______,
42 _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_P0 , KC_PDOT, KC_PAST, KC_PSLS, KC_PENT,
43 _______, _______,
44 _______, _______,
45 _______, _______,
46 _______, _______,
47 _______, _______
48 ),
49[FUN] = LAYOUT(
50 _______, KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_F5 , KC_F6 , KC_F7 , KC_F8 , KC_F9 , KC_F10 , KC_F11 ,
51 KC_TAB , _______, KC_MS_U, _______, KC_BTN3, _______, _______, KC_MPRV, KC_MNXT, KC_LCBR, KC_RCBR, KC_LBRC, KC_RBRC, KC_F12 ,
52 KC_HOME, KC_MS_L, KC_MS_D, KC_MS_R, KC_BTN1, _______, _______, KC_MPLY, KC_LEFT, KC_DOWN, KC_UP , KC_RGHT, _______, _______,
53 KC_END , KC_PSCR, KC_INS , _______, KC_BTN2, _______, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, KC_BSLS, KC_PIPE,
54 _______, _______,
55 KC_DEL , KC_ENT ,
56 _______, _______,
57 _______, _______,
58 _______, _______
59 )
60};
61
62/* template for new layouts:
63LAYOUT(
64 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
65 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
66 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
67 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
68 _______, _______,
69 _______, _______,
70 _______, _______,
71 _______, _______,
72 _______, _______
73 )
74*/
75
76uint32_t layer_state_set_user(uint32_t state) {
77 switch (biton32(state)) {
78 case DEF:
79 set_all_leds_to(0,0,0);
80 break;
81 case NUM:
82 /* highlight the numpad keys when numlock is on */
83 for (int i=44; i<=60; i++) {
84 set_led_to(i, 128,0,0);
85 }
86 set_led_to(63, 128, 0, 0);
87 break;
88 }
89
90 return state;
91}
92
93/* 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 @@
1# The default keymap for Keyboardio's Model01
2
3This 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 @@
1# used by default keymap
2MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
diff --git a/keyboards/model01/leds.c b/keyboards/model01/leds.c
new file mode 100644
index 000000000..b80a749a7
--- /dev/null
+++ b/keyboards/model01/leds.c
@@ -0,0 +1,57 @@
1/* Copyright 2018 James Laird-Wah
2 *
3 * This program is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation, either version 2 of the License, or
6 * (at your option) any later version.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
16#include <quantum.h>
17#include <i2c_master.h>
18#include <led_tables.h>
19#include "model01.h"
20
21#define I2C_TIMEOUT 1000
22
23#define LINCOR(i) pgm_read_byte(&CIE1931_CURVE[i])
24
25int set_all_leds_to_raw(uint8_t r, uint8_t g, uint8_t b) {
26 uint8_t buf[] = {
27 TWI_CMD_LED_SET_ALL_TO,
28 b, g, r
29 };
30 int ret = 0;
31 ret |= i2c_transmit(I2C_ADDR(LEFT), buf, sizeof(buf), I2C_TIMEOUT);
32 ret |= i2c_transmit(I2C_ADDR(RIGHT), buf, sizeof(buf), I2C_TIMEOUT);
33 _delay_us(10);
34 return ret;
35}
36
37int set_all_leds_to(uint8_t r, uint8_t g, uint8_t b) {
38 return set_all_leds_to_raw(LINCOR(r), LINCOR(g), LINCOR(b));
39}
40
41int set_led_to_raw(uint8_t led, uint8_t r, uint8_t g, uint8_t b) {
42 uint8_t buf[] = {
43 TWI_CMD_LED_SET_ONE_TO,
44 led & 0x1f,
45 b, g, r
46 };
47 int hand = (led >= 32) ? RIGHT : LEFT;
48 int ret = i2c_transmit(I2C_ADDR(hand), buf, sizeof(buf), I2C_TIMEOUT);
49 _delay_us(10);
50 return ret;
51}
52
53int set_led_to(uint8_t led, uint8_t r, uint8_t g, uint8_t b) {
54 return set_led_to_raw(led, LINCOR(r), LINCOR(g), LINCOR(b));
55}
56
57/* 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..0aac781dd
--- /dev/null
+++ b/keyboards/model01/leds.h
@@ -0,0 +1,25 @@
1/* Copyright 2018 James Laird-Wah
2 *
3 * This program is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation, either version 2 of the License, or
6 * (at your option) any later version.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
16#pragma once
17
18#include <quantum.h>
19
20int set_all_leds_to(uint8_t r, uint8_t g, uint8_t b);
21int set_led_to(uint8_t led, uint8_t r, uint8_t g, uint8_t b);
22
23/* Raw (gamma uncorrected) LED values */
24int set_all_leds_to_raw(uint8_t r, uint8_t g, uint8_t b);
25int set_led_to_raw(uint8_t 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 @@
1/* Copyright 2018 James Laird-Wah
2 *
3 * This program is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation, either version 2 of the License, or
6 * (at your option) any later version.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
16#include <quantum.h>
17#include <i2c_master.h>
18#include <string.h>
19#include "model01.h"
20
21/* If no key events have occurred, the scanners will time out on reads.
22 * So we don't want to be too permissive here. */
23#define I2C_TIMEOUT 10
24
25static matrix_row_t rows[MATRIX_ROWS];
26#define ROWS_PER_HAND (MATRIX_ROWS / 2)
27
28inline
29uint8_t matrix_rows(void) {
30 return MATRIX_ROWS;
31}
32
33inline
34uint8_t matrix_cols(void) {
35 return MATRIX_COLS;
36}
37
38static int i2c_read_hand(int hand) {
39 uint8_t buf[5];
40 i2c_status_t ret = i2c_receive(I2C_ADDR(hand), buf, sizeof(buf), I2C_TIMEOUT);
41 if (ret != I2C_STATUS_SUCCESS)
42 return 1;
43
44 if (buf[0] != TWI_REPLY_KEYDATA)
45 return 2;
46
47 int start_row = hand ? ROWS_PER_HAND : 0;
48 uint8_t *out = &rows[start_row];
49 memcpy(out, &buf[1], 4);
50 return 0;
51}
52
53static int i2c_set_keyscan_interval(int hand, int delay) {
54 uint8_t buf[] = {TWI_CMD_KEYSCAN_INTERVAL, delay};
55 i2c_status_t ret = i2c_transmit(I2C_ADDR(hand), buf, sizeof(buf), I2C_TIMEOUT);
56 return ret;
57}
58
59void matrix_init(void) {
60 /* Ensure scanner power is on - else right hand will not work */
61 DDRC |= _BV(7);
62 PORTC |= _BV(7);
63
64 i2c_init();
65 i2c_set_keyscan_interval(LEFT, 2);
66 i2c_set_keyscan_interval(RIGHT, 2);
67 memset(rows, 0, sizeof(rows));
68
69 matrix_init_quantum();
70}
71
72uint8_t matrix_scan(void) {
73 uint8_t ret = 0;
74 ret |= i2c_read_hand(LEFT);
75 ret |= i2c_read_hand(RIGHT);
76 matrix_scan_quantum();
77 return ret;
78}
79
80inline
81matrix_row_t matrix_get_row(uint8_t row) {
82 return rows[row];
83}
84
85void matrix_print(void) {
86 print("\nr/c 0123456789ABCDEF\n");
87 for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
88 phex(row); print(": ");
89 pbin_reverse16(matrix_get_row(row));
90 print("\n");
91 }
92}
93
94/* 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 @@
1/* Copyright 2018 James Laird-Wah
2 *
3 * This program is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation, either version 2 of the License, or
6 * (at your option) any later version.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
16#include <quantum.h>
17#include <i2c_master.h>
18#include <string.h>
19#include "model01.h"
20
21void matrix_init_kb(void) {
22 /* the bootloader can leave LEDs on, so */
23 set_all_leds_to(0, 0, 0);
24 matrix_init_user();
25}
26
27void matrix_scan_kb(void) {
28 matrix_scan_user();
29}
30
31__attribute__ ((weak))
32void matrix_scan_user(void) {
33}
34
35__attribute__ ((weak))
36void matrix_init_user(void) {
37}
38
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 @@
1/* Copyright 2018 James Laird-Wah
2 *
3 * This program is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation, either version 2 of the License, or
6 * (at your option) any later version.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
16#pragma once
17
18#include <quantum.h>
19
20#define LAYOUT( \
21 L07, L06, L05, L04, L03, L02, R05, R04, R03, R02, R01, R00, \
22 L17, L16, L15, L14, L13, L12, L01, R06, R15, R14, R13, R12, R11, R10, \
23 L27, L26, L25, L24, L23, L22, L11, R16, R25, R24, R23, R22, R21, R20, \
24 L37, L36, L35, L34, L33, L32, L21, R26, R35, R34, R33, R32, R31, R30, \
25 L00, R07, \
26 L10, R17, \
27 L20, R27, \
28 L30, R37, \
29 L31, R36 \
30 ) { \
31 {L00, L01, L02, L03, L04, L05, L06, L07}, \
32 {L10, L11, L12, L13, L14, L15, L16, L17}, \
33 {L20, L21, L22, L23, L24, L25, L26, L27}, \
34 {L30, L31, L32, L33, L34, L35, L36, L37}, \
35 {R00, R01, R02, R03, R04, R05, R06, R07}, \
36 {R10, R11, R12, R13, R14, R15, R16, R17}, \
37 {R20, R21, R22, R23, R24, R25, R26, R27}, \
38 {R30, R31, R32, R33, R34, R35, R36, R37} \
39 }
40
41#include "wire-protocol-constants.h"
42#define I2C_ADDR_LEFT (0x58 << 1)
43#define I2C_ADDR_RIGHT (I2C_ADDR_LEFT + 6)
44#define I2C_ADDR(hand) ((hand) ? I2C_ADDR_RIGHT : I2C_ADDR_LEFT)
45#define LEFT 0
46#define RIGHT 1
47
48#include "leds.h"
49
50/* 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 @@
1# Keyboardio Model 01
2
3A split keyboard.
4
5Keyboard Maintainer: QMK Community
6Hardware Supported: Keyboardio Model 01
7Hardware Availability: [Keyboardio](https://shop.keyboard.io)
8
9Make example for this keyboard (after setting up your build environment):
10
11 make model01:default
12
13See 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.
14Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
15
16## Programming the Keyboard
17
18To program the keyboard, if you have avrdude installed:
19
20 make model01:default:avrdude
21
22When prompted to reset your keyboard, press the prog key at upper left. If the
23keyboard does not reset, you can hold the prog key while plugging it into your
24computer. The prog key will light up red in programming mode.
25
26## Features
27
28This implements the standard keymap, including mousekeys.
29
30It doesn't do cursor warping - QMK does not support absolute mouse positioning.
31
32LED support is limited. Gamma compensation and the high speed batch update
33functions supported by the hardware are not implemented. The high current power
34switch is also not implemented, so if you try and turn all the LEDs on at full
35brightness, something may conk out.
36
37Hotplugging 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..cab7065ff
--- /dev/null
+++ b/keyboards/model01/rules.mk
@@ -0,0 +1,62 @@
1SRC += i2c_master.c \
2 leds.c \
3 matrix.c
4
5# MCU name
6MCU = atmega32u4
7
8# Processor frequency.
9# This will define a symbol, F_CPU, in all source code files equal to the
10# processor frequency in Hz. You can then use this symbol in your source code to
11# calculate timings. Do NOT tack on a 'UL' at the end, this will be done
12# automatically to create a 32-bit value in your source code.
13#
14# This will be an integer division of F_USB below, as it is sourced by
15# F_USB after it has run through any CPU prescalers. Note that this value
16# does not *change* the processor frequency - it should merely be updated to
17# reflect the processor speed set externally so that the code can use accurate
18# software delays.
19F_CPU = 16000000
20
21
22#
23# LUFA specific
24#
25# Target architecture (see library "Board Types" documentation).
26ARCH = AVR8
27
28# Input clock frequency.
29# This will define a symbol, F_USB, in all source code files equal to the
30# input clock frequency (before any prescaling is performed) in Hz. This value may
31# differ from F_CPU if prescaling is used on the latter, and is required as the
32# raw input clock is fed directly to the PLL sections of the AVR for high speed
33# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
34# at the end, this will be done automatically to create a 32-bit value in your
35# source code.
36#
37# If no clock division is performed on the input clock inside the AVR (via the
38# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
39F_USB = $(F_CPU)
40
41# Interrupt driven control endpoint task(+60)
42OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
43
44BOOTLOADER = caterina
45
46# Build Options
47# change yes to no to disable
48#
49BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000)
50MOUSEKEY_ENABLE = no # Mouse keys(+4700)
51EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
52CONSOLE_ENABLE = yes # Console for debug(+400)
53COMMAND_ENABLE = no # Commands for debug and configuration
54# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
55SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
56# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
57NKRO_ENABLE = no # USB Nkey Rollover
58MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config)
59UNICODE_ENABLE = no # Unicode
60
61CUSTOM_MATRIX = yes
62CIE1931_CURVE = yes
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 @@
1/*
2 * This file is taken from the KeyboardioScanner module:
3 * https://github.com/keyboardio/KeyboardioScanner/blob/master/wire-protocol-constants.h
4 *
5 * Copyright (C) 2015-2018 Keyboard.io, Inc
6 *
7 * Permission is hereby granted, free of charge, to any person obtaining a copy
8 * of this software and associated documentation files (the "Software"), to deal
9 * in the Software without restriction, including without limitation the rights
10 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11 * copies of the Software, and to permit persons to whom the Software is
12 * furnished to do so, subject to the following conditions:
13 *
14 * The above copyright notice and this permission notice shall be included in all
15 * copies or substantial portions of the Software.
16 *
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23 * SOFTWARE.
24 */
25#pragma once
26
27#define TWI_CMD_NONE 0x00
28#define TWI_CMD_VERSION 0x01
29#define TWI_CMD_KEYSCAN_INTERVAL 0x02
30#define TWI_CMD_LED_SET_ALL_TO 0x03
31#define TWI_CMD_LED_SET_ONE_TO 0x04
32#define TWI_CMD_COLS_USE_PULLUPS 0x05
33#define TWI_CMD_LED_SPI_FREQUENCY 0x06
34
35#define LED_SPI_FREQUENCY_4MHZ 0x07
36#define LED_SPI_FREQUENCY_2MHZ 0x06
37#define LED_SPI_FREQUENCY_1MHZ 0x05
38#define LED_SPI_FREQUENCY_512KHZ 0x04
39#define LED_SPI_FREQUENCY_256KHZ 0x03
40#define LED_SPI_FREQUENCY_128KHZ 0x02
41#define LED_SPI_FREQUENCY_64KHZ 0x01
42#define LED_SPI_OFF 0x00
43
44
45// 512KHZ seems to be the sweet spot in early testing
46// so make it the default
47#define LED_SPI_FREQUENCY_DEFAULT LED_SPI_FREQUENCY_512KHZ
48
49
50#define TWI_CMD_LED_BASE 0x80
51
52#define TWI_REPLY_NONE 0x00
53#define TWI_REPLY_KEYDATA 0x01