suspend.c (1967B)
1 // Copyright 2022 QMK 2 // SPDX-License-Identifier: GPL-2.0-or-later 3 4 #include "suspend.h" 5 #include "matrix.h" 6 7 extern matrix_row_t matrix_previous[MATRIX_ROWS]; 8 static matrix_row_t wakeup_matrix[MATRIX_ROWS]; 9 10 // TODO: Move to more correct location 11 __attribute__((weak)) void matrix_power_up(void) {} 12 __attribute__((weak)) void matrix_power_down(void) {} 13 14 /** \brief Run user level Power down 15 * 16 * FIXME: needs doc 17 */ 18 __attribute__((weak)) void suspend_power_down_user(void) {} 19 20 /** \brief Run keyboard level Power down 21 * 22 * FIXME: needs doc 23 */ 24 __attribute__((weak)) void suspend_power_down_kb(void) { 25 suspend_power_down_user(); 26 } 27 28 /** \brief run user level code immediately after wakeup 29 * 30 * FIXME: needs doc 31 */ 32 __attribute__((weak)) void suspend_wakeup_init_user(void) {} 33 34 /** \brief run keyboard level code immediately after wakeup 35 * 36 * FIXME: needs doc 37 */ 38 __attribute__((weak)) void suspend_wakeup_init_kb(void) { 39 suspend_wakeup_init_user(); 40 } 41 42 /** \brief suspend wakeup condition 43 * 44 * FIXME: needs doc 45 */ 46 bool suspend_wakeup_condition(void) { 47 matrix_power_up(); 48 matrix_scan(); 49 matrix_power_down(); 50 51 bool wakeup = false; 52 for (uint8_t row = 0; row < MATRIX_ROWS; row++) { 53 wakeup_matrix[row] = matrix_get_row(row); 54 wakeup |= wakeup_matrix[row] != 0; 55 } 56 57 return wakeup; 58 } 59 60 void update_matrix_state_after_wakeup(void) { 61 matrix_power_up(); 62 matrix_scan(); 63 matrix_power_down(); 64 65 for (uint8_t row = 0; row < MATRIX_ROWS; row++) { 66 const matrix_row_t current_row = matrix_get_row(row); 67 wakeup_matrix[row] |= current_row & ~matrix_previous[row]; 68 matrix_previous[row] |= current_row; 69 } 70 } 71 72 bool keypress_is_wakeup_key(uint8_t row, uint8_t col) { 73 return (wakeup_matrix[row] & ((matrix_row_t)1 << col)); 74 } 75 76 void wakeup_matrix_handle_key_event(uint8_t row, uint8_t col, bool pressed) { 77 if (!pressed) { 78 wakeup_matrix[row] &= ~((matrix_row_t)1 << col); 79 } 80 }