Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Suspend functions #3112

Merged
merged 11 commits into from
Jun 3, 2018
35 changes: 33 additions & 2 deletions docs/custom_quantum_functions.md
Original file line number Diff line number Diff line change
Expand Up @@ -135,9 +135,11 @@ void led_set_user(uint8_t usb_led) {
* Keyboard/Revision: `void led_set_kb(uint8_t usb_led)`
* Keymap: `void led_set_user(uint8_t usb_led)`


# Matrix Initialization Code

Before a keyboard can be used the hardware must be initialized. QMK handles initialization of the keyboard matrix itself, but if you have other hardware like LED's or i²c controllers you will need to set up that hardware before it can be used.
Before a keyboard can be used the hardware must be initialized. QMK handles initialization of the keyboard matrix itself, but if you have other hardware like LED's or i²c controllers you will need to set up that hardware before it can be used.


### Example `matrix_init_user()` Implementation

Expand Down Expand Up @@ -177,9 +179,38 @@ This function gets called at every matrix scan, which is basically as often as t
You should use this function if you need custom matrix scanning code. It can also be used for custom status output (such as LED's or a display) or other functionality that you want to trigger regularly even when the user isn't typing.


# Keyboard Idling/Wake Code

If the board supports it, it can be "idled", by stopping a number of functions. A good example of this is RGB lights or backlights. This can save on power consumption, or may be better behavior for your keyboard.

This is controlled by two functions: `suspend_power_down_*` and `suspend_wakeup_init_*`, which are called when the system is board is idled and when it wakes up, respectively.


### Example suspend_power_down_user() and suspend_wakeup_init_user() Implementation

This example, at the keyboard level, sets up B1, B2, and B3 as LED pins.

```
void suspend_power_down_user(void)
{
rgb_matrix_set_suspend_state(true);
}

void suspend_wakeup_init_user(void)
{
rgb_matrix_set_suspend_state(false);
}

```

### `keyboard_init_*` Function Documentation

* Keyboard/Revision: `void suspend_power_down_kb(void)` and `void suspend_wakeup_init_user(void)`
* Keymap: `void suspend_power_down_kb(void)` and `void suspend_wakeup_init_user(void)`
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Shouldn't this mention *_user for keymap, and *_kb for Keyboard/Revision?


# Layer Change Code

Thir runs code every time that the layers get changed. This can be useful for layer indication, or custom layer handling.
This runs code every time that the layers get changed. This can be useful for layer indication, or custom layer handling.

### Example `layer_state_set_*` Implementation

Expand Down
33 changes: 33 additions & 0 deletions tmk_core/common/avr/suspend.c
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,21 @@ void suspend_idle(uint8_t time)
*/
static uint8_t wdt_timeout = 0;

/** \brief Run keyboard level Power down
*
* FIXME: needs doc
*/
__attribute__ ((weak))
void suspend_power_down_user (void) { }
/** \brief Run keyboard level Power down
*
* FIXME: needs doc
*/
__attribute__ ((weak))
void suspend_power_down_kb(void) {
suspend_power_down_user();
}

/** \brief Power down
*
* FIXME: needs doc
Expand Down Expand Up @@ -103,6 +118,8 @@ static void power_down(uint8_t wdto)
#endif
rgblight_disable_noeeprom();
#endif
suspend_power_down_kb();

// TODO: more power saving
// See PicoPower application note
// - I/O port input with pullup
Expand Down Expand Up @@ -144,6 +161,21 @@ bool suspend_wakeup_condition(void)
return false;
}

/** \brief run user level code immediately after wakeup
*
* FIXME: needs doc
*/
__attribute__ ((weak))
void suspend_wakeup_init_user(void) { }

/** \brief run keyboard level code immediately after wakeup
*
* FIXME: needs doc
*/
__attribute__ ((weak))
void suspend_wakeup_init_kb(void) {
suspend_wakeup_init_user();
}
/** \brief run immediately after wakeup
*
* FIXME: needs doc
Expand All @@ -162,6 +194,7 @@ void suspend_wakeup_init(void)
rgblight_timer_enable();
#endif
#endif
suspend_wakeup_init_kb();
}

#ifndef NO_SUSPEND_POWER_DOWN
Expand Down
33 changes: 33 additions & 0 deletions tmk_core/common/chibios/suspend.c
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,21 @@ void suspend_idle(uint8_t time) {
wait_ms(time);
}

/** \brief Run keyboard level Power down
*
* FIXME: needs doc
*/
__attribute__ ((weak))
void suspend_power_down_user (void) { }
/** \brief Run keyboard level Power down
*
* FIXME: needs doc
*/
__attribute__ ((weak))
void suspend_power_down_kb(void) {
suspend_power_down_user();
}

/** \brief suspend power down
*
* FIXME: needs doc
Expand All @@ -30,6 +45,7 @@ void suspend_power_down(void) {
// shouldn't power down TPM/FTM if we want a breathing LED
// also shouldn't power down USB

suspend_power_down_kb();
// on AVR, this enables the watchdog for 15ms (max), and goes to
// SLEEP_MODE_PWR_DOWN

Expand All @@ -53,6 +69,22 @@ bool suspend_wakeup_condition(void)
return false;
}

/** \brief run user level code immediately after wakeup
*
* FIXME: needs doc
*/
__attribute__ ((weak))
void suspend_wakeup_init_user(void) { }

/** \brief run keyboard level code immediately after wakeup
*
* FIXME: needs doc
*/
__attribute__ ((weak))
void suspend_wakeup_init_kb(void) {
suspend_power_down_user();
}

/** \brief suspend wakeup condition
*
* run immediately after wakeup
Expand All @@ -79,4 +111,5 @@ void suspend_wakeup_init(void)
#ifdef BACKLIGHT_ENABLE
backlight_init();
#endif /* BACKLIGHT_ENABLE */
suspend_wakeup_init_kb();
}
5 changes: 5 additions & 0 deletions tmk_core/common/suspend.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,9 @@ void suspend_power_down(void);
bool suspend_wakeup_condition(void);
void suspend_wakeup_init(void);

void suspend_wakeup_init_user(void);
void suspend_wakeup_init_kb(void);
void suspend_power_down_user (void);
void suspend_power_down_kb(void);

#endif