@@ -53,9 +53,11 @@ static inline void KEY_POWER_OFF(void) { | |||
DDRB = 0x00; PORTB = 0xFF; // change pins input with pull-up | |||
DDRD |= (1<<4); PORTD &= ~(1<<4); // MOS FET switch off | |||
} | |||
static inline bool KEY_POWER_STATE(void) { return PORTD & (1<<4); } | |||
#else | |||
static inline void KEY_POWER_ON(void) {} | |||
static inline void KEY_POWER_OFF(void) {} | |||
static inline bool KEY_POWER_STATE(void) { return true; } | |||
#endif | |||
static inline void KEY_INIT(void) | |||
{ | |||
@@ -73,7 +75,7 @@ static inline void KEY_INIT(void) | |||
KEY_UNABLE(); | |||
KEY_PREV_OFF(); | |||
KEY_POWER_ON(); | |||
KEY_POWER_OFF(); | |||
} | |||
static inline void KEY_SELECT(uint8_t ROW, uint8_t COL) | |||
{ |
@@ -35,7 +35,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
// matrix power saving | |||
#define MATRIX_POWER_SAVE 10000 | |||
static uint32_t matrix_last_modified = 0; | |||
static bool matrix_power = true; | |||
// matrix state buffer(1:on, 0:off) | |||
static matrix_row_t *matrix; | |||
@@ -80,7 +79,8 @@ uint8_t matrix_scan(void) | |||
matrix_prev = matrix; | |||
matrix = tmp; | |||
matrix_power_up(); | |||
// power on | |||
if (!KEY_POWER_STATE()) KEY_POWER_ON(); | |||
for (uint8_t row = 0; row < MATRIX_ROWS; row++) { | |||
for (uint8_t col = 0; col < MATRIX_COLS; col++) { | |||
KEY_SELECT(row, col); | |||
@@ -136,7 +136,14 @@ uint8_t matrix_scan(void) | |||
} | |||
if (matrix[row] ^ matrix_prev[row]) matrix_last_modified = timer_read32(); | |||
} | |||
matrix_power_down(); | |||
// power off | |||
if (KEY_POWER_STATE() && | |||
(USB_DeviceState == DEVICE_STATE_Suspended || | |||
USB_DeviceState == DEVICE_STATE_Unattached ) && | |||
timer_elapsed32(matrix_last_modified) > MATRIX_POWER_SAVE) { | |||
KEY_POWER_OFF(); | |||
suspend_power_down(); | |||
} | |||
return 1; | |||
} | |||
@@ -176,16 +183,8 @@ void matrix_print(void) | |||
} | |||
void matrix_power_up(void) { | |||
if (matrix_power) return; | |||
KEY_POWER_ON(); | |||
matrix_power = true; | |||
} | |||
void matrix_power_down(void) { | |||
if (!matrix_power) return; | |||
// doesn't power save while USB connection is active | |||
if (USB_DeviceState != DEVICE_STATE_Unattached) return; | |||
if (timer_elapsed32(matrix_last_modified) <= MATRIX_POWER_SAVE) return; | |||
KEY_POWER_OFF(); | |||
suspend_power_down(); | |||
matrix_power = false; | |||
} |
@@ -63,7 +63,7 @@ int main(void) | |||
USB_USBTask(); | |||
#endif | |||
} | |||
print("USB configured.\n"); | |||
print("\nUSB init\n"); | |||
rn42_init(); | |||
rn42_task_init(); | |||
@@ -82,10 +82,18 @@ int main(void) | |||
sleep_led_init(); | |||
#endif | |||
print("Keyboard start.\n"); | |||
print("Keyboard start\n"); | |||
while (1) { | |||
while (USB_DeviceState == DEVICE_STATE_Suspended) { | |||
while (rn42_rts() && // RN42 is off | |||
USB_DeviceState == DEVICE_STATE_Suspended) { | |||
print("[s]"); | |||
matrix_power_down(); | |||
suspend_power_down(); | |||
suspend_power_down(); | |||
suspend_power_down(); | |||
suspend_power_down(); | |||
suspend_power_down(); | |||
suspend_power_down(); | |||
suspend_power_down(); | |||
if (USB_Device_RemoteWakeupEnabled && suspend_wakeup_condition()) { | |||
USB_Device_SendRemoteWakeup(); |
@@ -151,6 +151,7 @@ void EVENT_USB_Device_Connect(void) | |||
print("[C]"); | |||
/* For battery powered device */ | |||
if (!USB_IsInitialized) { | |||
USB_Disable(); | |||
USB_Init(); | |||
USB_Device_EnableSOFEvents(); | |||
} | |||
@@ -160,6 +161,7 @@ void EVENT_USB_Device_Disconnect(void) | |||
{ | |||
print("[D]"); | |||
/* For battery powered device */ | |||
USB_IsInitialized = false; | |||
/* TODO: This doesn't work. After several plug in/outs can not be enumerated. | |||
if (USB_IsInitialized) { | |||
USB_Disable(); // Disable all interrupts | |||
@@ -177,6 +179,7 @@ void EVENT_USB_Device_Reset(void) | |||
void EVENT_USB_Device_Suspend() | |||
{ | |||
print("[S]"); | |||
matrix_power_down(); | |||
#ifdef SLEEP_LED_ENABLE | |||
sleep_led_enable(); | |||
#endif |