diff options
Diffstat (limited to 'keyboard/planck')
-rw-r--r-- | keyboard/planck/Makefile | 6 | ||||
-rw-r--r-- | keyboard/planck/config.h | 5 | ||||
-rw-r--r-- | keyboard/planck/config_definitions.h | 50 | ||||
-rw-r--r-- | keyboard/planck/extended_keymaps/extended_keymap_default.c | 15 | ||||
-rw-r--r-- | keyboard/planck/matrix.c | 235 |
5 files changed, 297 insertions, 14 deletions
diff --git a/keyboard/planck/Makefile b/keyboard/planck/Makefile index 7ea71af512..ad25854e6d 100644 --- a/keyboard/planck/Makefile +++ b/keyboard/planck/Makefile @@ -60,8 +60,7 @@ ifdef COMMON SRC = keymap_common.c \ $(MATRIX) \ led.c \ - backlight.c \ - beeps.c + backlight.c ifdef KEYMAP SRC := common_keymaps/keymap_$(KEYMAP).c $(SRC) @@ -74,8 +73,7 @@ else SRC = extended_keymap_common.c \ $(MATRIX) \ led.c \ - backlight.c \ - beeps.c + backlight.c ifdef KEYMAP SRC := extended_keymaps/extended_keymap_$(KEYMAP).c $(SRC) diff --git a/keyboard/planck/config.h b/keyboard/planck/config.h index 4ac9f766e6..47cf39a903 100644 --- a/keyboard/planck/config.h +++ b/keyboard/planck/config.h @@ -18,6 +18,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. #ifndef CONFIG_H #define CONFIG_H +#include "config_definitions.h" /* USB Device descriptor parameter */ #define VENDOR_ID 0xFEED @@ -31,6 +32,10 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. #define MATRIX_ROWS 4 #define MATRIX_COLS 12 +/* Planck PCB default pin-out */ +#define COLS (int []){ F1, F0, B0, C7, F4, F5, F6, F7, D4, D6, B4, D7 } +#define ROWS (int []){ D0, D5, B5, B6 } + /* define if matrix has ghost */ //#define MATRIX_HAS_GHOST diff --git a/keyboard/planck/config_definitions.h b/keyboard/planck/config_definitions.h new file mode 100644 index 0000000000..fd138b8841 --- /dev/null +++ b/keyboard/planck/config_definitions.h @@ -0,0 +1,50 @@ +#ifndef CONFIG_DEFINITIONS_H +#define CONFIG_DEFINITIONS_H + +#define B0 0x20 +#define B1 0x21 +#define B2 0x22 +#define B3 0x23 +#define B4 0x24 +#define B5 0x25 +#define B6 0x26 +#define B7 0x27 +#define C0 0x30 +#define C1 0x31 +#define C2 0x32 +#define C3 0x33 +#define C4 0x34 +#define C5 0x35 +#define C6 0x36 +#define C7 0x37 +#define D0 0x40 +#define D1 0x41 +#define D2 0x42 +#define D3 0x43 +#define D4 0x44 +#define D5 0x45 +#define D6 0x46 +#define D7 0x47 +#define E0 0x50 +#define E1 0x51 +#define E2 0x52 +#define E3 0x53 +#define E4 0x54 +#define E5 0x55 +#define E6 0x56 +#define E7 0x57 +#define F0 0x60 +#define F1 0x61 +#define F2 0x62 +#define F3 0x63 +#define F4 0x64 +#define F5 0x65 +#define F6 0x66 +#define F7 0x67 + + + + + +#endif + diff --git a/keyboard/planck/extended_keymaps/extended_keymap_default.c b/keyboard/planck/extended_keymaps/extended_keymap_default.c index 710611c3cb..c75144bf4a 100644 --- a/keyboard/planck/extended_keymaps/extended_keymap_default.c +++ b/keyboard/planck/extended_keymaps/extended_keymap_default.c @@ -1,6 +1,7 @@ #include "extended_keymap_common.h" #include "backlight.h" #include "lufa.h" +#include "debug.h" const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [0] = { /* Qwerty */ @@ -51,18 +52,12 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) switch(id) { case 0: if (record->event.pressed) { - if (!&midi_device) { - register_code(KC_RSFT); - } else { - midi_send_noteon(&midi_device, 1, 64, 127); - } + register_code(KC_RSFT); + midi_send_noteon(&midi_device, 1, 64, 127); backlight_step(); } else { - if (!&midi_device) { - unregister_code(KC_RSFT); - } else { - midi_send_noteoff(&midi_device, 1, 64, 127); - } + unregister_code(KC_RSFT); + midi_send_noteoff(&midi_device, 1, 64, 127); } break; } diff --git a/keyboard/planck/matrix.c b/keyboard/planck/matrix.c new file mode 100644 index 0000000000..58bd61f758 --- /dev/null +++ b/keyboard/planck/matrix.c @@ -0,0 +1,235 @@ +/* +Copyright 2012 Jun Wako +Generated by planckkeyboard.com (2014 Jack Humbert) + +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/>. +*/ + +/* + * scan matrix + */ +#include <stdint.h> +#include <stdbool.h> +#include <avr/io.h> +#include <util/delay.h> +#include "print.h" +#include "debug.h" +#include "util.h" +#include "matrix.h" +#include "backlight.h" // TODO fix this dependency + +#ifndef DEBOUNCE +# define DEBOUNCE 10 +#endif +static uint8_t debouncing = DEBOUNCE; + +/* matrix state(1:on, 0:off) */ +static matrix_row_t matrix[MATRIX_ROWS]; +static matrix_row_t matrix_debouncing[MATRIX_ROWS]; + +static matrix_row_t read_cols(void); +static void init_cols(void); +static void unselect_rows(void); +static void select_row(uint8_t row); + +inline +uint8_t matrix_rows(void) +{ + return MATRIX_ROWS; +} + +inline +uint8_t matrix_cols(void) +{ + return MATRIX_COLS; +} + +void matrix_init(void) +{ + // To use PORTF disable JTAG with writing JTD bit twice within four cycles. + MCUCR |= (1<<JTD); + MCUCR |= (1<<JTD); + + backlight_init_ports(); + + // Turn status LED on + DDRE |= (1<<6); + PORTE |= (1<<6); + + // initialize row and col + unselect_rows(); + init_cols(); + + // initialize matrix state: all keys off + for (uint8_t i=0; i < MATRIX_ROWS; i++) { + matrix[i] = 0; + matrix_debouncing[i] = 0; + } +} + + +uint8_t matrix_scan(void) +{ + for (uint8_t i = 0; i < MATRIX_ROWS; i++) { + select_row(i); + _delay_us(30); // without this wait read unstable value. + matrix_row_t cols = read_cols(); + if (matrix_debouncing[i] != cols) { + matrix_debouncing[i] = cols; + if (debouncing) { + debug("bounce!: "); debug_hex(debouncing); debug("\n"); + } + debouncing = DEBOUNCE; + } + unselect_rows(); + } + + if (debouncing) { + if (--debouncing) { + _delay_ms(1); + } else { + for (uint8_t i = 0; i < MATRIX_ROWS; i++) { + matrix[i] = matrix_debouncing[i]; + } + } + } + + return 1; +} + +bool matrix_is_modified(void) +{ + if (debouncing) return false; + return true; +} + +inline +bool matrix_is_on(uint8_t row, uint8_t col) +{ + return (matrix[row] & ((matrix_row_t)1<col)); +} + +inline +matrix_row_t matrix_get_row(uint8_t row) +{ + return matrix[row]; +} + +void matrix_print(void) +{ + print("\nr/c 0123456789ABCDEF\n"); + for (uint8_t row = 0; row < MATRIX_ROWS; row++) { + phex(row); print(": "); + pbin_reverse16(matrix_get_row(row)); + print("\n"); + } +} + +uint8_t matrix_key_count(void) +{ + uint8_t count = 0; + for (uint8_t i = 0; i < MATRIX_ROWS; i++) { + count += bitpop16(matrix[i]); + } + return count; +} + +static void init_cols(void) +{ + int B = 0, C = 0, D = 0, E = 0, F = 0; + for(int x = 0; x < MATRIX_COLS; x++) { + int col = COLS[x]; + if ((col & 0xF0) == 0x20) { + B |= (1<<(col & 0x0F)); + } else if ((col & 0xF0) == 0x30) { + C |= (1<<(col & 0x0F)); + } else if ((col & 0xF0) == 0x40) { + D |= (1<<(col & 0x0F)); + } else if ((col & 0xF0) == 0x50) { + E |= (1<<(col & 0x0F)); + } else if ((col & 0xF0) == 0x60) { + F |= (1<<(col & 0x0F)); + } + } + DDRB &= ~(B); PORTB |= (B); + DDRC &= ~(C); PORTC |= (C); + DDRD &= ~(D); PORTD |= (D); + DDRE &= ~(E); PORTE |= (E); + DDRF &= ~(F); PORTF |= (F); +} + +static matrix_row_t read_cols(void) +{ + matrix_row_t result = 0; + for(int x = 0; x < MATRIX_COLS; x++) { + int col = COLS[x]; + if ((col & 0xF0) == 0x20) { + result |= (PINB&(1<<(col & 0x0F)) ? 0 : (1<<x)); + } else if ((col & 0xF0) == 0x30) { + result |= (PINC&(1<<(col & 0x0F)) ? 0 : (1<<x)); + } else if ((col & 0xF0) == 0x40) { + result |= (PIND&(1<<(col & 0x0F)) ? 0 : (1<<x)); + } else if ((col & 0xF0) == 0x50) { + result |= (PINE&(1<<(col & 0x0F)) ? 0 : (1<<x)); + } else if ((col & 0xF0) == 0x60) { + result |= (PINF&(1<<(col & 0x0F)) ? 0 : (1<<x)); + } + } + return result; +} + +static void unselect_rows(void) +{ + int B = 0, C = 0, D = 0, E = 0, F = 0; + for(int x = 0; x < MATRIX_ROWS; x++) { + int row = ROWS[x]; + if ((row & 0xF0) == 0x20) { + B |= (1<<(row & 0x0F)); + } else if ((row & 0xF0) == 0x30) { + C |= (1<<(row & 0x0F)); + } else if ((row & 0xF0) == 0x40) { + D |= (1<<(row & 0x0F)); + } else if ((row & 0xF0) == 0x50) { + E |= (1<<(row & 0x0F)); + } else if ((row & 0xF0) == 0x60) { + F |= (1<<(row & 0x0F)); + } + } + DDRB &= ~(B); PORTB |= (B); + DDRC &= ~(C); PORTC |= (C); + DDRD &= ~(D); PORTD |= (D); + DDRE &= ~(E); PORTE |= (E); + DDRF &= ~(F); PORTF |= (F); +} + +static void select_row(uint8_t row) +{ + int row_pin = ROWS[row]; + if ((row_pin & 0xF0) == 0x20) { + DDRB |= (1<<(row_pin & 0x0F)); + PORTB &= ~(1<<(row_pin & 0x0F)); + } else if ((row_pin & 0xF0) == 0x30) { + DDRC |= (1<<(row_pin & 0x0F)); + PORTC &= ~(1<<(row_pin & 0x0F)); + } else if ((row_pin & 0xF0) == 0x40) { + DDRD |= (1<<(row_pin & 0x0F)); + PORTD &= ~(1<<(row_pin & 0x0F)); + } else if ((row_pin & 0xF0) == 0x50) { + DDRE |= (1<<(row_pin & 0x0F)); + PORTE &= ~(1<<(row_pin & 0x0F)); + } else if ((row_pin & 0xF0) == 0x60) { + DDRF |= (1<<(row_pin & 0x0F)); + PORTF &= ~(1<<(row_pin & 0x0F)); + } +}
\ No newline at end of file |