diff options
author | Mathias Andersson <wraul@dbox.se> | 2019-06-26 09:32:03 +0200 |
---|---|---|
committer | Drashna Jaelre <drashna@live.com> | 2019-06-26 00:32:03 -0700 |
commit | 3483c51f62640c83d35a0b4c4636a5939f2c3898 (patch) | |
tree | bf4d0a94104a5e883c7b0f9d9b53aad982627a0c | |
parent | 8fd3f42281885346f93fff2f122569c002071c67 (diff) | |
download | qmk_firmware-3483c51f62640c83d35a0b4c4636a5939f2c3898.tar.gz qmk_firmware-3483c51f62640c83d35a0b4c4636a5939f2c3898.zip |
[Keyboard] Modernize KMAC (#6131)
* [Keyboard] Modernize the KMAC implementation
This brings the matrix implementation more in line with the current
default matrix code.
It also simplifies the implementation quite a bit.
* [Keyboard] Add layout support to KMAC
19 files changed, 569 insertions, 620 deletions
diff --git a/keyboards/kmac/config.h b/keyboards/kmac/config.h index 110a7ac0f..652263d2b 100644 --- a/keyboards/kmac/config.h +++ b/keyboards/kmac/config.h | |||
@@ -15,17 +15,16 @@ You should have received a copy of the GNU General Public License | |||
15 | along with this program. If not, see <http://www.gnu.org/licenses/>. | 15 | along with this program. If not, see <http://www.gnu.org/licenses/>. |
16 | */ | 16 | */ |
17 | 17 | ||
18 | #ifndef CONFIG_H | 18 | #pragma once |
19 | #define CONFIG_H | ||
20 | 19 | ||
21 | #include "config_common.h" | 20 | #include "config_common.h" |
22 | 21 | ||
23 | /* USB Device descriptor parameter */ | 22 | /* USB Device descriptor parameter */ |
24 | #define VENDOR_ID 0xFEED | 23 | #define VENDOR_ID 0xFEED |
25 | #define PRODUCT_ID 0x6050 | 24 | #define PRODUCT_ID 0x6050 |
26 | #define DEVICE_VER 0x0104 | 25 | #define DEVICE_VER 0x0104 |
27 | #define MANUFACTURER KBDMania | 26 | #define MANUFACTURER KBDMania |
28 | #define PRODUCT KMAC | 27 | #define PRODUCT KMAC |
29 | #define DESCRIPTION QMK keyboard firmware for KMAC | 28 | #define DESCRIPTION QMK keyboard firmware for KMAC |
30 | 29 | ||
31 | /* key matrix size */ | 30 | /* key matrix size */ |
@@ -36,9 +35,11 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
36 | * Keyboard Matrix Assignments | 35 | * Keyboard Matrix Assignments |
37 | * The KMAC uses demultiplexers for the cols, they are only included here as documentation. | 36 | * The KMAC uses demultiplexers for the cols, they are only included here as documentation. |
38 | * See matrix.c for more details. | 37 | * See matrix.c for more details. |
39 | */ | 38 | */ |
40 | #define MATRIX_ROW_PINS { D0, D1, D2, D3, D5, B7 } | 39 | #define MATRIX_ROW_PINS \ |
41 | #define MATRIX_COL_PINS { C6, B6, F0, F1, C7, B5 } | 40 | { D0, D1, D2, D3, D5, B7 } |
41 | #define MATRIX_COL_PINS \ | ||
42 | { B6, C6, C7, F1, F0, B5 } | ||
42 | #define UNUSED_PINS | 43 | #define UNUSED_PINS |
43 | 44 | ||
44 | /* COL2ROW, ROW2COL*/ | 45 | /* COL2ROW, ROW2COL*/ |
@@ -169,5 +170,3 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
169 | 170 | ||
170 | /* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ | 171 | /* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ |
171 | //#define MIDI_TONE_KEYCODE_OCTAVES 1 | 172 | //#define MIDI_TONE_KEYCODE_OCTAVES 1 |
172 | |||
173 | #endif | ||
diff --git a/keyboards/kmac/info.json b/keyboards/kmac/info.json index f86cfdde5..2fe0ef269 100644 --- a/keyboards/kmac/info.json +++ b/keyboards/kmac/info.json | |||
@@ -6,7 +6,8 @@ | |||
6 | "width": 18.25, | 6 | "width": 18.25, |
7 | "height": 6.5, | 7 | "height": 6.5, |
8 | "layouts": { | 8 | "layouts": { |
9 | "LAYOUT": { | 9 | "LAYOUT_tkl_ansi": { |
10 | "key_count": 87, | ||
10 | "layout": [ | 11 | "layout": [ |
11 | { "label": "Esc", "x": 0, "y": 0 }, | 12 | { "label": "Esc", "x": 0, "y": 0 }, |
12 | { "label": "F1", "x": 2, "y": 0 }, | 13 | { "label": "F1", "x": 2, "y": 0 }, |
@@ -97,8 +98,8 @@ | |||
97 | { "label": "\u2192", "x": 17.25, "y": 5.5 } | 98 | { "label": "\u2192", "x": 17.25, "y": 5.5 } |
98 | ] | 99 | ] |
99 | }, | 100 | }, |
100 | 101 | "LAYOUT_tkl_ansi_wkl": { | |
101 | "LAYOUT_WKL": { | 102 | "key_count": 84, |
102 | "layout": [ | 103 | "layout": [ |
103 | { "label": "Esc", "x": 0, "y": 0 }, | 104 | { "label": "Esc", "x": 0, "y": 0 }, |
104 | { "label": "F1", "x": 2, "y": 0 }, | 105 | { "label": "F1", "x": 2, "y": 0 }, |
@@ -177,11 +178,9 @@ | |||
177 | { "label": "Shift", "x": 12.25, "y": 4.5, "w": 2.75 }, | 178 | { "label": "Shift", "x": 12.25, "y": 4.5, "w": 2.75 }, |
178 | { "label": "\u2191", "x": 16.25, "y": 4.5 }, | 179 | { "label": "\u2191", "x": 16.25, "y": 4.5 }, |
179 | { "label": "Ctrl", "x": 0, "y": 5.5, "w": 1.5 }, | 180 | { "label": "Ctrl", "x": 0, "y": 5.5, "w": 1.5 }, |
180 | { "label": "Win", "x": 1.5, "y": 5.5 }, | ||
181 | { "label": "Alt", "x": 2.5, "y": 5.5, "w": 1.5 }, | 181 | { "label": "Alt", "x": 2.5, "y": 5.5, "w": 1.5 }, |
182 | { "x": 4, "y": 5.5, "w": 7 }, | 182 | { "x": 4, "y": 5.5, "w": 7 }, |
183 | { "label": "Alt", "x": 11, "y": 5.5, "w": 1.5 }, | 183 | { "label": "Alt", "x": 11, "y": 5.5, "w": 1.5 }, |
184 | { "label": "Win", "x": 12.5, "y": 5.5 }, | ||
185 | { "label": "Ctrl", "x": 13.5, "y": 5.5, "w": 1.5 }, | 184 | { "label": "Ctrl", "x": 13.5, "y": 5.5, "w": 1.5 }, |
186 | { "label": "\u2190", "x": 15.25, "y": 5.5 }, | 185 | { "label": "\u2190", "x": 15.25, "y": 5.5 }, |
187 | { "label": "\u2193", "x": 16.25, "y": 5.5 }, | 186 | { "label": "\u2193", "x": 16.25, "y": 5.5 }, |
diff --git a/keyboards/kmac/keymaps/default/config.h b/keyboards/kmac/keymaps/default/config.h index 09b8f1bc7..14b43132a 100644 --- a/keyboards/kmac/keymaps/default/config.h +++ b/keyboards/kmac/keymaps/default/config.h | |||
@@ -1,4 +1,4 @@ | |||
1 | /* Copyright 2017 Mathias Andersson <wraul@dbox.se> | 1 | /* Copyright 2019 Mathias Andersson <wraul@dbox.se> |
2 | * | 2 | * |
3 | * This program is free software: you can redistribute it and/or modify | 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 | 4 | * it under the terms of the GNU General Public License as published by |
diff --git a/keyboards/kmac/keymaps/default/keymap.c b/keyboards/kmac/keymaps/default/keymap.c index 3444f3cd5..05ccd1bcb 100644 --- a/keyboards/kmac/keymaps/default/keymap.c +++ b/keyboards/kmac/keymaps/default/keymap.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* Copyright 2017 Mathias Andersson <wraul@dbox.se> | 1 | /* Copyright 2017-2019 Mathias Andersson <wraul@dbox.se> |
2 | * | 2 | * |
3 | * This program is free software: you can redistribute it and/or modify | 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 | 4 | * it under the terms of the GNU General Public License as published by |
@@ -15,79 +15,73 @@ | |||
15 | */ | 15 | */ |
16 | #include QMK_KEYBOARD_H | 16 | #include QMK_KEYBOARD_H |
17 | 17 | ||
18 | // Each layer gets a name for readability, which is then used in the keymap matrix below. | 18 | enum layer_names { |
19 | // The underscores don't mean anything - you can have a layer called STUFF or any other name. | 19 | _QW, |
20 | // Layer names don't all need to be of the same length, obviously, and you can also skip them | 20 | _FN, |
21 | // entirely and just use numbers. | 21 | }; |
22 | #define _BL 0 | 22 | |
23 | #define _FL 1 | 23 | // Defines the keycodes used by our macros in process_record_user |
24 | enum custom_keycodes { | ||
25 | MCR_01 = SAFE_RANGE, | ||
26 | MCR_02, | ||
27 | MCR_03, | ||
28 | MCR_04, | ||
29 | MCR_05, | ||
30 | MCR_06, | ||
31 | MCR_07, | ||
32 | MCR_08, | ||
33 | MCR_09, | ||
34 | MCR_10, | ||
35 | MCR_11, | ||
36 | }; | ||
24 | 37 | ||
38 | // clang-format off | ||
25 | const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | 39 | const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { |
26 | [_BL] = LAYOUT( | 40 | [_QW] = LAYOUT_tkl_ansi( |
27 | KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_BRK, | 41 | KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_BRK, |
28 | KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_INS, KC_HOME, KC_PGUP, | 42 | KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_INS, KC_HOME, KC_PGUP, |
29 | KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_END, KC_PGDN, | 43 | KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_END, KC_PGDN, |
30 | KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, | 44 | KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, |
31 | KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, | 45 | KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, |
32 | KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, MO(_FL), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT), | 46 | KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, MO(_FN), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT), |
33 | [_FL] = LAYOUT( | 47 | [_FN] = LAYOUT_tkl_ansi( |
34 | BL_STEP, M(0), M(1), M(2), M(3), M(4), M(5), M(6), M(7), M(8), M(9), M(10), M(11), _______, _______, _______, | 48 | BL_STEP, MCR_01, MCR_02, MCR_03, MCR_03, MCR_04, MCR_05, MCR_06, MCR_07, MCR_08, MCR_09, MCR_10, MCR_11, _______, _______, _______, |
35 | _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, | 49 | _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, |
36 | _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, | 50 | _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, |
37 | _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, | 51 | _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, |
38 | _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, | 52 | _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, |
39 | _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), | 53 | _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), |
40 | }; | 54 | }; |
55 | // clang-format on | ||
41 | 56 | ||
42 | const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) | 57 | bool process_record_user(uint16_t keycode, keyrecord_t *record) { |
43 | { | 58 | switch (keycode) { |
44 | // MACRODOWN only works in this function | 59 | case MCR_01: |
45 | switch (id) | 60 | if (record->event.pressed) { |
46 | { | 61 | SEND_STRING("The"); |
47 | case 0: | 62 | } |
48 | if (record->event.pressed) | 63 | break; |
49 | { | 64 | case MCR_02: |
50 | SEND_STRING("The"); | 65 | if (record->event.pressed) { |
51 | return false; | 66 | SEND_STRING("Custom"); |
52 | } | 67 | } |
53 | break; | 68 | break; |
54 | case 1: | 69 | case MCR_03: |
55 | if (record->event.pressed) | 70 | if (record->event.pressed) { |
56 | { | 71 | SEND_STRING("Keyboard"); |
57 | SEND_STRING("Custom"); | 72 | } |
58 | return false; | 73 | break; |
59 | } | 74 | case MCR_04: |
60 | break; | 75 | if (record->event.pressed) { |
61 | case 2: | 76 | SEND_STRING(SS_LCTRL("c") SS_TAP(X_RIGHT) SS_LCTRL("v")); |
62 | if (record->event.pressed) | 77 | } |
63 | { | 78 | break; |
64 | SEND_STRING("Keyboard"); | ||
65 | return false; | ||
66 | } | ||
67 | break; | ||
68 | case 3: | ||
69 | if (record->event.pressed) | ||
70 | { | ||
71 | return MACRO(D(LCTL), T(C), U(LCTL), T(RGHT), D(LCTL), T(V), U(LCTL), END); | ||
72 | } | ||
73 | break; | ||
74 | } | 79 | } |
75 | return MACRO_NONE; | 80 | return true; |
76 | }; | 81 | }; |
77 | 82 | ||
78 | void matrix_init_user(void) | 83 | void matrix_init_user(void) {} |
79 | { | ||
80 | } | ||
81 | |||
82 | void matrix_scan_user(void) | ||
83 | { | ||
84 | } | ||
85 | 84 | ||
86 | bool process_record_user(uint16_t keycode, keyrecord_t *record) | 85 | void matrix_scan_user(void) {} |
87 | { | ||
88 | return true; | ||
89 | } | ||
90 | 86 | ||
91 | void led_set_user(uint8_t usb_led) | 87 | void led_set_user(uint8_t usb_led) {} |
92 | { | ||
93 | } | ||
diff --git a/keyboards/kmac/keymaps/default/readme.md b/keyboards/kmac/keymaps/default/readme.md index aaa6f9bf2..a60840375 100644 --- a/keyboards/kmac/keymaps/default/readme.md +++ b/keyboards/kmac/keymaps/default/readme.md | |||
@@ -2,8 +2,6 @@ | |||
2 | 2 | ||
3 | This is the default keymap for the winkey version of the PCB. It implements the same features as the official default KMAC firmware. | 3 | This is the default keymap for the winkey version of the PCB. It implements the same features as the official default KMAC firmware. |
4 | 4 | ||
5 | See [keymap.c](keymap.c) for details. | ||
6 | |||
7 | ## Layers | 5 | ## Layers |
8 | 6 | ||
9 | The keymap have two layers. To access the functions on the second layer, hold down `Fn` and press the corresponding key. | 7 | The keymap have two layers. To access the functions on the second layer, hold down `Fn` and press the corresponding key. |
@@ -50,7 +48,3 @@ These are mostly useless and serve more like examples I guess. | |||
50 | | 2 | Types `Custom` | | 48 | | 2 | Types `Custom` | |
51 | | 3 | Types `Keyboard` | | 49 | | 3 | Types `Keyboard` | |
52 | | 4 | Inputs `<Ctrl+c>` `<Right>` `<Ctrl+v>` | | 50 | | 4 | Inputs `<Ctrl+c>` `<Right>` `<Ctrl+v>` | |
53 | |||
54 | ## Building | ||
55 | |||
56 | To build the firmware with the default keymap, run `make default`. | ||
diff --git a/keyboards/kmac/keymaps/default/rules.mk b/keyboards/kmac/keymaps/default/rules.mk deleted file mode 100644 index 128487947..000000000 --- a/keyboards/kmac/keymaps/default/rules.mk +++ /dev/null | |||
@@ -1,34 +0,0 @@ | |||
1 | # Copyright 2013 Jun Wako <wakojun@gmail.com> | ||
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 | # QMK Build Options | ||
18 | # change to "no" to disable the options, or define them in the Makefile in | ||
19 | # the appropriate keymap folder that will get included automatically | ||
20 | # | ||
21 | BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) | ||
22 | MOUSEKEY_ENABLE = yes # Mouse keys(+4700) | ||
23 | EXTRAKEY_ENABLE = yes # Audio control and System control(+450) | ||
24 | CONSOLE_ENABLE = no # Console for debug(+400) | ||
25 | COMMAND_ENABLE = yes # Commands for debug and configuration | ||
26 | NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work | ||
27 | BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality | ||
28 | MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config) | ||
29 | AUDIO_ENABLE = no # Audio output on port C6 | ||
30 | UNICODE_ENABLE = no # Unicode | ||
31 | BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID | ||
32 | RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. | ||
33 | SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend | ||
34 | |||
diff --git a/keyboards/kmac/keymaps/winkeyless/config.h b/keyboards/kmac/keymaps/default_tkl_ansi/config.h index a3828f7d5..14b43132a 100644 --- a/keyboards/kmac/keymaps/winkeyless/config.h +++ b/keyboards/kmac/keymaps/default_tkl_ansi/config.h | |||
@@ -1,4 +1,4 @@ | |||
1 | /* Copyright 2017 Mathias Andersson <wraul@dbox.se> | 1 | /* Copyright 2019 Mathias Andersson <wraul@dbox.se> |
2 | * | 2 | * |
3 | * This program is free software: you can redistribute it and/or modify | 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 | 4 | * it under the terms of the GNU General Public License as published by |
@@ -14,11 +14,6 @@ | |||
14 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | 14 | * along with this program. If not, see <http://www.gnu.org/licenses/>. |
15 | */ | 15 | */ |
16 | 16 | ||
17 | #ifndef CONFIG_USER_H | 17 | #pragma once |
18 | #define CONFIG_USER_H | ||
19 | |||
20 | #include "../../config.h" | ||
21 | 18 | ||
22 | // place overrides here | 19 | // place overrides here |
23 | |||
24 | #endif | ||
diff --git a/keyboards/kmac/keymaps/default_tkl_ansi/keymap.c b/keyboards/kmac/keymaps/default_tkl_ansi/keymap.c new file mode 100644 index 000000000..05ccd1bcb --- /dev/null +++ b/keyboards/kmac/keymaps/default_tkl_ansi/keymap.c | |||
@@ -0,0 +1,87 @@ | |||
1 | /* Copyright 2017-2019 Mathias Andersson <wraul@dbox.se> | ||
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 | enum layer_names { | ||
19 | _QW, | ||
20 | _FN, | ||
21 | }; | ||
22 | |||
23 | // Defines the keycodes used by our macros in process_record_user | ||
24 | enum custom_keycodes { | ||
25 | MCR_01 = SAFE_RANGE, | ||
26 | MCR_02, | ||
27 | MCR_03, | ||
28 | MCR_04, | ||
29 | MCR_05, | ||
30 | MCR_06, | ||
31 | MCR_07, | ||
32 | MCR_08, | ||
33 | MCR_09, | ||
34 | MCR_10, | ||
35 | MCR_11, | ||
36 | }; | ||
37 | |||
38 | // clang-format off | ||
39 | const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | ||
40 | [_QW] = LAYOUT_tkl_ansi( | ||
41 | KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_BRK, | ||
42 | KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_INS, KC_HOME, KC_PGUP, | ||
43 | KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_END, KC_PGDN, | ||
44 | KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, | ||
45 | KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, | ||
46 | KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, MO(_FN), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT), | ||
47 | [_FN] = LAYOUT_tkl_ansi( | ||
48 | BL_STEP, MCR_01, MCR_02, MCR_03, MCR_03, MCR_04, MCR_05, MCR_06, MCR_07, MCR_08, MCR_09, MCR_10, MCR_11, _______, _______, _______, | ||
49 | _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, | ||
50 | _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, | ||
51 | _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, | ||
52 | _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, | ||
53 | _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), | ||
54 | }; | ||
55 | // clang-format on | ||
56 | |||
57 | bool process_record_user(uint16_t keycode, keyrecord_t *record) { | ||
58 | switch (keycode) { | ||
59 | case MCR_01: | ||
60 | if (record->event.pressed) { | ||
61 | SEND_STRING("The"); | ||
62 | } | ||
63 | break; | ||
64 | case MCR_02: | ||
65 | if (record->event.pressed) { | ||
66 | SEND_STRING("Custom"); | ||
67 | } | ||
68 | break; | ||
69 | case MCR_03: | ||
70 | if (record->event.pressed) { | ||
71 | SEND_STRING("Keyboard"); | ||
72 | } | ||
73 | break; | ||
74 | case MCR_04: | ||
75 | if (record->event.pressed) { | ||
76 | SEND_STRING(SS_LCTRL("c") SS_TAP(X_RIGHT) SS_LCTRL("v")); | ||
77 | } | ||
78 | break; | ||
79 | } | ||
80 | return true; | ||
81 | }; | ||
82 | |||
83 | void matrix_init_user(void) {} | ||
84 | |||
85 | void matrix_scan_user(void) {} | ||
86 | |||
87 | void led_set_user(uint8_t usb_led) {} | ||
diff --git a/keyboards/kmac/keymaps/default_tkl_ansi/readme.md b/keyboards/kmac/keymaps/default_tkl_ansi/readme.md new file mode 100644 index 000000000..a60840375 --- /dev/null +++ b/keyboards/kmac/keymaps/default_tkl_ansi/readme.md | |||
@@ -0,0 +1,50 @@ | |||
1 | # Keymap for the winkey version of KMAC | ||
2 | |||
3 | This is the default keymap for the winkey version of the PCB. It implements the same features as the official default KMAC firmware. | ||
4 | |||
5 | ## Layers | ||
6 | |||
7 | The keymap have two layers. To access the functions on the second layer, hold down `Fn` and press the corresponding key. | ||
8 | |||
9 | ### Layer 1: Default Layer | ||
10 | ,---. ,---------------. ,---------------. ,---------------. ,-----------. | ||
11 | |Esc| |F1 |F2 |F3 |F4 | |F5 |F6 |F7 |F8 | |F9 |F10|F11|F12| |PrS|ScL|Pau| | ||
12 | `---' `---------------' `---------------' `---------------' `-----------' | ||
13 | ,-----------------------------------------------------------. ,-----------. | ||
14 | |~ | 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backsp | |Ins|Hom|PgU| | ||
15 | |-----------------------------------------------------------| |-----------| | ||
16 | |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \| |Del|End|PgD| | ||
17 | |-----------------------------------------------------------| '-----------' | ||
18 | |Caps | A| S| D| F| G| H| J| K| L| ;| '|Return | | ||
19 | |-----------------------------------------------------------| ,---. | ||
20 | |Shift | Z| X| C| V| B| N| M| ,| .| /|Shift | |Up | | ||
21 | |-----------------------------------------------------------| ,-----------. | ||
22 | |Ctl|Gui|Alt| Space |Alt|Gui|Fn |Ctl| |Lef|Dow|Rig| | ||
23 | `-----------------------------------------------------------' `-----------' | ||
24 | |||
25 | ### Layer 2: Function Layer | ||
26 | ,---. ,---------------. ,---------------. ,---------------. ,-----------. | ||
27 | |Led| |M1 |M2 |M3 |M4 | |M5 |M6 |M7 |M8 | |M9 |M10|M11|M12| | | | | | ||
28 | `---' `---------------' `---------------' `---------------' `-----------' | ||
29 | ,-----------------------------------------------------------. ,-----------. | ||
30 | | | | | | | | | | | | | | | | | | | | | ||
31 | |-----------------------------------------------------------| |-----------| | ||
32 | | | | | | | | | | | | | | | | | | | | | ||
33 | |-----------------------------------------------------------| '-----------' | ||
34 | | | | | | | | | | | | | | | | ||
35 | |-----------------------------------------------------------| ,---. | ||
36 | | | | | | | | | | | | | | | | | ||
37 | |-----------------------------------------------------------| ,-----------. | ||
38 | | | | | | | | | | | | | | | ||
39 | `-----------------------------------------------------------' `-----------' | ||
40 | |||
41 | ## Macros | ||
42 | |||
43 | These are mostly useless and serve more like examples I guess. | ||
44 | |||
45 | | Macro | Action | | ||
46 | |:-----:| -------------------------------------- | | ||
47 | | 1 | Types `The` | | ||
48 | | 2 | Types `Custom` | | ||
49 | | 3 | Types `Keyboard` | | ||
50 | | 4 | Inputs `<Ctrl+c>` `<Right>` `<Ctrl+v>` | | ||
diff --git a/keyboards/kmac/keymaps/default_tkl_ansi_wkl/config.h b/keyboards/kmac/keymaps/default_tkl_ansi_wkl/config.h new file mode 100644 index 000000000..14b43132a --- /dev/null +++ b/keyboards/kmac/keymaps/default_tkl_ansi_wkl/config.h | |||
@@ -0,0 +1,19 @@ | |||
1 | /* Copyright 2019 Mathias Andersson <wraul@dbox.se> | ||
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/kmac/keymaps/default_tkl_ansi_wkl/keymap.c b/keyboards/kmac/keymaps/default_tkl_ansi_wkl/keymap.c new file mode 100644 index 000000000..42be54764 --- /dev/null +++ b/keyboards/kmac/keymaps/default_tkl_ansi_wkl/keymap.c | |||
@@ -0,0 +1,87 @@ | |||
1 | /* Copyright 2017-2019 Mathias Andersson <wraul@dbox.se> | ||
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 | enum layer_names { | ||
19 | _QW, | ||
20 | _FN, | ||
21 | }; | ||
22 | |||
23 | // Defines the keycodes used by our macros in process_record_user | ||
24 | enum custom_keycodes { | ||
25 | MCR_01 = SAFE_RANGE, | ||
26 | MCR_02, | ||
27 | MCR_03, | ||
28 | MCR_04, | ||
29 | MCR_05, | ||
30 | MCR_06, | ||
31 | MCR_07, | ||
32 | MCR_08, | ||
33 | MCR_09, | ||
34 | MCR_10, | ||
35 | MCR_11, | ||
36 | }; | ||
37 | |||
38 | // clang-format off | ||
39 | const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | ||
40 | [_QW] = LAYOUT_tkl_ansi_wkl( | ||
41 | KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_BRK, | ||
42 | KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_INS, KC_HOME, KC_PGUP, | ||
43 | KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_END, KC_PGDN, | ||
44 | KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, | ||
45 | KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, | ||
46 | KC_LCTL, KC_LALT, KC_SPC, MO(_FN), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT), | ||
47 | [_FN] = LAYOUT_tkl_ansi_wkl( | ||
48 | BL_STEP, MCR_01, MCR_02, MCR_03, MCR_03, MCR_04, MCR_05, MCR_06, MCR_07, MCR_08, MCR_09, MCR_10, MCR_11, _______, _______, _______, | ||
49 | _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, | ||
50 | _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, | ||
51 | _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, | ||
52 | _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, | ||
53 | _______, _______, _______, _______, _______, _______, _______, _______), | ||
54 | }; | ||
55 | // clang-format on | ||
56 | |||
57 | bool process_record_user(uint16_t keycode, keyrecord_t *record) { | ||
58 | switch (keycode) { | ||
59 | case MCR_01: | ||
60 | if (record->event.pressed) { | ||
61 | SEND_STRING("The"); | ||
62 | } | ||
63 | break; | ||
64 | case MCR_02: | ||
65 | if (record->event.pressed) { | ||
66 | SEND_STRING("Custom"); | ||
67 | } | ||
68 | break; | ||
69 | case MCR_03: | ||
70 | if (record->event.pressed) { | ||
71 | SEND_STRING("Keyboard"); | ||
72 | } | ||
73 | break; | ||
74 | case MCR_04: | ||
75 | if (record->event.pressed) { | ||
76 | SEND_STRING(SS_LCTRL("c") SS_TAP(X_RIGHT) SS_LCTRL("v")); | ||
77 | } | ||
78 | break; | ||
79 | } | ||
80 | return true; | ||
81 | }; | ||
82 | |||
83 | void matrix_init_user(void) {} | ||
84 | |||
85 | void matrix_scan_user(void) {} | ||
86 | |||
87 | void led_set_user(uint8_t usb_led) {} | ||
diff --git a/keyboards/kmac/keymaps/winkeyless/readme.md b/keyboards/kmac/keymaps/default_tkl_ansi_wkl/readme.md index 9c579e9f5..a66ed1090 100644 --- a/keyboards/kmac/keymaps/winkeyless/readme.md +++ b/keyboards/kmac/keymaps/default_tkl_ansi_wkl/readme.md | |||
@@ -2,9 +2,6 @@ | |||
2 | 2 | ||
3 | This is the default keymap for the winkeyless version of the PCB. It implements the same features as the official default KMAC firmware. | 3 | This is the default keymap for the winkeyless version of the PCB. It implements the same features as the official default KMAC firmware. |
4 | 4 | ||
5 | |||
6 | See [keymap.c](keymap.c) for details. | ||
7 | |||
8 | ## Layers | 5 | ## Layers |
9 | 6 | ||
10 | The keymap have two layers. To access the functions on the second layer, hold down `Fn` and press the corresponding key. | 7 | The keymap have two layers. To access the functions on the second layer, hold down `Fn` and press the corresponding key. |
@@ -22,8 +19,8 @@ The keymap have two layers. To access the functions on the second layer, hold do | |||
22 | |-----------------------------------------------------------| ,---. | 19 | |-----------------------------------------------------------| ,---. |
23 | |Shift | Z| X| C| V| B| N| M| ,| .| /|Shift | |Up | | 20 | |Shift | Z| X| C| V| B| N| M| ,| .| /|Shift | |Up | |
24 | |-----------------------------------------------------------| ,-----------. | 21 | |-----------------------------------------------------------| ,-----------. |
25 | |Ctl|Gui|Alt| Space |Alt|Fn |Ctl| |Lef|Dow|Rig| | 22 | |Ctl | |Alt | Space |Fn | |Ctl | |Lef|Dow|Rig| |
26 | `-----------------------------------------------------------' `-----------' | 23 | `----' `-----------------------------------------' `----' `-----------' |
27 | 24 | ||
28 | ### Layer 2: Function Layer | 25 | ### Layer 2: Function Layer |
29 | ,---. ,---------------. ,---------------. ,---------------. ,-----------. | 26 | ,---. ,---------------. ,---------------. ,---------------. ,-----------. |
@@ -38,8 +35,8 @@ The keymap have two layers. To access the functions on the second layer, hold do | |||
38 | |-----------------------------------------------------------| ,---. | 35 | |-----------------------------------------------------------| ,---. |
39 | | | | | | | | | | | | | | | | | 36 | | | | | | | | | | | | | | | | |
40 | |-----------------------------------------------------------| ,-----------. | 37 | |-----------------------------------------------------------| ,-----------. |
41 | | | | | | | | | | | | | | 38 | | | | | | | | | | | | | |
42 | `-----------------------------------------------------------' `-----------' | 39 | `----' `-----------------------------------------' `----' `-----------' |
43 | 40 | ||
44 | ## Macros | 41 | ## Macros |
45 | 42 | ||
@@ -51,7 +48,3 @@ These are mostly useless and serve more like examples I guess. | |||
51 | | 2 | Types `Custom` | | 48 | | 2 | Types `Custom` | |
52 | | 3 | Types `Keyboard` | | 49 | | 3 | Types `Keyboard` | |
53 | | 4 | Inputs `<Ctrl+c>` `<Right>` `<Ctrl+v>` | | 50 | | 4 | Inputs `<Ctrl+c>` `<Right>` `<Ctrl+v>` | |
54 | |||
55 | ## Building | ||
56 | |||
57 | To build the firmware with the keymap for the winkeyless version, run `make winkeyless`. | ||
diff --git a/keyboards/kmac/keymaps/winkeyless/keymap.c b/keyboards/kmac/keymaps/winkeyless/keymap.c deleted file mode 100644 index 0df0aaf42..000000000 --- a/keyboards/kmac/keymaps/winkeyless/keymap.c +++ /dev/null | |||
@@ -1,93 +0,0 @@ | |||
1 | /* Copyright 2017 Mathias Andersson <wraul@dbox.se> | ||
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 | // Each layer gets a name for readability, which is then used in the keymap matrix below. | ||
19 | // The underscores don't mean anything - you can have a layer called STUFF or any other name. | ||
20 | // Layer names don't all need to be of the same length, obviously, and you can also skip them | ||
21 | // entirely and just use numbers. | ||
22 | #define _BL 0 | ||
23 | #define _FL 1 | ||
24 | |||
25 | const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | ||
26 | [_BL] = LAYOUT_WKL( | ||
27 | KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_BRK, | ||
28 | KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_INS, KC_HOME, KC_PGUP, | ||
29 | KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_END, KC_PGDN, | ||
30 | KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, | ||
31 | KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, | ||
32 | KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(_FL), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT), | ||
33 | [_FL] = LAYOUT_WKL( | ||
34 | BL_STEP, M(0), M(1), M(2), M(3), M(4), M(5), M(6), M(7), M(8), M(9), M(10), M(11), _______, _______, _______, | ||
35 | _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, | ||
36 | _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, | ||
37 | _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, | ||
38 | _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, | ||
39 | _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), | ||
40 | }; | ||
41 | |||
42 | const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) | ||
43 | { | ||
44 | // MACRODOWN only works in this function | ||
45 | switch (id) | ||
46 | { | ||
47 | case 0: | ||
48 | if (record->event.pressed) | ||
49 | { | ||
50 | SEND_STRING("The"); | ||
51 | return false; | ||
52 | } | ||
53 | break; | ||
54 | case 1: | ||
55 | if (record->event.pressed) | ||
56 | { | ||
57 | SEND_STRING("Custom"); | ||
58 | return false; | ||
59 | } | ||
60 | break; | ||
61 | case 2: | ||
62 | if (record->event.pressed) | ||
63 | { | ||
64 | SEND_STRING("Keyboard"); | ||
65 | return false; | ||
66 | } | ||
67 | break; | ||
68 | case 3: | ||
69 | if (record->event.pressed) | ||
70 | { | ||
71 | return MACRO(D(LCTL), T(C), U(LCTL), T(RGHT), D(LCTL), T(V), U(LCTL), END); | ||
72 | } | ||
73 | break; | ||
74 | } | ||
75 | return MACRO_NONE; | ||
76 | }; | ||
77 | |||
78 | void matrix_init_user(void) | ||
79 | { | ||
80 | } | ||
81 | |||
82 | void matrix_scan_user(void) | ||
83 | { | ||
84 | } | ||
85 | |||
86 | bool process_record_user(uint16_t keycode, keyrecord_t *record) | ||
87 | { | ||
88 | return true; | ||
89 | } | ||
90 | |||
91 | void led_set_user(uint8_t usb_led) | ||
92 | { | ||
93 | } | ||
diff --git a/keyboards/kmac/keymaps/winkeyless/rules.mk b/keyboards/kmac/keymaps/winkeyless/rules.mk deleted file mode 100644 index 128487947..000000000 --- a/keyboards/kmac/keymaps/winkeyless/rules.mk +++ /dev/null | |||
@@ -1,34 +0,0 @@ | |||
1 | # Copyright 2013 Jun Wako <wakojun@gmail.com> | ||
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 | # QMK Build Options | ||
18 | # change to "no" to disable the options, or define them in the Makefile in | ||
19 | # the appropriate keymap folder that will get included automatically | ||
20 | # | ||
21 | BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) | ||
22 | MOUSEKEY_ENABLE = yes # Mouse keys(+4700) | ||
23 | EXTRAKEY_ENABLE = yes # Audio control and System control(+450) | ||
24 | CONSOLE_ENABLE = no # Console for debug(+400) | ||
25 | COMMAND_ENABLE = yes # Commands for debug and configuration | ||
26 | NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work | ||
27 | BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality | ||
28 | MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config) | ||
29 | AUDIO_ENABLE = no # Audio output on port C6 | ||
30 | UNICODE_ENABLE = no # Unicode | ||
31 | BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID | ||
32 | RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. | ||
33 | SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend | ||
34 | |||
diff --git a/keyboards/kmac/kmac.c b/keyboards/kmac/kmac.c index 6b54294b4..dcbbc2f17 100644 --- a/keyboards/kmac/kmac.c +++ b/keyboards/kmac/kmac.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* Copyright 2017 Mathias Andersson <wraul@dbox.se> | 1 | /* Copyright 2017-2019 Mathias Andersson <wraul@dbox.se> |
2 | * | 2 | * |
3 | * This program is free software: you can redistribute it and/or modify | 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 | 4 | * it under the terms of the GNU General Public License as published by |
@@ -15,61 +15,68 @@ | |||
15 | */ | 15 | */ |
16 | #include "kmac.h" | 16 | #include "kmac.h" |
17 | 17 | ||
18 | #define CAPS_PIN B0 | ||
19 | #define SCROLL_PIN E6 | ||
20 | #define F_ROW_MASK 0b01 | ||
21 | #define WASD_MASK 0b10 | ||
22 | |||
23 | // Optional override functions below. | ||
24 | // You can leave any or all of these undefined. | ||
25 | // These are only required if you want to perform custom actions. | ||
26 | |||
18 | void matrix_init_kb(void) { | 27 | void matrix_init_kb(void) { |
19 | // put your keyboard start-up code here | 28 | // put your keyboard start-up code here |
20 | // runs once when the firmware starts up | 29 | // runs once when the firmware starts up |
21 | led_init_ports(); | 30 | setPinOutput(CAPS_PIN); |
31 | setPinOutput(SCROLL_PIN); | ||
32 | |||
22 | matrix_init_user(); | 33 | matrix_init_user(); |
23 | } | 34 | } |
24 | 35 | ||
36 | /* | ||
37 | |||
25 | void matrix_scan_kb(void) { | 38 | void matrix_scan_kb(void) { |
26 | // put your looping keyboard code here | 39 | // put your looping keyboard code here |
27 | // runs every cycle (a lot) | 40 | // runs every cycle (a lot) |
28 | 41 | ||
29 | matrix_scan_user(); | 42 | matrix_scan_user(); |
30 | } | 43 | } |
31 | 44 | ||
32 | bool process_record_kb(uint16_t keycode, keyrecord_t *record) { | 45 | bool process_record_kb(uint16_t keycode, keyrecord_t *record) { |
33 | // put your per-action keyboard code here | 46 | // put your per-action keyboard code here |
34 | // runs for every action, just before processing by the firmware | 47 | // runs for every action, just before processing by the firmware |
35 | 48 | ||
36 | return process_record_user(keycode, record); | 49 | return process_record_user(keycode, record); |
37 | } | 50 | } |
38 | 51 | ||
39 | void led_init_ports(void) { | 52 | */ |
40 | DDRB |= (1<<0); // OUT | ||
41 | DDRE |= (1<<6); // OUT | ||
42 | } | ||
43 | 53 | ||
44 | /* LED pin configuration | 54 | /* LED pin configuration |
45 | * Scroll Lock: Low PE6 | 55 | * Scroll Lock: Low PE6 |
46 | * Caps Lock: Low PB0 | 56 | * Caps Lock: Low PB0 |
47 | */ | 57 | */ |
48 | void led_set_kb(uint8_t usb_led) { | 58 | void led_set_kb(uint8_t usb_led) { |
49 | if (usb_led & (1<<USB_LED_CAPS_LOCK)) | 59 | if (IS_LED_ON(usb_led, USB_LED_CAPS_LOCK)) { |
50 | { | 60 | writePinLow(CAPS_PIN); |
51 | PORTB &= ~(1<<0); // LO | 61 | } else { |
52 | } | 62 | writePinHigh(CAPS_PIN); |
53 | else | ||
54 | { | ||
55 | PORTB |= (1<<0); // HI | ||
56 | } | 63 | } |
57 | 64 | ||
58 | if (usb_led & (1<<USB_LED_SCROLL_LOCK)) | 65 | if (IS_LED_ON(usb_led, USB_LED_SCROLL_LOCK)) { |
59 | { | 66 | writePinLow(SCROLL_PIN); |
60 | PORTE &= ~(1<<6); // LO | 67 | } else { |
61 | } | 68 | writePinHigh(SCROLL_PIN); |
62 | else | ||
63 | { | ||
64 | PORTE |= (1<<6); // HI | ||
65 | } | 69 | } |
66 | 70 | ||
67 | led_set_user(usb_led); | 71 | led_set_user(usb_led); |
68 | } | 72 | } |
69 | 73 | ||
70 | void backlight_init_ports(void) { | 74 | void backlight_init_ports(void) { |
71 | DDRB |= (1<<1) | (1<<2) | (1<<3) | (1<<4); // OUT | 75 | setPinOutput(B1); |
72 | DDRD |= (1<<7); // OUT | 76 | setPinOutput(B2); |
77 | setPinOutput(B3); | ||
78 | setPinOutput(B4); | ||
79 | setPinOutput(D7); | ||
73 | } | 80 | } |
74 | 81 | ||
75 | /* Backlight pin configuration | 82 | /* Backlight pin configuration |
@@ -79,31 +86,24 @@ void backlight_init_ports(void) { | |||
79 | * S: Low PB3 | 86 | * S: Low PB3 |
80 | * D: Low PD7 | 87 | * D: Low PD7 |
81 | */ | 88 | */ |
82 | void backlight_set(uint8_t level) | 89 | void backlight_set(uint8_t level) { |
83 | { | ||
84 | // F-row | 90 | // F-row |
85 | if(level & (1<<0)) | 91 | if (level & F_ROW_MASK) { |
86 | { | 92 | writePinHigh(B1); |
87 | PORTB |= (1<<1); // HI | 93 | } else { |
88 | } | 94 | writePinLow(B1); |
89 | else | ||
90 | { | ||
91 | PORTB &= ~(1<<1); // LO | ||
92 | } | 95 | } |
93 | 96 | ||
94 | // WASD | 97 | // WASD |
95 | if(level & (1<<1)) | 98 | if (level & WASD_MASK) { |
96 | { | 99 | writePinLow(B2); |
97 | PORTB &= ~(1<<4); // LO | 100 | writePinLow(B3); |
98 | PORTB &= ~(1<<2); // LO | 101 | writePinLow(B4); |
99 | PORTB &= ~(1<<3); // LO | 102 | writePinLow(D7); |
100 | PORTD &= ~(1<<7); // LO | 103 | } else { |
101 | } | 104 | writePinHigh(B2); |
102 | else | 105 | writePinHigh(B3); |
103 | { | 106 | writePinHigh(B4); |
104 | PORTB |= (1<<4); // HI | 107 | writePinHigh(D7); |
105 | PORTB |= (1<<2); // HI | ||
106 | PORTB |= (1<<3); // HI | ||
107 | PORTD |= (1<<7); // HI | ||
108 | } | 108 | } |
109 | } | 109 | } |
diff --git a/keyboards/kmac/kmac.h b/keyboards/kmac/kmac.h index 44de8914a..edeb63583 100644 --- a/keyboards/kmac/kmac.h +++ b/keyboards/kmac/kmac.h | |||
@@ -1,4 +1,4 @@ | |||
1 | /* Copyright 2017 Mathias Andersson <wraul@dbox.se> | 1 | /* Copyright 2017-2019 Mathias Andersson <wraul@dbox.se> |
2 | * | 2 | * |
3 | * This program is free software: you can redistribute it and/or modify | 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 | 4 | * it under the terms of the GNU General Public License as published by |
@@ -13,41 +13,44 @@ | |||
13 | * You should have received a copy of the GNU General Public License | 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/>. | 14 | * along with this program. If not, see <http://www.gnu.org/licenses/>. |
15 | */ | 15 | */ |
16 | #ifndef KMAC_H | 16 | #pragma once |
17 | #define KMAC_H | ||
18 | 17 | ||
19 | #include "quantum.h" | 18 | #include "quantum.h" |
20 | 19 | ||
21 | // Keymap for the winkey version of the PCB. | 20 | // clang-format off |
22 | #define LAYOUT( \ | 21 | #define LAYOUT_tkl_ansi( \ |
23 | K00, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K0F, K0G, \ | 22 | k00, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C, k0D, k0E, k0F, k0G, \ |
24 | K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E, K1F, K1G, \ | 23 | k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1A, k1B, k1C, k1D, k1E, k1F, k1G, \ |
25 | K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, K2E, K2F, K2G, \ | 24 | k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2A, k2B, k2C, k2D, k2E, k2F, k2G, \ |
26 | K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3D, \ | 25 | k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3A, k3B, k3D, \ |
27 | K40, K41, K42, K43, K44, K45, K46, K47, K48, K49, K4A, K4D, K4F, \ | 26 | k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4A, k4D, k4F, \ |
28 | K50, K51, K52, K55, K58, K5A, K5C, K5D, K5E, K5F, K5G) \ | 27 | k50, k51, k52, k55, k58, k5A, k5C, k5D, k5E, k5F, k5G \ |
29 | { \ | 28 | ) \ |
30 | /* 0 1 2 3 4 5 6 7 8 9 A B C D E F G */ \ | 29 | { \ |
31 | /* 0 */ {K00, KC_NO, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K0F, K0G}, \ | 30 | {k00, KC_NO, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C, k0D, k0E, k0F, k0G}, \ |
32 | /* 1 */ {K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E, K1F, K1G}, \ | 31 | {k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1A, k1B, k1C, k1D, k1E, k1F, k1G}, \ |
33 | /* 2 */ {K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, K2E, K2F, K2G}, \ | 32 | {k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2A, k2B, k2C, k2D, k2E, k2F, k2G}, \ |
34 | /* 3 */ {K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, KC_NO, K3D, KC_NO, KC_NO, KC_NO}, \ | 33 | {k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3A, k3B, KC_NO, k3D, KC_NO, KC_NO, KC_NO}, \ |
35 | /* 4 */ {K40, K41, K42, K43, K44, K45, K46, K47, K48, K49, K4A, KC_NO, KC_NO, K4D, KC_NO, K4F, KC_NO}, \ | 34 | {k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4A, KC_NO, KC_NO, k4D, KC_NO, k4F, KC_NO}, \ |
36 | /* 5 */ { K50, K51, K52, KC_NO, KC_NO, K55, KC_NO, KC_NO, K58, KC_NO, K5A, KC_NO, K5C, K5D, K5E, K5F, K5G } \ | 35 | {k50, k51, k52, KC_NO, KC_NO, k55, KC_NO, KC_NO, k58, KC_NO, k5A, KC_NO, k5C, k5D, k5E, k5F, k5G } \ |
37 | } | 36 | } |
37 | // clang-format on | ||
38 | 38 | ||
39 | // Keymap for the winkeyless version of the PCB. | 39 | // clang-format off |
40 | #define LAYOUT_WKL( \ | 40 | #define LAYOUT_tkl_ansi_wkl( \ |
41 | K00, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K0F, K0G, \ | 41 | k00, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C, k0D, k0E, k0F, k0G, \ |
42 | K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E, K1F, K1G, \ | 42 | k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1A, k1B, k1C, k1D, k1E, k1F, k1G, \ |
43 | K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, K2E, K2F, K2G, \ | 43 | k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2A, k2B, k2C, k2D, k2E, k2F, k2G, \ |
44 | K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3D, \ | 44 | k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3A, k3B, k3D, \ |
45 | K40, K41, K42, K43, K44, K45, K46, K47, K48, K49, K4A, K4D, K4F, \ | 45 | k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4A, k4D, k4F, \ |
46 | K50, K51, K52, K55, K58, K5A, K5D, K5E, K5F, K5G) LAYOUT(K00, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K0F, K0G, \ | 46 | k50, k52, k55, k58, k5D, k5E, k5F, k5G \ |
47 | K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E, K1F, K1G, \ | 47 | ) \ |
48 | K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, K2E, K2F, K2G, \ | 48 | { \ |
49 | K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3D, \ | 49 | {k00, KC_NO, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C, k0D, k0E, k0F, k0G}, \ |
50 | K40, K41, K42, K43, K44, K45, K46, K47, K48, K49, K4A, K4D, K4F, \ | 50 | {k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1A, k1B, k1C, k1D, k1E, k1F, k1G}, \ |
51 | K50, K51, K52, K55, K58, K5A, KC_NO, K5D, K5E, K5F, K5G) | 51 | {k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2A, k2B, k2C, k2D, k2E, k2F, k2G}, \ |
52 | 52 | {k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3A, k3B, KC_NO, k3D, KC_NO, KC_NO, KC_NO}, \ | |
53 | #endif | 53 | {k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4A, KC_NO, KC_NO, k4D, KC_NO, k4F, KC_NO}, \ |
54 | {k50, KC_NO, k52, KC_NO, KC_NO, k55, KC_NO, KC_NO, k58, KC_NO, KC_NO, KC_NO, KC_NO, k5D, k5E, k5F, k5G } \ | ||
55 | } | ||
56 | // clang-format on | ||
diff --git a/keyboards/kmac/matrix.c b/keyboards/kmac/matrix.c index 00da96604..2212ee076 100644 --- a/keyboards/kmac/matrix.c +++ b/keyboards/kmac/matrix.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | Copyright 2017 Mathias Andersson <wraul@dbox.se> | 2 | Copyright 2017-2019 Mathias Andersson <wraul@dbox.se> |
3 | 3 | ||
4 | This program is free software: you can redistribute it and/or modify | 4 | This program is free software: you can redistribute it and/or modify |
5 | it under the terms of the GNU General Public License as published by | 5 | it under the terms of the GNU General Public License as published by |
@@ -16,118 +16,137 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
16 | */ | 16 | */ |
17 | #include <stdint.h> | 17 | #include <stdint.h> |
18 | #include <stdbool.h> | 18 | #include <stdbool.h> |
19 | #if defined(__AVR__) | ||
20 | #include <avr/io.h> | ||
21 | #endif | ||
22 | #include "wait.h" | 19 | #include "wait.h" |
23 | #include "print.h" | 20 | #include "print.h" |
24 | #include "debug.h" | 21 | #include "debug.h" |
25 | #include "util.h" | 22 | #include "util.h" |
26 | #include "matrix.h" | 23 | #include "matrix.h" |
27 | #include "timer.h" | 24 | #include "debounce.h" |
28 | 25 | #include "quantum.h" | |
29 | 26 | ||
30 | /* Set 0 if debouncing isn't needed */ | 27 | #if (MATRIX_COLS <= 8) |
31 | #ifndef DEBOUNCE | 28 | # define print_matrix_header() print("\nr/c 01234567\n") |
32 | # define DEBOUNCE 5 | 29 | # define print_matrix_row(row) print_bin_reverse8(matrix_get_row(row)) |
30 | # define matrix_bitpop(i) bitpop(matrix[i]) | ||
31 | # define ROW_SHIFTER ((uint8_t)1) | ||
32 | #elif (MATRIX_COLS <= 16) | ||
33 | # define print_matrix_header() print("\nr/c 0123456789ABCDEF\n") | ||
34 | # define print_matrix_row(row) print_bin_reverse16(matrix_get_row(row)) | ||
35 | # define matrix_bitpop(i) bitpop16(matrix[i]) | ||
36 | # define ROW_SHIFTER ((uint16_t)1) | ||
37 | #elif (MATRIX_COLS <= 32) | ||
38 | # define print_matrix_header() print("\nr/c 0123456789ABCDEF0123456789ABCDEF\n") | ||
39 | # define print_matrix_row(row) print_bin_reverse32(matrix_get_row(row)) | ||
40 | # define matrix_bitpop(i) bitpop32(matrix[i]) | ||
41 | # define ROW_SHIFTER ((uint32_t)1) | ||
33 | #endif | 42 | #endif |
34 | 43 | ||
35 | #define COL_SHIFTER ((uint32_t)1) | 44 | static const pin_t row_pins[MATRIX_ROWS] = MATRIX_ROW_PINS; |
36 | 45 | static const pin_t col_pins[MATRIX_COLS] = MATRIX_COL_PINS; | |
37 | static uint16_t debouncing_time; | ||
38 | static bool debouncing = false; | ||
39 | |||
40 | |||
41 | static const uint8_t row_pins[MATRIX_ROWS] = MATRIX_ROW_PINS; | ||
42 | 46 | ||
43 | /* matrix state(1:on, 0:off) */ | 47 | /* matrix state(1:on, 0:off) */ |
44 | static matrix_row_t matrix[MATRIX_ROWS]; | 48 | static matrix_row_t raw_matrix[MATRIX_ROWS]; // raw values |
45 | static matrix_row_t matrix_debouncing[MATRIX_ROWS]; | 49 | static matrix_row_t matrix[MATRIX_ROWS]; // debounced values |
46 | 50 | ||
47 | static void init_rows(void); | 51 | __attribute__((weak)) void matrix_init_quantum(void) { matrix_init_kb(); } |
48 | static bool read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col); | ||
49 | static void unselect_cols(void); | ||
50 | static void select_col(uint8_t col); | ||
51 | 52 | ||
52 | inline | 53 | __attribute__((weak)) void matrix_scan_quantum(void) { matrix_scan_kb(); } |
53 | uint8_t matrix_rows(void) { | ||
54 | return MATRIX_ROWS; | ||
55 | } | ||
56 | 54 | ||
57 | inline | 55 | __attribute__((weak)) void matrix_init_kb(void) { matrix_init_user(); } |
58 | uint8_t matrix_cols(void) { | ||
59 | return MATRIX_COLS; | ||
60 | } | ||
61 | 56 | ||
62 | void matrix_init(void) { | 57 | __attribute__((weak)) void matrix_scan_kb(void) { matrix_scan_user(); } |
63 | unselect_cols(); | ||
64 | init_rows(); | ||
65 | 58 | ||
66 | // initialize matrix state: all keys off | 59 | __attribute__((weak)) void matrix_init_user(void) {} |
67 | for (uint8_t i=0; i < MATRIX_ROWS; i++) { | ||
68 | matrix[i] = 0; | ||
69 | matrix_debouncing[i] = 0; | ||
70 | } | ||
71 | 60 | ||
72 | matrix_init_quantum(); | 61 | __attribute__((weak)) void matrix_scan_user(void) {} |
73 | } | ||
74 | 62 | ||
75 | uint8_t matrix_scan(void) | 63 | inline uint8_t matrix_rows(void) { return MATRIX_ROWS; } |
76 | { | ||
77 | // Set col, read rows | ||
78 | for (uint8_t current_col = 0; current_col < MATRIX_COLS; current_col++) { | ||
79 | bool matrix_changed = read_rows_on_col(matrix_debouncing, current_col); | ||
80 | if (matrix_changed) { | ||
81 | debouncing = true; | ||
82 | debouncing_time = timer_read(); | ||
83 | } | ||
84 | } | ||
85 | |||
86 | if (debouncing && (timer_elapsed(debouncing_time) > DEBOUNCE)) { | ||
87 | for (uint8_t i = 0; i < MATRIX_ROWS; i++) { | ||
88 | matrix[i] = matrix_debouncing[i]; | ||
89 | } | ||
90 | debouncing = false; | ||
91 | } | ||
92 | 64 | ||
93 | matrix_scan_quantum(); | 65 | inline uint8_t matrix_cols(void) { return MATRIX_COLS; } |
94 | return 1; | ||
95 | } | ||
96 | 66 | ||
97 | inline | 67 | inline bool matrix_is_on(uint8_t row, uint8_t col) { return (matrix[row] & ((matrix_row_t)1 << col)); } |
98 | bool matrix_is_on(uint8_t row, uint8_t col) | ||
99 | { | ||
100 | return (matrix[row] & ((matrix_row_t)1<<col)); | ||
101 | } | ||
102 | 68 | ||
103 | inline | 69 | inline matrix_row_t matrix_get_row(uint8_t row) { return matrix[row]; } |
104 | matrix_row_t matrix_get_row(uint8_t row) | ||
105 | { | ||
106 | return matrix[row]; | ||
107 | } | ||
108 | 70 | ||
109 | void matrix_print(void) | 71 | void matrix_print(void) { |
110 | { | 72 | print_matrix_header(); |
111 | print("\nr/c 0123456789ABCDEFGHIJKLMNOPQRSTUV\n"); | ||
112 | 73 | ||
113 | for (uint8_t row = 0; row < MATRIX_ROWS; row++) { | 74 | for (uint8_t row = 0; row < MATRIX_ROWS; row++) { |
114 | phex(row); print(": "); | 75 | phex(row); |
115 | print_bin_reverse32(matrix_get_row(row)); | 76 | print(": "); |
77 | print_matrix_row(row); | ||
116 | print("\n"); | 78 | print("\n"); |
117 | } | 79 | } |
118 | } | 80 | } |
119 | 81 | ||
120 | uint8_t matrix_key_count(void) | 82 | uint8_t matrix_key_count(void) { |
121 | { | ||
122 | uint8_t count = 0; | 83 | uint8_t count = 0; |
123 | for (uint8_t i = 0; i < MATRIX_ROWS; i++) { | 84 | for (uint8_t i = 0; i < MATRIX_ROWS; i++) { |
124 | count += bitpop32(matrix[i]); | 85 | count += matrix_bitpop(i); |
125 | } | 86 | } |
126 | return count; | 87 | return count; |
127 | } | 88 | } |
128 | 89 | ||
129 | static bool read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col) | 90 | /* Columns 0 - 15 |
130 | { | 91 | * These columns uses two 74HC237D 3 to 8 bit demultiplexers. |
92 | * col / pin: PB6 PC6 PC7 PF1 PF0 | ||
93 | * 0: 0 1 0 0 0 | ||
94 | * 1: 0 1 0 0 1 | ||
95 | * 2: 0 1 0 1 0 | ||
96 | * 3: 0 1 0 1 1 | ||
97 | * 4: 0 1 1 0 0 | ||
98 | * 5: 0 1 1 0 1 | ||
99 | * 6: 0 1 1 1 0 | ||
100 | * 7: 0 1 1 1 1 | ||
101 | * 8: 1 0 0 0 0 | ||
102 | * 9: 1 0 0 0 1 | ||
103 | * 10: 1 0 0 1 0 | ||
104 | * 11: 1 0 0 1 1 | ||
105 | * 12: 1 0 1 0 0 | ||
106 | * 13: 1 0 1 0 1 | ||
107 | * 14: 1 0 1 1 0 | ||
108 | * 15: 1 0 1 1 1 | ||
109 | * | ||
110 | * col: 16 | ||
111 | * pin: PB5 | ||
112 | */ | ||
113 | static void unselect_cols(void) { | ||
114 | for (uint8_t x = 0; x < 6; x++) { | ||
115 | setPinOutput(col_pins[x]); | ||
116 | writePinLow(col_pins[x]); | ||
117 | } | ||
118 | } | ||
119 | |||
120 | static void select_col(uint8_t col) { | ||
121 | if (col < 16) { | ||
122 | uint8_t c = col + 8; | ||
123 | |||
124 | writePin(B6, c & 0b10000); | ||
125 | writePin(C6, c & 0b01000); | ||
126 | writePin(C7, c & 0b00100); | ||
127 | writePin(F1, c & 0b00010); | ||
128 | writePin(F0, c & 0b00001); | ||
129 | } else { | ||
130 | writePinHigh(B5); | ||
131 | } | ||
132 | } | ||
133 | |||
134 | /* Row pin configuration | ||
135 | * row: 0 1 2 3 4 5 | ||
136 | * pin: D0 D1 D2 D3 D5 B7 | ||
137 | * | ||
138 | * Caps lock uses its own pin E2 | ||
139 | */ | ||
140 | static void init_pins(void) { | ||
141 | unselect_cols(); | ||
142 | for (uint8_t x = 0; x < MATRIX_ROWS; x++) { | ||
143 | setPinInput(row_pins[x]); | ||
144 | } | ||
145 | |||
146 | setPinInputHigh(E2); | ||
147 | } | ||
148 | |||
149 | static bool read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col) { | ||
131 | bool matrix_changed = false; | 150 | bool matrix_changed = false; |
132 | 151 | ||
133 | // Select col and wait for col selecton to stabilize | 152 | // Select col and wait for col selecton to stabilize |
@@ -135,42 +154,32 @@ static bool read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col) | |||
135 | wait_us(30); | 154 | wait_us(30); |
136 | 155 | ||
137 | // For each row... | 156 | // For each row... |
138 | for(uint8_t row_index = 0; row_index < MATRIX_ROWS; row_index++) | 157 | for (uint8_t row_index = 0; row_index < MATRIX_ROWS; row_index++) { |
139 | { | ||
140 | // Store last value of row prior to reading | 158 | // Store last value of row prior to reading |
141 | matrix_row_t last_row_value = current_matrix[row_index]; | 159 | matrix_row_t last_row_value = current_matrix[row_index]; |
142 | 160 | ||
143 | // Check row pin state | 161 | // Check row pin state |
144 | // Use the otherwise unused row: 3, col: 0 for caps lock | 162 | // Use the otherwise unused row: 3, col: 0 for caps lock |
145 | if (row_index == 3 && current_col == 0) { | 163 | if (row_index == 3 && current_col == 0) { |
146 | // Pin E2 uses active low | 164 | if (readPin(E2) == 0) { |
147 | if ((_SFR_IO8(E2 >> 4) & _BV(E2 & 0xF)) == 0) | ||
148 | { | ||
149 | // Pin LO, set col bit | 165 | // Pin LO, set col bit |
150 | current_matrix[row_index] |= (COL_SHIFTER << current_col); | 166 | current_matrix[row_index] |= (ROW_SHIFTER << current_col); |
151 | } | 167 | } else { |
152 | else | ||
153 | { | ||
154 | // Pin HI, clear col bit | 168 | // Pin HI, clear col bit |
155 | current_matrix[row_index] &= ~(COL_SHIFTER << current_col); | 169 | current_matrix[row_index] &= ~(ROW_SHIFTER << current_col); |
156 | } | 170 | } |
157 | } | 171 | } else { |
158 | else { | 172 | if (readPin(row_pins[row_index]) == 0) { |
159 | if ((_SFR_IO8(row_pins[row_index] >> 4) & _BV(row_pins[row_index] & 0xF))) | 173 | // Pin HI, clear col bit |
160 | { | 174 | current_matrix[row_index] &= ~(ROW_SHIFTER << current_col); |
161 | // Pin HI, set col bit | 175 | } else { |
162 | current_matrix[row_index] |= (COL_SHIFTER << current_col); | 176 | // Pin LO, set col bit |
163 | } | 177 | current_matrix[row_index] |= (ROW_SHIFTER << current_col); |
164 | else | ||
165 | { | ||
166 | // Pin LO, clear col bit | ||
167 | current_matrix[row_index] &= ~(COL_SHIFTER << current_col); | ||
168 | } | 178 | } |
169 | } | 179 | } |
170 | 180 | ||
171 | // Determine if the matrix changed state | 181 | // Determine if the matrix changed state |
172 | if ((last_row_value != current_matrix[row_index]) && !(matrix_changed)) | 182 | if ((last_row_value != current_matrix[row_index]) && !(matrix_changed)) { |
173 | { | ||
174 | matrix_changed = true; | 183 | matrix_changed = true; |
175 | } | 184 | } |
176 | } | 185 | } |
@@ -181,131 +190,31 @@ static bool read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col) | |||
181 | return matrix_changed; | 190 | return matrix_changed; |
182 | } | 191 | } |
183 | 192 | ||
184 | /* Row pin configuration | 193 | void matrix_init(void) { |
185 | * row: 0 1 2 3 4 5 | 194 | // initialize key pins |
186 | * pin: D0 D1 D2 D3 D5 B7 | 195 | init_pins(); |
187 | * | ||
188 | * Caps lock uses its own pin E2 | ||
189 | */ | ||
190 | static void init_rows(void) | ||
191 | { | ||
192 | DDRD &= ~((1<<0)| (1<<1) | (1<<2) | (1<<3) | (1<<5)); // IN | ||
193 | PORTD &= ~((1<<0)| (1<<1) | (1<<2) | (1<<3) | (1<<5)); // LO | ||
194 | DDRB &= ~(1<<7); // IN | ||
195 | PORTB &= ~(1<<7); // LO | ||
196 | |||
197 | DDRE &= ~(1<<2); // IN | ||
198 | PORTE |= (1<<2); // HI | ||
199 | } | ||
200 | 196 | ||
201 | /* Columns 0 - 15 | 197 | // initialize matrix state: all keys off |
202 | * These columns uses two 74HC237D 3 to 8 bit demultiplexers. | 198 | for (uint8_t i = 0; i < MATRIX_ROWS; i++) { |
203 | * col / pin: PC6 PB6 PF0 PF1 PC7 | 199 | raw_matrix[i] = 0; |
204 | * 0: 1 0 0 0 0 | 200 | matrix[i] = 0; |
205 | * 1: 1 0 1 0 0 | 201 | } |
206 | * 2: 1 0 0 1 0 | ||
207 | * 3: 1 0 1 1 0 | ||
208 | * 4: 1 0 0 0 1 | ||
209 | * 5: 1 0 1 0 1 | ||
210 | * 6: 1 0 0 1 1 | ||
211 | * 7: 1 0 1 1 1 | ||
212 | * 8: 0 1 0 0 0 | ||
213 | * 9: 0 1 1 0 0 | ||
214 | * 10: 0 1 0 1 0 | ||
215 | * 11: 0 1 1 1 0 | ||
216 | * 12: 0 1 0 0 1 | ||
217 | * 13: 0 1 1 0 1 | ||
218 | * 14: 0 1 0 1 1 | ||
219 | * 15: 0 1 1 1 1 | ||
220 | * | ||
221 | * col: 16 | ||
222 | * pin: PB5 | ||
223 | */ | ||
224 | static void unselect_cols(void) | ||
225 | { | ||
226 | DDRB |= (1<<5) | (1<<6); // OUT | ||
227 | PORTB &= ~((1<<5) | (1<<6)); // LO | ||
228 | 202 | ||
229 | DDRC |= (1<<6) | (1<<7); // OUT | 203 | debounce_init(MATRIX_ROWS); |
230 | PORTC &= ~((1<<6) | (1<<7)); // LO | ||
231 | 204 | ||
232 | DDRF |= (1<<0) | (1<<1); // OUT | 205 | matrix_init_quantum(); |
233 | PORTF &= ~((1<<0) | (1<<1)); // LO | ||
234 | } | 206 | } |
235 | 207 | ||
236 | static void select_col(uint8_t col) | 208 | uint8_t matrix_scan(void) { |
237 | { | 209 | bool changed = false; |
238 | switch (col) { | 210 | |
239 | case 0: | 211 | for (uint8_t current_col = 0; current_col < MATRIX_COLS; current_col++) { |
240 | PORTC |= (1<<6); // HI | 212 | changed |= read_rows_on_col(raw_matrix, current_col); |
241 | break; | ||
242 | case 1: | ||
243 | PORTC |= (1<<6); // HI | ||
244 | PORTF |= (1<<0); // HI | ||
245 | break; | ||
246 | case 2: | ||
247 | PORTC |= (1<<6); // HI | ||
248 | PORTF |= (1<<1); // HI | ||
249 | break; | ||
250 | case 3: | ||
251 | PORTC |= (1<<6); // HI | ||
252 | PORTF |= (1<<0) | (1<<1); // HI | ||
253 | break; | ||
254 | case 4: | ||
255 | PORTC |= (1<<6); // HI | ||
256 | PORTC |= (1<<7); // HI | ||
257 | break; | ||
258 | case 5: | ||
259 | PORTC |= (1<<6); // HI | ||
260 | PORTF |= (1<<0); // HI | ||
261 | PORTC |= (1<<7); // HI | ||
262 | break; | ||
263 | case 6: | ||
264 | PORTC |= (1<<6); // HI | ||
265 | PORTF |= (1<<1); // HI | ||
266 | PORTC |= (1<<7); // HI | ||
267 | break; | ||
268 | case 7: | ||
269 | PORTC |= (1<<6); // HI | ||
270 | PORTF |= (1<<0) | (1<<1); // HI | ||
271 | PORTC |= (1<<7); // HI | ||
272 | break; | ||
273 | case 8: | ||
274 | PORTB |= (1<<6); // HI | ||
275 | break; | ||
276 | case 9: | ||
277 | PORTB |= (1<<6); // HI | ||
278 | PORTF |= (1<<0); // HI | ||
279 | break; | ||
280 | case 10: | ||
281 | PORTB |= (1<<6); // HI | ||
282 | PORTF |= (1<<1); // HI | ||
283 | break; | ||
284 | case 11: | ||
285 | PORTB |= (1<<6); // HI | ||
286 | PORTF |= (1<<0) | (1<<1); // HI | ||
287 | break; | ||
288 | case 12: | ||
289 | PORTB |= (1<<6); // HI | ||
290 | PORTC |= (1<<7); // HI | ||
291 | break; | ||
292 | case 13: | ||
293 | PORTB |= (1<<6); // HI | ||
294 | PORTF |= (1<<0); // HI | ||
295 | PORTC |= (1<<7); // HI | ||
296 | break; | ||
297 | case 14: | ||
298 | PORTB |= (1<<6); // HI | ||
299 | PORTF |= (1<<1); // HI | ||
300 | PORTC |= (1<<7); // HI | ||
301 | break; | ||
302 | case 15: | ||
303 | PORTB |= (1<<6); // HI | ||
304 | PORTF |= (1<<0) | (1<<1); // HI | ||
305 | PORTC |= (1<<7); // HI | ||
306 | break; | ||
307 | case 16: | ||
308 | PORTB |= (1<<5); // HI | ||
309 | break; | ||
310 | } | 213 | } |
214 | |||
215 | debounce(raw_matrix, matrix, MATRIX_ROWS, changed); | ||
216 | |||
217 | matrix_scan_quantum(); | ||
218 | |||
219 | return (uint8_t)changed; | ||
311 | } | 220 | } |
diff --git a/keyboards/kmac/readme.md b/keyboards/kmac/readme.md index cd181a5f6..47dbaa847 100644 --- a/keyboards/kmac/readme.md +++ b/keyboards/kmac/readme.md | |||
@@ -1,44 +1,21 @@ | |||
1 | # KMAC keyboard firmware | 1 | # KMAC |
2 | 2 | ||
3 | A Korean custom keyboard designed by Byungho Kim and the KBDMania community. | 3 | A Korean custom keyboard designed by Byungho Kim and the KBDMania community. |
4 | 4 | ||
5 | ## Supported models | 5 | Keyboard Maintainer: [Mathias Andersson](https://github.com/wraul) |
6 | Hardware Supported: KMAC & KMAC 2 | ||
7 | Hardware Availability: http://www.kbdmania.net/xe/news/5232321 | ||
6 | 8 | ||
7 | All the tenkeyless models should be supported. | 9 | Make example for this keyboard (after setting up your build environment): |
8 | 10 | ||
9 | ## Bootloader | 11 | make kmac:default |
10 | |||
11 | The PCB is hardwired to run the bootloader if the key at the `Caps Lock` position is held down when connecting the keyboard. | ||
12 | 12 | ||
13 | It is also possible to use Boot Magic and Command to access the bootloader. | 13 | 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). |
14 | 14 | ||
15 | ## Quantum MK Firmware | 15 | ## Bootloader |
16 | 16 | ||
17 | For the full Quantum feature list, see the [documentation](https://docs.qmk.fm). | 17 | The PCB is hardwired to run the bootloader if the key at the `Caps Lock` position is held down when connecting the keyboard. |
18 | 18 | ||
19 | ## Building | 19 | ## PCB versions |
20 | 20 | ||
21 | The KMAC are available with two different PCB layouts, a winkey version and a winkeyless version. A default keymap are provided for each versions of the PCB. | 21 | The KMAC are available with two different PCB layouts, a winkey version and a winkeyless version. A default keymap are provided for each versions of the PCB. |
22 | |||
23 | Depending on which PCB and keymap you would like to use, you will have to compile the firmware slightly differently. All of the commands should be run in the [qmk root](https://github.com/qmk/qmk_firmware/) folder. | ||
24 | |||
25 | ### Winkey keymap | ||
26 | |||
27 | The [default keymap](keymaps/default) are designed for the winkey version of the PCB. | ||
28 | |||
29 | ### Winkeyless Keymap | ||
30 | |||
31 | A [keymap](keymaps/winkeyless) for the winkeyless version of the PCB are also provided. | ||
32 | |||
33 | ### Custom keymaps | ||
34 | |||
35 | To define your own keymap, copy one of the [existing keymap](keymaps) folders and give it the name of your keymap. Then check the [keymap documentation](https://docs.qmk.fm/faq_keymap.html) for details on how to modify the keymap. | ||
36 | |||
37 | To make it easy to define keymaps for the different versions of the PCB two macros are provided. | ||
38 | |||
39 | | PCB | Macro | | ||
40 | | -------------- | -------------- | | ||
41 | | Winkey PCB | `LAYOUT()` | | ||
42 | | Winkeyless PCB | `LAYOUT_WKL()` | | ||
43 | |||
44 | To build the firmware with a custom keymap, run `make <keymap name>` | ||
diff --git a/keyboards/kmac/rules.mk b/keyboards/kmac/rules.mk index 41b16979d..dbcf540bd 100644 --- a/keyboards/kmac/rules.mk +++ b/keyboards/kmac/rules.mk | |||
@@ -1,5 +1,5 @@ | |||
1 | # Project specific files | 1 | # Project specific files |
2 | SRC = matrix.c | 2 | SRC += matrix.c |
3 | 3 | ||
4 | # MCU name | 4 | # MCU name |
5 | #MCU = at90usb1287 | 5 | #MCU = at90usb1287 |
@@ -42,15 +42,19 @@ F_USB = $(F_CPU) | |||
42 | OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT | 42 | OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT |
43 | 43 | ||
44 | 44 | ||
45 | # Boot Section Size in *bytes* | 45 | # Bootloader selection |
46 | # Teensy halfKay 512 | 46 | # Teensy halfkay |
47 | # Teensy++ halfKay 1024 | 47 | # Pro Micro caterina |
48 | # Atmel DFU loader 4096 | 48 | # Atmel DFU atmel-dfu |
49 | # LUFA bootloader 4096 | 49 | # LUFA DFU lufa-dfu |
50 | # USBaspLoader 2048 | 50 | # QMK DFU qmk-dfu |
51 | OPT_DEFS += -DBOOTLOADER_SIZE=4096 | 51 | # atmega32a bootloadHID |
52 | BOOTLOADER = atmel-dfu | ||
52 | 53 | ||
53 | 54 | ||
55 | # Supported layouts | ||
56 | LAYOUTS = tkl_ansi | ||
57 | |||
54 | # Build Options | 58 | # Build Options |
55 | # change yes to no to disable | 59 | # change yes to no to disable |
56 | # | 60 | # |