diff options
Diffstat (limited to 'common/keyboard_scan.c')
-rw-r--r-- | common/keyboard_scan.c | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/common/keyboard_scan.c b/common/keyboard_scan.c index 8214d7c415..9641ff6ca9 100644 --- a/common/keyboard_scan.c +++ b/common/keyboard_scan.c @@ -6,6 +6,7 @@ /* Keyboard scanner module for Chrome EC */ #include "chipset.h" +#include "clock.h" #include "common.h" #include "console.h" #include "hooks.h" @@ -27,6 +28,15 @@ #define SCAN_TIME_COUNT 32 /* Number of last scan times to track */ +#ifndef CONFIG_KEYBOARD_POST_SCAN_CLOCKS +/* + * Default delay in clocks; this was experimentally determined to be long + * enough to avoid watchdog warnings or I2C errors on a typical notebook + * config on STM32. + */ +#define CONFIG_KEYBOARD_POST_SCAN_CLOCKS 16000 +#endif + #ifndef CONFIG_KEYBOARD_BOARD_CONFIG /* Use default keyboard scan config, because board didn't supply one */ struct keyboard_scan_config keyscan_config = { @@ -62,9 +72,13 @@ static uint8_t simulated_key[KEYBOARD_COLS]; /* Keys simulated-pressed */ static uint32_t scan_time[SCAN_TIME_COUNT]; /* Times of last scans */ static int scan_time_index; /* Current scan_time[] index */ + /* Index into scan_time[] when each key started debouncing */ static uint8_t scan_edge_index[KEYBOARD_COLS][KEYBOARD_ROWS]; +/* Minimum delay between keyboard scans based on current clock frequency */ +static uint32_t post_scan_clock_us; + /* * Print all keyboard scan state changes? Off by default because it generates * a lot of debug output, which makes the saved EC console data less useful. @@ -443,6 +457,13 @@ static enum boot_key check_boot_key(const uint8_t *state) return BOOT_KEY_OTHER; } +static void keyboard_freq_change(void) +{ + post_scan_clock_us = (CONFIG_KEYBOARD_POST_SCAN_CLOCKS * 1000) / + (clock_get_freq() / 1000); +} +DECLARE_HOOK(HOOK_FREQ_CHANGE, keyboard_freq_change, HOOK_PRIO_DEFAULT); + /*****************************************************************************/ /* Interface */ @@ -490,6 +511,9 @@ void keyboard_scan_task(void) keyboard_raw_task_start(); + /* Set initial clock frequency-based minimum delay between scans */ + keyboard_freq_change(); + while (1) { /* Enable all outputs */ CPRINTF("[%T KB wait]\n"); @@ -534,6 +558,9 @@ void keyboard_scan_task(void) wait_time = keyscan_config.min_post_scan_delay_us; + if (wait_time < post_scan_clock_us) + wait_time = post_scan_clock_us; + usleep(wait_time); } } |