Browse Source

Merge branch 'ledmap'

yuk86
Kai Ryu 10 years ago
parent
commit
8b070f0f54

+ 24
- 14
common.mk View File

COMMON_DIR = common COMMON_DIR = common
SRC += $(COMMON_DIR)/host.c \
$(COMMON_DIR)/keyboard.c \
$(COMMON_DIR)/action.c \
$(COMMON_DIR)/action_tapping.c \
$(COMMON_DIR)/action_macro.c \
$(COMMON_DIR)/action_layer.c \
$(COMMON_DIR)/action_util.c \
$(COMMON_DIR)/keymap.c \
$(COMMON_DIR)/timer.c \
$(COMMON_DIR)/print.c \
$(COMMON_DIR)/bootloader.c \
$(COMMON_DIR)/suspend.c \
$(COMMON_DIR)/xprintf.S \
$(COMMON_DIR)/util.c
SRC += $(COMMON_DIR)/host.c \
$(COMMON_DIR)/keyboard.c \
$(COMMON_DIR)/action.c \
$(COMMON_DIR)/action_tapping.c \
$(COMMON_DIR)/action_macro.c \
$(COMMON_DIR)/action_layer.c \
$(COMMON_DIR)/action_util.c \
$(COMMON_DIR)/keymap.c \
$(COMMON_DIR)/timer.c \
$(COMMON_DIR)/print.c \
$(COMMON_DIR)/bootloader.c \
$(COMMON_DIR)/suspend.c \
$(COMMON_DIR)/xprintf.S \
$(COMMON_DIR)/util.c




# Option modules # Option modules
OPT_DEFS += -DBACKLIGHT_ENABLE OPT_DEFS += -DBACKLIGHT_ENABLE
endif endif


ifdef LEDMAP_ENABLE
SRC += $(COMMON_DIR)/ledmap.c
OPT_DEFS += -DLEDMAP_ENABLE
ifdef LEDMAP_IN_EEPROM_ENABLE
SRC += $(COMMON_DIR)/ledmap_in_eeprom.c
OPT_DEFS += -DLEDMAP_IN_EEPROM_ENABLE
endif
endif


ifdef KEYMAP_SECTION_ENABLE ifdef KEYMAP_SECTION_ENABLE
OPT_DEFS += -DKEYMAP_SECTION_ENABLE OPT_DEFS += -DKEYMAP_SECTION_ENABLE
EXTRALDFLAGS = -Wl,-L$(TOP_DIR),-Tldscript_keymap_avr5.x EXTRALDFLAGS = -Wl,-L$(TOP_DIR),-Tldscript_keymap_avr5.x

+ 6
- 0
common/action_layer.c View File

default_layer_debug(); debug(" to "); default_layer_debug(); debug(" to ");
default_layer_state = state; default_layer_state = state;
default_layer_debug(); debug("\n"); default_layer_debug(); debug("\n");
#ifdef LEDMAP_ENABLE
default_layer_state_change(state);
#endif
clear_keyboard_but_mods(); // To avoid stuck keys clear_keyboard_but_mods(); // To avoid stuck keys
} }


layer_debug(); dprint(" to "); layer_debug(); dprint(" to ");
layer_state = state; layer_state = state;
layer_debug(); dprintln(); layer_debug(); dprintln();
#ifdef LEDMAP_ENABLE
layer_state_change(state);
#endif
clear_keyboard_but_mods(); // To avoid stuck keys clear_keyboard_but_mods(); // To avoid stuck keys
} }



+ 8
- 0
common/action_layer.h View File

#define layer_debug() #define layer_debug()
#endif #endif


#ifdef LEDMAP_ENABLE
void default_layer_state_change(uint32_t state);
void layer_state_change(uint32_t state);
#else
#define default_layer_state_change()
#define layer_state_change()
#endif



/* return action depending on current layer status */ /* return action depending on current layer status */
action_t layer_switch_get_action(key_t key); action_t layer_switch_get_action(key_t key);

+ 4
- 0
common/bootmagic.c View File

#include "action_layer.h" #include "action_layer.h"
#include "eeconfig.h" #include "eeconfig.h"
#include "keymap_in_eeprom.h" #include "keymap_in_eeprom.h"
#include "ledmap_in_eeprom.h"
#include "bootmagic.h" #include "bootmagic.h"




eeconfig_init(); eeconfig_init();
#ifdef KEYMAP_IN_EEPROM_ENABLE #ifdef KEYMAP_IN_EEPROM_ENABLE
write_keymap_to_eeprom(); write_keymap_to_eeprom();
#endif
#ifdef LEDMAP_IN_EEPROM_ENABLE
write_ledmap_to_eeprom();
#endif #endif
} }



+ 9
- 0
common/keyboard.c View File

#else #else
#include "breathing_led.h" #include "breathing_led.h"
#endif #endif
#include "ledmap.h"
#include "ledmap_in_eeprom.h"
#include "keymap_in_eeprom.h" #include "keymap_in_eeprom.h"
#ifdef MOUSEKEY_ENABLE #ifdef MOUSEKEY_ENABLE
# include "mousekey.h" # include "mousekey.h"
bootmagic(); bootmagic();
#endif #endif


#ifdef LEDMAP_ENABLE
#ifdef LEDMAP_IN_EEPROM_ENABLE
ledmap_in_eeprom_init();
#endif
ledmap_init();
#endif

#ifdef BACKLIGHT_ENABLE #ifdef BACKLIGHT_ENABLE
backlight_init(); backlight_init();
#endif #endif

+ 26
- 0
common/led.h View File

#define LED_H #define LED_H
#include "stdint.h" #include "stdint.h"


#ifndef LED_COUNT
#define LED_COUNT 1
#endif

#if (LED_COUNT <= 8)
typedef uint8_t led_pack_t;
#elif (LED_COUNT <= 16)
typedef uint16_t led_pack_t;
#elif (LED_COUNT <= 32)
typedef uint32_t led_pack_t;
#else
#error "LED_COUNT: invalid value"
#endif

#if (LED_COUNT <= 16)
#define LED_BIT(i) (1U<<(i))
#elif (LED_COUNT <= 32)
#define LED_BIT(i) (1UL<<(i))
#else
#error "LED_COUNT: invalid value"
#endif

#define LED_BIT_SET(x, i) ((x) |= LED_BIT(i))
#define LED_BIT_CLEAR(x, i) ((x) &= ~LED_BIT(i))
#define LED_BIT_XOR(x, i) ((x) ^= LED_BIT(i))
#define LED_BIT_IS_SET(x, i) ((x) & LED_BIT(i))


/* keyboard LEDs */ /* keyboard LEDs */
#define USB_LED_NUM_LOCK 0 #define USB_LED_NUM_LOCK 0

+ 131
- 0
common/ledmap.c View File

#include "ledmap.h"
#include "ledmap_in_eeprom.h"
#include "led.h"
#include "softpwm_led.h"
#include "action_layer.h"
#include "debug.h"

static led_state_t led_state_last = 0;
static led_binding_t usb_led_binding = 0;
static led_binding_t default_layer_binding = 0;
static led_binding_t layer_binding = 0;
static led_binding_t backlight_binding = 0;

static void update_led_state(led_state_t state);

void ledmap_init(void)
{
for (uint8_t i = 0; i < LED_COUNT; i++) {
uint8_t code = ledmap_get_code(i);
if (code & LEDMAP_BACKLIGHT) {
LED_BIT_SET(backlight_binding, i);
}
code &= LEDMAP_MASK;
if (code >= LEDMAP_DEFAULT_LAYER_0 && code <= LEDMAP_DEFAULT_LAYER_31) {
LED_BIT_SET(default_layer_binding, i);
}
else if (code >= LEDMAP_LAYER_0 && code <= LEDMAP_LAYER_31) {
LED_BIT_SET(layer_binding, i);
}
else if (code >= LEDMAP_NUM_LOCK && code <= LEDMAP_KANA) {
LED_BIT_SET(usb_led_binding, i);
}
}
ledmap_led_init();
}

void led_set(uint8_t usb_led)
{
if (usb_led_binding) {
led_state_t led_state = led_state_last;
for (uint8_t i = 0; i < LED_COUNT; i++) {
if (usb_led_binding & LED_BIT(i)) {
uint8_t code = ledmap_get_code(i) & LEDMAP_MASK;
for (uint8_t j = USB_LED_NUM_LOCK; j <= USB_LED_KANA; j++) {
if (code - LEDMAP_NUM_LOCK == j) {
(usb_led & (1 << j)) ? LED_BIT_SET(led_state, i) : LED_BIT_CLEAR(led_state, i);
}
}
}
}
update_led_state(led_state);
}
}

#ifndef NO_ACTION_LAYER
void default_layer_state_change(uint32_t state)
{
if (default_layer_binding) {
led_state_t led_state = led_state_last;
for (uint8_t i = 0; i < LED_COUNT; i++) {
if (default_layer_binding & LED_BIT(i)) {
uint8_t code = ledmap_get_code(i) & LEDMAP_MASK;
(state & (1UL << (code - LEDMAP_DEFAULT_LAYER_0))) ? LED_BIT_SET(led_state, i) : LED_BIT_CLEAR(led_state, i);
}
}
update_led_state(led_state);
}
}

void layer_state_change(uint32_t state)
{
if (layer_binding) {
led_state_t led_state = led_state_last;
for (uint8_t i = 0; i < LED_COUNT; i++) {
if (layer_binding & LED_BIT(i)) {
uint8_t code = ledmap_get_code(i) & LEDMAP_MASK;
(state & (1UL << (code - LEDMAP_LAYER_0))) ? LED_BIT_SET(led_state, i) : LED_BIT_CLEAR(led_state, i);
}
}
update_led_state(led_state);
}
}
#endif

#ifdef SOFTPWM_LED_ENABLE
void softpwm_led_on(uint8_t index)
{
if (backlight_binding & LED_BIT(index)) {
ledmap_led_on(index);
}
}

void softpwm_led_off(uint8_t index)
{
if (backlight_binding & LED_BIT(index)) {
ledmap_led_off(index);
}
}

void softpwm_led_state_change(uint8_t state)
{
if (state) {
}
else {
led_state_t led_state = led_state_last;
led_state_last &= ~(backlight_binding);
update_led_state(led_state);
}
}
#endif

void update_led_state(led_state_t state)
{
uint8_t diff = led_state_last ^ state;
if (diff) {
for (uint8_t i = 0; i < LED_COUNT; i++) {
if (softpwm_led_get_state() && (backlight_binding & LED_BIT(i))) {
continue;
}
if (diff & LED_BIT(i)) {
if (state & LED_BIT(i)) {
ledmap_led_on(i);
}
else {
ledmap_led_off(i);
}
}
}
led_state_last = state;
}
}

+ 53
- 0
common/ledmap.h View File

#ifndef LEDMAP_H
#define LEDMAP_H

#include "stdint.h"
#include "stdbool.h"
#include "led.h"

typedef led_pack_t led_state_t;
typedef led_pack_t led_binding_t;

typedef enum {
LEDMAP_NO = 0,
LEDMAP_DEFAULT_LAYER_0,
LEDMAP_DEFAULT_LAYER_31 = LEDMAP_DEFAULT_LAYER_0 + 31,
LEDMAP_LAYER_0,
LEDMAP_LAYER_31 = LEDMAP_LAYER_0 + 31,
LEDMAP_NUM_LOCK,
LEDMAP_CAPS_LOCK,
LEDMAP_SCROLL_LOCK,
LEDMAP_COMPOSE,
LEDMAP_KANA,
LEDMAP_BACKLIGHT = 0x80
} ledmap_code_t;

#define LEDMAP_MASK 0x7F

typedef union {
uint8_t raw;
struct {
uint8_t binding : 7;
bool backlight : 1;
};
} ledmap_t;

#define LEDMAP_DEFAULT_LAYER(x) (LEDMAP_DEFAULT_LAYER_0 + x)
#define LEDMAP_LAYER(x) (LEDMAP_LAYER_0 + x)

void ledmap_init(void);

#ifdef LEDMAP_ENABLE
uint8_t ledmap_get_code(uint8_t index);
void ledmap_led_init(void);
void ledmap_led_on(uint8_t index);
void ledmap_led_off(uint8_t index);
#else
#define ledmaps
#define ledmap_get()
#define ledmap_led_init()
#define ledmap_led_on()
#define ledmap_led_off()
#endif

#endif

+ 36
- 0
common/ledmap_in_eeprom.c View File

#include <avr/pgmspace.h>
#include <avr/eeprom.h>
#include "ledmap.h"
#include "ledmap_in_eeprom.h"

#ifdef LEDMAP_IN_EEPROM_ENABLE

#undef ledmap_get_code

static uint8_t ledmap[LED_COUNT];

void ledmap_in_eeprom_init(void)
{
for (uint8_t i = 0; i < LED_COUNT; i++) {
ledmap[i] = eeprom_read_byte(EECONFIG_LEDMAP + i);
//ledmap[i] = LEDMAP_UNCONFIGURED;
if (ledmap[i] == LEDMAP_UNCONFIGURED) {
ledmap[i] = ledmap_get_code(i);
eeprom_write_byte(EECONFIG_LEDMAP + i, ledmap[i]);
}
}
}

void write_ledmap_to_eeprom(void)
{
for (uint8_t i = 0; i < LED_COUNT; i++) {
eeprom_write_byte(EECONFIG_LEDMAP + i, ledmap_get_code(i));
}
}

uint8_t ledmap_in_eeprom_get_code(uint8_t i)
{
return ledmap[i];
}

#endif

+ 24
- 0
common/ledmap_in_eeprom.h View File

#ifndef LEDMAP_IN_EEPROM_H
#define LEDMAP_IN_EEPROM_H

#ifndef EECONFIG_LEDMAP_IN_EEPROM
#define EECONFIG_LEDMAP_IN_EEPROM 7
#endif

#define EECONFIG_LEDMAP (uint8_t*)EECONFIG_LEDMAP_IN_EEPROM
#define LEDMAP_SIZE (sizeof(uint8_t) * LED_COUNT)

#define LEDMAP_UNCONFIGURED 0xFF

#ifdef LEDMAP_IN_EEPROM_ENABLE
#define ledmap_get_code ledmap_in_eeprom_get_code
void ledmap_in_eeprom_init(void);
void write_ledmap_to_eeprom(void);
uint8_t ledmap_in_eeprom_get_code(uint8_t index);
#else
#define ledmap_in_eeprom_init()
#define write_ledmap_to_eeprom()
#define ledmap_in_eeprom_get_code()
#endif

#endif

+ 94
- 39
common/softpwm_led.c View File

#define SOFTPWM_LED_FREQ 64 #define SOFTPWM_LED_FREQ 64
#define SOFTPWM_LED_TIMER_TOP F_CPU / (256 * SOFTPWM_LED_FREQ) #define SOFTPWM_LED_TIMER_TOP F_CPU / (256 * SOFTPWM_LED_FREQ)


uint8_t softpwm_ocr = 0;
uint8_t softpwm_ocr_buff = 0;
static uint8_t softpwm_led_state = 0;
static uint8_t softpwm_led_ocr[LED_COUNT] = {0};
static uint8_t softpwm_led_ocr_buff[LED_COUNT] = {0};


void softpwm_led_init(void) void softpwm_led_init(void)
{ {
/* Enable Compare Match Interrupt */ /* Enable Compare Match Interrupt */
#ifdef SOFTPWM_LED_TIMER3 #ifdef SOFTPWM_LED_TIMER3
TIMSK3 |= (1<<OCIE3A); TIMSK3 |= (1<<OCIE3A);
dprintf("softpwm led on: %u\n", TIMSK3 & (1<<OCIE3A));
//dprintf("softpwm led on: %u\n", TIMSK3 & (1<<OCIE3A));
#else #else
TIMSK1 |= (1<<OCIE1A); TIMSK1 |= (1<<OCIE1A);
dprintf("softpwm led on: %u\n", TIMSK1 & (1<<OCIE1A));
//dprintf("softpwm led on: %u\n", TIMSK1 & (1<<OCIE1A));
#endif
softpwm_led_state = 1;
#ifdef LEDMAP_ENABLE
softpwm_led_state_change(softpwm_led_state);
#endif #endif
} }


/* Disable Compare Match Interrupt */ /* Disable Compare Match Interrupt */
#ifdef SOFTPWM_LED_TIMER3 #ifdef SOFTPWM_LED_TIMER3
TIMSK3 &= ~(1<<OCIE3A); TIMSK3 &= ~(1<<OCIE3A);
dprintf("softpwm led off: %u\n", TIMSK3 & (1<<OCIE3A));
//dprintf("softpwm led off: %u\n", TIMSK3 & (1<<OCIE3A));
#else #else
TIMSK1 &= ~(1<<OCIE1A); TIMSK1 &= ~(1<<OCIE1A);
dprintf("softpwm led off: %u\n", TIMSK1 & (1<<OCIE1A));
//dprintf("softpwm led off: %u\n", TIMSK1 & (1<<OCIE1A));
#endif
softpwm_led_state = 0;
for (uint8_t i = 0; i < LED_COUNT; i++) {
softpwm_led_off(i);
}
#ifdef LEDMAP_ENABLE
softpwm_led_state_change(softpwm_led_state);
#endif #endif
} }


void softpwm_led_toggle(void) void softpwm_led_toggle(void)
{ {
/* Disable Compare Match Interrupt */
#ifdef SOFTPWM_LED_TIMER3
TIMSK3 ^= (1<<OCIE3A);
dprintf("softpwm led toggle: %u\n", TIMSK3 & (1<<OCIE3A));
#else
TIMSK1 ^= (1<<OCIE1A);
dprintf("softpwm led toggle: %u\n", TIMSK1 & (1<<OCIE1A));
#endif
if (softpwm_led_state) {
softpwm_led_disable();
}
else {
softpwm_led_enable();
}
} }


void softpwm_led_set(uint8_t val) {
softpwm_ocr_buff = val;
void softpwm_led_set(uint8_t index, uint8_t val)
{
softpwm_led_ocr_buff[index] = val;
}

void softpwm_led_set_all(uint8_t val)
{
for (uint8_t i = 0; i < LED_COUNT; i++) {
softpwm_led_ocr_buff[i] = val;
}
}

inline uint8_t softpwm_led_get_state(void)
{
return softpwm_led_state;
} }


#ifdef BREATHING_LED_ENABLE #ifdef BREATHING_LED_ENABLE
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 8, 8, 9, 10, 11, 11, 12, 13, 14, 15, 16, 17, 18, 19, 21, 22, 23, 25, 26, 27, 29, 30, 32, 34, 35, 37, 39, 41, 43, 45, 47, 49, 51, 53, 56, 58, 61, 63, 66, 68, 71, 74, 77, 80, 83, 86, 89, 92, 95, 98, 102, 105, 108, 112, 116, 119, 123, 126, 130, 134, 138, 142, 145, 149, 153, 157, 161, 165, 169, 173, 176, 180, 184, 188, 192, 195, 199, 203, 206, 210, 213, 216, 219, 223, 226, 228, 231, 234, 236, 239, 241, 243, 245, 247, 248, 250, 251, 252, 253, 254, 255, 255, 255, 255, 255, 255, 255, 254, 253, 252, 251, 250, 248, 247, 245, 243, 241, 239, 236, 234, 231, 228, 226, 223, 219, 216, 213, 210, 206, 203, 199, 195, 192, 188, 184, 180, 176, 173, 169, 165, 161, 157, 153, 149, 145, 142, 138, 134, 130, 126, 123, 119, 116, 112, 108, 105, 102, 98, 95, 92, 89, 86, 83, 80, 77, 74, 71, 68, 66, 63, 61, 58, 56, 53, 51, 49, 47, 45, 43, 41, 39, 37, 35, 34, 32, 30, 29, 27, 26, 25, 23, 22, 21, 19, 18, 17, 16, 15, 14, 13, 12, 11, 11, 10, 9, 8, 8, 7, 6, 6, 5, 5, 4, 4, 3, 3, 2, 2, 2, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 8, 8, 9, 10, 11, 11, 12, 13, 14, 15, 16, 17, 18, 19, 21, 22, 23, 25, 26, 27, 29, 30, 32, 34, 35, 37, 39, 41, 43, 45, 47, 49, 51, 53, 56, 58, 61, 63, 66, 68, 71, 74, 77, 80, 83, 86, 89, 92, 95, 98, 102, 105, 108, 112, 116, 119, 123, 126, 130, 134, 138, 142, 145, 149, 153, 157, 161, 165, 169, 173, 176, 180, 184, 188, 192, 195, 199, 203, 206, 210, 213, 216, 219, 223, 226, 228, 231, 234, 236, 239, 241, 243, 245, 247, 248, 250, 251, 252, 253, 254, 255, 255, 255, 255, 255, 255, 255, 254, 253, 252, 251, 250, 248, 247, 245, 243, 241, 239, 236, 234, 231, 228, 226, 223, 219, 216, 213, 210, 206, 203, 199, 195, 192, 188, 184, 180, 176, 173, 169, 165, 161, 157, 153, 149, 145, 142, 138, 134, 130, 126, 123, 119, 116, 112, 108, 105, 102, 98, 95, 92, 89, 86, 83, 80, 77, 74, 71, 68, 66, 63, 61, 58, 56, 53, 51, 49, 47, 45, 43, 41, 39, 37, 35, 34, 32, 30, 29, 27, 26, 25, 23, 22, 21, 19, 18, 17, 16, 15, 14, 13, 12, 11, 11, 10, 9, 8, 8, 7, 6, 6, 5, 5, 4, 4, 3, 3, 2, 2, 2, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0
}; };


static uint8_t breathing_led_state = 0;
static uint8_t breathing_led_duration = 0;
static led_state_t breathing_led_state = 0;
static uint8_t breathing_led_duration[LED_COUNT] = {0};


void breathing_led_enable(void)
void breathing_led_enable(uint8_t index)
{ {
breathing_led_state = 1;
LED_BIT_SET(breathing_led_state, index);
} }


void breathing_led_disable(void)
void breathing_led_enable_all(void)
{
for (uint8_t i = 0; i < LED_COUNT; i++) {
LED_BIT_SET(breathing_led_state, i);
}
}

void breathing_led_disable(uint8_t index)
{
LED_BIT_CLEAR(breathing_led_state, index);
}

void breathing_led_disable_all(void)
{ {
breathing_led_state = 0; breathing_led_state = 0;
} }


void breathing_led_toggle(void)
void breathing_led_toggle(uint8_t index)
{ {
breathing_led_state ^= 1;
LED_BIT_XOR(breathing_led_state, index);
} }


void breathing_led_set_duration(uint8_t dur)
void breathing_led_toggle_all(void)
{ {
breathing_led_duration = dur;
dprintf("breathing led set duration: %u\n", breathing_led_duration);
for (uint8_t i = 0; i < LED_COUNT; i++) {
LED_BIT_XOR(breathing_led_state, i);
}
}

void breathing_led_set_duration(uint8_t index, uint8_t dur)
{
breathing_led_duration[index] = dur;
//dprintf("breathing led set duration: %u\n", breathing_led_duration);
}

void breathing_led_set_duration_all(uint8_t dur)
{
for (uint8_t i = 0; i < LED_COUNT; i++) {
breathing_led_duration[i] = dur;
}
} }


#endif #endif
pwm++; pwm++;
// LED on // LED on
if (pwm == 0) { if (pwm == 0) {
softpwm_led_on();
softpwm_ocr = softpwm_ocr_buff;
for (uint8_t i = 0; i < LED_COUNT; i++) {
softpwm_led_on(i);
softpwm_led_ocr[i] = softpwm_led_ocr_buff[i];
}
} }
// LED off // LED off
if (pwm == softpwm_ocr) {
softpwm_led_off();
for (uint8_t i = 0; i < LED_COUNT; i++) {
if (pwm == softpwm_led_ocr[i]) {
softpwm_led_off(i);
}
} }


#ifdef BREATHING_LED_ENABLE #ifdef BREATHING_LED_ENABLE
static uint8_t count = 0; static uint8_t count = 0;
static uint8_t index = 0;
static uint8_t step = 0;
static uint8_t index[LED_COUNT] = {0};
static uint8_t step[LED_COUNT] = {0};
if (breathing_led_state) { if (breathing_led_state) {
count++;
if (count > SOFTPWM_LED_FREQ) {
if (++count > SOFTPWM_LED_FREQ) {
count = 0; count = 0;
step++;
if (step > breathing_led_duration) {
step = 0;
softpwm_ocr_buff = pgm_read_byte(&breathing_table[index]);
index++;
for (uint8_t i = 0; i < LED_COUNT; i++) {
if (breathing_led_state & LED_BIT(i)) {
if (++step[i] > breathing_led_duration[i]) {
step[i] = 0;
softpwm_led_ocr_buff[i] = pgm_read_byte(&breathing_table[index[i]]);
index[i]++;
}
}
} }
} }
} }

+ 26
- 7
common/softpwm_led.h View File

#ifndef SOFTPWM_LED_H #ifndef SOFTPWM_LED_H
#define SOFTPWM_LED_H #define SOFTPWM_LED_H


#include "stdint.h"
#include "led.h"

typedef led_pack_t led_state_t;

#ifdef SOFTPWM_LED_ENABLE #ifdef SOFTPWM_LED_ENABLE


void softpwm_led_init(void); void softpwm_led_init(void);
void softpwm_led_enable(void); void softpwm_led_enable(void);
void softpwm_led_disable(void); void softpwm_led_disable(void);
void softpwm_led_toggle(void); void softpwm_led_toggle(void);
void softpwm_led_set(uint8_t val);
void softpwm_led_on(void);
void softpwm_led_off(void);
void softpwm_led_set(uint8_t index, uint8_t val);
void softpwm_led_set_all(uint8_t val);
void softpwm_led_on(uint8_t index);
void softpwm_led_off(uint8_t index);
uint8_t softpwm_led_get_state(void);
void softpwm_led_state_change(uint8_t state);


#ifdef BREATHING_LED_ENABLE #ifdef BREATHING_LED_ENABLE
#define breathing_led_init() #define breathing_led_init()
void breathing_led_enable(void);
void breathing_led_disable(void);
void breathing_led_toggle(void);
void breathing_led_set_duration(uint8_t dur);
void breathing_led_enable(uint8_t index);
void breathing_led_enable_all(void);
void breathing_led_disable(uint8_t index);
void breathing_led_disable_all(void);
void breathing_led_toggle(uint8_t index);
void breathing_led_toggle_all(void);
void breathing_led_set_duration(uint8_t index, uint8_t dur);
void breathing_led_set_duration_all(uint8_t dur);
#else #else
#define breathing_led_init() #define breathing_led_init()
#define breathing_led_enable() #define breathing_led_enable()
#define breathing_led_enable_all()
#define breathing_led_disable() #define breathing_led_disable()
#define breathing_led_disable_all()
#define breathing_led_toggle() #define breathing_led_toggle()
#define breathing_led_toggle_all()
#define breathing_led_set_duration() #define breathing_led_set_duration()
#define breathing_led_set_duration_all()
#endif #endif


#else #else
#define softpwm_led_disable() #define softpwm_led_disable()
#define softpwm_led_toggle() #define softpwm_led_toggle()
#define softpwm_led_set() #define softpwm_led_set()
#define softpwm_led_set_all()
#define softpwm_led_on() #define softpwm_led_on()
#define softpwm_led_off() #define softpwm_led_off()
#define softpwm_led_get_state()
#define softpwm_led_state_change()


#endif #endif



+ 4
- 2
keyboard/gh60/Makefile View File

# project specific files # project specific files
SRC = keymap_common.c \ SRC = keymap_common.c \
matrix.c \ matrix.c \
led.c \
backlight.c \ backlight.c \
ledmap.c \
led_matrix.c led_matrix.c


ifdef KEYMAP ifdef KEYMAP
#PS2_USE_BUSYWAIT = yes #PS2_USE_BUSYWAIT = yes
BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
KEYMAP_IN_EEPROM_ENABLE = yes # Read keymap from eeprom KEYMAP_IN_EEPROM_ENABLE = yes # Read keymap from eeprom
KEYMAP_SECTION_ENABLE = yes # Fixed address keymap for keymap editor
#KEYMAP_SECTION_ENABLE = yes # Fixed address keymap for keymap editor
SOFTPWM_LED_ENABLE = yes # Enable SoftPWM to drive backlight SOFTPWM_LED_ENABLE = yes # Enable SoftPWM to drive backlight
BREATHING_LED_ENABLE = yes # Enable breathing backlight BREATHING_LED_ENABLE = yes # Enable breathing backlight
LEDMAP_ENABLE = yes # Enable LED mapping
LEDMAP_IN_EEPROM_ENABLE = yes # Read LED mapping from eeprom




# Optimize size but this may cause error "relocation truncated to fit" # Optimize size but this may cause error "relocation truncated to fit"

+ 20
- 15
keyboard/gh60/backlight.c View File

void backlight_enable(void) void backlight_enable(void)
{ {
#ifdef SOFTPWM_LED_ENABLE #ifdef SOFTPWM_LED_ENABLE
#if defined(GH60_REV_CHN)
DDRB |= (1<<PB6);
PORTB &= ~(1<<PB6);
#else
DDRF |= (1<<PF7 | 1<<PF6 | 1<<PF5 | 1<<PF4);
PORTF |= (1<<PF7 | 1<<PF6 | 1<<PF5 | 1<<PF4);
#endif
softpwm_led_enable(); softpwm_led_enable();
#else #else
#if defined(GH60_REV_CHN) #if defined(GH60_REV_CHN)
{ {
#ifdef SOFTPWM_LED_ENABLE #ifdef SOFTPWM_LED_ENABLE
softpwm_led_disable(); softpwm_led_disable();
#if defined(GH60_REV_CHN)
DDRB &= ~(1<<PB6);
#else
DDRF &= ~(1<<PF7 | 1<<PF6 | 1<<PF5 | 1<<PF4);
#endif
#else #else
#if defined(GH60_REV_CHN) #if defined(GH60_REV_CHN)
// Turn off PWM // Turn off PWM
case 2: case 2:
case 3: case 3:
backlight_enable(); backlight_enable();
#ifdef SOFTPWM_LED_ENABLE
breathing_led_disable_all();
#else
breathing_led_disable(); breathing_led_disable();
#endif
backlight_set_raw(pgm_read_byte(&backlight_table[level])); backlight_set_raw(pgm_read_byte(&backlight_table[level]));
break; break;
case 4: case 4:
case 5: case 5:
case 6: case 6:
backlight_enable(); backlight_enable();
#ifdef SOFTPWM_LED_ENABLE
breathing_led_enable_all();
breathing_led_set_duration_all(6 - level);
#else
breathing_led_enable(); breathing_led_enable();
breathing_led_set_duration(6 - level); breathing_led_set_duration(6 - level);
#endif
break; break;
case 0: case 0:
default: default:
#ifdef SOFTPWM_LED_ENABLE
breathing_led_disable_all();
#else
breathing_led_disable(); breathing_led_disable();
#endif
backlight_disable(); backlight_disable();
break; break;
} }
inline void backlight_set_raw(uint8_t raw) inline void backlight_set_raw(uint8_t raw)
{ {
#ifdef SOFTPWM_LED_ENABLE #ifdef SOFTPWM_LED_ENABLE
softpwm_led_set(raw);
for (uint8_t i = 0; i < LED_COUNT; i++) {
softpwm_led_set(i, raw);
}
#else #else
#if defined(GH60_REV_CHN) #if defined(GH60_REV_CHN)
OCR1B = raw; OCR1B = raw;
} }


#ifdef SOFTPWM_LED_ENABLE #ifdef SOFTPWM_LED_ENABLE
#ifndef LEDMAP_ENABLE


void softpwm_led_on(void)
void softpwm_led_on(uint8_t index)
{ {
#if defined(GH60_REV_CHN) #if defined(GH60_REV_CHN)
PORTB |= (1<<PB6); PORTB |= (1<<PB6);
#endif #endif
} }


void softpwm_led_off(void)
void softpwm_led_off(uint8_t index)
{ {
#if defined(GH60_REV_CHN) #if defined(GH60_REV_CHN)
PORTB &= ~(1<<PB6); PORTB &= ~(1<<PB6);
} }


#endif #endif
#endif




#ifndef SOFTPWM_LED_ENABLE #ifndef SOFTPWM_LED_ENABLE

+ 9
- 0
keyboard/gh60/config.h View File

#define LED_MATRIX_COLS 14 #define LED_MATRIX_COLS 14
#endif #endif


/* LED mapping */
#ifdef LEDMAP_ENABLE
#if defined(GH60_REV_CHN)
#define LED_COUNT 2
#else
#define LED_COUNT 5
#endif
#endif

/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ /* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
#define LOCKING_SUPPORT_ENABLE #define LOCKING_SUPPORT_ENABLE



+ 2
- 0
keyboard/gh60/led.c View File

#include "led.h" #include "led.h"




#ifndef LEDMAP_ENABLE
void led_set(uint8_t usb_led) void led_set(uint8_t usb_led)
{ {
if (usb_led & (1<<USB_LED_CAPS_LOCK)) { if (usb_led & (1<<USB_LED_CAPS_LOCK)) {
PORTB &= ~(1<<2); PORTB &= ~(1<<2);
} }
} }
#endif

+ 103
- 0
keyboard/gh60/ledmap.c View File

#include <avr/pgmspace.h>
#include "ledmap.h"
#include "debug.h"


#ifdef LEDMAP_ENABLE

static const uint8_t ledmaps[LED_COUNT] PROGMEM = {
#if defined(GH60_REV_CHN)
[0] = LEDMAP_CAPS_LOCK | LEDMAP_BACKLIGHT, // CapsLock - PB2
[1] = LEDMAP_LAYER(1) | LEDMAP_BACKLIGHT, // PWM - PB6
#else
[0] = LEDMAP_CAPS_LOCK | LEDMAP_BACKLIGHT, // CapsLock - PB2
[1] = LEDMAP_BACKLIGHT, // Esc - GPIO1 - PF6
[2] = LEDMAP_LAYER(1) | LEDMAP_BACKLIGHT, // WASD - GPIO0 - PF7
[3] = LEDMAP_LAYER(2) | LEDMAP_BACKLIGHT, // Sh/Al/Ct - GPIO3 - PF4
[4] = LEDMAP_LAYER(1) | LEDMAP_BACKLIGHT, // Fn - GPIO2 - PF5
#endif
};

uint8_t ledmap_get_code(uint8_t index)
{
return pgm_read_byte(&ledmaps[index]);
}

void ledmap_led_init(void)
{
DDRB |= (1<<PB2);
PORTB |= (1<<PB2);
#if defined(GH60_REV_CHN)
DDRB |= (1<<PB6);
PORTB &= ~(1<<PB6);
#else
DDRF |= (1<<PF7 | 1<<PF6 | 1<<PF5 | 1<<PF4);
PORTF |= (1<<PF7 | 1<<PF6 | 1<<PF5 | 1<<PF4);
#endif
}

void ledmap_led_on(uint8_t index)
{
#if defined(GH60_REV_CHN)
switch (index) {
case 0:
PORTB &= ~(1<<PB2);
break;
case 1:
PORTB |= (1<<PB6);
break;
}
#else
switch (index) {
case 0:
PORTB &= ~(1<<PB2);
break;
case 1:
PORTF &= ~(1<<PF6);
break;
case 2:
PORTF &= ~(1<<PF7);
break;
case 3:
PORTF &= ~(1<<PF4);
break;
case 4:
PORTF &= ~(1<<PF5);
break;
}
#endif
}

void ledmap_led_off(uint8_t index)
{
#if defined(GH60_REV_CHN)
switch (index) {
case 0:
PORTB |= (1<<PB2);
break;
case 1:
PORTB &= ~(1<<PB6);
break;
}
#else
switch (index) {
case 0:
PORTB |= (1<<PB2);
break;
case 1:
PORTF |= (1<<PF6);
break;
case 2:
PORTF |= (1<<PF7);
break;
case 3:
PORTF |= (1<<PF4);
break;
case 4:
PORTF |= (1<<PF5);
break;
}
#endif
}

#endif