]> git.donarmstrong.com Git - tmk_firmware.git/blobdiff - keyboard/hhkb_rn42/hhkb_avr.h
Matrix power saving
[tmk_firmware.git] / keyboard / hhkb_rn42 / hhkb_avr.h
index b7bd507b5d94e4dba7c5bb9e4d1f72c84980d531..f007d7667acc4198139227a5eef494a393e99beb 100644 (file)
@@ -41,17 +41,30 @@ static inline void KEY_UNABLE(void) { (PORTB |=  (1<<6)); }
 static inline bool KEY_STATE(void) { return (PIND & (1<<7)); }
 static inline void KEY_PREV_ON(void) { (PORTB |=  (1<<7)); }
 static inline void KEY_PREV_OFF(void) { (PORTB &= ~(1<<7)); }
+#ifdef HHKB_POWER_SAVING
+static inline void KEY_POWER_ON(void) {
+    DDRB = 0xFF; PORTB = 0x40;          // change pins output
+    DDRD |= (1<<4); PORTD |= (1<<4);    // MOS FET switch on
+    /* Without this wait you will miss or get false key events. */
+    _delay_ms(5);                       // wait for powering up
+}
+static inline void KEY_POWER_OFF(void) {
+    /* input with pull-up consumes less than without it when pin is open. */
+    DDRB = 0x00; PORTB = 0xFF;          // change pins input with pull-up
+    DDRD |= (1<<4); PORTD &= ~(1<<4);   // MOS FET switch off
+}
+#else
 static inline void KEY_POWER_ON(void) {}
 static inline void KEY_POWER_OFF(void) {}
+#endif
 static inline void KEY_INIT(void)
 {
+    /* row,col,prev: output */
     DDRB  = 0xFF;
-    PORTB = 0x00;
+    PORTB = 0x40;   // unable
+    /* key: input with pull-up */
     DDRD  &= ~0x80;
-    PORTD |= 0x80;
-    /* keyswitch board power on */
-    DDRD  |=  (1<<4);
-    PORTD |=  (1<<4);
+    PORTD |=  0x80;
 #ifdef HHKB_JP
     /* row extention for HHKB JP */
     DDRC  |= (1<<6|1<<7);
@@ -59,6 +72,8 @@ static inline void KEY_INIT(void)
 #endif
     KEY_UNABLE();
     KEY_PREV_OFF();
+
+    KEY_POWER_ON();
 }
 static inline void KEY_SELECT(uint8_t ROW, uint8_t COL)
 {