2013-03-24 16:46:32 +00:00
# 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 ;
}
2013-03-26 07:55:45 +00:00
// run immediately after wakeup
2013-03-24 16:46:32 +00:00
void suspend_wakeup_init ( void )
{
2013-03-26 07:55:45 +00:00
// clear matrix and keyboard state
2013-03-24 16:46:32 +00:00
matrix_init ( ) ;
clear_keyboard ( ) ;
}
2013-03-26 07:55:45 +00:00
# ifndef NO_SUSPEND_POWER_DOWN
/* 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 ) ) ) ;
}
*/
}
# endif