@@ -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 | |||
@@ -48,6 +49,7 @@ You can find some keyboard specific projects under `converter` and `keyboard` di | |||
* [phantom](keyboard/phantom/) - [Phantom] keyboard (by Tranquilite) | |||
* [IIgs_Standard](keyboard/IIgs/) - Apple [IIGS] keyboard mod(by JeffreySung) | |||
* [macway](keyboard/macway/) - [Compact keyboard mod][GH_macway] [retired] | |||
* [KMAC](keyboard/kmac/) - Korean custom keyboard | |||
[GH_macway]: http://geekhack.org/showwiki.php?title=Island:11930 | |||
[GH_hhkb]: http://geekhack.org/showwiki.php?title=Island:12047 |
@@ -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 |
@@ -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; |
@@ -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): | |||
* 1101|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 */ |
@@ -0,0 +1,77 @@ | |||
/* | |||
Copyright 2013 Mathias Andersson <[email protected]> | |||
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); | |||
} |
@@ -0,0 +1,41 @@ | |||
/* | |||
Copyright 2013 Mathias Andersson <[email protected]> | |||
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 |
@@ -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,14 @@ 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"); | |||
#ifdef BACKLIGHT_ENABLE | |||
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 | |||
} | |||
#endif | |||
@@ -10,6 +10,9 @@ void eeconfig_init(void) | |||
eeprom_write_byte(EECONFIG_DEFAULT_LAYER, 0); | |||
eeprom_write_byte(EECONFIG_KEYMAP, 0); | |||
eeprom_write_byte(EECONFIG_MOUSEKEY_ACCEL, 0); | |||
#ifdef BACKLIGHT_ENABLE | |||
eeprom_write_byte(EECONFIG_BACKLIGHT, 0); | |||
#endif | |||
} | |||
void eeconfig_enable(void) | |||
@@ -35,3 +38,8 @@ 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); } | |||
#ifdef BACKLIGHT_ENABLE | |||
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); } | |||
#endif |
@@ -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,9 @@ void eeconfig_write_default_layer(uint8_t val); | |||
uint8_t eeconfig_read_keymap(void); | |||
void eeconfig_write_keymap(uint8_t val); | |||
#ifdef BACKLIGHT_ENABLE | |||
uint8_t eeconfig_read_backlight(void); | |||
void eeconfig_write_backlight(uint8_t val); | |||
#endif | |||
#endif |
@@ -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 | |||
} | |||
/* |
@@ -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 |
@@ -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`. |
@@ -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 |