]> git.friedersdorff.com Git - max/tmk_keyboard.git/commitdiff
Add support for backlight
authorWraul <wraul@dbox.se>
Thu, 30 May 2013 18:24:39 +0000 (20:24 +0200)
committertmk <nobody@nowhere>
Sat, 22 Jun 2013 08:23:36 +0000 (17:23 +0900)
13 files changed:
README.md
common.mk
common/action.c
common/action_code.h
common/backlight.c [new file with mode: 0644]
common/backlight.h [new file with mode: 0644]
common/command.c
common/eeconfig.c
common/eeconfig.h
common/keyboard.c
common/suspend.c
doc/build.md
doc/keymap.md

index d4793e9bfb42f24f908adcaeee476fb84fccb832..5065f27880a7910f4b3feefa704706cec7362cb1 100644 (file)
--- a/README.md
+++ b/README.md
@@ -23,6 +23,7 @@ These features can be used in your keyboard.
 * Virtual DIP Switch  - Configurations stored EEPROM(Boot Magic)
 * Locking CapsLock    - Mechanical switch support for CapsLock
 * Breathing Sleep LED - Sleep indicator with charm during USB suspend
+* Backlight           - Control backlight levels
 
 
 Projects
index 5f47e5c1bc3de8faa372ba6f98c04e8d6a0a722b..47d5c852f330cb93842f1196d9d93889cf2f279f 100644 (file)
--- a/common.mk
+++ b/common.mk
@@ -63,6 +63,11 @@ ifdef SLEEP_LED_ENABLE
     OPT_DEFS += -DNO_SUSPEND_POWER_DOWN
 endif
 
+ifdef BACKLIGHT_ENABLE
+    SRC += $(COMMON_DIR)/backlight.c
+    OPT_DEFS += -DBACKLIGHT_ENABLE
+endif
+
 
 # Search Path
 VPATH += $(TOP_DIR)/common
index c7c8f71f2ccafa346cd6cfd77625d244e7a814b9..b1fa0e31cf7798c4cdbf49efa83d9a0e97a4575b 100644 (file)
@@ -20,6 +20,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #include "mousekey.h"
 #include "command.h"
 #include "led.h"
+#include "backlight.h"
 #include "action_layer.h"
 #include "action_tapping.h"
 #include "action_oneshot.h"
@@ -291,6 +292,26 @@ void process_action(keyrecord_t *record)
         case ACT_MACRO:
             action_macro_play(action_get_macro(record, action.func.id, action.func.opt));
             break;
+#endif
+#ifdef BACKLIGHT_ENABLE
+        case ACT_BACKLIGHT:
+            if (!event.pressed) {
+                switch (action.backlight.id) {
+                    case BACKLIGHT_INCREASE:
+                        backlight_increase();
+                        break;
+                    case BACKLIGHT_DECREASE:
+                        backlight_decrease();
+                        break;
+                    case BACKLIGHT_TOGGLE:
+                        backlight_toggle();
+                        break;
+                    case BACKLIGHT_STEP:
+                        backlight_step();
+                        break;
+                }
+            }
+            break;
 #endif
         case ACT_COMMAND:
             break;
index 0933dce1369a95aa6db4d4d2ea7c423dc3c92a3e..d28b74f843e5892cf022d3fb54a9ece881037a3c 100644 (file)
@@ -85,6 +85,9 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
  * 1100|opt | id(8)      Macro play?
  * 1100|1111| id(8)      Macro record?
  *
+ * ACT_BACKLIGHT(1101):
+ * 1110|xxxx| id(8)      Backlight commands
+ *
  * ACT_COMMAND(1110):
  * 1110|opt | id(8)      Built-in Command exec
  *
@@ -109,6 +112,7 @@ enum action_kind_id {
     ACT_LAYER_TAP1      = 0b1011,
     /* Extensions */
     ACT_MACRO           = 0b1100,
+    ACT_BACKLIGHT       = 0b1101,
     ACT_COMMAND         = 0b1110,
     ACT_FUNCTION        = 0b1111
 };
@@ -157,6 +161,9 @@ typedef union {
         uint8_t  page   :2;
         uint8_t  kind   :4;
     } usage;
+    struct action_backlight {
+        uint8_t  id     :8;
+    } backlight;
     struct action_command {
         uint8_t  id     :8;
         uint8_t  opt    :4;
@@ -272,10 +279,21 @@ enum layer_pram_tap_op {
 /*
  * Extensions
  */
+enum backlight_id {
+    BACKLIGHT_INCREASE = 0,
+    BACKLIGHT_DECREASE = 1,
+    BACKLIGHT_TOGGLE   = 2,
+    BACKLIGHT_STEP     = 3,
+};
 /* Macro */
 #define ACTION_MACRO(id)                ACTION(ACT_MACRO, (id))
 #define ACTION_MACRO_TAP(id)            ACTION(ACT_MACRO, FUNC_TAP<<8 | (id))
 #define ACTION_MACRO_OPT(id, opt)       ACTION(ACT_MACRO, (opt)<<8 | (id))
+/* Backlight */
+#define ACTION_BACKLIGHT_INCREASE()     ACTION(ACT_BACKLIGHT, BACKLIGHT_INCREASE)
+#define ACTION_BACKLIGHT_DECREASE()     ACTION(ACT_BACKLIGHT, BACKLIGHT_DECREASE)
+#define ACTION_BACKLIGHT_TOGGLE()       ACTION(ACT_BACKLIGHT, BACKLIGHT_TOGGLE)
+#define ACTION_BACKLIGHT_STEP()         ACTION(ACT_BACKLIGHT, BACKLIGHT_STEP)
 /* Command */
 #define ACTION_COMMAND(id, opt)         ACTION(ACT_COMMAND,  (opt)<<8 | (addr))
 /* Function */
diff --git a/common/backlight.c b/common/backlight.c
new file mode 100644 (file)
index 0000000..00dc04a
--- /dev/null
@@ -0,0 +1,77 @@
+/*
+Copyright 2013 Mathias Andersson <wraul@dbox.se>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "backlight.h"
+#include "eeconfig.h"
+#include "debug.h"
+
+backlight_config_t backlight_config;
+
+void backlight_init(void)
+{
+    /* check signature */
+    if (!eeconfig_is_enabled()) {
+        eeconfig_init();
+    }
+    backlight_config.raw = eeconfig_read_backlight();
+    backlight_set(backlight_config.enable ? backlight_config.level : 0);
+}
+
+void backlight_increase(void)
+{
+    if(backlight_config.level < BACKLIGHT_LEVELS)
+    {
+        backlight_config.level++;
+        backlight_config.enable = 1;
+        eeconfig_write_backlight(backlight_config.raw);
+    }
+    dprintf("backlight increase: %u\n", backlight_config.level);
+    backlight_set(backlight_config.level);
+}
+
+void backlight_decrease(void)
+{
+    if(backlight_config.level > 0)
+    {
+        backlight_config.level--;
+        backlight_config.enable = !!backlight_config.level;
+        eeconfig_write_backlight(backlight_config.raw);
+    }
+    dprintf("backlight decrease: %u\n", backlight_config.level);
+    backlight_set(backlight_config.level);
+}
+
+void backlight_toggle(void)
+{
+    backlight_config.enable ^= 1;
+    eeconfig_write_backlight(backlight_config.raw);
+    dprintf("backlight toggle: %u\n", backlight_config.enable);
+    backlight_set(backlight_config.enable ? backlight_config.level : 0);
+}
+
+void backlight_step(void)
+{
+    backlight_config.level++;
+    if(backlight_config.level > BACKLIGHT_LEVELS)
+    {
+        backlight_config.level = 0;
+    }
+    backlight_config.enable = !!backlight_config.level;
+    eeconfig_write_backlight(backlight_config.raw);
+    dprintf("backlight step: %u\n", backlight_config.level);
+    backlight_set(backlight_config.level);
+}
diff --git a/common/backlight.h b/common/backlight.h
new file mode 100644 (file)
index 0000000..685c422
--- /dev/null
@@ -0,0 +1,41 @@
+/*
+Copyright 2013 Mathias Andersson <wraul@dbox.se>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef BACKLIGHT_H
+#define BACKLIGHT_H
+
+#include <stdint.h>
+#include <stdbool.h>
+
+typedef union {
+    uint8_t raw;
+    struct {
+        bool    enable:1;
+        uint8_t level:7;
+    };
+} backlight_config_t;
+
+void backlight_init(void);
+
+void backlight_increase(void);
+void backlight_decrease(void);
+void backlight_toggle(void);
+void backlight_step(void);
+
+void backlight_set(uint8_t level);
+
+#endif
index 73a72b4a1d84bfea9a04051c9b595918489ea81a..bcf1b4937fc15585ea5b81770e32659909df335b 100644 (file)
@@ -31,6 +31,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #include "sleep_led.h"
 #include "led.h"
 #include "command.h"
+#include "backlight.h"
 
 #ifdef MOUSEKEY_ENABLE
 #include "mousekey.h"
@@ -149,6 +150,12 @@ static void print_eeconfig(void)
     print(".no_gui: "); print_dec(kc.no_gui); print("\n");
     print(".swap_grave_esc: "); print_dec(kc.swap_grave_esc); print("\n");
     print(".swap_backslash_backspace: "); print_dec(kc.swap_backslash_backspace); print("\n");
+
+    backlight_config_t bc;
+    bc.raw = eeconfig_read_backlight();
+    print("backlight_config.raw: "); print_hex8(bc.raw); print("\n");
+    print(".enable: "); print_dec(bc.enable); print("\n");
+    print(".level: "); print_dec(bc.level); print("\n");
 }
 #endif
 
index a833f4db9c32b73a17851a0138275c2d31a24f51..7af29ec10a373969a47868a39697b577b4abc573 100644 (file)
@@ -10,6 +10,7 @@ void eeconfig_init(void)
     eeprom_write_byte(EECONFIG_DEFAULT_LAYER,  0);
     eeprom_write_byte(EECONFIG_KEYMAP,         0);
     eeprom_write_byte(EECONFIG_MOUSEKEY_ACCEL, 0);
+    eeprom_write_byte(EECONFIG_BACKLIGHT,      0);
 }
 
 void eeconfig_enable(void)
@@ -35,3 +36,6 @@ void eeconfig_write_default_layer(uint8_t val) { eeprom_write_byte(EECONFIG_DEFA
 
 uint8_t eeconfig_read_keymap(void)      { return eeprom_read_byte(EECONFIG_KEYMAP); }
 void eeconfig_write_keymap(uint8_t val) { eeprom_write_byte(EECONFIG_KEYMAP, val); }
+
+uint8_t eeconfig_read_backlight(void)      { return eeprom_read_byte(EECONFIG_BACKLIGHT); }
+void eeconfig_write_backlight(uint8_t val) { eeprom_write_byte(EECONFIG_BACKLIGHT, val); }
index 0b605fc7bfdaae848044a638d43205e08c61437f..f0acce01c924dfd29197d7a34616411f5057edf4 100644 (file)
@@ -19,6 +19,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #define EECONFIG_H
 
 #include <stdint.h>
+#include <stdbool.h>
 
 
 #define EECONFIG_MAGIC_NUMBER                       (uint16_t)0xFEED
@@ -29,6 +30,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #define EECONFIG_DEFAULT_LAYER                      (uint8_t *)3
 #define EECONFIG_KEYMAP                             (uint8_t *)4
 #define EECONFIG_MOUSEKEY_ACCEL                     (uint8_t *)5
+#define EECONFIG_BACKLIGHT                          (uint8_t *)6
 
 
 /* debug bit */
@@ -64,4 +66,7 @@ void eeconfig_write_default_layer(uint8_t val);
 uint8_t eeconfig_read_keymap(void);
 void eeconfig_write_keymap(uint8_t val);
 
+uint8_t eeconfig_read_backlight(void);
+void eeconfig_write_backlight(uint8_t val);
+
 #endif
index 6bc6fae6e25f55bf5e2b2bedb9b2c079b3a9f132..d1821a099f554db950f912f66755aefac2ae2c7a 100644 (file)
@@ -31,6 +31,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #include "bootmagic.h"
 #include "eeconfig.h"
 #include "mousekey.h"
+#include "backlight.h"
 
 
 #ifdef MATRIX_HAS_GHOST
@@ -65,6 +66,10 @@ void keyboard_init(void)
 #ifdef BOOTMAGIC_ENABLE
     bootmagic();
 #endif
+
+#ifdef BACKLIGHT_ENABLE
+    backlight_init();
+#endif
 }
 
 /*
index 6029fe7ffa409c2caa3351f3a9d60a16b0bfb7eb..146b96d5cc0c5f8ac6e9332dffe98474eca660fd 100644 (file)
@@ -1,10 +1,14 @@
 #include "suspend.h"
 #include "matrix.h"
 #include "action.h"
+#include "backlight.h"
 
 
 void suspend_power_down(void)
 {
+#ifdef BACKLIGHT_ENABLE
+    backlight_set(0);
+#endif
 #ifndef NO_SUSPEND_POWER_DOWN
     // Enable watchdog to wake from MCU sleep
     cli();
@@ -50,6 +54,9 @@ void suspend_wakeup_init(void)
     // clear matrix and keyboard state
     matrix_init();
     clear_keyboard();
+#ifdef BACKLIGHT_ENABLE
+    backlight_init();
+#endif
 }
 
 #ifndef NO_SUSPEND_POWER_DOWN
index 88504f0965bf3fb41e977b6b86dc946f48585821..ae8565010e7b0c29e2a93a661b125d45737919af 100644 (file)
@@ -132,6 +132,7 @@ Optional. Note that ***comment out*** to disable them.
     COMMAND_ENABLE = yes        # Commands for debug and configuration
     SLEEP_LED_ENABLE = yes      # Breathing sleep LED during USB suspend
     #NKRO_ENABLE = yes          # USB Nkey Rollover - not yet supported in LUFA
+    #BACKLIGHT_ENABLE = yes     # Enable keyboard backlight functionality
 
 ### 3. Programmer
 Optional. Set proper command for your controller, bootloader and programmer. This command can be used with `make program`. Not needed if you use `FLIP`, `dfu-programmer` or `Teesy Loader`.
index 474a706e0c2ad26e43a403116b36ec7a8c2227f4..7d979eb7c6bf3c606b3fecb25d26b40d72dd87b8 100644 (file)
@@ -430,6 +430,27 @@ See `keyboard/hhkb/keymap.c` for sample.
 
 
 
+### 2.5 Backlight Action
+These actions control the backlight.
+
+#### 2.5.1 Change backlight level
+Increase backlight level.
+
+    ACTION_BACKLIGHT_INCREASE()
+
+Decrease backlight level.
+
+    ACTION_BACKLIGHT_DECREASE()
+
+Step through backlight levels.
+
+    ACTION_BACKLIGHT_STEP()
+
+#### 2.5.2 Turn on / off backlight
+Turn the backlight on and off without changing level.
+
+    ACTION_BACKLIGHT_TOGGLE()
+
 
 
 ## 3. Layer switching Example