suspend.c 1.9 KB

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