From 15b9bce6bab13d85529fe9aaa91b3df9cd773e13 Mon Sep 17 00:00:00 2001 From: Wilba6582 Date: Tue, 17 Mar 2015 00:43:37 +1100 Subject: [PATCH 1/3] Initial commit for Planck PCB Rev 1. - Backlight on PB7 controlled by Timer1 Fast PWM (no interrupts). - Backlight commands connected temporarily to top left keys. - Backlight init called from matrix.c, since there's no generic keyboard_init() override function. --- keyboard/planck/Makefile | 6 ++- keyboard/planck/config.h | 4 ++ keyboard/planck/keymap_wilba.c | 56 +++++++++++++++++++++++++ keyboard/planck/led.c | 22 +++++----- keyboard/planck/matrix.c | 74 +++++++++++++++++++++++----------- 5 files changed, 127 insertions(+), 35 deletions(-) create mode 100644 keyboard/planck/keymap_wilba.c diff --git a/keyboard/planck/Makefile b/keyboard/planck/Makefile index c456cb51b..001f17f31 100644 --- a/keyboard/planck/Makefile +++ b/keyboard/planck/Makefile @@ -50,7 +50,8 @@ TARGET_DIR = . # project specific files SRC = keymap_common.c \ matrix.c \ - led.c + led.c \ + backlight.c ifdef KEYMAP SRC := keymap_$(KEYMAP).c $(SRC) @@ -118,9 +119,10 @@ MOUSEKEY_ENABLE = yes # Mouse keys(+4700) EXTRAKEY_ENABLE = yes # Audio control and System control(+450) CONSOLE_ENABLE = yes # Console for debug(+400) COMMAND_ENABLE = yes # Commands for debug and configuration +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE #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 # Optimize size but this may cause error "relocation truncated to fit" #EXTRALDFLAGS = -Wl,--relax diff --git a/keyboard/planck/config.h b/keyboard/planck/config.h index 81637f45b..0b0c15247 100644 --- a/keyboard/planck/config.h +++ b/keyboard/planck/config.h @@ -34,6 +34,10 @@ along with this program. If not, see . /* define if matrix has ghost */ //#define MATRIX_HAS_GHOST +/* number of backlight levels */ +/* NOTE: this is the max value of 0..BACKLIGHT_LEVELS so really 16 levels. */ +#define BACKLIGHT_LEVELS 15 + /* Set 0 if debouncing isn't needed */ #define DEBOUNCE 5 diff --git a/keyboard/planck/keymap_wilba.c b/keyboard/planck/keymap_wilba.c new file mode 100644 index 000000000..696fda42e --- /dev/null +++ b/keyboard/planck/keymap_wilba.c @@ -0,0 +1,56 @@ +#include "keymap_common.h" + +const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[0] = KEYMAP( /* Wilba */ + FN27, FN28, FN29, E, R, T, Y, U, I, O, P, BSPC, + TAB, A, S, D, F, G, H, J, K, L, SCLN, QUOT, + LSFT, Z, X, C, V, B, N, M, COMM, DOT, SLSH, ENT, + LCTL, LGUI, LALT, RSFT, FN1, SPC, FN2, LEFT, DOWN, UP, RGHT), +[1] = KEYMAP( /* Wilba Alternate */ + ESC, Q, W, E, R, T, Y, U, I, O, P, BSPC, + TAB, A, S, D, F, G, H, J, K, L, SCLN, QUOT, + LSFT, Z, X, C, V, B, N, M, COMM, DOT, SLSH, ENT, + LCTL, LGUI, LALT, RSFT, FN1, SPC, FN2, LEFT, DOWN, UP, RGHT), +[2] = KEYMAP( /* Wilba LOWER */ + TRNS, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, TRNS, + TRNS, F11, F12, LBRC, RBRC, FN20, EQL, FN23, FN24, MINS, FN21, TRNS, + TRNS, BSLS, GRV, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, + TRNS, TRNS, TRNS, TRNS, FN1, TRNS, TRNS, MNXT, VOLD, VOLU, MPLY), +[3] = KEYMAP( /* Wilba RAISE */ + TRNS, FN10, FN11, FN12, FN13, FN14, FN15, FN16, FN17, FN18, FN19, TRNS, + TRNS, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, TRNS, + TRNS, FN25, FN22, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, + TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, FN2, TRNS, TRNS, TRNS, TRNS), +}; +const uint16_t PROGMEM fn_actions[] = { + [1] = ACTION_LAYER_MOMENTARY(2), // LOWER + [2] = ACTION_LAYER_MOMENTARY(3), // RAISE + + [3] = ACTION_DEFAULT_LAYER_SET(0), + [4] = ACTION_DEFAULT_LAYER_SET(1), + + [10] = ACTION_MODS_KEY(MOD_LSFT, KC_1), // ! + [11] = ACTION_MODS_KEY(MOD_LSFT, KC_2), // @ + [12] = ACTION_MODS_KEY(MOD_LSFT, KC_3), // # + [13] = ACTION_MODS_KEY(MOD_LSFT, KC_4), // $ + [14] = ACTION_MODS_KEY(MOD_LSFT, KC_5), // % + [15] = ACTION_MODS_KEY(MOD_LSFT, KC_6), // ^ + [16] = ACTION_MODS_KEY(MOD_LSFT, KC_7), // & + [17] = ACTION_MODS_KEY(MOD_LSFT, KC_8), // * + [18] = ACTION_MODS_KEY(MOD_LSFT, KC_9), // ( + [19] = ACTION_MODS_KEY(MOD_LSFT, KC_0), // ) + + [20] = ACTION_MODS_KEY(MOD_LSFT, KC_MINS), // _ + [21] = ACTION_MODS_KEY(MOD_LSFT, KC_EQL), // + + [22] = ACTION_MODS_KEY(MOD_LSFT, KC_GRV), // ~ + [23] = ACTION_MODS_KEY(MOD_LSFT, KC_LBRC), // { + [24] = ACTION_MODS_KEY(MOD_LSFT, KC_RBRC), // } + [25] = ACTION_MODS_KEY(MOD_LSFT, KC_BSLS), // | + + [26] = ACTION_MODS_KEY(MOD_LSFT | MOD_RSFT, KC_PAUSE), + + [27] = ACTION_BACKLIGHT_TOGGLE(), + [28] = ACTION_BACKLIGHT_INCREASE(), + [29] = ACTION_BACKLIGHT_DECREASE() + +}; diff --git a/keyboard/planck/led.c b/keyboard/planck/led.c index 6cffd5ea7..448df2ccf 100644 --- a/keyboard/planck/led.c +++ b/keyboard/planck/led.c @@ -22,13 +22,17 @@ along with this program. If not, see . void led_set(uint8_t usb_led) { - // if (usb_led & (1<. #include "debug.h" #include "util.h" #include "matrix.h" +#include "backlight.h" // TODO fix this dependency #ifndef DEBOUNCE @@ -57,6 +58,13 @@ uint8_t matrix_cols(void) void matrix_init(void) { + // To use PORTF disable JTAG with writing JTD bit twice within four cycles. + MCUCR |= (1< Date: Tue, 17 Mar 2015 00:51:36 +1100 Subject: [PATCH 2/3] Added backlight.h, backlight.c --- keyboard/planck/backlight.c | 46 +++++++++++++++++++++++++++++++++++++ keyboard/planck/backlight.h | 2 ++ 2 files changed, 48 insertions(+) create mode 100644 keyboard/planck/backlight.c create mode 100644 keyboard/planck/backlight.h diff --git a/keyboard/planck/backlight.c b/keyboard/planck/backlight.c new file mode 100644 index 000000000..d12dcf238 --- /dev/null +++ b/keyboard/planck/backlight.c @@ -0,0 +1,46 @@ + +#include +#include "backlight.h" + + +void backlight_init_ports() +{ + // Setup PB7 as output and output low. + DDRB |= (1<<7); + PORTB &= ~(1<<7); + + // Use full 16-bit resolution. + ICR1 = 0xFFFF; + + // I could write a wall of text here to explain... but TL;DW + // Go read the ATmega32u4 datasheet. + // And this: http://blog.saikoled.com/post/43165849837/secret-konami-cheat-code-to-high-resolution-pwm-on + + // Pin PB7 = OCR1C (Timer 1, Channel C) + // Compare Output Mode = Clear on compare match, Channel C = COM1C1=1 COM1C0=0 + // (i.e. start high, go low when counter matches.) + // WGM Mode 14 (Fast PWM) = WGM13=1 WGM12=1 WGM11=1 WGM10=0 + // Clock Select = clk/1 (no prescaling) = CS12=0 CS11=0 CS10=1 + + TCCR1A = _BV(COM1C1) | _BV(WGM11); // = 0b00001010; + TCCR1B = _BV(WGM13) | _BV(WGM12) | _BV(CS10); // = 0b00011001; + + // Default to zero duty cycle. + OCR1C = 0x0000; +} + +void backlight_set(uint8_t level) +{ + if ( level == 0 ) + { + // Turn off PWM control on PB7, revert to output low. + TCCR1A &= ~(_BV(COM1C1)); + } + else + { + // Turn on PWM control of PB7 + TCCR1A |= _BV(COM1C1); + OCR1C = level << 12 | 0x0FFF; + } +} + diff --git a/keyboard/planck/backlight.h b/keyboard/planck/backlight.h new file mode 100644 index 000000000..0fe1f4a72 --- /dev/null +++ b/keyboard/planck/backlight.h @@ -0,0 +1,2 @@ + +void backlight_init_ports(void); From 65680819df13585a563296f008be1a4b0ee8045a Mon Sep 17 00:00:00 2001 From: Wilba6582 Date: Tue, 17 Mar 2015 00:56:41 +1100 Subject: [PATCH 3/3] Replaced tabs with spaces to match TMK convention. --- keyboard/planck/backlight.c | 64 +++++++++++++++++----------------- keyboard/planck/keymap_wilba.c | 12 +++---- keyboard/planck/led.c | 4 +-- keyboard/planck/matrix.c | 6 ++-- 4 files changed, 43 insertions(+), 43 deletions(-) diff --git a/keyboard/planck/backlight.c b/keyboard/planck/backlight.c index d12dcf238..ee7e31ee9 100644 --- a/keyboard/planck/backlight.c +++ b/keyboard/planck/backlight.c @@ -5,42 +5,42 @@ void backlight_init_ports() { - // Setup PB7 as output and output low. - DDRB |= (1<<7); - PORTB &= ~(1<<7); - - // Use full 16-bit resolution. - ICR1 = 0xFFFF; + // Setup PB7 as output and output low. + DDRB |= (1<<7); + PORTB &= ~(1<<7); + + // Use full 16-bit resolution. + ICR1 = 0xFFFF; - // I could write a wall of text here to explain... but TL;DW - // Go read the ATmega32u4 datasheet. - // And this: http://blog.saikoled.com/post/43165849837/secret-konami-cheat-code-to-high-resolution-pwm-on - - // Pin PB7 = OCR1C (Timer 1, Channel C) - // Compare Output Mode = Clear on compare match, Channel C = COM1C1=1 COM1C0=0 - // (i.e. start high, go low when counter matches.) - // WGM Mode 14 (Fast PWM) = WGM13=1 WGM12=1 WGM11=1 WGM10=0 - // Clock Select = clk/1 (no prescaling) = CS12=0 CS11=0 CS10=1 - - TCCR1A = _BV(COM1C1) | _BV(WGM11); // = 0b00001010; - TCCR1B = _BV(WGM13) | _BV(WGM12) | _BV(CS10); // = 0b00011001; - - // Default to zero duty cycle. - OCR1C = 0x0000; + // I could write a wall of text here to explain... but TL;DW + // Go read the ATmega32u4 datasheet. + // And this: http://blog.saikoled.com/post/43165849837/secret-konami-cheat-code-to-high-resolution-pwm-on + + // Pin PB7 = OCR1C (Timer 1, Channel C) + // Compare Output Mode = Clear on compare match, Channel C = COM1C1=1 COM1C0=0 + // (i.e. start high, go low when counter matches.) + // WGM Mode 14 (Fast PWM) = WGM13=1 WGM12=1 WGM11=1 WGM10=0 + // Clock Select = clk/1 (no prescaling) = CS12=0 CS11=0 CS10=1 + + TCCR1A = _BV(COM1C1) | _BV(WGM11); // = 0b00001010; + TCCR1B = _BV(WGM13) | _BV(WGM12) | _BV(CS10); // = 0b00011001; + + // Default to zero duty cycle. + OCR1C = 0x0000; } void backlight_set(uint8_t level) { - if ( level == 0 ) - { - // Turn off PWM control on PB7, revert to output low. - TCCR1A &= ~(_BV(COM1C1)); - } - else - { - // Turn on PWM control of PB7 - TCCR1A |= _BV(COM1C1); - OCR1C = level << 12 | 0x0FFF; - } + if ( level == 0 ) + { + // Turn off PWM control on PB7, revert to output low. + TCCR1A &= ~(_BV(COM1C1)); + } + else + { + // Turn on PWM control of PB7 + TCCR1A |= _BV(COM1C1); + OCR1C = level << 12 | 0x0FFF; + } } diff --git a/keyboard/planck/keymap_wilba.c b/keyboard/planck/keymap_wilba.c index 696fda42e..9781f8fcd 100644 --- a/keyboard/planck/keymap_wilba.c +++ b/keyboard/planck/keymap_wilba.c @@ -39,7 +39,7 @@ const uint16_t PROGMEM fn_actions[] = { [17] = ACTION_MODS_KEY(MOD_LSFT, KC_8), // * [18] = ACTION_MODS_KEY(MOD_LSFT, KC_9), // ( [19] = ACTION_MODS_KEY(MOD_LSFT, KC_0), // ) - + [20] = ACTION_MODS_KEY(MOD_LSFT, KC_MINS), // _ [21] = ACTION_MODS_KEY(MOD_LSFT, KC_EQL), // + [22] = ACTION_MODS_KEY(MOD_LSFT, KC_GRV), // ~ @@ -48,9 +48,9 @@ const uint16_t PROGMEM fn_actions[] = { [25] = ACTION_MODS_KEY(MOD_LSFT, KC_BSLS), // | [26] = ACTION_MODS_KEY(MOD_LSFT | MOD_RSFT, KC_PAUSE), - - [27] = ACTION_BACKLIGHT_TOGGLE(), - [28] = ACTION_BACKLIGHT_INCREASE(), - [29] = ACTION_BACKLIGHT_DECREASE() - + + [27] = ACTION_BACKLIGHT_TOGGLE(), + [28] = ACTION_BACKLIGHT_INCREASE(), + [29] = ACTION_BACKLIGHT_DECREASE() + }; diff --git a/keyboard/planck/led.c b/keyboard/planck/led.c index 448df2ccf..1f3643488 100644 --- a/keyboard/planck/led.c +++ b/keyboard/planck/led.c @@ -22,8 +22,8 @@ along with this program. If not, see . void led_set(uint8_t usb_led) { - // Using PE6 Caps Lock LED - if (usb_led & (1<