diff options
author | Jack Humbert <jack.humb@gmail.com> | 2015-08-21 23:14:48 -0400 |
---|---|---|
committer | Jack Humbert <jack.humb@gmail.com> | 2015-08-21 23:14:48 -0400 |
commit | 476e29d1190ac45b810109512bbb50cc4769493b (patch) | |
tree | 1d493bae3b0ae91a6202918aa1bf53fb0da936fa /keyboard/planck | |
parent | 2d76b5c3d421c984f6b4b9da757383cc87e3f808 (diff) | |
parent | b191f8c60fbbaf1fb55d67edb86a6c33489b2ce3 (diff) |
Merge pull request #26 from jackhumbert/midi
Midi
Diffstat (limited to 'keyboard/planck')
-rwxr-xr-x | keyboard/planck/Config/LUFAConfig.h | 93 | ||||
-rw-r--r-- | keyboard/planck/Makefile | 6 | ||||
-rw-r--r-- | keyboard/planck/config.h | 7 | ||||
-rw-r--r-- | keyboard/planck/config_definitions.h | 50 | ||||
-rw-r--r-- | keyboard/planck/extended_keymap_common.h | 1 | ||||
-rw-r--r-- | keyboard/planck/extended_keymaps/extended_keymap_default.c | 4 | ||||
-rw-r--r-- | keyboard/planck/matrix.c | 235 | ||||
-rw-r--r-- | keyboard/planck/matrix_pcb.c | 1 |
8 files changed, 392 insertions, 5 deletions
diff --git a/keyboard/planck/Config/LUFAConfig.h b/keyboard/planck/Config/LUFAConfig.h new file mode 100755 index 0000000000..fa9404498f --- /dev/null +++ b/keyboard/planck/Config/LUFAConfig.h @@ -0,0 +1,93 @@ +/*
+ LUFA Library
+ Copyright (C) Dean Camera, 2012.
+
+ dean [at] fourwalledcubicle [dot] com
+ www.lufa-lib.org
+*/
+
+/*
+ Copyright 2012 Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+ Permission to use, copy, modify, distribute, and sell this
+ software and its documentation for any purpose is hereby granted
+ without fee, provided that the above copyright notice appear in
+ all copies and that both that the copyright notice and this
+ permission notice and warranty disclaimer appear in supporting
+ documentation, and that the name of the author not be used in
+ advertising or publicity pertaining to distribution of the
+ software without specific, written prior permission.
+
+ The author disclaim all warranties with regard to this
+ software, including all implied warranties of merchantability
+ and fitness. In no event shall the author be liable for any
+ special, indirect or consequential damages or any damages
+ whatsoever resulting from loss of use, data or profits, whether
+ in an action of contract, negligence or other tortious action,
+ arising out of or in connection with the use or performance of
+ this software.
+*/
+
+/** \file
+ * \brief LUFA Library Configuration Header File
+ *
+ * This header file is used to configure LUFA's compile time options,
+ * as an alternative to the compile time constants supplied through
+ * a makefile.
+ *
+ * For information on what each token does, refer to the LUFA
+ * manual section "Summary of Compile Tokens".
+ */
+
+#ifndef _LUFA_CONFIG_H_
+#define _LUFA_CONFIG_H_
+
+ #if (ARCH == ARCH_AVR8)
+
+ /* Non-USB Related Configuration Tokens: */
+// #define DISABLE_TERMINAL_CODES
+
+ /* USB Class Driver Related Tokens: */
+// #define HID_HOST_BOOT_PROTOCOL_ONLY
+// #define HID_STATETABLE_STACK_DEPTH {Insert Value Here}
+// #define HID_USAGE_STACK_DEPTH {Insert Value Here}
+// #define HID_MAX_COLLECTIONS {Insert Value Here}
+// #define HID_MAX_REPORTITEMS {Insert Value Here}
+// #define HID_MAX_REPORT_IDS {Insert Value Here}
+// #define NO_CLASS_DRIVER_AUTOFLUSH
+
+ /* General USB Driver Related Tokens: */
+// #define ORDERED_EP_CONFIG
+ #define USE_STATIC_OPTIONS (USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)
+ #define USB_DEVICE_ONLY
+// #define USB_HOST_ONLY
+// #define USB_STREAM_TIMEOUT_MS {Insert Value Here}
+// #define NO_LIMITED_CONTROLLER_CONNECT
+// #define NO_SOF_EVENTS
+
+ /* USB Device Mode Driver Related Tokens: */
+// #define USE_RAM_DESCRIPTORS
+ #define USE_FLASH_DESCRIPTORS
+// #define USE_EEPROM_DESCRIPTORS
+// #define NO_INTERNAL_SERIAL
+ #define FIXED_CONTROL_ENDPOINT_SIZE 8
+// #define DEVICE_STATE_AS_GPIOR {Insert Value Here}
+ #define FIXED_NUM_CONFIGURATIONS 1
+// #define CONTROL_ONLY_DEVICE
+// #define INTERRUPT_CONTROL_ENDPOINT
+// #define NO_DEVICE_REMOTE_WAKEUP
+// #define NO_DEVICE_SELF_POWER
+
+ /* USB Host Mode Driver Related Tokens: */
+// #define HOST_STATE_AS_GPIOR {Insert Value Here}
+// #define USB_HOST_TIMEOUT_MS {Insert Value Here}
+// #define HOST_DEVICE_SETTLE_DELAY_MS {Insert Value Here}
+// #define NO_AUTO_VBUS_MANAGEMENT
+// #define INVERTED_VBUS_ENABLE_LINE
+
+ #else
+
+ #error Unsupported architecture for this LUFA configuration file.
+
+ #endif
+#endif
diff --git a/keyboard/planck/Makefile b/keyboard/planck/Makefile index cd67c711bc..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 7e95afddea..47cf39a903 100644 --- a/keyboard/planck/config.h +++ b/keyboard/planck/config.h @@ -18,19 +18,24 @@ 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 #define PRODUCT_ID 0x6060 #define DEVICE_VER 0x0001 #define MANUFACTURER Ortholinear Keyboards -#define PRODUCT Planck +#define PRODUCT The Planck Keyboard #define DESCRIPTION A compact ortholinear keyboard /* key matrix size */ #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_keymap_common.h b/keyboard/planck/extended_keymap_common.h index 2dce4a2fac..e6a7dac5b5 100644 --- a/keyboard/planck/extended_keymap_common.h +++ b/keyboard/planck/extended_keymap_common.h @@ -48,6 +48,7 @@ typedef union { keymap_config_t keymap_config; #endif + /* translates key to keycode */ uint16_t keymap_key_to_keycode(uint8_t layer, keypos_t key); diff --git a/keyboard/planck/extended_keymaps/extended_keymap_default.c b/keyboard/planck/extended_keymaps/extended_keymap_default.c index 1d5ac4321b..c75144bf4a 100644 --- a/keyboard/planck/extended_keymaps/extended_keymap_default.c +++ b/keyboard/planck/extended_keymaps/extended_keymap_default.c @@ -1,5 +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,9 +53,11 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) case 0: if (record->event.pressed) { register_code(KC_RSFT); + midi_send_noteon(&midi_device, 1, 64, 127); backlight_step(); } else { 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 diff --git a/keyboard/planck/matrix_pcb.c b/keyboard/planck/matrix_pcb.c index 6f6ccd5c1c..2a9ec8fcde 100644 --- a/keyboard/planck/matrix_pcb.c +++ b/keyboard/planck/matrix_pcb.c @@ -78,6 +78,7 @@ void matrix_init(void) } } + uint8_t matrix_scan(void) { for (uint8_t i = 0; i < MATRIX_ROWS; i++) { |