Skip to content

Commit

Permalink
Squashed 'tmk_core/' changes from ee8c5ba..d5c5ac6
Browse files Browse the repository at this point in the history
d5c5ac6 Merge branch 'develop'
5957682 Merge branch 'hotfix-mediakey'
a478c62 Merge branch 'hotfix-vusb'
cccebfe Merge branch 'njbair-docfix'
0aaab57 Clean up wording in keymap example
dc8bbc3 Clarify layer precedence
9e0b4c1 clarify layer documentation
915eb48 core: Fix media/consumer keys
88f90f3 Fix for VUSB configuration
3e290cd Fix including board.mk in chibios.mk
32c69e0 Merge branch 'newapi' into develop
c9a56f9 Merge remote-tracking branch 'flabbergast/chibios' into develop
01e33ea Fix chibios and mbed common.mk for hook.c
bea79d9 hook: Change func name of usb events
3e97536 hook: Change file and func names(*_hook -> hook_*)
c286d8c Merge pull request #10 from fredizzimo/chibios-contrib2
062d74e Update ChibiOS instructions
d47150f Add support for new version of ChibiOS and Contrib
62b5401 Chibios: disable LTO (link-time optimisation).
c64e9aa hooks: Fix for LUFA
54e68b0 hooks: Remove led_restore_hook
325c09d Chibios: make the default bootloader_jump redefinable (weak).
078c722 Chibios: fix STM32_BOOTLOADER_ADDRESS name.
e73cfe5 hooks: Fix for keyboard LED update
e6120c5 Implement basic hooks.
7c370e9 Chibios: Update the main chibios README.
7f0198d Chibios: implement sleep LED for STM32.
afef9b4 Fix hard-coded path of CHIBIOS
95c5b19 Merge pull request #7 from fredizzimo/sysvsize
27128a8 Sysv format for ChibiOS arm-none-eabi-size
d4b8e68 core: Fix chibios user compile options
b85d462 Merge branch 'chibios' of https://github.com/flabbergast/tmk_keyboard into flabbergast_chibios
de41aa1 core: Fix ps2_mouse.c debug print
d79d925 Removed duplicate debug message code and surrounded it with IFDEF as needed
8f28589 Chibios: Revert common.mk change (fix AVR linking problem).
ec9eff2 Chibios: cleanup usb_main code.
28c4665 Chibios: Fix a HardFault bug (wait after start).

git-subtree-dir: tmk_core
git-subtree-split: d5c5ac63e60dfc6da6661a21bd968b4d577a27d5
  • Loading branch information
tmk committed Apr 21, 2016
1 parent 657d9f2 commit 7138145
Show file tree
Hide file tree
Showing 22 changed files with 446 additions and 119 deletions.
1 change: 1 addition & 0 deletions common.mk
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ SRC += $(COMMON_DIR)/host.c \
$(COMMON_DIR)/print.c \
$(COMMON_DIR)/debug.c \
$(COMMON_DIR)/util.c \
$(COMMON_DIR)/hook.c \
$(COMMON_DIR)/avr/suspend.c \
$(COMMON_DIR)/avr/xprintf.S \
$(COMMON_DIR)/avr/timer.c \
Expand Down
2 changes: 2 additions & 0 deletions common/action.c
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "action_macro.h"
#include "action_util.h"
#include "action.h"
#include "hook.h"

#ifdef DEBUG_ACTION
#include "debug.h"
Expand All @@ -39,6 +40,7 @@ void action_exec(keyevent_t event)
if (!IS_NOEVENT(event)) {
dprint("\n---- action_exec: start -----\n");
dprint("EVENT: "); debug_event(event); dprintln();
hook_matrix_change(event);
}

keyrecord_t record = { .event = event };
Expand Down
2 changes: 2 additions & 0 deletions common/action_layer.c
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
#include "action.h"
#include "util.h"
#include "action_layer.h"
#include "hook.h"

#ifdef DEBUG_ACTION
#include "debug.h"
Expand Down Expand Up @@ -62,6 +63,7 @@ static void layer_state_set(uint32_t state)
dprint("layer_state: ");
layer_debug(); dprint(" to ");
layer_state = state;
hook_layer_change(layer_state);
layer_debug(); dprintln();
clear_keyboard_but_mods(); // To avoid stuck keys
}
Expand Down
4 changes: 4 additions & 0 deletions common/bootmagic.c
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
#include "action_layer.h"
#include "eeconfig.h"
#include "bootmagic.h"
#include "hook.h"

keymap_config_t keymap_config;

Expand Down Expand Up @@ -40,6 +41,9 @@ void bootmagic(void)
bootloader_jump();
}

/* user-defined checks */
hook_bootmagic();

/* debug enable */
debug_config.raw = eeconfig_read_debug();
if (bootmagic_scan_keycode(BOOTMAGIC_KEY_DEBUG_ENABLE)) {
Expand Down
1 change: 1 addition & 0 deletions common/chibios/bootloader.c
Original file line number Diff line number Diff line change
Expand Up @@ -42,5 +42,6 @@ void bootloader_jump(void) {
#endif /* defined(KIIBOHD_BOOTLOADER) */

#else /* neither STM32 nor KINETIS */
__attribute__((weak))
void bootloader_jump(void) {}
#endif
74 changes: 68 additions & 6 deletions common/chibios/sleep_led.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,27 @@
#include "led.h"
#include "sleep_led.h"

#if defined(KL2x) || defined(K20x) /* platform selection: familiar Kinetis chips */
/* All right, we go the "software" way: LP timer, toggle LED in interrupt.
/* All right, we go the "software" way: timer, toggle LED in interrupt.
* Based on hasu's code for AVRs.
* Use LP timer on Kinetises, TIM14 on STM32F0.
*/

#if defined(KL2x) || defined(K20x)

/* Use Low Power Timer (LPTMR) */
#define TIMER_INTERRUPT_VECTOR KINETIS_LPTMR0_IRQ_VECTOR
#define RESET_COUNTER LPTMR0->CSR |= LPTMRx_CSR_TCF

#elif defined(STM32F0XX)

/* Use TIM14 manually */
#define TIMER_INTERRUPT_VECTOR STM32_TIM14_HANDLER
#define RESET_COUNTER STM32_TIM14->SR &= ~STM32_TIM_SR_UIF

#endif

#if defined(KL2x) || defined(K20x) || defined(STM32F0XX) /* common parts for timers/interrupts */

/* Breathing Sleep LED brighness(PWM On period) table
* (64[steps] * 4[duration]) / 64[PWM periods/s] = 4 second breath cycle
*
Expand All @@ -22,8 +38,8 @@ static const uint8_t breathing_table[64] = {
15, 10, 6, 4, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};

/* Low Power Timer interrupt handler */
OSAL_IRQ_HANDLER(KINETIS_LPTMR0_IRQ_VECTOR) {
/* interrupt handler */
OSAL_IRQ_HANDLER(TIMER_INTERRUPT_VECTOR) {
OSAL_IRQ_PROLOGUE();

/* Software PWM
Expand Down Expand Up @@ -55,11 +71,16 @@ OSAL_IRQ_HANDLER(KINETIS_LPTMR0_IRQ_VECTOR) {
}

/* Reset the counter */
LPTMR0->CSR |= LPTMRx_CSR_TCF;
RESET_COUNTER;

OSAL_IRQ_EPILOGUE();
}

#endif /* common parts for known platforms */


#if defined(KL2x) || defined(K20x) /* platform selection: familiar Kinetis chips */

/* LPTMR clock options */
#define LPTMR_CLOCK_MCGIRCLK 0 /* 4MHz clock */
#define LPTMR_CLOCK_LPO 1 /* 1kHz clock */
Expand Down Expand Up @@ -144,7 +165,48 @@ void sleep_led_toggle(void) {
LPTMR0->CSR ^= LPTMRx_CSR_TEN;
}

#else /* platform selection: not on familiar Kinetis chips */
#elif defined(STM32F0XX) /* platform selection: STM32F0XX */

/* Initialise the timer */
void sleep_led_init(void) {
/* enable clock */
rccEnableTIM14(FALSE); /* low power enable = FALSE */
rccResetTIM14();

/* prescale */
/* Assuming 48MHz internal clock */
/* getting cca 65484 irqs/sec */
STM32_TIM14->PSC = 733;

/* auto-reload */
/* 0 => interrupt every time */
STM32_TIM14->ARR = 3;

/* enable counter update event interrupt */
STM32_TIM14->DIER |= STM32_TIM_DIER_UIE;

/* register interrupt vector */
nvicEnableVector(STM32_TIM14_NUMBER, 2); /* vector, priority */
}

void sleep_led_enable(void) {
/* Enable the timer */
STM32_TIM14->CR1 = STM32_TIM_CR1_CEN | STM32_TIM_CR1_URS;
/* URS => update event only on overflow; setting UG bit disabled */
}

void sleep_led_disable(void) {
/* Disable the timer */
STM32_TIM14->CR1 = 0;
}

void sleep_led_toggle(void) {
/* Toggle the timer */
STM32_TIM14->CR1 ^= STM32_TIM_CR1_CEN;
}


#else /* platform selection: not on familiar chips */

void sleep_led_init(void) {
}
Expand Down
61 changes: 61 additions & 0 deletions common/hook.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
/*
Copyright 2016 Jun Wako <wakojun@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/

#include "keyboard.h"
#include "hook.h"

/* -------------------------------------------------
* Definitions of hardware-independent default hooks
* ------------------------------------------------- */

/* Called on layer state change event. */
/* Default behaviour: do nothing. */
__attribute__((weak))
void hook_layer_change(uint8_t layer_state) {
(void)layer_state;
}

/* Called periodically from the matrix scan loop (very often!) */
/* Default behaviour: do nothing. */
__attribute__((weak))
void hook_keyboard_loop(void) {}

/* Called on matrix state change event (every keypress => often!) */
/* Default behaviour: do nothing. */
__attribute__((weak))
void hook_matrix_change(keyevent_t event) {
(void)event;
}

/* Called on indicator LED update event (when reported from host). */
/* Default behaviour: calls led_set (for compatibility). */
__attribute__((weak))
void hook_keyboard_leds_change(uint8_t led_status) {
keyboard_set_leds(led_status);
}

/* Called once, on checking the bootmagic combos. */
/* Default behaviour: do nothing. */
__attribute__((weak))
void hook_bootmagic(void) {
/* An example: */
// #include "bootmagic.h"
// #include "keymap.h"
// if(bootmagic_scan_keycode(KC_W)) {
// // do something
// }
}
74 changes: 74 additions & 0 deletions common/hook.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
/*
Copyright 2016 Jun Wako <wakojun@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/

#ifndef _HOOKS_H_
#define _HOOKS_H_

#include "keyboard.h"
#include "led.h"

/* -------------------------------------
* Hardware / one-off hooks
* ------------------------------------- */

/* Called once, before initialising USB. */
/* Default behaviour: do nothing. */
void hook_early_init(void);

/* Called once, after USB is connected and keyboard initialised. */
/* Default behaviour: do nothing. */
void hook_late_init(void);

/* Called once, on getting SUSPEND event from USB. */
/* Default behaviour: do nothing. */
void hook_usb_suspend_entry(void);

/* Called repeatedly during the SUSPENDed state. */
/* Default behaviour: power down and periodically check
* the matrix, cause wakeup if needed. */
void hook_usb_suspend_loop(void);

/* Called once, on getting WAKE event from USB. */
/* Default behaviour: disables sleep LED breathing and restores
* the "normal" indicator LED status by default. */
void hook_usb_wakeup(void);

/* Called once, on checking the bootmagic combos. */
/* Default behaviour: do nothing. */
void hook_bootmagic(void);

/* -------------------------------------
* Keyboard / periodic hooks
* ------------------------------------- */

/* Called periodically from the keyboard loop (very often!) */
/* Default behaviour: do nothing. */
void hook_keyboard_loop(void);

/* Called on matrix state change event (every keypress => often!) */
/* Default behaviour: do nothing. */
void hook_matrix_change(keyevent_t event);

/* Called on layer state change event. */
/* Default behaviour: do nothing. */
void hook_layer_change(uint8_t layer_state);

/* Called on indicator LED update event (when reported from host). */
/* Default behaviour: calls keyboard_set_leds (for compatibility). */
void hook_keyboard_leds_change(uint8_t led_status);

#endif /* _HOOKS_H_ */
13 changes: 9 additions & 4 deletions common/keyboard.c
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "bootmagic.h"
#include "eeconfig.h"
#include "backlight.h"
#include "hook.h"
#ifdef MOUSEKEY_ENABLE
# include "mousekey.h"
#endif
Expand Down Expand Up @@ -128,11 +129,13 @@ void keyboard_task(void)
if (debug_matrix) matrix_print();
for (uint8_t c = 0; c < MATRIX_COLS; c++) {
if (matrix_change & ((matrix_row_t)1<<c)) {
action_exec((keyevent_t){
keyevent_t e = (keyevent_t){
.key = (keypos_t){ .row = r, .col = c },
.pressed = (matrix_row & ((matrix_row_t)1<<c)),
.time = (timer_read() | 1) /* time should not be 0 */
});
};
action_exec(e);
hook_matrix_change(e);
// record a processed key
matrix_prev[r] ^= ((matrix_row_t)1<<c);
// process a key per task call
Expand All @@ -146,6 +149,8 @@ void keyboard_task(void)

MATRIX_LOOP_END:

hook_keyboard_loop();

#ifdef MOUSEKEY_ENABLE
// mousekey repeat & acceleration
mousekey_task();
Expand All @@ -166,12 +171,12 @@ void keyboard_task(void)
// update LED
if (led_status != host_keyboard_leds()) {
led_status = host_keyboard_leds();
keyboard_set_leds(led_status);
if (debug_keyboard) dprintf("LED: %02X\n", led_status);
hook_keyboard_leds_change(led_status);
}
}

void keyboard_set_leds(uint8_t leds)
{
if (debug_keyboard) { debug("keyboard_set_led: "); debug_hex8(leds); debug("\n"); }
led_set(leds);
}
2 changes: 1 addition & 1 deletion common/keymap.c
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@ static action_t keycode_to_action(uint8_t keycode)
case KC_SYSTEM_POWER ... KC_SYSTEM_WAKE:
action.code = ACTION_USAGE_SYSTEM(KEYCODE2SYSTEM(keycode));
break;
case KC_AUDIO_MUTE ... KC_MEDIA_REWIND:
case KC_AUDIO_MUTE ... KC_WWW_FAVORITES:
action.code = ACTION_USAGE_CONSUMER(KEYCODE2CONSUMER(keycode));
break;
case KC_MS_UP ... KC_MS_ACCEL2:
Expand Down

0 comments on commit 7138145

Please sign in to comment.