forked from qmk/qmk_firmware
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
4 changed files
with
97 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,10 +1,21 @@ | ||
#ifndef SLEEP_LED_H | ||
#define SLEEP_LED_H | ||
|
||
#define NO_SUSPEND_POWER_DOWN | ||
|
||
#ifdef SLEEP_LED_ENABLE | ||
|
||
void sleep_led_init(void); | ||
void sleep_led_enable(void); | ||
void sleep_led_disable(void); | ||
void sleep_led_toggle(void); | ||
|
||
#else | ||
|
||
#define sleep_led_init() | ||
#define sleep_led_enable() | ||
#define sleep_led_disable() | ||
#define sleep_led_toggle() | ||
|
||
#endif | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,51 @@ | ||
#include "suspend.h" | ||
#include "matrix.h" | ||
#include "action.h" | ||
|
||
|
||
void suspend_power_down(void) | ||
{ | ||
#ifndef NO_SUSPEND_POWER_DOWN | ||
// Enable watchdog to wake from MCU sleep | ||
cli(); | ||
wdt_reset(); | ||
|
||
// Watchdog Interrupt and System Reset Mode | ||
//wdt_enable(WDTO_1S); | ||
//WDTCSR |= _BV(WDIE); | ||
|
||
// Watchdog Interrupt Mode | ||
wdt_intr_enable(WDTO_120MS); | ||
|
||
// TODO: more power saving | ||
// See PicoPower application note | ||
// - I/O port input with pullup | ||
// - prescale clock | ||
// - BOD disable | ||
// - Power Reduction Register PRR | ||
// sleep in power down mode | ||
set_sleep_mode(SLEEP_MODE_PWR_DOWN); | ||
sleep_enable(); | ||
sei(); | ||
sleep_cpu(); | ||
sleep_disable(); | ||
|
||
// Disable watchdog after sleep | ||
wdt_disable(); | ||
#endif | ||
} | ||
|
||
bool suspend_wakeup_condition(void) | ||
{ | ||
matrix_scan(); | ||
for (uint8_t r = 0; r < MATRIX_ROWS; r++) { | ||
if (matrix_get_row(r)) return true; | ||
} | ||
return false; | ||
} | ||
|
||
void suspend_wakeup_init(void) | ||
{ | ||
matrix_init(); | ||
clear_keyboard(); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
#ifndef SUSPEND_H | ||
#define SUSPEND_H | ||
|
||
#include <stdint.h> | ||
#include <stdbool.h> | ||
#include <avr/sleep.h> | ||
#include <avr/wdt.h> | ||
#include <avr/interrupt.h> | ||
|
||
|
||
#define wdt_intr_enable(value) \ | ||
__asm__ __volatile__ ( \ | ||
"in __tmp_reg__,__SREG__" "\n\t" \ | ||
"cli" "\n\t" \ | ||
"wdr" "\n\t" \ | ||
"sts %0,%1" "\n\t" \ | ||
"out __SREG__,__tmp_reg__" "\n\t" \ | ||
"sts %0,%2" "\n\t" \ | ||
: /* no outputs */ \ | ||
: "M" (_SFR_MEM_ADDR(_WD_CONTROL_REG)), \ | ||
"r" (_BV(_WD_CHANGE_BIT) | _BV(WDE)), \ | ||
"r" ((uint8_t) ((value & 0x08 ? _WD_PS3_MASK : 0x00) | \ | ||
_BV(WDIE) | (value & 0x07)) ) \ | ||
: "r0" \ | ||
) | ||
|
||
|
||
void suspend_power_down(void); | ||
bool suspend_wakeup_condition(void); | ||
void suspend_wakeup_init(void); | ||
|
||
#endif |