@@ -7,6 +7,7 @@ | |||
#include "backlight.h" | |||
#include "suspend_avr.h" | |||
#include "suspend.h" | |||
#include "timer.h" | |||
#ifdef PROTOCOL_LUFA | |||
#include "lufa.h" | |||
#endif | |||
@@ -52,11 +53,13 @@ void suspend_idle(uint8_t time) | |||
* WDTO_4S | |||
* WDTO_8S | |||
*/ | |||
void suspend_power_down(uint8_t wdto) | |||
static uint8_t wdt_timeout = 0; | |||
static void power_down(uint8_t wdto) | |||
{ | |||
#ifdef PROTOCOL_LUFA | |||
if (USB_DeviceState == DEVICE_STATE_Configured) return; | |||
#endif | |||
wdt_timeout = wdto; | |||
// Watchdog Interrupt Mode | |||
wdt_intr_enable(wdto); | |||
@@ -67,7 +70,6 @@ void suspend_power_down(uint8_t wdto) | |||
// - prescale clock | |||
// - BOD disable | |||
// - Power Reduction Register PRR | |||
set_sleep_mode(SLEEP_MODE_PWR_DOWN); | |||
sleep_enable(); | |||
sei(); | |||
@@ -78,6 +80,11 @@ void suspend_power_down(uint8_t wdto) | |||
wdt_disable(); | |||
} | |||
void suspend_power_down(void) | |||
{ | |||
power_down(WDTO_15MS); | |||
} | |||
bool suspend_wakeup_condition(void) | |||
{ | |||
matrix_power_up(); | |||
@@ -103,15 +110,13 @@ void suspend_wakeup_init(void) | |||
/* watchdog timeout */ | |||
ISR(WDT_vect) | |||
{ | |||
/* wakeup from MCU sleep mode */ | |||
/* | |||
// blink LED | |||
static uint8_t led_state = 0; | |||
static uint8_t led_count = 0; | |||
led_count++; | |||
if ((led_count & 0x07) == 0) { | |||
led_set((led_state ^= (1<<USB_LED_CAPS_LOCK))); | |||
// compensate timer for sleep | |||
switch (wdt_timeout) { | |||
case WDTO_15MS: | |||
timer_count += 15 + 2; // WDTO_15MS + 2(from observation) | |||
break; | |||
default: | |||
; | |||
} | |||
*/ | |||
} | |||
#endif |
@@ -6,7 +6,7 @@ | |||
void suspend_idle(uint8_t timeout); | |||
void suspend_power_down(uint8_t timeout); | |||
void suspend_power_down(void); | |||
bool suspend_wakeup_condition(void); | |||
void suspend_wakeup_init(void); | |||
@@ -9,10 +9,15 @@ Bug: | |||
- Do not power-down during USB connection is active - DONE 11/11 | |||
(USB_DeviceState == USB_DEVICE_Configured) is used to check USB connection | |||
matrix_power_down() matrix.c - 11/23 | |||
- timer is slow while power down - DONE 11/26 | |||
- time out interrupt is lost while power down? | |||
- interrupt of watchdog timer compensates timer counter(avr/suspend.c) | |||
Todo: | |||
Design: | |||
- suspend.h - DONE 11/26 | |||
- remove argument from suspend_power_down() for backward compatitibility | |||
- remove MCU dependent power saving code from core/keyboard | |||
- it should be located in project matrix.c - DONE 11/23 | |||
- HHKB matrix.c needs matrix_prev? | |||
@@ -47,6 +52,8 @@ Power saving: | |||
- During USB suspend change clock source to internal RC from external Xtal(6.8) | |||
- FRZCLK: you can freeze clock for power saving. still WAKEUPI and VBUSTI interrupts are available while freezing.(21.7.3) | |||
- Suspend: Clear Suspend Bit, Freeze clock, disable PLL, MCU sleep(21.13) | |||
- Voltage reference(8.1.1) | |||
- to reduce power consumption while power down mode | |||
Improving: | |||
- BT LED; connecting, linked, sleeping, deep sleeping |
@@ -186,6 +186,6 @@ void matrix_power_down(void) { | |||
if (USB_DeviceState == DEVICE_STATE_Configured) return; | |||
if (timer_elapsed32(matrix_last_modified) <= MATRIX_POWER_SAVE) return; | |||
KEY_POWER_OFF(); | |||
suspend_power_down(WDTO_15MS); | |||
suspend_power_down(); | |||
matrix_power = false; | |||
} |
@@ -85,7 +85,7 @@ int main(void) | |||
print("Keyboard start.\n"); | |||
while (1) { | |||
while (USB_DeviceState == DEVICE_STATE_Suspended) { | |||
suspend_power_down(WDTO_120MS); | |||
suspend_power_down(); | |||
if (USB_Device_RemoteWakeupEnabled && suspend_wakeup_condition()) { | |||
USB_Device_SendRemoteWakeup(); | |||
} |
@@ -587,7 +587,7 @@ int main(void) | |||
print("Keyboard start.\n"); | |||
while (1) { | |||
while (USB_DeviceState == DEVICE_STATE_Suspended) { | |||
suspend_power_down(WDTO_120MS); | |||
suspend_power_down(); | |||
if (USB_Device_RemoteWakeupEnabled && suspend_wakeup_condition()) { | |||
USB_Device_SendRemoteWakeup(); | |||
} |