diff --git a/src/board/system76/common/config.c b/src/board/system76/common/config.c index f4781a5..dc20c53 100644 --- a/src/board/system76/common/config.c +++ b/src/board/system76/common/config.c @@ -3,8 +3,16 @@ #include #include +#include #include +/** + * Test if the EC should reset its configuration. + */ +bool config_should_reset(void) { + return kbscan_fn_held && kbscan_esc_held; +} + /** * Reset the EC configuration data. */ diff --git a/src/board/system76/common/include/board/config.h b/src/board/system76/common/include/board/config.h index c31dae8..fa97cc9 100644 --- a/src/board/system76/common/include/board/config.h +++ b/src/board/system76/common/include/board/config.h @@ -3,6 +3,9 @@ #ifndef _BOARD_CONFIG_H #define _BOARD_CONFIG_H +#include + +bool config_should_reset(void); void config_reset(void); #endif // _BOARD_CONFIG_H diff --git a/src/board/system76/common/include/board/kbscan.h b/src/board/system76/common/include/board/kbscan.h index 2c02769..f24d806 100644 --- a/src/board/system76/common/include/board/kbscan.h +++ b/src/board/system76/common/include/board/kbscan.h @@ -7,6 +7,10 @@ #include +// EC config reset key combo: Fn+Esc +extern bool kbscan_fn_held; +extern bool kbscan_esc_held; + extern bool kbscan_enabled; // ms between repeating key diff --git a/src/board/system76/common/kbscan.c b/src/board/system76/common/kbscan.c index 4bf8ff4..1bb81bd 100644 --- a/src/board/system76/common/kbscan.c +++ b/src/board/system76/common/kbscan.c @@ -18,6 +18,9 @@ #define KM_NKEY 0 #endif // KM_NKEY +bool kbscan_fn_held = false; +bool kbscan_esc_held = false; + bool kbscan_enabled = false; uint16_t kbscan_repeat_period = 91; uint16_t kbscan_repeat_delay = 500; @@ -182,12 +185,16 @@ bool kbscan_press(uint16_t key, bool pressed, uint8_t * layer) { case (KT_NORMAL): if (kbscan_enabled) { kbc_scancode(&KBC, key, pressed); + if ((key & 0xFF) == K_ESC) + kbscan_esc_held = pressed; } break; case (KT_FN): if (layer != NULL) { if (pressed) *layer = 1; else *layer = 0; + + kbscan_fn_held = pressed; } else { // In the case no layer can be set, reset bit return false; diff --git a/src/board/system76/common/power.c b/src/board/system76/common/power.c index 7a455c7..d113b27 100644 --- a/src/board/system76/common/power.c +++ b/src/board/system76/common/power.c @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include @@ -405,6 +406,8 @@ void power_event(void) { // Enable S5 power if necessary, before sending PWR_BTN update_power_state(); if (power_state == POWER_STATE_DS5) { + if (config_should_reset()) + config_reset(); power_on_s5(); } }