diff options
Diffstat (limited to 'keyboard/planck')
-rw-r--r-- | keyboard/planck/Makefile | 6 | ||||
-rw-r--r-- | keyboard/planck/backlight.c | 46 | ||||
-rw-r--r-- | keyboard/planck/backlight.h | 2 | ||||
-rw-r--r-- | keyboard/planck/config.h | 4 | ||||
-rw-r--r-- | keyboard/planck/keymap_wilba.c | 56 | ||||
-rw-r--r-- | keyboard/planck/led.c | 22 | ||||
-rw-r--r-- | keyboard/planck/matrix.c | 74 |
7 files changed, 175 insertions, 35 deletions
diff --git a/keyboard/planck/Makefile b/keyboard/planck/Makefile index c456cb51b3..001f17f316 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/backlight.c b/keyboard/planck/backlight.c new file mode 100644 index 0000000000..ee7e31ee9c --- /dev/null +++ b/keyboard/planck/backlight.c @@ -0,0 +1,46 @@ + +#include <avr/io.h> +#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 0000000000..0fe1f4a72b --- /dev/null +++ b/keyboard/planck/backlight.h @@ -0,0 +1,2 @@ + +void backlight_init_ports(void); diff --git a/keyboard/planck/config.h b/keyboard/planck/config.h index 81637f45b2..0b0c152479 100644 --- a/keyboard/planck/config.h +++ b/keyboard/planck/config.h @@ -34,6 +34,10 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. /* 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 0000000000..9781f8fcd8 --- /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 6cffd5ea7b..1f36434883 100644 --- a/keyboard/planck/led.c +++ b/keyboard/planck/led.c @@ -22,13 +22,17 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. void led_set(uint8_t usb_led) { - // if (usb_led & (1<<USB_LED_FUNCTION)) { - // // Output high. - // DDRF |= (1<<0); - // PORTF |= (1<<0); - // } else { - // // Output low. - // DDRF &= ~(1<<0); - // PORTF &= ~(1<<0); - // } + // Using PE6 Caps Lock LED + if (usb_led & (1<<USB_LED_CAPS_LOCK)) + { + // Output high. + DDRE |= (1<<6); + PORTE |= (1<<6); + } + else + { + // Output low. + DDRE &= ~(1<<6); + PORTE &= ~(1<<6); + } } diff --git a/keyboard/planck/matrix.c b/keyboard/planck/matrix.c index 38d35e3e07..e3926caece 100644 --- a/keyboard/planck/matrix.c +++ b/keyboard/planck/matrix.c @@ -27,6 +27,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. #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<<JTD); + MCUCR |= (1<<JTD); + + // TODO fix this dependency + backlight_init_ports(); + // initialize row and col unselect_rows(); init_cols(); @@ -134,10 +142,19 @@ uint8_t matrix_key_count(void) return count; } +// +// Planck PCB Rev 1 Pin Assignments +// +// Column: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 +// Pin: F1, F0, B0, C7, F4, F5, F6, F7, D4, D6, B4, D7 +// + static void init_cols(void) { - DDRB &= ~(1<<6 | 1<<5 | 1<<4); - PORTB |= (1<<6 | 1<<5 | 1<<4); + DDRB &= ~(1<<4 | 1<<0); + PORTB |= (1<<4 | 1<<0); + DDRC &= ~(1<<7); + PORTC |= (1<<7); DDRD &= ~(1<<7 | 1<<6 | 1<<4); PORTD |= (1<<7 | 1<<6 | 1<<4); DDRF &= ~(1<<0 | 1<<1 | 1<<4 | 1<<5 | 1<<6 | 1<<7); @@ -147,46 +164,55 @@ static void init_cols(void) static matrix_row_t read_cols(void) { - return (PIND&(1<<4) ? 0 : (1<<0)) | - (PIND&(1<<6) ? 0 : (1<<1)) | - (PIND&(1<<7) ? 0 : (1<<2)) | - (PINB&(1<<4) ? 0 : (1<<3)) | - (PINB&(1<<5) ? 0 : (1<<4)) | - (PINB&(1<<6) ? 0 : (1<<5)) | - (PINF&(1<<7) ? 0 : (1<<6)) | - (PINF&(1<<6) ? 0 : (1<<7)) | - (PINF&(1<<5) ? 0 : (1<<8)) | - (PINF&(1<<4) ? 0 : (1<<9)) | - (PINF&(1<<1) ? 0 : (1<<10)) | - (PINF&(1<<0) ? 0 : (1<<11)); + return (PINF&(1<<1) ? 0 : (1<<0)) | + (PINF&(1<<0) ? 0 : (1<<1)) | + (PINB&(1<<0) ? 0 : (1<<2)) | + (PINC&(1<<7) ? 0 : (1<<3)) | + (PINF&(1<<4) ? 0 : (1<<4)) | + (PINF&(1<<5) ? 0 : (1<<5)) | + (PINF&(1<<6) ? 0 : (1<<6)) | + (PINF&(1<<7) ? 0 : (1<<7)) | + (PIND&(1<<4) ? 0 : (1<<8)) | + (PIND&(1<<6) ? 0 : (1<<9)) | + (PINB&(1<<4) ? 0 : (1<<10)) | + (PIND&(1<<7) ? 0 : (1<<11)); } static void unselect_rows(void) { - DDRB &= ~(1<<0 | 1<<1 | 1<<2 | 1<<3); - PORTB |= (1<<0 | 1<<1 | 1<<2 | 1<<3); + DDRB &= ~(1<<5 | 1<<6); + PORTB |= (1<<5 | 1<<6); + DDRD &= ~(1<<0 | 1<<5); + PORTD |= (1<<0 | 1<<5); } +// +// Planck PCB Rev 1 Pin Assignments +// +// Row: 0, 1, 2, 3 +// Pin: D0, D5, B5, B6 +// + static void select_row(uint8_t row) { switch (row) { case 0: - DDRB |= (1<<0); - PORTB &= ~(1<<0); + DDRD |= (1<<0); + PORTD &= ~(1<<0); break; case 1: - DDRB |= (1<<1); - PORTB &= ~(1<<1); + DDRD |= (1<<5); + PORTD &= ~(1<<5); break; case 2: - DDRB |= (1<<2); - PORTB &= ~(1<<2); + DDRB |= (1<<5); + PORTB &= ~(1<<5); break; case 3: - DDRB |= (1<<3); - PORTB &= ~(1<<3); + DDRB |= (1<<6); + PORTB &= ~(1<<6); break; } |