diff --git a/converter/news_usb/README.md b/converter/news_usb/README.md index 64bbbb1d..7bc2bcc2 100644 --- a/converter/news_usb/README.md +++ b/converter/news_usb/README.md @@ -23,8 +23,8 @@ Use PD2(USART RXD) for 'Keyboard Data' pin and give power with VCC and GND. Othe ------------------------ PD2 Keyboard Data PD3 Keyboard Command - PD4 Mouse Data - PD0 BZ + PD0 Mouse Data + PD1 BZ Target microcontroller is Atmel ATMega32U2 by default but porting this project to other 8-bit AVR controllers would be easy. diff --git a/converter/news_usb/binary/news_usb_unimap.hex b/converter/news_usb/binary/news_usb_unimap.hex index 25222043..ea542ef0 100644 --- a/converter/news_usb/binary/news_usb_unimap.hex +++ b/converter/news_usb/binary/news_usb_unimap.hex @@ -25,7 +25,7 @@ :10018000370A004C45443A20253032580A000A4CC0 :100190006F6F702073746172742E0A000A55534297 :1001A00020636F6E666967757265642E0A000A5473 -:1001B0004D4B3A3735666238622F4C5546413A64AA +:1001B0004D4B3A6266383266312F4C5546413A64AF :1001C00036613764660A0009025400030100A03258 :1001D00009040000010301010009211101000122AD :1001E00040000705810308000A090401000103011A @@ -92,9 +92,9 @@ :1005B0005553454B45592045585452414B455920B8 :1005C000434F4E534F4C4520434F4D4D414E4420D9 :1005D0004B45594D41505F53454354494F4E20348C -:1005E0003039360A004255494C443A203735666264 -:1005F0003862202832333A32393A3535204E6F7618 -:100600002020372032303233290A005649443A201C +:1005E0003039360A004255494C443A206266383266 +:1005F0006631202831313A35353A3435204E6F7620 +:100600002020392032303233290A005649443A201A :1006100030784645454428544D4B29205049443AAA :100620002030783530323128534F4E59204E4557BF :1006300053206B6579626F61726420636F6E7665BB @@ -1008,7 +1008,7 @@ :103EF000FF91EF919F918F910F900FBE0F901F90A8 :103F000018951F920F920FB60F9211248F939F93C3 :103F1000AF93BF938091BD019091BE01A091BF016D -:103F2000B091C001892B8A2B8B2B69F18BB191E069 +:103F2000B091C001892B8A2B8B2B69F18BB192E068 :103F300089278BB98091BD019091BE01A091BF01ED :103F4000B091C001181619061A061B069CF4809140 :103F5000BD019091BE01A091BF01B091C001019738 @@ -1016,7 +1016,7 @@ :103F7000B093C001BF91AF919F918F910F900FBEF1 :103F80000F901F90189580916F008D7F80936F0028 :103F900010928000109281008FB7F89410928900DF -:103FA000109288008FBF5898E5CF0E94DC1F68945C +:103FA000109288008FBF5998E5CF0E94DC1F68945B :103FB000B1110C946B2008950E94502088F09F57F7 :103FC00098F0B92F9927B751B0F0E1F0660F771F3D :103FD000881F991F1AF0BA95C9F714C0B13091F033 diff --git a/converter/news_usb/matrix.c b/converter/news_usb/matrix.c index 693d5b6a..8fe5d8b8 100644 --- a/converter/news_usb/matrix.c +++ b/converter/news_usb/matrix.c @@ -133,7 +133,7 @@ uint8_t matrix_scan(void) // make code if (!matrix_is_on(ROW(code), COL(code))) { matrix[ROW(code)] |= (1< + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ +#include "unimap_trans.h" + + +#define AC_L1 ACTION_LAYER_MOMENTARY(1) +#define AC_L2 ACTION_LAYER_MOMENTARY(2) +#define AC_SLS2 ACTION_LAYER_TAP_KEY(2, KC_SLSH) +#define AC_SCL3 ACTION_LAYER_TAP_KEY(3, KC_SCLN) +#define AC_SPC4 ACTION_LAYER_TAP_KEY(4, KC_SPC) +#define AC_BACK ACTION_MODS_KEY(MOD_LALT, KC_LEFT) +#define AC_FRWD ACTION_MODS_KEY(MOD_LALT, KC_RIGHT) +#define AC_ENT_ ACTION_MODS_TAP_KEY(MOD_RCTL, KC_ENT) + + +#ifdef KEYMAP_SECTION_ENABLE +const action_t actionmaps[][UNIMAP_ROWS][UNIMAP_COLS] __attribute__ ((section (".keymap.keymaps"))) = { +#else +const action_t actionmaps[][UNIMAP_ROWS][UNIMAP_COLS] PROGMEM = { +#endif + /* 0: + * ,-----------------------------------------------------------. + * |` | 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| \ | + * |-----------------------------------------------------------| + * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| Bspc| + * |-----------------------------------------------------------| + * |Ctrl | A| S| D| F| G| H| J| K| L| ;| '|Enter | + * |-----------------------------------------------------------| + * |Shft| \| Z| X| C| V| B| N| M| ,| .| /|Shift | + * |-----------------------------------------------------------' + * |Ctrl|Gui |Alt | Space |Alt |App | L1 | + * `-----------------------------------------------------------' + */ + [0] = UNIMAP_ALPS64( \ + ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, GRV, BSLS, + TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC, BSPC, + LCTL,A, S, D, F, G, H, J, K, L, SCL3,QUOT, ENT_, + LSFT,NUBS,Z, X, C, V, B, N, M, COMM,DOT, SLS2, RSFT,L1, + L2, LGUI,LALT, SPC4, APP, RALT,RGUI,L1), + + [1] = UNIMAP_ALPS64( \ + GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, TRNS,GRV, + CAPS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,PSCR,SLCK,PAUS,UP, INS, DEL, + TRNS,VOLD,VOLU,MUTE,TRNS,TRNS,PAST,PSLS,HOME,PGUP,LEFT,RGHT, TRNS, + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,PPLS,PMNS,END, PGDN,DOWN,TRNS, TRNS,TRNS, + TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS), + + [2] = UNIMAP_ALPS64( + GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, + TRNS,HOME,PGDN,UP, PGUP,END, HOME,PGDN,PGUP,END, NO, NO, NO, TRNS, + TRNS,NO, LEFT,DOWN,RGHT,NO, LEFT,DOWN,UP, RGHT,NO, NO, TRNS, + TRNS,TRNS,NO, NO, NO, NO, NO, HOME,PGDN,PGUP,END, TRNS, TRNS,TRNS, + TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS), + + [3] = UNIMAP_ALPS64( + GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, + TAB, NO, NO, NO, NO, NO, WH_L,WH_D,MS_U,WH_U,WH_R,BACK,FRWD, TRNS, + TRNS,ACL0,ACL1,ACL2,ACL2,NO, NO, MS_L,MS_D,MS_R,TRNS,NO, TRNS, + TRNS,TRNS,NO, NO, NO, NO, BTN3,BTN2,BTN1,BACK,FRWD,NO, TRNS,TRNS, + TRNS,TRNS,TRNS, BTN1, TRNS,TRNS,TRNS,TRNS), + + [4] = UNIMAP_ALPS64( + GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, + TAB, NO, NO, NO, NO, NO, WH_L,WH_D,MS_U,WH_U,WH_R,BTN4,BTN5, TAB, + LCTL,VOLD,VOLU,MUTE,NO, NO, NO, MS_L,MS_D,MS_R,BTN1,NO, ENT, + LSFT,TRNS,NO, NO, NO, NO, BTN3,BTN2,BTN1,BACK,FRWD,NO, TRNS,TRNS, + TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS), +}; diff --git a/keyboard/gh60/Makefile b/keyboard/gh60/Makefile index b0e7a30e..c6237d57 100644 --- a/keyboard/gh60/Makefile +++ b/keyboard/gh60/Makefile @@ -113,7 +113,7 @@ OPT_DEFS += -DBOOTLOADER_SIZE=4096 # Build Options # comment out to disable the options. # -BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) +#BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) MOUSEKEY_ENABLE = yes # Mouse keys(+4700) EXTRAKEY_ENABLE = yes # Audio control and System control(+450) CONSOLE_ENABLE = yes # Console for debug(+400) diff --git a/keyboard/gh60/Makefile.pjrc b/keyboard/gh60/Makefile.pjrc index 11bd3b78..aeec17fd 100644 --- a/keyboard/gh60/Makefile.pjrc +++ b/keyboard/gh60/Makefile.pjrc @@ -48,8 +48,7 @@ TMK_DIR = ../../tmk_core TARGET_DIR = . # project specific files -SRC = keymap_common.c \ - matrix.c \ +SRC = matrix.c \ led.c ifdef KEYMAP diff --git a/tmk_core/common/action_layer.c b/tmk_core/common/action_layer.c index be316697..6a1b5f3d 100644 --- a/tmk_core/common/action_layer.c +++ b/tmk_core/common/action_layer.c @@ -142,6 +142,108 @@ static uint8_t current_layer_for_key(keypos_t key) } +#ifdef BOOTMAGIC_ENABLE +#include "keymap.h" +extern keymap_config_t keymap_config; + +static uint8_t config_keymap(uint8_t keycode) +{ + switch (keycode) { + case KC_CAPSLOCK: + case KC_LOCKING_CAPS: + if (keymap_config.swap_control_capslock || keymap_config.capslock_to_control) { + return KC_LCTL; + } + return keycode; + case KC_LCTL: + if (keymap_config.swap_control_capslock) { + return KC_CAPSLOCK; + } + return KC_LCTL; + case KC_LALT: + if (keymap_config.swap_lalt_lgui) { + if (keymap_config.no_gui) { + return KC_NO; + } + return KC_LGUI; + } + return KC_LALT; + case KC_LGUI: + if (keymap_config.swap_lalt_lgui) { + return KC_LALT; + } + if (keymap_config.no_gui) { + return KC_NO; + } + return KC_LGUI; + case KC_RALT: + if (keymap_config.swap_ralt_rgui) { + if (keymap_config.no_gui) { + return KC_NO; + } + return KC_RGUI; + } + return KC_RALT; + case KC_RGUI: + if (keymap_config.swap_ralt_rgui) { + return KC_RALT; + } + if (keymap_config.no_gui) { + return KC_NO; + } + return KC_RGUI; + case KC_GRAVE: + if (keymap_config.swap_grave_esc) { + return KC_ESC; + } + return KC_GRAVE; + case KC_ESC: + if (keymap_config.swap_grave_esc) { + return KC_GRAVE; + } + return KC_ESC; + case KC_BSLASH: + if (keymap_config.swap_backslash_backspace) { + return KC_BSPACE; + } + return KC_BSLASH; + case KC_BSPACE: + if (keymap_config.swap_backslash_backspace) { + return KC_BSLASH; + } + return KC_BSPACE; + default: + return keycode; + } +} + +static action_t get_action(uint8_t layer, keypos_t key) +{ + action_t act = action_for_key(layer, key); + switch (act.kind.id) { + case ACT_LMODS: + case ACT_RMODS: + case ACT_LMODS_TAP: + case ACT_RMODS_TAP: + act.key.code = config_keymap(act.key.code); + break; + case ACT_LAYER_TAP: + case ACT_LAYER_TAP_EXT: + act.layer_tap.code = config_keymap(act.layer_tap.code); + break; + default: + break; + } + return act; +} +#else +static action_t get_action(uint8_t layer, keypos_t key) +{ + return action_for_key(layer, key); +} +#endif + + #ifndef NO_TRACK_KEY_PRESS /* record layer on where key is pressed */ static uint8_t layer_pressed[MATRIX_ROWS][MATRIX_COLS] = {}; @@ -161,5 +263,5 @@ action_t layer_switch_get_action(keyevent_t event) #else layer = current_layer_for_key(event.key); #endif - return action_for_key(layer, event.key); + return get_action(layer, event.key); } diff --git a/tmk_core/common/avr/eeconfig.c b/tmk_core/common/avr/eeconfig.c index 5bd47dc6..5556609d 100644 --- a/tmk_core/common/avr/eeconfig.c +++ b/tmk_core/common/avr/eeconfig.c @@ -2,6 +2,8 @@ #include #include #include "eeconfig.h" +#include "keymap.h" +#include "print.h" void eeconfig_init(void) { @@ -22,7 +24,12 @@ void eeconfig_enable(void) void eeconfig_disable(void) { - eeprom_write_word(EECONFIG_MAGIC, 0xFFFF); + eeprom_write_word(EECONFIG_MAGIC, 0xFFFF); + eeprom_write_byte(EECONFIG_DEBUG, 0xFF); + eeprom_write_byte(EECONFIG_DEFAULT_LAYER, 0xFF); + eeprom_write_byte(EECONFIG_KEYMAP, 0xFF); + eeprom_write_byte(EECONFIG_MOUSEKEY_ACCEL, 0xFF); + eeprom_write_byte(EECONFIG_BACKLIGHT, 0xFF); } bool eeconfig_is_enabled(void) @@ -43,3 +50,13 @@ void eeconfig_write_keymap(uint8_t val) { eeprom_write_byte(EECONFIG_KEYMAP, val uint8_t eeconfig_read_backlight(void) { return eeprom_read_byte(EECONFIG_BACKLIGHT); } void eeconfig_write_backlight(uint8_t val) { eeprom_write_byte(EECONFIG_BACKLIGHT, val); } #endif + +void eeconfig_debug(void) +{ + xprintf("eeprom:"); + for (int i = 0; i < 16 /* E2END + 1 */; i++) { + if ((i % 16) == 0) { xprintf("\n%04X: ", i); } + xprintf("%02X ", eeprom_read_byte((uint8_t *)i)); + } + xprintf("\n"); +} diff --git a/tmk_core/common/bootmagic.c b/tmk_core/common/bootmagic.c index 220eb14f..e54fe0ab 100644 --- a/tmk_core/common/bootmagic.c +++ b/tmk_core/common/bootmagic.c @@ -34,7 +34,7 @@ void bootmagic(void) /* eeconfig clear */ if (bootmagic_scan_key(BOOTMAGIC_KEY_EEPROM_CLEAR)) { - eeconfig_init(); + eeconfig_disable(); } /* bootloader */ @@ -45,6 +45,10 @@ void bootmagic(void) /* user-defined checks */ hook_bootmagic(); + if (!eeconfig_is_enabled()) { + goto WAIT; + } + /* debug enable */ debug_config.raw = eeconfig_read_debug(); if (bootmagic_scan_key(BOOTMAGIC_KEY_DEBUG_ENABLE)) { @@ -61,35 +65,38 @@ void bootmagic(void) eeconfig_write_debug(debug_config.raw); /* keymap config */ - keymap_config.raw = eeconfig_read_keymap(); + keymap_config_t kc; + kc.raw = eeconfig_read_keymap(); if (bootmagic_scan_key(BOOTMAGIC_KEY_SWAP_CONTROL_CAPSLOCK)) { - keymap_config.swap_control_capslock = !keymap_config.swap_control_capslock; + kc.swap_control_capslock = !kc.swap_control_capslock; } if (bootmagic_scan_key(BOOTMAGIC_KEY_CAPSLOCK_TO_CONTROL)) { - keymap_config.capslock_to_control = !keymap_config.capslock_to_control; + kc.capslock_to_control = !kc.capslock_to_control; } if (bootmagic_scan_key(BOOTMAGIC_KEY_SWAP_LALT_LGUI)) { - keymap_config.swap_lalt_lgui = !keymap_config.swap_lalt_lgui; + kc.swap_lalt_lgui = !kc.swap_lalt_lgui; } if (bootmagic_scan_key(BOOTMAGIC_KEY_SWAP_RALT_RGUI)) { - keymap_config.swap_ralt_rgui = !keymap_config.swap_ralt_rgui; + kc.swap_ralt_rgui = !kc.swap_ralt_rgui; } if (bootmagic_scan_key(BOOTMAGIC_KEY_NO_GUI)) { - keymap_config.no_gui = !keymap_config.no_gui; + kc.no_gui = !kc.no_gui; } if (bootmagic_scan_key(BOOTMAGIC_KEY_SWAP_GRAVE_ESC)) { - keymap_config.swap_grave_esc = !keymap_config.swap_grave_esc; + kc.swap_grave_esc = !kc.swap_grave_esc; } if (bootmagic_scan_key(BOOTMAGIC_KEY_SWAP_BACKSLASH_BACKSPACE)) { - keymap_config.swap_backslash_backspace = !keymap_config.swap_backslash_backspace; + kc.swap_backslash_backspace = !kc.swap_backslash_backspace; } if (bootmagic_scan_key(BOOTMAGIC_HOST_NKRO)) { - keymap_config.nkro = !keymap_config.nkro; + kc.nkro = !kc.nkro; } - eeconfig_write_keymap(keymap_config.raw); + eeconfig_write_keymap(kc.raw); #if defined(NKRO_ENABLE) || defined(NKRO_6KRO_ENABLE) - keyboard_nkro = keymap_config.nkro; + if (kc.nkro) { + keyboard_nkro = !keyboard_nkro; + } #endif /* default layer */ @@ -109,6 +116,18 @@ void bootmagic(void) default_layer = eeconfig_read_default_layer(); default_layer_set((uint32_t)default_layer); } + + keymap_config = kc; + + // wait until all key is released +WAIT: + matrix_scan(); + for (uint8_t r = 0; r < MATRIX_ROWS; r++) { + if (matrix_get_row(r)) { + goto WAIT; + wait_ms(10); + } + } } static bool scan_key(uint16_t code) diff --git a/tmk_core/common/command.c b/tmk_core/common/command.c index 74255736..b429a181 100644 --- a/tmk_core/common/command.c +++ b/tmk_core/common/command.c @@ -19,7 +19,6 @@ along with this program. If not, see . #include "wait.h" #include "keycode.h" #include "host.h" -#include "keymap.h" #include "print.h" #include "debug.h" #include "util.h" @@ -145,6 +144,9 @@ static void command_common_help(void) } #ifdef BOOTMAGIC_ENABLE +#include "keymap.h" +__attribute__ ((weak)) void eeconfig_debug(void) {} + static void print_eeconfig(void) { print("default_layer: "); print_dec(eeconfig_read_default_layer()); print("\n"); @@ -176,6 +178,8 @@ static void print_eeconfig(void) print(".enable: "); print_dec(bc.enable); print("\n"); print(".level: "); print_dec(bc.level); print("\n"); #endif + + eeconfig_debug(); } #endif diff --git a/tmk_core/common/eeconfig.h b/tmk_core/common/eeconfig.h index 3cd1a174..5fd2bb0a 100644 --- a/tmk_core/common/eeconfig.h +++ b/tmk_core/common/eeconfig.h @@ -72,4 +72,6 @@ uint8_t eeconfig_read_backlight(void); void eeconfig_write_backlight(uint8_t val); #endif +void eeconfig_debug(void); + #endif diff --git a/tmk_core/common/keymap.c b/tmk_core/common/keymap.c index 2bd4a253..1ea1dd8b 100644 --- a/tmk_core/common/keymap.c +++ b/tmk_core/common/keymap.c @@ -27,10 +27,6 @@ along with this program. If not, see . #include #endif -#ifdef BOOTMAGIC_ENABLE -extern keymap_config_t keymap_config; -#endif - static action_t keycode_to_action(uint8_t keycode); @@ -42,71 +38,6 @@ action_t action_for_key(uint8_t layer, keypos_t key) switch (keycode) { case KC_FN0 ... KC_FN31: return keymap_fn_to_action(keycode); -#ifdef BOOTMAGIC_ENABLE - case KC_CAPSLOCK: - case KC_LOCKING_CAPS: - if (keymap_config.swap_control_capslock || keymap_config.capslock_to_control) { - return keycode_to_action(KC_LCTL); - } - return keycode_to_action(keycode); - case KC_LCTL: - if (keymap_config.swap_control_capslock) { - return keycode_to_action(KC_CAPSLOCK); - } - return keycode_to_action(KC_LCTL); - case KC_LALT: - if (keymap_config.swap_lalt_lgui) { - if (keymap_config.no_gui) { - return keycode_to_action(KC_NO); - } - return keycode_to_action(KC_LGUI); - } - return keycode_to_action(KC_LALT); - case KC_LGUI: - if (keymap_config.swap_lalt_lgui) { - return keycode_to_action(KC_LALT); - } - if (keymap_config.no_gui) { - return keycode_to_action(KC_NO); - } - return keycode_to_action(KC_LGUI); - case KC_RALT: - if (keymap_config.swap_ralt_rgui) { - if (keymap_config.no_gui) { - return keycode_to_action(KC_NO); - } - return keycode_to_action(KC_RGUI); - } - return keycode_to_action(KC_RALT); - case KC_RGUI: - if (keymap_config.swap_ralt_rgui) { - return keycode_to_action(KC_RALT); - } - if (keymap_config.no_gui) { - return keycode_to_action(KC_NO); - } - return keycode_to_action(KC_RGUI); - case KC_GRAVE: - if (keymap_config.swap_grave_esc) { - return keycode_to_action(KC_ESC); - } - return keycode_to_action(KC_GRAVE); - case KC_ESC: - if (keymap_config.swap_grave_esc) { - return keycode_to_action(KC_GRAVE); - } - return keycode_to_action(KC_ESC); - case KC_BSLASH: - if (keymap_config.swap_backslash_backspace) { - return keycode_to_action(KC_BSPACE); - } - return keycode_to_action(KC_BSLASH); - case KC_BSPACE: - if (keymap_config.swap_backslash_backspace) { - return keycode_to_action(KC_BSLASH); - } - return keycode_to_action(KC_BSPACE); -#endif default: return keycode_to_action(keycode); }