1
0

Merge branch 'rn42'

This commit is contained in:
tmk 2015-01-15 17:12:26 +09:00
commit fb78b6acf1
3 changed files with 39 additions and 31 deletions

View File

@ -7,6 +7,7 @@
#include "backlight.h" #include "backlight.h"
#include "suspend_avr.h" #include "suspend_avr.h"
#include "suspend.h" #include "suspend.h"
#include "timer.h"
#ifdef PROTOCOL_LUFA #ifdef PROTOCOL_LUFA
#include "lufa.h" #include "lufa.h"
#endif #endif
@ -52,11 +53,13 @@ void suspend_idle(uint8_t time)
* WDTO_4S * WDTO_4S
* WDTO_8S * 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 #ifdef PROTOCOL_LUFA
if (USB_DeviceState == DEVICE_STATE_Configured) return; if (USB_DeviceState == DEVICE_STATE_Configured) return;
#endif #endif
wdt_timeout = wdto;
// Watchdog Interrupt Mode // Watchdog Interrupt Mode
wdt_intr_enable(wdto); wdt_intr_enable(wdto);
@ -67,7 +70,6 @@ void suspend_power_down(uint8_t wdto)
// - prescale clock // - prescale clock
// - BOD disable // - BOD disable
// - Power Reduction Register PRR // - Power Reduction Register PRR
set_sleep_mode(SLEEP_MODE_PWR_DOWN); set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sleep_enable(); sleep_enable();
sei(); sei();
@ -78,6 +80,11 @@ void suspend_power_down(uint8_t wdto)
wdt_disable(); wdt_disable();
} }
void suspend_power_down(void)
{
power_down(WDTO_15MS);
}
bool suspend_wakeup_condition(void) bool suspend_wakeup_condition(void)
{ {
matrix_power_up(); matrix_power_up();
@ -103,15 +110,13 @@ void suspend_wakeup_init(void)
/* watchdog timeout */ /* watchdog timeout */
ISR(WDT_vect) ISR(WDT_vect)
{ {
/* wakeup from MCU sleep mode */ // compensate timer for sleep
/* switch (wdt_timeout) {
// blink LED case WDTO_15MS:
static uint8_t led_state = 0; timer_count += 15 + 2; // WDTO_15MS + 2(from observation)
static uint8_t led_count = 0; break;
led_count++; default:
if ((led_count & 0x07) == 0) { ;
led_set((led_state ^= (1<<USB_LED_CAPS_LOCK)));
} }
*/
} }
#endif #endif

View File

@ -6,7 +6,7 @@
void suspend_idle(uint8_t timeout); void suspend_idle(uint8_t timeout);
void suspend_power_down(uint8_t timeout); void suspend_power_down(void);
bool suspend_wakeup_condition(void); bool suspend_wakeup_condition(void);
void suspend_wakeup_init(void); void suspend_wakeup_init(void);

View File

@ -148,8 +148,10 @@ static void Console_Task(void)
*/ */
void EVENT_USB_Device_Connect(void) void EVENT_USB_Device_Connect(void)
{ {
print("[C]");
/* For battery powered device */ /* For battery powered device */
if (!USB_IsInitialized) { if (!USB_IsInitialized) {
USB_Disable();
USB_Init(); USB_Init();
USB_Device_EnableSOFEvents(); USB_Device_EnableSOFEvents();
} }
@ -157,7 +159,9 @@ void EVENT_USB_Device_Connect(void)
void EVENT_USB_Device_Disconnect(void) void EVENT_USB_Device_Disconnect(void)
{ {
print("[D]");
/* For battery powered device */ /* For battery powered device */
USB_IsInitialized = false;
/* TODO: This doesn't work. After several plug in/outs can not be enumerated. /* TODO: This doesn't work. After several plug in/outs can not be enumerated.
if (USB_IsInitialized) { if (USB_IsInitialized) {
USB_Disable(); // Disable all interrupts USB_Disable(); // Disable all interrupts
@ -169,10 +173,13 @@ void EVENT_USB_Device_Disconnect(void)
void EVENT_USB_Device_Reset(void) void EVENT_USB_Device_Reset(void)
{ {
print("[R]");
} }
void EVENT_USB_Device_Suspend() void EVENT_USB_Device_Suspend()
{ {
print("[S]");
matrix_power_down();
#ifdef SLEEP_LED_ENABLE #ifdef SLEEP_LED_ENABLE
sleep_led_enable(); sleep_led_enable();
#endif #endif
@ -180,6 +187,7 @@ void EVENT_USB_Device_Suspend()
void EVENT_USB_Device_WakeUp() void EVENT_USB_Device_WakeUp()
{ {
print("[W]");
suspend_wakeup_init(); suspend_wakeup_init();
#ifdef SLEEP_LED_ENABLE #ifdef SLEEP_LED_ENABLE
@ -489,37 +497,28 @@ int8_t sendchar(uint8_t c)
uint8_t ep = Endpoint_GetCurrentEndpoint(); uint8_t ep = Endpoint_GetCurrentEndpoint();
Endpoint_SelectEndpoint(CONSOLE_IN_EPNUM); Endpoint_SelectEndpoint(CONSOLE_IN_EPNUM);
if (!Endpoint_IsEnabled() || !Endpoint_IsConfigured()) { if (!Endpoint_IsEnabled() || !Endpoint_IsConfigured()) {
Endpoint_SelectEndpoint(ep); goto ERROR_EXIT;
return -1;
} }
if (timeouted && !Endpoint_IsReadWriteAllowed()) { if (timeouted && !Endpoint_IsReadWriteAllowed()) {
Endpoint_SelectEndpoint(ep); goto ERROR_EXIT;
return - 1;
} }
timeouted = false; timeouted = false;
uint8_t timeout = SEND_TIMEOUT; uint8_t timeout = SEND_TIMEOUT;
uint16_t prevFN = USB_Device_GetFrameNumber();
while (!Endpoint_IsReadWriteAllowed()) { while (!Endpoint_IsReadWriteAllowed()) {
switch (USB_DeviceState) { if (USB_DeviceState != DEVICE_STATE_Configured) {
case DEVICE_STATE_Unattached: goto ERROR_EXIT;
case DEVICE_STATE_Suspended:
return -1;
} }
if (Endpoint_IsStalled()) { if (Endpoint_IsStalled()) {
Endpoint_SelectEndpoint(ep); goto ERROR_EXIT;
return -1;
} }
if (prevFN != USB_Device_GetFrameNumber()) {
if (!(timeout--)) { if (!(timeout--)) {
timeouted = true; timeouted = true;
Endpoint_SelectEndpoint(ep); goto ERROR_EXIT;
return -1;
}
prevFN = USB_Device_GetFrameNumber();
} }
_delay_ms(1);
} }
Endpoint_Write_8(c); Endpoint_Write_8(c);
@ -530,6 +529,9 @@ int8_t sendchar(uint8_t c)
Endpoint_SelectEndpoint(ep); Endpoint_SelectEndpoint(ep);
return 0; return 0;
ERROR_EXIT:
Endpoint_SelectEndpoint(ep);
return -1;
} }
#else #else
int8_t sendchar(uint8_t c) int8_t sendchar(uint8_t c)
@ -587,7 +589,8 @@ int main(void)
print("Keyboard start.\n"); print("Keyboard start.\n");
while (1) { while (1) {
while (USB_DeviceState == DEVICE_STATE_Suspended) { while (USB_DeviceState == DEVICE_STATE_Suspended) {
suspend_power_down(WDTO_120MS); print("[s]");
suspend_power_down();
if (USB_Device_RemoteWakeupEnabled && suspend_wakeup_condition()) { if (USB_Device_RemoteWakeupEnabled && suspend_wakeup_condition()) {
USB_Device_SendRemoteWakeup(); USB_Device_SendRemoteWakeup();
} }