aboutsummaryrefslogtreecommitdiff
path: root/platforms/chibios/suspend.c
diff options
context:
space:
mode:
Diffstat (limited to 'platforms/chibios/suspend.c')
-rw-r--r--platforms/chibios/suspend.c92
1 files changed, 92 insertions, 0 deletions
diff --git a/platforms/chibios/suspend.c b/platforms/chibios/suspend.c
new file mode 100644
index 000000000..9310a9992
--- /dev/null
+++ b/platforms/chibios/suspend.c
@@ -0,0 +1,92 @@
1/* TODO */
2
3#include <ch.h>
4#include <hal.h>
5
6#include "matrix.h"
7#include "action.h"
8#include "action_util.h"
9#include "mousekey.h"
10#include "programmable_button.h"
11#include "host.h"
12#include "suspend.h"
13#include "led.h"
14#include "wait.h"
15
16/** \brief suspend idle
17 *
18 * FIXME: needs doc
19 */
20void suspend_idle(uint8_t time) {
21 // TODO: this is not used anywhere - what units is 'time' in?
22 wait_ms(time);
23}
24
25/** \brief suspend power down
26 *
27 * FIXME: needs doc
28 */
29void suspend_power_down(void) {
30 suspend_power_down_quantum();
31 // on AVR, this enables the watchdog for 15ms (max), and goes to
32 // SLEEP_MODE_PWR_DOWN
33
34 wait_ms(17);
35}
36
37/** \brief suspend wakeup condition
38 *
39 * FIXME: needs doc
40 */
41__attribute__((weak)) void matrix_power_up(void) {}
42__attribute__((weak)) void matrix_power_down(void) {}
43bool suspend_wakeup_condition(void) {
44 matrix_power_up();
45 matrix_scan();
46 matrix_power_down();
47 for (uint8_t r = 0; r < MATRIX_ROWS; r++) {
48 if (matrix_get_row(r)) return true;
49 }
50 return false;
51}
52
53/** \brief run user level code immediately after wakeup
54 *
55 * FIXME: needs doc
56 */
57__attribute__((weak)) void suspend_wakeup_init_user(void) {}
58
59/** \brief run keyboard level code immediately after wakeup
60 *
61 * FIXME: needs doc
62 */
63__attribute__((weak)) void suspend_wakeup_init_kb(void) { suspend_wakeup_init_user(); }
64
65/** \brief suspend wakeup condition
66 *
67 * run immediately after wakeup
68 * FIXME: needs doc
69 */
70void suspend_wakeup_init(void) {
71 // clear keyboard state
72 // need to do it manually, because we're running from ISR
73 // and clear_keyboard() calls print
74 // so only clear the variables in memory
75 // the reports will be sent from main.c afterwards
76 // or if the PC asks for GET_REPORT
77 clear_mods();
78 clear_weak_mods();
79 clear_keys();
80#ifdef MOUSEKEY_ENABLE
81 mousekey_clear();
82#endif /* MOUSEKEY_ENABLE */
83#ifdef PROGRAMMABLE_BUTTON_ENABLE
84 programmable_button_clear();
85#endif /* PROGRAMMABLE_BUTTON_ENABLE */
86#ifdef EXTRAKEY_ENABLE
87 host_system_send(0);
88 host_consumer_send(0);
89#endif /* EXTRAKEY_ENABLE */
90
91 suspend_wakeup_init_quantum();
92}