~ruther/qmk_firmware

05795cb0034e885bec37f782cfc6bddcae262637 — tmk 10 years ago 10a6b2c
Compensate timer during prower down
M common/avr/suspend.c => common/avr/suspend.c +16 -11
@@ 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

M common/suspend.h => common/suspend.h +1 -1
@@ 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);


M keyboard/hhkb_rn42/MEMO.txt => keyboard/hhkb_rn42/MEMO.txt +7 -0
@@ 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

M keyboard/hhkb_rn42/matrix.c => keyboard/hhkb_rn42/matrix.c +1 -1
@@ 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;
}

M keyboard/hhkb_rn42/rn42/main.c => keyboard/hhkb_rn42/rn42/main.c +1 -1
@@ 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();
            }

M protocol/lufa/lufa.c => protocol/lufa/lufa.c +1 -1
@@ 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();
            }