diff options
| author | James Young <18669334+noroadsleft@users.noreply.github.com> | 2020-11-28 12:02:18 -0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-11-28 12:02:18 -0800 |
| commit | c66df1664497546f32662409778731143e45a552 (patch) | |
| tree | da73a2d532a27685a31d932b3a44a707d4a3af81 /tmk_core | |
| parent | 15385d4113414d42bd062c60c9de5df797d3157f (diff) | |
| download | qmk_firmware-c66df1664497546f32662409778731143e45a552.tar.gz qmk_firmware-c66df1664497546f32662409778731143e45a552.zip | |
2020 November 28 Breaking Changes Update (#11053)
* Branch point for 2020 November 28 Breaking Change
* Remove matrix_col_t to allow MATRIX_ROWS > 32 (#10183)
* Add support for soft serial to ATmega32U2 (#10204)
* Change MIDI velocity implementation to allow direct control of velocity value (#9940)
* Add ability to build a subset of all keyboards based on platform.
* Actually use eeprom_driver_init().
* Make bootloader_jump weak for ChibiOS. (#10417)
* Joystick 16-bit support (#10439)
* Per-encoder resolutions (#10259)
* Share button state from mousekey to pointing_device (#10179)
* Add hotfix for chibios keyboards not wake (#10088)
* Add advanced/efficient RGB Matrix Indicators (#8564)
* Naming change.
* Support for STM32 GPIOF,G,H,I,J,K (#10206)
* Add milc as a dependency and remove the installed milc (#10563)
* ChibiOS upgrade: early init conversions (#10214)
* ChibiOS upgrade: configuration file migrator (#9952)
* Haptic and solenoid cleanup (#9700)
* XD75 cleanup (#10524)
* OLED display update interval support (#10388)
* Add definition based on currently-selected serial driver. (#10716)
* New feature: Retro Tapping per key (#10622)
* Allow for modification of output RGB values when using rgblight/rgb_matrix. (#10638)
* Add housekeeping task callbacks so that keyboards/keymaps are capable of executing code for each main loop iteration. (#10530)
* Rescale both ChibiOS and AVR backlighting.
* Reduce Helix keyboard build variation (#8669)
* Minor change to behavior allowing display updates to continue between task ticks (#10750)
* Some GPIO manipulations in matrix.c change to atomic. (#10491)
* qmk cformat (#10767)
* [Keyboard] Update the Speedo firmware for v3.0 (#10657)
* Maartenwut/Maarten namechange to evyd13/Evy (#10274)
* [quantum] combine repeated lines of code (#10837)
* Add step sequencer feature (#9703)
* aeboards/ext65 refactor (#10820)
* Refactor xelus/dawn60 for Rev2 later (#10584)
* add DEBUG_MATRIX_SCAN_RATE_ENABLE to common_features.mk (#10824)
* [Core] Added `add_oneshot_mods` & `del_oneshot_mods` (#10549)
* update chibios os usb for the otg driver (#8893)
* Remove HD44780 References, Part 4 (#10735)
* [Keyboard] Add Valor FRL TKL (+refactor) (#10512)
* Fix cursor position bug in oled_write_raw functions (#10800)
* Fixup version.h writing when using SKIP_VERSION=yes (#10972)
* Allow for certain code in the codebase assuming length of string. (#10974)
* Add AT90USB support for serial.c (#10706)
* Auto shift: support repeats and early registration (#9826)
* Rename ledmatrix.h to match .c file (#7949)
* Split RGB_MATRIX_ENABLE into _ENABLE and _DRIVER (#10231)
* Split LED_MATRIX_ENABLE into _ENABLE and _DRIVER (#10840)
* Merge point for 2020 Nov 28 Breaking Change
Diffstat (limited to 'tmk_core')
24 files changed, 289 insertions, 54 deletions
diff --git a/tmk_core/chibios.mk b/tmk_core/chibios.mk index 2bd53f0dc..e53edccee 100644 --- a/tmk_core/chibios.mk +++ b/tmk_core/chibios.mk | |||
| @@ -123,6 +123,8 @@ else ifneq ("$(wildcard $(KEYBOARD_PATH_1)/chconf.h)","") | |||
| 123 | CHCONFDIR = $(KEYBOARD_PATH_1) | 123 | CHCONFDIR = $(KEYBOARD_PATH_1) |
| 124 | else ifneq ("$(wildcard $(TOP_DIR)/platforms/chibios/$(BOARD)/configs/chconf.h)","") | 124 | else ifneq ("$(wildcard $(TOP_DIR)/platforms/chibios/$(BOARD)/configs/chconf.h)","") |
| 125 | CHCONFDIR = $(TOP_DIR)/platforms/chibios/$(BOARD)/configs | 125 | CHCONFDIR = $(TOP_DIR)/platforms/chibios/$(BOARD)/configs |
| 126 | else ifneq ("$(wildcard $(TOP_DIR)/platforms/chibios/common/configs/chconf.h)","") | ||
| 127 | CHCONFDIR = $(TOP_DIR)/platforms/chibios/common/configs | ||
| 126 | endif | 128 | endif |
| 127 | 129 | ||
| 128 | ifneq ("$(wildcard $(KEYBOARD_PATH_5)/halconf.h)","") | 130 | ifneq ("$(wildcard $(KEYBOARD_PATH_5)/halconf.h)","") |
| @@ -137,6 +139,8 @@ else ifneq ("$(wildcard $(KEYBOARD_PATH_1)/halconf.h)","") | |||
| 137 | HALCONFDIR = $(KEYBOARD_PATH_1) | 139 | HALCONFDIR = $(KEYBOARD_PATH_1) |
| 138 | else ifneq ("$(wildcard $(TOP_DIR)/platforms/chibios/$(BOARD)/configs/halconf.h)","") | 140 | else ifneq ("$(wildcard $(TOP_DIR)/platforms/chibios/$(BOARD)/configs/halconf.h)","") |
| 139 | HALCONFDIR = $(TOP_DIR)/platforms/chibios/$(BOARD)/configs | 141 | HALCONFDIR = $(TOP_DIR)/platforms/chibios/$(BOARD)/configs |
| 142 | else ifneq ("$(wildcard $(TOP_DIR)/platforms/chibios/common/configs/halconf.h)","") | ||
| 143 | HALCONFDIR = $(TOP_DIR)/platforms/chibios/common/configs | ||
| 140 | endif | 144 | endif |
| 141 | 145 | ||
| 142 | # HAL-OSAL files (optional). | 146 | # HAL-OSAL files (optional). |
| @@ -183,8 +187,8 @@ else ifneq ("$(wildcard $(KEYBOARD_PATH_2)/ld/$(MCU_LDSCRIPT).ld)","") | |||
| 183 | LDSCRIPT = $(KEYBOARD_PATH_2)/ld/$(MCU_LDSCRIPT).ld | 187 | LDSCRIPT = $(KEYBOARD_PATH_2)/ld/$(MCU_LDSCRIPT).ld |
| 184 | else ifneq ("$(wildcard $(KEYBOARD_PATH_1)/ld/$(MCU_LDSCRIPT).ld)","") | 188 | else ifneq ("$(wildcard $(KEYBOARD_PATH_1)/ld/$(MCU_LDSCRIPT).ld)","") |
| 185 | LDSCRIPT = $(KEYBOARD_PATH_1)/ld/$(MCU_LDSCRIPT).ld | 189 | LDSCRIPT = $(KEYBOARD_PATH_1)/ld/$(MCU_LDSCRIPT).ld |
| 186 | else ifneq ("$(wildcard $(TOP_DIR)/platforms/chibios/ld/$(MCU_LDSCRIPT).ld)","") | 190 | else ifneq ("$(wildcard $(TOP_DIR)/platforms/chibios/common/ld/$(MCU_LDSCRIPT).ld)","") |
| 187 | LDSCRIPT = $(TOP_DIR)/platforms/chibios/ld/$(MCU_LDSCRIPT).ld | 191 | LDSCRIPT = $(TOP_DIR)/platforms/chibios/common/ld/$(MCU_LDSCRIPT).ld |
| 188 | else ifneq ("$(wildcard $(STARTUPLD_CONTRIB)/$(MCU_LDSCRIPT).ld)","") | 192 | else ifneq ("$(wildcard $(STARTUPLD_CONTRIB)/$(MCU_LDSCRIPT).ld)","") |
| 189 | LDSCRIPT = $(STARTUPLD_CONTRIB)/$(MCU_LDSCRIPT).ld | 193 | LDSCRIPT = $(STARTUPLD_CONTRIB)/$(MCU_LDSCRIPT).ld |
| 190 | USE_CHIBIOS_CONTRIB = yes | 194 | USE_CHIBIOS_CONTRIB = yes |
| @@ -209,6 +213,8 @@ CHIBISRC := $(patsubst $(TOP_DIR)/%,%,$(CHIBISRC)) | |||
| 209 | 213 | ||
| 210 | EXTRAINCDIRS += $(CHIBIOS)/os/license $(CHIBIOS)/os/oslib/include \ | 214 | EXTRAINCDIRS += $(CHIBIOS)/os/license $(CHIBIOS)/os/oslib/include \ |
| 211 | $(TOP_DIR)/platforms/chibios/$(BOARD)/configs \ | 215 | $(TOP_DIR)/platforms/chibios/$(BOARD)/configs \ |
| 216 | $(TOP_DIR)/platforms/chibios/common/configs \ | ||
| 217 | $(HALCONFDIR) $(CHCONFDIR) \ | ||
| 212 | $(STARTUPINC) $(KERNINC) $(PORTINC) $(OSALINC) \ | 218 | $(STARTUPINC) $(KERNINC) $(PORTINC) $(OSALINC) \ |
| 213 | $(HALINC) $(PLATFORMINC) $(BOARDINC) $(TESTINC) \ | 219 | $(HALINC) $(PLATFORMINC) $(BOARDINC) $(TESTINC) \ |
| 214 | $(STREAMSINC) $(CHIBIOS)/os/various $(COMMON_VPATH) | 220 | $(STREAMSINC) $(CHIBIOS)/os/various $(COMMON_VPATH) |
diff --git a/tmk_core/common/action.c b/tmk_core/common/action.c index ee9aa0df7..77da0139f 100644 --- a/tmk_core/common/action.c +++ b/tmk_core/common/action.c | |||
| @@ -37,9 +37,13 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
| 37 | # include "nodebug.h" | 37 | # include "nodebug.h" |
| 38 | #endif | 38 | #endif |
| 39 | 39 | ||
| 40 | #ifdef POINTING_DEVICE_ENABLE | ||
| 41 | # include "pointing_device.h" | ||
| 42 | #endif | ||
| 43 | |||
| 40 | int tp_buttons; | 44 | int tp_buttons; |
| 41 | 45 | ||
| 42 | #ifdef RETRO_TAPPING | 46 | #if defined(RETRO_TAPPING) || defined(RETRO_TAPPING_PER_KEY) |
| 43 | int retro_tapping_counter = 0; | 47 | int retro_tapping_counter = 0; |
| 44 | #endif | 48 | #endif |
| 45 | 49 | ||
| @@ -51,6 +55,10 @@ int retro_tapping_counter = 0; | |||
| 51 | __attribute__((weak)) bool get_ignore_mod_tap_interrupt(uint16_t keycode, keyrecord_t *record) { return false; } | 55 | __attribute__((weak)) bool get_ignore_mod_tap_interrupt(uint16_t keycode, keyrecord_t *record) { return false; } |
| 52 | #endif | 56 | #endif |
| 53 | 57 | ||
| 58 | #ifdef RETRO_TAPPING_PER_KEY | ||
| 59 | __attribute__((weak)) bool get_retro_tapping(uint16_t keycode, keyrecord_t *record) { return false; } | ||
| 60 | #endif | ||
| 61 | |||
| 54 | #ifndef TAP_CODE_DELAY | 62 | #ifndef TAP_CODE_DELAY |
| 55 | # define TAP_CODE_DELAY 0 | 63 | # define TAP_CODE_DELAY 0 |
| 56 | #endif | 64 | #endif |
| @@ -67,7 +75,7 @@ void action_exec(keyevent_t event) { | |||
| 67 | dprint("EVENT: "); | 75 | dprint("EVENT: "); |
| 68 | debug_event(event); | 76 | debug_event(event); |
| 69 | dprintln(); | 77 | dprintln(); |
| 70 | #ifdef RETRO_TAPPING | 78 | #if defined(RETRO_TAPPING) || defined(RETRO_TAPPING_PER_KEY) |
| 71 | retro_tapping_counter++; | 79 | retro_tapping_counter++; |
| 72 | #endif | 80 | #endif |
| 73 | } | 81 | } |
| @@ -220,6 +228,19 @@ void process_record_handler(keyrecord_t *record) { | |||
| 220 | process_action(record, action); | 228 | process_action(record, action); |
| 221 | } | 229 | } |
| 222 | 230 | ||
| 231 | #if defined(PS2_MOUSE_ENABLE) || defined(POINTING_DEVICE_ENABLE) | ||
| 232 | void register_button(bool pressed, enum mouse_buttons button) { | ||
| 233 | # ifdef PS2_MOUSE_ENABLE | ||
| 234 | tp_buttons = pressed ? tp_buttons | button : tp_buttons & ~button; | ||
| 235 | # endif | ||
| 236 | # ifdef POINTING_DEVICE_ENABLE | ||
| 237 | report_mouse_t currentReport = pointing_device_get_report(); | ||
| 238 | currentReport.buttons = pressed ? currentReport.buttons | button : currentReport.buttons & ~button; | ||
| 239 | pointing_device_set_report(currentReport); | ||
| 240 | # endif | ||
| 241 | } | ||
| 242 | #endif | ||
| 243 | |||
| 223 | /** \brief Take an action and processes it. | 244 | /** \brief Take an action and processes it. |
| 224 | * | 245 | * |
| 225 | * FIXME: Needs documentation. | 246 | * FIXME: Needs documentation. |
| @@ -404,15 +425,23 @@ void process_action(keyrecord_t *record, action_t action) { | |||
| 404 | if (event.pressed) { | 425 | if (event.pressed) { |
| 405 | mousekey_on(action.key.code); | 426 | mousekey_on(action.key.code); |
| 406 | switch (action.key.code) { | 427 | switch (action.key.code) { |
| 407 | # ifdef PS2_MOUSE_ENABLE | 428 | # if defined(PS2_MOUSE_ENABLE) || defined(POINTING_DEVICE_ENABLE) |
| 408 | case KC_MS_BTN1: | 429 | case KC_MS_BTN1: |
| 409 | tp_buttons |= (1 << 0); | 430 | register_button(true, MOUSE_BTN1); |
| 410 | break; | 431 | break; |
| 411 | case KC_MS_BTN2: | 432 | case KC_MS_BTN2: |
| 412 | tp_buttons |= (1 << 1); | 433 | register_button(true, MOUSE_BTN2); |
| 413 | break; | 434 | break; |
| 414 | case KC_MS_BTN3: | 435 | case KC_MS_BTN3: |
| 415 | tp_buttons |= (1 << 2); | 436 | register_button(true, MOUSE_BTN3); |
| 437 | break; | ||
| 438 | # endif | ||
| 439 | # ifdef POINTING_DEVICE_ENABLE | ||
| 440 | case KC_MS_BTN4: | ||
| 441 | register_button(true, MOUSE_BTN4); | ||
| 442 | break; | ||
| 443 | case KC_MS_BTN5: | ||
| 444 | register_button(true, MOUSE_BTN5); | ||
| 416 | break; | 445 | break; |
| 417 | # endif | 446 | # endif |
| 418 | default: | 447 | default: |
| @@ -422,15 +451,23 @@ void process_action(keyrecord_t *record, action_t action) { | |||
| 422 | } else { | 451 | } else { |
| 423 | mousekey_off(action.key.code); | 452 | mousekey_off(action.key.code); |
| 424 | switch (action.key.code) { | 453 | switch (action.key.code) { |
| 425 | # ifdef PS2_MOUSE_ENABLE | 454 | # if defined(PS2_MOUSE_ENABLE) || defined(POINTING_DEVICE_ENABLE) |
| 426 | case KC_MS_BTN1: | 455 | case KC_MS_BTN1: |
| 427 | tp_buttons &= ~(1 << 0); | 456 | register_button(false, MOUSE_BTN1); |
| 428 | break; | 457 | break; |
| 429 | case KC_MS_BTN2: | 458 | case KC_MS_BTN2: |
| 430 | tp_buttons &= ~(1 << 1); | 459 | register_button(false, MOUSE_BTN2); |
| 431 | break; | 460 | break; |
| 432 | case KC_MS_BTN3: | 461 | case KC_MS_BTN3: |
| 433 | tp_buttons &= ~(1 << 2); | 462 | register_button(false, MOUSE_BTN3); |
| 463 | break; | ||
| 464 | # endif | ||
| 465 | # ifdef POINTING_DEVICE_ENABLE | ||
| 466 | case KC_MS_BTN4: | ||
| 467 | register_button(false, MOUSE_BTN4); | ||
| 468 | break; | ||
| 469 | case KC_MS_BTN5: | ||
| 470 | register_button(false, MOUSE_BTN5); | ||
| 434 | break; | 471 | break; |
| 435 | # endif | 472 | # endif |
| 436 | default: | 473 | default: |
| @@ -692,20 +729,23 @@ void process_action(keyrecord_t *record, action_t action) { | |||
| 692 | #endif | 729 | #endif |
| 693 | 730 | ||
| 694 | #ifndef NO_ACTION_TAPPING | 731 | #ifndef NO_ACTION_TAPPING |
| 695 | # ifdef RETRO_TAPPING | 732 | # if defined(RETRO_TAPPING) || defined(RETRO_TAPPING_PER_KEY) |
| 696 | if (!is_tap_action(action)) { | 733 | if (!is_tap_action(action)) { |
| 697 | retro_tapping_counter = 0; | 734 | retro_tapping_counter = 0; |
| 698 | } else { | 735 | } else { |
| 699 | if (event.pressed) { | 736 | if (event.pressed) { |
| 700 | if (tap_count > 0) { | 737 | if (tap_count > 0) { |
| 701 | retro_tapping_counter = 0; | 738 | retro_tapping_counter = 0; |
| 702 | } else { | ||
| 703 | } | 739 | } |
| 704 | } else { | 740 | } else { |
| 705 | if (tap_count > 0) { | 741 | if (tap_count > 0) { |
| 706 | retro_tapping_counter = 0; | 742 | retro_tapping_counter = 0; |
| 707 | } else { | 743 | } else { |
| 708 | if (retro_tapping_counter == 2) { | 744 | if ( |
| 745 | # ifdef RETRO_TAPPING_PER_KEY | ||
| 746 | get_retro_tapping(get_event_keycode(record->event, false), record) && | ||
| 747 | # endif | ||
| 748 | retro_tapping_counter == 2) { | ||
| 709 | tap_code(action.layer_tap.code); | 749 | tap_code(action.layer_tap.code); |
| 710 | } | 750 | } |
| 711 | retro_tapping_counter = 0; | 751 | retro_tapping_counter = 0; |
diff --git a/tmk_core/common/action_util.c b/tmk_core/common/action_util.c index fd0e4409f..000503b08 100644 --- a/tmk_core/common/action_util.c +++ b/tmk_core/common/action_util.c | |||
| @@ -290,6 +290,32 @@ void set_macro_mods(uint8_t mods) { macro_mods = mods; } | |||
| 290 | void clear_macro_mods(void) { macro_mods = 0; } | 290 | void clear_macro_mods(void) { macro_mods = 0; } |
| 291 | 291 | ||
| 292 | #ifndef NO_ACTION_ONESHOT | 292 | #ifndef NO_ACTION_ONESHOT |
| 293 | /** \brief get oneshot mods | ||
| 294 | * | ||
| 295 | * FIXME: needs doc | ||
| 296 | */ | ||
| 297 | uint8_t get_oneshot_mods(void) { return oneshot_mods; } | ||
| 298 | |||
| 299 | void add_oneshot_mods(uint8_t mods) { | ||
| 300 | if ((oneshot_mods & mods) != mods) { | ||
| 301 | # if (defined(ONESHOT_TIMEOUT) && (ONESHOT_TIMEOUT > 0)) | ||
| 302 | oneshot_time = timer_read(); | ||
| 303 | # endif | ||
| 304 | oneshot_mods |= mods; | ||
| 305 | oneshot_mods_changed_kb(mods); | ||
| 306 | } | ||
| 307 | } | ||
| 308 | |||
| 309 | void del_oneshot_mods(uint8_t mods) { | ||
| 310 | if (oneshot_mods & mods) { | ||
| 311 | oneshot_mods &= ~mods; | ||
| 312 | # if (defined(ONESHOT_TIMEOUT) && (ONESHOT_TIMEOUT > 0)) | ||
| 313 | oneshot_time = oneshot_mods ? timer_read() : 0; | ||
| 314 | # endif | ||
| 315 | oneshot_mods_changed_kb(oneshot_mods); | ||
| 316 | } | ||
| 317 | } | ||
| 318 | |||
| 293 | /** \brief set oneshot mods | 319 | /** \brief set oneshot mods |
| 294 | * | 320 | * |
| 295 | * FIXME: needs doc | 321 | * FIXME: needs doc |
| @@ -316,11 +342,6 @@ void clear_oneshot_mods(void) { | |||
| 316 | oneshot_mods_changed_kb(oneshot_mods); | 342 | oneshot_mods_changed_kb(oneshot_mods); |
| 317 | } | 343 | } |
| 318 | } | 344 | } |
| 319 | /** \brief get oneshot mods | ||
| 320 | * | ||
| 321 | * FIXME: needs doc | ||
| 322 | */ | ||
| 323 | uint8_t get_oneshot_mods(void) { return oneshot_mods; } | ||
| 324 | #endif | 345 | #endif |
| 325 | 346 | ||
| 326 | /** \brief Called when the one shot modifiers have been changed. | 347 | /** \brief Called when the one shot modifiers have been changed. |
diff --git a/tmk_core/common/action_util.h b/tmk_core/common/action_util.h index 5dd8393da..743ff1406 100644 --- a/tmk_core/common/action_util.h +++ b/tmk_core/common/action_util.h | |||
| @@ -57,12 +57,11 @@ void set_macro_mods(uint8_t mods); | |||
| 57 | void clear_macro_mods(void); | 57 | void clear_macro_mods(void); |
| 58 | 58 | ||
| 59 | /* oneshot modifier */ | 59 | /* oneshot modifier */ |
| 60 | void set_oneshot_mods(uint8_t mods); | ||
| 61 | uint8_t get_oneshot_mods(void); | 60 | uint8_t get_oneshot_mods(void); |
| 61 | void add_oneshot_mods(uint8_t mods); | ||
| 62 | void del_oneshot_mods(uint8_t mods); | ||
| 63 | void set_oneshot_mods(uint8_t mods); | ||
| 62 | void clear_oneshot_mods(void); | 64 | void clear_oneshot_mods(void); |
| 63 | void oneshot_toggle(void); | ||
| 64 | void oneshot_enable(void); | ||
| 65 | void oneshot_disable(void); | ||
| 66 | bool has_oneshot_mods_timed_out(void); | 65 | bool has_oneshot_mods_timed_out(void); |
| 67 | 66 | ||
| 68 | uint8_t get_oneshot_locked_mods(void); | 67 | uint8_t get_oneshot_locked_mods(void); |
diff --git a/tmk_core/common/arm_atsam/suspend.c b/tmk_core/common/arm_atsam/suspend.c index d1077be4c..e51426128 100644 --- a/tmk_core/common/arm_atsam/suspend.c +++ b/tmk_core/common/arm_atsam/suspend.c | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | #include "matrix.h" | 1 | #include "matrix.h" |
| 2 | #include "i2c_master.h" | 2 | #include "i2c_master.h" |
| 3 | #include "led_matrix.h" | 3 | #include "md_rgb_matrix.h" |
| 4 | #include "suspend.h" | 4 | #include "suspend.h" |
| 5 | 5 | ||
| 6 | /** \brief Suspend idle | 6 | /** \brief Suspend idle |
diff --git a/tmk_core/common/chibios/bootloader.c b/tmk_core/common/chibios/bootloader.c index 7b2cf5c43..f6d016ec9 100644 --- a/tmk_core/common/chibios/bootloader.c +++ b/tmk_core/common/chibios/bootloader.c | |||
| @@ -32,7 +32,7 @@ | |||
| 32 | 32 | ||
| 33 | extern uint32_t __ram0_end__; | 33 | extern uint32_t __ram0_end__; |
| 34 | 34 | ||
| 35 | void bootloader_jump(void) { | 35 | __attribute__((weak)) void bootloader_jump(void) { |
| 36 | // For STM32 MCUs with dual-bank flash, and we're incapable of jumping to the bootloader. The first valid flash | 36 | // For STM32 MCUs with dual-bank flash, and we're incapable of jumping to the bootloader. The first valid flash |
| 37 | // bank is executed unconditionally after a reset, so it doesn't enter DFU unless BOOT0 is high. Instead, we do | 37 | // bank is executed unconditionally after a reset, so it doesn't enter DFU unless BOOT0 is high. Instead, we do |
| 38 | // it with hardware...in this case, we pull a GPIO high/low depending on the configuration, connects 3.3V to | 38 | // it with hardware...in this case, we pull a GPIO high/low depending on the configuration, connects 3.3V to |
| @@ -58,7 +58,7 @@ void enter_bootloader_mode_if_requested(void) {} // not needed at all, but if a | |||
| 58 | 58 | ||
| 59 | extern uint32_t __ram0_end__; | 59 | extern uint32_t __ram0_end__; |
| 60 | 60 | ||
| 61 | void bootloader_jump(void) { | 61 | __attribute__((weak)) void bootloader_jump(void) { |
| 62 | *MAGIC_ADDR = BOOTLOADER_MAGIC; // set magic flag => reset handler will jump into boot loader | 62 | *MAGIC_ADDR = BOOTLOADER_MAGIC; // set magic flag => reset handler will jump into boot loader |
| 63 | NVIC_SystemReset(); | 63 | NVIC_SystemReset(); |
| 64 | } | 64 | } |
| @@ -85,8 +85,8 @@ void enter_bootloader_mode_if_requested(void) { | |||
| 85 | # if defined(BOOTLOADER_KIIBOHD) | 85 | # if defined(BOOTLOADER_KIIBOHD) |
| 86 | /* Kiibohd Bootloader (MCHCK and Infinity KB) */ | 86 | /* Kiibohd Bootloader (MCHCK and Infinity KB) */ |
| 87 | # define SCB_AIRCR_VECTKEY_WRITEMAGIC 0x05FA0000 | 87 | # define SCB_AIRCR_VECTKEY_WRITEMAGIC 0x05FA0000 |
| 88 | const uint8_t sys_reset_to_loader_magic[] = "\xff\x00\x7fRESET TO LOADER\x7f\x00\xff"; | 88 | const uint8_t sys_reset_to_loader_magic[] = "\xff\x00\x7fRESET TO LOADER\x7f\x00\xff"; |
| 89 | void bootloader_jump(void) { | 89 | __attribute__((weak)) void bootloader_jump(void) { |
| 90 | __builtin_memcpy((void *)VBAT, (const void *)sys_reset_to_loader_magic, sizeof(sys_reset_to_loader_magic)); | 90 | __builtin_memcpy((void *)VBAT, (const void *)sys_reset_to_loader_magic, sizeof(sys_reset_to_loader_magic)); |
| 91 | // request reset | 91 | // request reset |
| 92 | SCB->AIRCR = SCB_AIRCR_VECTKEY_WRITEMAGIC | SCB_AIRCR_SYSRESETREQ_Msk; | 92 | SCB->AIRCR = SCB_AIRCR_VECTKEY_WRITEMAGIC | SCB_AIRCR_SYSRESETREQ_Msk; |
| @@ -95,7 +95,7 @@ void bootloader_jump(void) { | |||
| 95 | # else /* defined(BOOTLOADER_KIIBOHD) */ | 95 | # else /* defined(BOOTLOADER_KIIBOHD) */ |
| 96 | /* Default for Kinetis - expecting an ARM Teensy */ | 96 | /* Default for Kinetis - expecting an ARM Teensy */ |
| 97 | # include "wait.h" | 97 | # include "wait.h" |
| 98 | void bootloader_jump(void) { | 98 | __attribute__((weak)) void bootloader_jump(void) { |
| 99 | wait_ms(100); | 99 | wait_ms(100); |
| 100 | __BKPT(0); | 100 | __BKPT(0); |
| 101 | } | 101 | } |
diff --git a/tmk_core/common/eeconfig.c b/tmk_core/common/eeconfig.c index fe56c57d1..e15897552 100644 --- a/tmk_core/common/eeconfig.c +++ b/tmk_core/common/eeconfig.c | |||
| @@ -13,6 +13,10 @@ | |||
| 13 | # include "eeprom_driver.h" | 13 | # include "eeprom_driver.h" |
| 14 | #endif | 14 | #endif |
| 15 | 15 | ||
| 16 | #if defined(HAPTIC_ENABLE) | ||
| 17 | # include "haptic.h" | ||
| 18 | #endif | ||
| 19 | |||
| 16 | /** \brief eeconfig enable | 20 | /** \brief eeconfig enable |
| 17 | * | 21 | * |
| 18 | * FIXME: needs doc | 22 | * FIXME: needs doc |
| @@ -65,6 +69,15 @@ void eeconfig_init_quantum(void) { | |||
| 65 | eeprom_update_byte(EECONFIG_HANDEDNESS, 0); | 69 | eeprom_update_byte(EECONFIG_HANDEDNESS, 0); |
| 66 | #endif | 70 | #endif |
| 67 | 71 | ||
| 72 | #if defined(HAPTIC_ENABLE) | ||
| 73 | haptic_reset(); | ||
| 74 | #else | ||
| 75 | // this is used in case haptic is disabled, but we still want sane defaults | ||
| 76 | // in the haptic configuration eeprom. All zero will trigger a haptic_reset | ||
| 77 | // when a haptic-enabled firmware is loaded onto the keyboard. | ||
| 78 | eeprom_update_dword(EECONFIG_HAPTIC, 0); | ||
| 79 | #endif | ||
| 80 | |||
| 68 | eeconfig_init_kb(); | 81 | eeconfig_init_kb(); |
| 69 | } | 82 | } |
| 70 | 83 | ||
diff --git a/tmk_core/common/keyboard.c b/tmk_core/common/keyboard.c index b0394af00..8c7bdc8b5 100644 --- a/tmk_core/common/keyboard.c +++ b/tmk_core/common/keyboard.c | |||
| @@ -235,6 +235,20 @@ __attribute__((weak)) bool is_keyboard_left(void) { return true; } | |||
| 235 | */ | 235 | */ |
| 236 | __attribute__((weak)) bool should_process_keypress(void) { return is_keyboard_master(); } | 236 | __attribute__((weak)) bool should_process_keypress(void) { return is_keyboard_master(); } |
| 237 | 237 | ||
| 238 | /** \brief housekeeping_task_kb | ||
| 239 | * | ||
| 240 | * Override this function if you have a need to execute code for every keyboard main loop iteration. | ||
| 241 | * This is specific to keyboard-level functionality. | ||
| 242 | */ | ||
| 243 | __attribute__((weak)) void housekeeping_task_kb(void) {} | ||
| 244 | |||
| 245 | /** \brief housekeeping_task_user | ||
| 246 | * | ||
| 247 | * Override this function if you have a need to execute code for every keyboard main loop iteration. | ||
| 248 | * This is specific to user/keymap-level functionality. | ||
| 249 | */ | ||
| 250 | __attribute__((weak)) void housekeeping_task_user(void) {} | ||
| 251 | |||
| 238 | /** \brief keyboard_init | 252 | /** \brief keyboard_init |
| 239 | * | 253 | * |
| 240 | * FIXME: needs doc | 254 | * FIXME: needs doc |
| @@ -291,6 +305,10 @@ void keyboard_init(void) { | |||
| 291 | dip_switch_init(); | 305 | dip_switch_init(); |
| 292 | #endif | 306 | #endif |
| 293 | 307 | ||
| 308 | #if defined(DEBUG_MATRIX_SCAN_RATE) && defined(CONSOLE_ENABLE) | ||
| 309 | debug_enable = true; | ||
| 310 | #endif | ||
| 311 | |||
| 294 | keyboard_post_init_kb(); /* Always keep this last */ | 312 | keyboard_post_init_kb(); /* Always keep this last */ |
| 295 | } | 313 | } |
| 296 | 314 | ||
| @@ -315,6 +333,9 @@ void keyboard_task(void) { | |||
| 315 | uint8_t keys_processed = 0; | 333 | uint8_t keys_processed = 0; |
| 316 | #endif | 334 | #endif |
| 317 | 335 | ||
| 336 | housekeeping_task_kb(); | ||
| 337 | housekeeping_task_user(); | ||
| 338 | |||
| 318 | #if defined(OLED_DRIVER_ENABLE) && !defined(OLED_DISABLE_TIMEOUT) | 339 | #if defined(OLED_DRIVER_ENABLE) && !defined(OLED_DISABLE_TIMEOUT) |
| 319 | uint8_t ret = matrix_scan(); | 340 | uint8_t ret = matrix_scan(); |
| 320 | #else | 341 | #else |
diff --git a/tmk_core/common/keyboard.h b/tmk_core/common/keyboard.h index 79d949089..caa18e7e7 100644 --- a/tmk_core/common/keyboard.h +++ b/tmk_core/common/keyboard.h | |||
| @@ -71,6 +71,9 @@ void keyboard_pre_init_user(void); | |||
| 71 | void keyboard_post_init_kb(void); | 71 | void keyboard_post_init_kb(void); |
| 72 | void keyboard_post_init_user(void); | 72 | void keyboard_post_init_user(void); |
| 73 | 73 | ||
| 74 | void housekeeping_task_kb(void); | ||
| 75 | void housekeeping_task_user(void); | ||
| 76 | |||
| 74 | #ifdef __cplusplus | 77 | #ifdef __cplusplus |
| 75 | } | 78 | } |
| 76 | #endif | 79 | #endif |
diff --git a/tmk_core/common/matrix.h b/tmk_core/common/matrix.h index 78506059e..31ec84430 100644 --- a/tmk_core/common/matrix.h +++ b/tmk_core/common/matrix.h | |||
| @@ -30,16 +30,6 @@ typedef uint32_t matrix_row_t; | |||
| 30 | # error "MATRIX_COLS: invalid value" | 30 | # error "MATRIX_COLS: invalid value" |
| 31 | #endif | 31 | #endif |
| 32 | 32 | ||
| 33 | #if (MATRIX_ROWS <= 8) | ||
| 34 | typedef uint8_t matrix_col_t; | ||
| 35 | #elif (MATRIX_ROWS <= 16) | ||
| 36 | typedef uint16_t matrix_col_t; | ||
| 37 | #elif (MATRIX_ROWS <= 32) | ||
| 38 | typedef uint32_t matrix_col_t; | ||
| 39 | #else | ||
| 40 | # error "MATRIX_ROWS: invalid value" | ||
| 41 | #endif | ||
| 42 | |||
| 43 | #define MATRIX_ROW_SHIFTER ((matrix_row_t)1) | 33 | #define MATRIX_ROW_SHIFTER ((matrix_row_t)1) |
| 44 | 34 | ||
| 45 | #define MATRIX_IS_ON(row, col) (matrix_get_row(row) && (1 << col)) | 35 | #define MATRIX_IS_ON(row, col) (matrix_get_row(row) && (1 << col)) |
diff --git a/tmk_core/common/report.h b/tmk_core/common/report.h index 1aa33c998..610addf43 100644 --- a/tmk_core/common/report.h +++ b/tmk_core/common/report.h | |||
| @@ -192,7 +192,11 @@ typedef struct { | |||
| 192 | 192 | ||
| 193 | typedef struct { | 193 | typedef struct { |
| 194 | #if JOYSTICK_AXES_COUNT > 0 | 194 | #if JOYSTICK_AXES_COUNT > 0 |
| 195 | # if JOYSTICK_AXES_RESOLUTION > 8 | ||
| 196 | int16_t axes[JOYSTICK_AXES_COUNT]; | ||
| 197 | # else | ||
| 195 | int8_t axes[JOYSTICK_AXES_COUNT]; | 198 | int8_t axes[JOYSTICK_AXES_COUNT]; |
| 199 | # endif | ||
| 196 | #endif | 200 | #endif |
| 197 | 201 | ||
| 198 | #if JOYSTICK_BUTTON_COUNT > 0 | 202 | #if JOYSTICK_BUTTON_COUNT > 0 |
diff --git a/tmk_core/protocol/arm_atsam.mk b/tmk_core/protocol/arm_atsam.mk index 8d6f724f0..5bb45d658 100644 --- a/tmk_core/protocol/arm_atsam.mk +++ b/tmk_core/protocol/arm_atsam.mk | |||
| @@ -4,9 +4,9 @@ SRC += $(ARM_ATSAM_DIR)/adc.c | |||
| 4 | SRC += $(ARM_ATSAM_DIR)/clks.c | 4 | SRC += $(ARM_ATSAM_DIR)/clks.c |
| 5 | SRC += $(ARM_ATSAM_DIR)/d51_util.c | 5 | SRC += $(ARM_ATSAM_DIR)/d51_util.c |
| 6 | SRC += $(ARM_ATSAM_DIR)/i2c_master.c | 6 | SRC += $(ARM_ATSAM_DIR)/i2c_master.c |
| 7 | ifeq ($(RGB_MATRIX_ENABLE),custom) | 7 | ifeq ($(RGB_MATRIX_DRIVER),custom) |
| 8 | SRC += $(ARM_ATSAM_DIR)/led_matrix_programs.c | 8 | SRC += $(ARM_ATSAM_DIR)/md_rgb_matrix_programs.c |
| 9 | SRC += $(ARM_ATSAM_DIR)/led_matrix.c | 9 | SRC += $(ARM_ATSAM_DIR)/md_rgb_matrix.c |
| 10 | endif | 10 | endif |
| 11 | SRC += $(ARM_ATSAM_DIR)/main_arm_atsam.c | 11 | SRC += $(ARM_ATSAM_DIR)/main_arm_atsam.c |
| 12 | SRC += $(ARM_ATSAM_DIR)/spi.c | 12 | SRC += $(ARM_ATSAM_DIR)/spi.c |
diff --git a/tmk_core/protocol/arm_atsam/arm_atsam_protocol.h b/tmk_core/protocol/arm_atsam/arm_atsam_protocol.h index 8cb00b872..d126c66e7 100644 --- a/tmk_core/protocol/arm_atsam/arm_atsam_protocol.h +++ b/tmk_core/protocol/arm_atsam/arm_atsam_protocol.h | |||
| @@ -35,7 +35,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
| 35 | 35 | ||
| 36 | # include "main_arm_atsam.h" | 36 | # include "main_arm_atsam.h" |
| 37 | # ifdef RGB_MATRIX_ENABLE | 37 | # ifdef RGB_MATRIX_ENABLE |
| 38 | # include "led_matrix.h" | 38 | # include "md_rgb_matrix.h" |
| 39 | # include "rgb_matrix.h" | 39 | # include "rgb_matrix.h" |
| 40 | # endif | 40 | # endif |
| 41 | # include "issi3733_driver.h" | 41 | # include "issi3733_driver.h" |
diff --git a/tmk_core/protocol/arm_atsam/main_arm_atsam.c b/tmk_core/protocol/arm_atsam/main_arm_atsam.c index e4e79d351..e10be52fb 100644 --- a/tmk_core/protocol/arm_atsam/main_arm_atsam.c +++ b/tmk_core/protocol/arm_atsam/main_arm_atsam.c | |||
| @@ -305,6 +305,10 @@ int main(void) { | |||
| 305 | // dprintf("5v=%u 5vu=%u dlow=%u dhi=%u gca=%u gcd=%u\r\n", v_5v, v_5v_avg, v_5v_avg - V5_LOW, v_5v_avg - V5_HIGH, gcr_actual, gcr_desired); | 305 | // dprintf("5v=%u 5vu=%u dlow=%u dhi=%u gca=%u gcd=%u\r\n", v_5v, v_5v_avg, v_5v_avg - V5_LOW, v_5v_avg - V5_HIGH, gcr_actual, gcr_desired); |
| 306 | } | 306 | } |
| 307 | #endif // CONSOLE_ENABLE | 307 | #endif // CONSOLE_ENABLE |
| 308 | |||
| 309 | // Run housekeeping | ||
| 310 | housekeeping_task_kb(); | ||
| 311 | housekeeping_task_user(); | ||
| 308 | } | 312 | } |
| 309 | 313 | ||
| 310 | return 1; | 314 | return 1; |
diff --git a/tmk_core/protocol/arm_atsam/led_matrix.c b/tmk_core/protocol/arm_atsam/md_rgb_matrix.c index 69cb03a9f..439aaf8b3 100644 --- a/tmk_core/protocol/arm_atsam/led_matrix.c +++ b/tmk_core/protocol/arm_atsam/md_rgb_matrix.c | |||
| @@ -23,7 +23,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
| 23 | 23 | ||
| 24 | #ifdef USE_MASSDROP_CONFIGURATOR | 24 | #ifdef USE_MASSDROP_CONFIGURATOR |
| 25 | __attribute__((weak)) led_instruction_t led_instructions[] = {{.end = 1}}; | 25 | __attribute__((weak)) led_instruction_t led_instructions[] = {{.end = 1}}; |
| 26 | static void led_matrix_massdrop_config_override(int i); | 26 | static void md_rgb_matrix_config_override(int i); |
| 27 | #endif // USE_MASSDROP_CONFIGURATOR | 27 | #endif // USE_MASSDROP_CONFIGURATOR |
| 28 | 28 | ||
| 29 | void SERCOM1_0_Handler(void) { | 29 | void SERCOM1_0_Handler(void) { |
| @@ -188,7 +188,7 @@ void issi3733_prepare_arrays(void) { | |||
| 188 | } | 188 | } |
| 189 | } | 189 | } |
| 190 | 190 | ||
| 191 | void led_matrix_prepare(void) { | 191 | void md_rgb_matrix_prepare(void) { |
| 192 | for (uint8_t i = 0; i < ISSI3733_LED_COUNT; i++) { | 192 | for (uint8_t i = 0; i < ISSI3733_LED_COUNT; i++) { |
| 193 | *led_map[i].rgb.r = 0; | 193 | *led_map[i].rgb.r = 0; |
| 194 | *led_map[i].rgb.g = 0; | 194 | *led_map[i].rgb.g = 0; |
| @@ -199,7 +199,7 @@ void led_matrix_prepare(void) { | |||
| 199 | void led_set_one(int i, uint8_t r, uint8_t g, uint8_t b) { | 199 | void led_set_one(int i, uint8_t r, uint8_t g, uint8_t b) { |
| 200 | if (i < ISSI3733_LED_COUNT) { | 200 | if (i < ISSI3733_LED_COUNT) { |
| 201 | #ifdef USE_MASSDROP_CONFIGURATOR | 201 | #ifdef USE_MASSDROP_CONFIGURATOR |
| 202 | led_matrix_massdrop_config_override(i); | 202 | md_rgb_matrix_config_override(i); |
| 203 | #else | 203 | #else |
| 204 | led_buffer[i].r = r; | 204 | led_buffer[i].r = r; |
| 205 | led_buffer[i].g = g; | 205 | led_buffer[i].g = g; |
| @@ -219,7 +219,7 @@ void init(void) { | |||
| 219 | 219 | ||
| 220 | issi3733_prepare_arrays(); | 220 | issi3733_prepare_arrays(); |
| 221 | 221 | ||
| 222 | led_matrix_prepare(); | 222 | md_rgb_matrix_prepare(); |
| 223 | 223 | ||
| 224 | gcr_min_counter = 0; | 224 | gcr_min_counter = 0; |
| 225 | v_5v_cat_hit = 0; | 225 | v_5v_cat_hit = 0; |
| @@ -290,7 +290,7 @@ void flush(void) { | |||
| 290 | i2c_led_q_run(); | 290 | i2c_led_q_run(); |
| 291 | } | 291 | } |
| 292 | 292 | ||
| 293 | void led_matrix_indicators(void) { | 293 | void md_rgb_matrix_indicators(void) { |
| 294 | uint8_t kbled = keyboard_leds(); | 294 | uint8_t kbled = keyboard_leds(); |
| 295 | if (kbled && rgb_matrix_config.enable) { | 295 | if (kbled && rgb_matrix_config.enable) { |
| 296 | for (uint8_t i = 0; i < ISSI3733_LED_COUNT; i++) { | 296 | for (uint8_t i = 0; i < ISSI3733_LED_COUNT; i++) { |
| @@ -397,7 +397,7 @@ static void led_run_pattern(led_setup_t* f, float* ro, float* go, float* bo, flo | |||
| 397 | } | 397 | } |
| 398 | } | 398 | } |
| 399 | 399 | ||
| 400 | static void led_matrix_massdrop_config_override(int i) { | 400 | static void md_rgb_matrix_config_override(int i) { |
| 401 | float ro = 0; | 401 | float ro = 0; |
| 402 | float go = 0; | 402 | float go = 0; |
| 403 | float bo = 0; | 403 | float bo = 0; |
diff --git a/tmk_core/protocol/arm_atsam/led_matrix.h b/tmk_core/protocol/arm_atsam/md_rgb_matrix.h index 8eaa5623b..322b0f99d 100644 --- a/tmk_core/protocol/arm_atsam/led_matrix.h +++ b/tmk_core/protocol/arm_atsam/md_rgb_matrix.h | |||
| @@ -86,7 +86,7 @@ extern uint8_t gcr_actual_last; | |||
| 86 | 86 | ||
| 87 | void gcr_compute(void); | 87 | void gcr_compute(void); |
| 88 | 88 | ||
| 89 | void led_matrix_indicators(void); | 89 | void md_rgb_matrix_indicators(void); |
| 90 | 90 | ||
| 91 | /*------------------------- Legacy Lighting Support ------------------------*/ | 91 | /*------------------------- Legacy Lighting Support ------------------------*/ |
| 92 | 92 | ||
diff --git a/tmk_core/protocol/arm_atsam/led_matrix_programs.c b/tmk_core/protocol/arm_atsam/md_rgb_matrix_programs.c index 360102ba8..b43008cc5 100644 --- a/tmk_core/protocol/arm_atsam/led_matrix_programs.c +++ b/tmk_core/protocol/arm_atsam/md_rgb_matrix_programs.c | |||
| @@ -17,7 +17,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
| 17 | 17 | ||
| 18 | #ifdef USE_MASSDROP_CONFIGURATOR | 18 | #ifdef USE_MASSDROP_CONFIGURATOR |
| 19 | 19 | ||
| 20 | # include "led_matrix.h" | 20 | # include "md_rgb_matrix.h" |
| 21 | 21 | ||
| 22 | // Teal <-> Salmon | 22 | // Teal <-> Salmon |
| 23 | led_setup_t leds_teal_salmon[] = { | 23 | led_setup_t leds_teal_salmon[] = { |
diff --git a/tmk_core/protocol/chibios/main.c b/tmk_core/protocol/chibios/main.c index a0d28f9af..400c0b8f5 100644 --- a/tmk_core/protocol/chibios/main.c +++ b/tmk_core/protocol/chibios/main.c | |||
| @@ -54,6 +54,9 @@ | |||
| 54 | #ifdef STM32_EEPROM_ENABLE | 54 | #ifdef STM32_EEPROM_ENABLE |
| 55 | # include "eeprom_stm32.h" | 55 | # include "eeprom_stm32.h" |
| 56 | #endif | 56 | #endif |
| 57 | #ifdef EEPROM_DRIVER | ||
| 58 | # include "eeprom_driver.h" | ||
| 59 | #endif | ||
| 57 | #include "suspend.h" | 60 | #include "suspend.h" |
| 58 | #include "wait.h" | 61 | #include "wait.h" |
| 59 | 62 | ||
| @@ -150,6 +153,9 @@ int main(void) { | |||
| 150 | #ifdef STM32_EEPROM_ENABLE | 153 | #ifdef STM32_EEPROM_ENABLE |
| 151 | EEPROM_Init(); | 154 | EEPROM_Init(); |
| 152 | #endif | 155 | #endif |
| 156 | #ifdef EEPROM_DRIVER | ||
| 157 | eeprom_driver_init(); | ||
| 158 | #endif | ||
| 153 | 159 | ||
| 154 | // TESTING | 160 | // TESTING |
| 155 | // chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); | 161 | // chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); |
| @@ -230,6 +236,7 @@ int main(void) { | |||
| 230 | /* Remote wakeup */ | 236 | /* Remote wakeup */ |
| 231 | if (suspend_wakeup_condition()) { | 237 | if (suspend_wakeup_condition()) { |
| 232 | usbWakeupHost(&USB_DRIVER); | 238 | usbWakeupHost(&USB_DRIVER); |
| 239 | restart_usb_driver(&USB_DRIVER); | ||
| 233 | } | 240 | } |
| 234 | } | 241 | } |
| 235 | /* Woken up */ | 242 | /* Woken up */ |
| @@ -258,5 +265,9 @@ int main(void) { | |||
| 258 | #ifdef RAW_ENABLE | 265 | #ifdef RAW_ENABLE |
| 259 | raw_hid_task(); | 266 | raw_hid_task(); |
| 260 | #endif | 267 | #endif |
| 268 | |||
| 269 | // Run housekeeping | ||
| 270 | housekeeping_task_kb(); | ||
| 271 | housekeeping_task_user(); | ||
| 261 | } | 272 | } |
| 262 | } | 273 | } |
diff --git a/tmk_core/protocol/chibios/usb_main.c b/tmk_core/protocol/chibios/usb_main.c index ae33e86a7..bb4bf6a58 100644 --- a/tmk_core/protocol/chibios/usb_main.c +++ b/tmk_core/protocol/chibios/usb_main.c | |||
| @@ -165,6 +165,19 @@ static const USBEndpointConfig shared_ep_config = { | |||
| 165 | }; | 165 | }; |
| 166 | #endif | 166 | #endif |
| 167 | 167 | ||
| 168 | #if STM32_USB_USE_OTG1 | ||
| 169 | typedef struct { | ||
| 170 | size_t queue_capacity_in; | ||
| 171 | size_t queue_capacity_out; | ||
| 172 | USBInEndpointState in_ep_state; | ||
| 173 | USBOutEndpointState out_ep_state; | ||
| 174 | USBInEndpointState int_ep_state; | ||
| 175 | USBEndpointConfig inout_ep_config; | ||
| 176 | USBEndpointConfig int_ep_config; | ||
| 177 | const QMKUSBConfig config; | ||
| 178 | QMKUSBDriver driver; | ||
| 179 | } usb_driver_config_t; | ||
| 180 | #else | ||
| 168 | typedef struct { | 181 | typedef struct { |
| 169 | size_t queue_capacity_in; | 182 | size_t queue_capacity_in; |
| 170 | size_t queue_capacity_out; | 183 | size_t queue_capacity_out; |
| @@ -177,7 +190,54 @@ typedef struct { | |||
| 177 | const QMKUSBConfig config; | 190 | const QMKUSBConfig config; |
| 178 | QMKUSBDriver driver; | 191 | QMKUSBDriver driver; |
| 179 | } usb_driver_config_t; | 192 | } usb_driver_config_t; |
| 193 | #endif | ||
| 180 | 194 | ||
| 195 | #if STM32_USB_USE_OTG1 | ||
| 196 | /* Reusable initialization structure - see USBEndpointConfig comment at top of file */ | ||
| 197 | #define QMK_USB_DRIVER_CONFIG(stream, notification, fixedsize) \ | ||
| 198 | { \ | ||
| 199 | .queue_capacity_in = stream##_IN_CAPACITY, .queue_capacity_out = stream##_OUT_CAPACITY, \ | ||
| 200 | .inout_ep_config = \ | ||
| 201 | { \ | ||
| 202 | stream##_IN_MODE, /* Interrupt EP */ \ | ||
| 203 | NULL, /* SETUP packet notification callback */ \ | ||
| 204 | qmkusbDataTransmitted, /* IN notification callback */ \ | ||
| 205 | qmkusbDataReceived, /* OUT notification callback */ \ | ||
| 206 | stream##_EPSIZE, /* IN maximum packet size */ \ | ||
| 207 | stream##_EPSIZE, /* OUT maximum packet size */ \ | ||
| 208 | NULL, /* IN Endpoint state */ \ | ||
| 209 | NULL, /* OUT endpoint state */ \ | ||
| 210 | 2, /* IN multiplier */ \ | ||
| 211 | NULL /* SETUP buffer (not a SETUP endpoint) */ \ | ||
| 212 | }, \ | ||
| 213 | .int_ep_config = \ | ||
| 214 | { \ | ||
| 215 | USB_EP_MODE_TYPE_INTR, /* Interrupt EP */ \ | ||
| 216 | NULL, /* SETUP packet notification callback */ \ | ||
| 217 | qmkusbInterruptTransmitted, /* IN notification callback */ \ | ||
| 218 | NULL, /* OUT notification callback */ \ | ||
| 219 | CDC_NOTIFICATION_EPSIZE, /* IN maximum packet size */ \ | ||
| 220 | 0, /* OUT maximum packet size */ \ | ||
| 221 | NULL, /* IN Endpoint state */ \ | ||
| 222 | NULL, /* OUT endpoint state */ \ | ||
| 223 | 2, /* IN multiplier */ \ | ||
| 224 | NULL, /* SETUP buffer (not a SETUP endpoint) */ \ | ||
| 225 | }, \ | ||
| 226 | .config = { \ | ||
| 227 | .usbp = &USB_DRIVER, \ | ||
| 228 | .bulk_in = stream##_IN_EPNUM, \ | ||
| 229 | .bulk_out = stream##_OUT_EPNUM, \ | ||
| 230 | .int_in = notification, \ | ||
| 231 | .in_buffers = stream##_IN_CAPACITY, \ | ||
| 232 | .out_buffers = stream##_OUT_CAPACITY, \ | ||
| 233 | .in_size = stream##_EPSIZE, \ | ||
| 234 | .out_size = stream##_EPSIZE, \ | ||
| 235 | .fixed_size = fixedsize, \ | ||
| 236 | .ib = (__attribute__((aligned(4))) uint8_t[BQ_BUFFER_SIZE(stream##_IN_CAPACITY, stream##_EPSIZE)]){}, \ | ||
| 237 | .ob = (__attribute__((aligned(4))) uint8_t[BQ_BUFFER_SIZE(stream##_OUT_CAPACITY, stream##_EPSIZE)]){}, \ | ||
| 238 | } \ | ||
| 239 | } | ||
| 240 | #else | ||
| 181 | /* Reusable initialization structure - see USBEndpointConfig comment at top of file */ | 241 | /* Reusable initialization structure - see USBEndpointConfig comment at top of file */ |
| 182 | #define QMK_USB_DRIVER_CONFIG(stream, notification, fixedsize) \ | 242 | #define QMK_USB_DRIVER_CONFIG(stream, notification, fixedsize) \ |
| 183 | { \ | 243 | { \ |
| @@ -235,6 +295,7 @@ typedef struct { | |||
| 235 | .ob = (__attribute__((aligned(4))) uint8_t[BQ_BUFFER_SIZE(stream##_OUT_CAPACITY, stream##_EPSIZE)]){}, \ | 295 | .ob = (__attribute__((aligned(4))) uint8_t[BQ_BUFFER_SIZE(stream##_OUT_CAPACITY, stream##_EPSIZE)]){}, \ |
| 236 | } \ | 296 | } \ |
| 237 | } | 297 | } |
| 298 | #endif | ||
| 238 | 299 | ||
| 239 | typedef struct { | 300 | typedef struct { |
| 240 | union { | 301 | union { |
| @@ -327,8 +388,12 @@ static void usb_event_cb(USBDriver *usbp, usbevent_t event) { | |||
| 327 | usbInitEndpointI(usbp, SHARED_IN_EPNUM, &shared_ep_config); | 388 | usbInitEndpointI(usbp, SHARED_IN_EPNUM, &shared_ep_config); |
| 328 | #endif | 389 | #endif |
| 329 | for (int i = 0; i < NUM_USB_DRIVERS; i++) { | 390 | for (int i = 0; i < NUM_USB_DRIVERS; i++) { |
| 391 | #if STM32_USB_USE_OTG1 | ||
| 392 | usbInitEndpointI(usbp, drivers.array[i].config.bulk_in, &drivers.array[i].inout_ep_config); | ||
| 393 | #else | ||
| 330 | usbInitEndpointI(usbp, drivers.array[i].config.bulk_in, &drivers.array[i].in_ep_config); | 394 | usbInitEndpointI(usbp, drivers.array[i].config.bulk_in, &drivers.array[i].in_ep_config); |
| 331 | usbInitEndpointI(usbp, drivers.array[i].config.bulk_out, &drivers.array[i].out_ep_config); | 395 | usbInitEndpointI(usbp, drivers.array[i].config.bulk_out, &drivers.array[i].out_ep_config); |
| 396 | #endif | ||
| 332 | if (drivers.array[i].config.int_in) { | 397 | if (drivers.array[i].config.int_in) { |
| 333 | usbInitEndpointI(usbp, drivers.array[i].config.int_in, &drivers.array[i].int_ep_config); | 398 | usbInitEndpointI(usbp, drivers.array[i].config.int_in, &drivers.array[i].int_ep_config); |
| 334 | } | 399 | } |
| @@ -553,12 +618,21 @@ static const USBConfig usbcfg = { | |||
| 553 | */ | 618 | */ |
| 554 | void init_usb_driver(USBDriver *usbp) { | 619 | void init_usb_driver(USBDriver *usbp) { |
| 555 | for (int i = 0; i < NUM_USB_DRIVERS; i++) { | 620 | for (int i = 0; i < NUM_USB_DRIVERS; i++) { |
| 621 | #if STM32_USB_USE_OTG1 | ||
| 622 | QMKUSBDriver *driver = &drivers.array[i].driver; | ||
| 623 | drivers.array[i].inout_ep_config.in_state = &drivers.array[i].in_ep_state; | ||
| 624 | drivers.array[i].inout_ep_config.out_state = &drivers.array[i].out_ep_state; | ||
| 625 | drivers.array[i].int_ep_config.in_state = &drivers.array[i].int_ep_state; | ||
| 626 | qmkusbObjectInit(driver, &drivers.array[i].config); | ||
| 627 | qmkusbStart(driver, &drivers.array[i].config); | ||
| 628 | #else | ||
| 556 | QMKUSBDriver *driver = &drivers.array[i].driver; | 629 | QMKUSBDriver *driver = &drivers.array[i].driver; |
| 557 | drivers.array[i].in_ep_config.in_state = &drivers.array[i].in_ep_state; | 630 | drivers.array[i].in_ep_config.in_state = &drivers.array[i].in_ep_state; |
| 558 | drivers.array[i].out_ep_config.out_state = &drivers.array[i].out_ep_state; | 631 | drivers.array[i].out_ep_config.out_state = &drivers.array[i].out_ep_state; |
| 559 | drivers.array[i].int_ep_config.in_state = &drivers.array[i].int_ep_state; | 632 | drivers.array[i].int_ep_config.in_state = &drivers.array[i].int_ep_state; |
| 560 | qmkusbObjectInit(driver, &drivers.array[i].config); | 633 | qmkusbObjectInit(driver, &drivers.array[i].config); |
| 561 | qmkusbStart(driver, &drivers.array[i].config); | 634 | qmkusbStart(driver, &drivers.array[i].config); |
| 635 | #endif | ||
| 562 | } | 636 | } |
| 563 | 637 | ||
| 564 | /* | 638 | /* |
| @@ -574,6 +648,13 @@ void init_usb_driver(USBDriver *usbp) { | |||
| 574 | chVTObjectInit(&keyboard_idle_timer); | 648 | chVTObjectInit(&keyboard_idle_timer); |
| 575 | } | 649 | } |
| 576 | 650 | ||
| 651 | void restart_usb_driver(USBDriver *usbp) { | ||
| 652 | usbStop(usbp); | ||
| 653 | usbDisconnectBus(usbp); | ||
| 654 | usbStart(usbp, &usbcfg); | ||
| 655 | usbConnectBus(usbp); | ||
| 656 | } | ||
| 657 | |||
| 577 | /* --------------------------------------------------------- | 658 | /* --------------------------------------------------------- |
| 578 | * Keyboard functions | 659 | * Keyboard functions |
| 579 | * --------------------------------------------------------- | 660 | * --------------------------------------------------------- |
diff --git a/tmk_core/protocol/chibios/usb_main.h b/tmk_core/protocol/chibios/usb_main.h index 94baf9b35..d8813f480 100644 --- a/tmk_core/protocol/chibios/usb_main.h +++ b/tmk_core/protocol/chibios/usb_main.h | |||
| @@ -35,6 +35,9 @@ | |||
| 35 | /* Initialize the USB driver and bus */ | 35 | /* Initialize the USB driver and bus */ |
| 36 | void init_usb_driver(USBDriver *usbp); | 36 | void init_usb_driver(USBDriver *usbp); |
| 37 | 37 | ||
| 38 | /* Restart the USB driver and bus */ | ||
| 39 | void restart_usb_driver(USBDriver *usbp); | ||
| 40 | |||
| 38 | /* --------------- | 41 | /* --------------- |
| 39 | * Keyboard header | 42 | * Keyboard header |
| 40 | * --------------- | 43 | * --------------- |
diff --git a/tmk_core/protocol/lufa/lufa.c b/tmk_core/protocol/lufa/lufa.c index cec004402..878be7d34 100644 --- a/tmk_core/protocol/lufa/lufa.c +++ b/tmk_core/protocol/lufa/lufa.c | |||
| @@ -1104,6 +1104,10 @@ int main(void) { | |||
| 1104 | #if !defined(INTERRUPT_CONTROL_ENDPOINT) | 1104 | #if !defined(INTERRUPT_CONTROL_ENDPOINT) |
| 1105 | USB_USBTask(); | 1105 | USB_USBTask(); |
| 1106 | #endif | 1106 | #endif |
| 1107 | |||
| 1108 | // Run housekeeping | ||
| 1109 | housekeeping_task_kb(); | ||
| 1110 | housekeeping_task_user(); | ||
| 1107 | } | 1111 | } |
| 1108 | } | 1112 | } |
| 1109 | 1113 | ||
diff --git a/tmk_core/protocol/usb_descriptor.c b/tmk_core/protocol/usb_descriptor.c index f5d32445d..a0c0d4cdc 100644 --- a/tmk_core/protocol/usb_descriptor.c +++ b/tmk_core/protocol/usb_descriptor.c | |||
| @@ -41,6 +41,10 @@ | |||
| 41 | #include "usb_descriptor.h" | 41 | #include "usb_descriptor.h" |
| 42 | #include "usb_descriptor_common.h" | 42 | #include "usb_descriptor_common.h" |
| 43 | 43 | ||
| 44 | #ifdef JOYSTICK_ENABLE | ||
| 45 | # include "joystick.h" | ||
| 46 | #endif | ||
| 47 | |||
| 44 | // clang-format off | 48 | // clang-format off |
| 45 | 49 | ||
| 46 | /* | 50 | /* |
| @@ -308,10 +312,17 @@ const USB_Descriptor_HIDReport_Datatype_t PROGMEM JoystickReport[] = { | |||
| 308 | HID_RI_USAGE(8, 0x35), // Rz | 312 | HID_RI_USAGE(8, 0x35), // Rz |
| 309 | # endif | 313 | # endif |
| 310 | # if JOYSTICK_AXES_COUNT >= 1 | 314 | # if JOYSTICK_AXES_COUNT >= 1 |
| 311 | HID_RI_LOGICAL_MINIMUM(8, -127), | 315 | # if JOYSTICK_AXES_RESOLUTION == 8 |
| 312 | HID_RI_LOGICAL_MAXIMUM(8, 127), | 316 | HID_RI_LOGICAL_MINIMUM(8, -JOYSTICK_RESOLUTION), |
| 317 | HID_RI_LOGICAL_MAXIMUM(8, JOYSTICK_RESOLUTION), | ||
| 313 | HID_RI_REPORT_COUNT(8, JOYSTICK_AXES_COUNT), | 318 | HID_RI_REPORT_COUNT(8, JOYSTICK_AXES_COUNT), |
| 314 | HID_RI_REPORT_SIZE(8, 0x08), | 319 | HID_RI_REPORT_SIZE(8, 0x08), |
| 320 | # else | ||
| 321 | HID_RI_LOGICAL_MINIMUM(16, -JOYSTICK_RESOLUTION), | ||
| 322 | HID_RI_LOGICAL_MAXIMUM(16, JOYSTICK_RESOLUTION), | ||
| 323 | HID_RI_REPORT_COUNT(8, JOYSTICK_AXES_COUNT), | ||
| 324 | HID_RI_REPORT_SIZE(8, 0x10), | ||
| 325 | # endif | ||
| 315 | HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), | 326 | HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), |
| 316 | # endif | 327 | # endif |
| 317 | 328 | ||
diff --git a/tmk_core/protocol/usb_descriptor.h b/tmk_core/protocol/usb_descriptor.h index 02a4b1ce5..aa8863f43 100644 --- a/tmk_core/protocol/usb_descriptor.h +++ b/tmk_core/protocol/usb_descriptor.h | |||
| @@ -205,7 +205,11 @@ enum usb_endpoints { | |||
| 205 | 205 | ||
| 206 | #ifdef RAW_ENABLE | 206 | #ifdef RAW_ENABLE |
| 207 | RAW_IN_EPNUM = NEXT_EPNUM, | 207 | RAW_IN_EPNUM = NEXT_EPNUM, |
| 208 | #if STM32_USB_USE_OTG1 | ||
| 209 | #define RAW_OUT_EPNUM RAW_IN_EPNUM | ||
| 210 | #else | ||
| 208 | RAW_OUT_EPNUM = NEXT_EPNUM, | 211 | RAW_OUT_EPNUM = NEXT_EPNUM, |
| 212 | #endif | ||
| 209 | #endif | 213 | #endif |
| 210 | 214 | ||
| 211 | #ifdef SHARED_EP_ENABLE | 215 | #ifdef SHARED_EP_ENABLE |
| @@ -219,7 +223,11 @@ enum usb_endpoints { | |||
| 219 | // ChibiOS has enough memory and descriptor to actually enable the endpoint | 223 | // ChibiOS has enough memory and descriptor to actually enable the endpoint |
| 220 | // It could use the same endpoint numbers, as that's supported by ChibiOS | 224 | // It could use the same endpoint numbers, as that's supported by ChibiOS |
| 221 | // But the QMK code currently assumes that the endpoint numbers are different | 225 | // But the QMK code currently assumes that the endpoint numbers are different |
| 226 | #if STM32_USB_USE_OTG1 | ||
| 227 | #define CONSOLE_OUT_EPNUM CONSOLE_IN_EPNUM | ||
| 228 | #else | ||
| 222 | CONSOLE_OUT_EPNUM = NEXT_EPNUM, | 229 | CONSOLE_OUT_EPNUM = NEXT_EPNUM, |
| 230 | #endif | ||
| 223 | # else | 231 | # else |
| 224 | # define CONSOLE_OUT_EPNUM CONSOLE_IN_EPNUM | 232 | # define CONSOLE_OUT_EPNUM CONSOLE_IN_EPNUM |
| 225 | # endif | 233 | # endif |
| @@ -227,17 +235,29 @@ enum usb_endpoints { | |||
| 227 | 235 | ||
| 228 | #ifdef MIDI_ENABLE | 236 | #ifdef MIDI_ENABLE |
| 229 | MIDI_STREAM_IN_EPNUM = NEXT_EPNUM, | 237 | MIDI_STREAM_IN_EPNUM = NEXT_EPNUM, |
| 238 | #if STM32_USB_USE_OTG1 | ||
| 239 | #define MIDI_STREAM_OUT_EPNUM MIDI_STREAM_IN_EPNUM | ||
| 240 | #else | ||
| 230 | MIDI_STREAM_OUT_EPNUM = NEXT_EPNUM, | 241 | MIDI_STREAM_OUT_EPNUM = NEXT_EPNUM, |
| 242 | #endif | ||
| 231 | #endif | 243 | #endif |
| 232 | 244 | ||
| 233 | #ifdef VIRTSER_ENABLE | 245 | #ifdef VIRTSER_ENABLE |
| 234 | CDC_NOTIFICATION_EPNUM = NEXT_EPNUM, | 246 | CDC_NOTIFICATION_EPNUM = NEXT_EPNUM, |
| 235 | CDC_IN_EPNUM = NEXT_EPNUM, | 247 | CDC_IN_EPNUM = NEXT_EPNUM, |
| 248 | #if STM32_USB_USE_OTG1 | ||
| 249 | #define CDC_OUT_EPNUM CDC_IN_EPNUM | ||
| 250 | #else | ||
| 236 | CDC_OUT_EPNUM = NEXT_EPNUM, | 251 | CDC_OUT_EPNUM = NEXT_EPNUM, |
| 252 | #endif | ||
| 237 | #endif | 253 | #endif |
| 238 | #ifdef JOYSTICK_ENABLE | 254 | #ifdef JOYSTICK_ENABLE |
| 239 | JOYSTICK_IN_EPNUM = NEXT_EPNUM, | 255 | JOYSTICK_IN_EPNUM = NEXT_EPNUM, |
| 256 | #if STM32_USB_USE_OTG1 | ||
| 257 | JOYSTICK_OUT_EPNUM = JOYSTICK_IN_EPNUM, | ||
| 258 | #else | ||
| 240 | JOYSTICK_OUT_EPNUM = NEXT_EPNUM, | 259 | JOYSTICK_OUT_EPNUM = NEXT_EPNUM, |
| 260 | #endif | ||
| 241 | #endif | 261 | #endif |
| 242 | }; | 262 | }; |
| 243 | 263 | ||
diff --git a/tmk_core/protocol/vusb/main.c b/tmk_core/protocol/vusb/main.c index a57df5ce0..0e3447d92 100644 --- a/tmk_core/protocol/vusb/main.c +++ b/tmk_core/protocol/vusb/main.c | |||
| @@ -153,6 +153,10 @@ int main(void) { | |||
| 153 | console_task(); | 153 | console_task(); |
| 154 | } | 154 | } |
| 155 | #endif | 155 | #endif |
| 156 | |||
| 157 | // Run housekeeping | ||
| 158 | housekeeping_task_kb(); | ||
| 159 | housekeeping_task_user(); | ||
| 156 | } else if (suspend_wakeup_condition()) { | 160 | } else if (suspend_wakeup_condition()) { |
| 157 | usb_remote_wakeup(); | 161 | usb_remote_wakeup(); |
| 158 | } | 162 | } |
