Merge branch 'master' of https://github.com/jackhumbert/tmk_keyboard
7 files changed, 451 insertions(+), 0 deletions(-) A keyboard/jd45/Makefile A keyboard/jd45/backlight.c A keyboard/jd45/config.h A keyboard/jd45/jd45.c A keyboard/jd45/jd45.h A keyboard/jd45/keymaps/keymap_default.c A keyboard/jd45/keymaps/keymap_justin.c
A keyboard/jd45/Makefile => keyboard/jd45/Makefile +140 -0
@@ 0,0 1,140 @@ #---------------------------------------------------------------------------- # On command line: # # make all = Make software. # # make clean = Clean out built project files. # # make coff = Convert ELF to AVR COFF. # # make extcoff = Convert ELF to AVR Extended COFF. # # make program = Download the hex file to the device. # Please customize your programmer settings(PROGRAM_CMD) # # make teensy = Download the hex file to the device, using teensy_loader_cli. # (must have teensy_loader_cli installed). # # make dfu = Download the hex file to the device, using dfu-programmer (must # have dfu-programmer installed). # # make flip = Download the hex file to the device, using Atmel FLIP (must # have Atmel FLIP installed). # # make dfu-ee = Download the eeprom file to the device, using dfu-programmer # (must have dfu-programmer installed). # # make flip-ee = Download the eeprom file to the device, using Atmel FLIP # (must have Atmel FLIP installed). # # make debug = Start either simulavr or avarice as specified for debugging, # with avr-gdb or avr-insight as the front end for debugging. # # make filename.s = Just compile filename.c into the assembler code only. # # make filename.i = Create a preprocessed source file for use in submitting # bug reports to the GCC project. # # To rebuild project do "make clean" then "make all". #---------------------------------------------------------------------------- # Target file name (without extension). TARGET = jd45 # Directory common source filess exist TOP_DIR = ../.. TMK_DIR = ../../tmk_core # Directory keyboard dependent files exist TARGET_DIR = . # # project specific files SRC = jd45.c \ backlight.c ifdef KEYMAP SRC := keymaps/keymap_$(KEYMAP).c $(SRC) else SRC := keymaps/keymap_default.c $(SRC) endif CONFIG_H = config.h # MCU name #MCU = at90usb1287 MCU = atmega32u4 # Processor frequency. # This will define a symbol, F_CPU, in all source code files equal to the # processor frequency in Hz. You can then use this symbol in your source code to # calculate timings. Do NOT tack on a 'UL' at the end, this will be done # automatically to create a 32-bit value in your source code. # # This will be an integer division of F_USB below, as it is sourced by # F_USB after it has run through any CPU prescalers. Note that this value # does not *change* the processor frequency - it should merely be updated to # reflect the processor speed set externally so that the code can use accurate # software delays. F_CPU = 16000000 # # LUFA specific # # Target architecture (see library "Board Types" documentation). ARCH = AVR8 # Input clock frequency. # This will define a symbol, F_USB, in all source code files equal to the # input clock frequency (before any prescaling is performed) in Hz. This value may # differ from F_CPU if prescaling is used on the latter, and is required as the # raw input clock is fed directly to the PLL sections of the AVR for high speed # clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' # at the end, this will be done automatically to create a 32-bit value in your # source code. # # If no clock division is performed on the input clock inside the AVR (via the # CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. F_USB = $(F_CPU) # Interrupt driven control endpoint task(+60) OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT # Boot Section Size in *bytes* # Teensy halfKay 512 # Teensy++ halfKay 1024 # Atmel DFU loader 4096 # LUFA bootloader 4096 # USBaspLoader 2048 OPT_DEFS += -DBOOTLOADER_SIZE=4096 # Build Options # comment out to disable the options. # BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) 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 MIDI_ENABLE = YES # MIDI controls # UNICODE_ENABLE = YES # Unicode BLUETOOTH_ENABLE = yes # Enable Bluetooth with the Adafruit EZ-Key HID # Optimize size but this may cause error "relocation truncated to fit" #EXTRALDFLAGS = -Wl,--relax # Search Path VPATH += $(TARGET_DIR) VPATH += $(TOP_DIR) VPATH += $(TMK_DIR) include $(TOP_DIR)/quantum/quantum.mk
A keyboard/jd45/backlight.c => keyboard/jd45/backlight.c +61 -0
@@ 0,0 1,61 @@ #include <avr/io.h> #include "backlight.h" #define CHANNEL OCR1C 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; backlight_init(); } void backlight_set(uint8_t level) { if ( level == 0 ) { // Turn off PWM control on PB7, revert to output low. TCCR1A &= ~(_BV(COM1C1)); CHANNEL = 0x0; // Prevent backlight blink on lowest level PORTB &= ~(_BV(PORTB7)); } else if ( level == BACKLIGHT_LEVELS ) { // Prevent backlight blink on lowest level PORTB &= ~(_BV(PORTB7)); // Turn on PWM control of PB7 TCCR1A |= _BV(COM1C1); // Set the brightness CHANNEL = 0xFFFF; } else { // Prevent backlight blink on lowest level PORTB &= ~(_BV(PORTB7)); // Turn on PWM control of PB7 TCCR1A |= _BV(COM1C1); // Set the brightness CHANNEL = 0xFFFF >> ((BACKLIGHT_LEVELS - level) * ((BACKLIGHT_LEVELS + 1) / 2)); } } \ No newline at end of file
A keyboard/jd45/config.h => keyboard/jd45/config.h +79 -0
@@ 0,0 1,79 @@ /* Copyright 2012 Jun Wako <wakojun@gmail.com> 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/>. */ #ifndef CONFIG_H #define CONFIG_H #include "config_common.h" /* USB Device descriptor parameter */ #define VENDOR_ID 0xFEED #define PRODUCT_ID 0x6060 #define DEVICE_VER 0x0001 #define MANUFACTURER geekhack #define PRODUCT JD45 #define DESCRIPTION q.m.k. keyboard firmware for JD45 /* key matrix size */ #define MATRIX_ROWS 4 #define MATRIX_COLS 13 /* Planck PCB default pin-out */ #define COLS (int []){F4, D7, B5, B6, C6, C7, D4, D6, D5, D0, D1, D2, B0} #define ROWS (int []){F0, F1, F5, B4} /* COL2ROW or ROW2COL */ #define DIODE_DIRECTION COL2ROW /* define if matrix has ghost */ //#define MATRIX_HAS_GHOST /* number of backlight levels */ #define BACKLIGHT_LEVELS 3 /* Set 0 if debouncing isn't needed */ #define DEBOUNCE 5 /* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ #define LOCKING_SUPPORT_ENABLE /* Locking resynchronize hack */ #define LOCKING_RESYNC_ENABLE /* key combination for command */ #define IS_COMMAND() ( \ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) /* * Feature disable options * These options are also useful to firmware size reduction. */ /* disable debug print */ #define NO_DEBUG /* disable print */ #define NO_PRINT /* disable action features */ //#define NO_ACTION_LAYER //#define NO_ACTION_TAPPING //#define NO_ACTION_ONESHOT //#define NO_ACTION_MACRO //#define NO_ACTION_FUNCTION #endif
A keyboard/jd45/jd45.c => keyboard/jd45/jd45.c +27 -0
@@ 0,0 1,27 @@ #include "jd45.h" __attribute__ ((weak)) void * matrix_init_user(void) { }; __attribute__ ((weak)) void * matrix_scan_user(void) { }; void * matrix_init_kb(void) { #ifdef BACKLIGHT_ENABLE backlight_init_ports(); #endif if (matrix_init_user) { (*matrix_init_user)(); } }; void * matrix_scan_kb(void) { if (matrix_scan_user) { (*matrix_scan_user)(); } };
A keyboard/jd45/jd45.h => keyboard/jd45/jd45.h +12 -0
@@ 0,0 1,12 @@ #ifndef JD45_H #define JD45_H #include "matrix.h" #include "keymap_common.h" #include "backlight.h" #include <stddef.h> void * matrix_init_user(void); void * matrix_scan_user(void); #endif
A keyboard/jd45/keymaps/keymap_default.c => keyboard/jd45/keymaps/keymap_default.c +31 -0
@@ 0,0 1,31 @@ #include "jd45.h" #include "backlight.h" /* this keymap is to provide a basic keyboard layout for testing the matrix * for more practical and complicated keymap refer to other keymaps in the same folder */ /* JD45 keymap definition macro */ #define KEYMAP( \ K01, K02, K03, K04, K05, K06, K07, K08, K09, K10, K11, K12, K13, \ K14, K15, K16, K17, K18, K19, K20, K21, K22, K23, K24, K25, \ K26, K27, K28, K29, K30, K31, K32, K33, K34, K35, K36, K37, \ K38, K39, K40, K41, K42, K43, K44, K45, K46, K47 \ ) { \ { KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07, KC_##K08, KC_##K09, KC_##K10, KC_##K11, KC_##K12, KC_##K13 }, \ { KC_##K14, KC_##K15, KC_##K16, KC_##K17, KC_##K18, KC_##K19, KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_NO }, \ { KC_##K26, KC_##K27, KC_##K28, KC_##K29, KC_##K30, KC_##K31, KC_##K32, KC_##K33, KC_##K34, KC_##K35, KC_##K36, KC_##K37, KC_NO }, \ { KC_##K38, KC_##K39, KC_##K40, KC_##K41, KC_##K42, KC_NO, KC_##K43, KC_NO, KC_##K44, KC_##K45, KC_##K46, KC_##K47, KC_NO } \ } const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [0] = KEYMAP( ESC, Q, W, E, R, T, Y, U, I, O, P, QUOT, BSPC, TAB, A, S, D, F, G, H, J, K, L, SCLN, ENT, LSFT, Z, X, C, V, B, N, M, COMM, DOT, SLSH, RSFT, PAUSE, LCTL, LALT, DEL, SPC, DEL, LEFT, UP, DOWN, RIGHT ), }; const uint16_t PROGMEM fn_actions[] = { };
A keyboard/jd45/keymaps/keymap_justin.c => keyboard/jd45/keymaps/keymap_justin.c +101 -0
@@ 0,0 1,101 @@ #include "jd45.h" #include "backlight.h" /* JD45 keymap definition macro */ #define KEYMAP( \ K01, K02, K03, K04, K05, K06, K07, K08, K09, K10, K11, K12, K13, \ K14, K15, K16, K17, K18, K19, K20, K21, K22, K23, K24, K25, \ K26, K27, K28, K29, K30, K31, K32, K33, K34, K35, K36, K37, \ K38, K39, K40, K41, K42, K43, K44, K45, K46, K47 \ ) { \ { KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07, KC_##K08, KC_##K09, KC_##K10, KC_##K11, KC_##K12, KC_##K13 }, \ { KC_##K14, KC_##K15, KC_##K16, KC_##K17, KC_##K18, KC_##K19, KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_NO }, \ { KC_##K26, KC_##K27, KC_##K28, KC_##K29, KC_##K30, KC_##K31, KC_##K32, KC_##K33, KC_##K34, KC_##K35, KC_##K36, KC_##K37, KC_NO }, \ { KC_##K38, KC_##K39, KC_##K40, KC_##K41, KC_##K42, KC_NO, KC_##K43, KC_NO, KC_##K44, KC_##K45, KC_##K46, KC_##K47, KC_NO } \ } const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [0] = KEYMAP( ESC, Q, W, F, P, G, J, L, U, Y, SCLN, QUOT, BSPC, FN8, A, R, S, T, D, H, N, E, I, O, ENT, LSFT, Z, X, C, V, B, K, M, COMM, DOT, SLSH, FN6, FN4, LGUI, FN7, FN2, FN1, SPC, FN5, RALT, FN3, FN0 ), [1] = KEYMAP( TRNS, FN10, FN11, FN12, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, UP, DEL, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, HOME, PGUP, LEFT, RGHT, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, END, PGDN, DOWN, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS ), [2] = KEYMAP( TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, 7, 8, 9, 0, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, LBRC, 4, 5, 6, DOT, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, RBRC, 1, 2, 3, BSLS, TRNS, TRNS,FN29, TRNS, TRNS, TRNS, PAUSE, EQL, MINS, TRNS, TRNS ), [3] = KEYMAP( TRNS, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS ), [4] = KEYMAP( TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, 7, 8, 9, 0, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, LBRC, 4, 5, 6, DOT, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, RBRC, 1, 2, 3, BSLS, TRNS, TRNS,FN29, TRNS, TRNS, TRNS, PAUSE, EQL, MINS, TRNS, TRNS ), }; enum macro_id { PSWD1, PSWD2, PSWD3, }; const uint16_t PROGMEM fn_actions[] = { [0] = ACTION_MODS_TAP_KEY(MOD_LCTL, KC_MINS), [1] = ACTION_LAYER_MOMENTARY(1), // FN1 [2] = ACTION_LAYER_MOMENTARY(2), // FN2 [3] = ACTION_LAYER_MOMENTARY(3), // FN3 [4] = ACTION_MODS_TAP_KEY(MOD_LSFT, KC_GRV), [5] = ACTION_MODS_TAP_KEY(MOD_RSFT, KC_RGUI), [6] = ACTION_MODS_TAP_KEY(MOD_RSFT, KC_CAPS), [7] = ACTION_LAYER_MODS(4, MOD_LSFT), // FN4 [8] = ACTION_MODS_TAP_KEY(MOD_LCTL, KC_TAB), [10] = ACTION_MACRO(PSWD1), [11] = ACTION_MACRO(PSWD2), [12] = ACTION_MACRO(PSWD3), [29] = ACTION_BACKLIGHT_TOGGLE(), [30] = ACTION_BACKLIGHT_INCREASE(), [31] = ACTION_BACKLIGHT_DECREASE() }; /* * Macro definition */ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { switch (id) { case PSWD1: return (record->event.pressed ? MACRO( I(0), T(1), T(2), T(3), T(4), T(5), T(6), T(7), T(8), T(ENT), END ) : MACRO_NONE ); case PSWD2: return (record->event.pressed ? MACRO( I(0), T(1), T(2), T(3), T(4), T(5), T(6), T(7), T(8), T(ENT), END ) : MACRO_NONE ); case PSWD3: return (record->event.pressed ? MACRO( I(0), T(1), T(2), T(3), T(4), T(5), T(6), T(7), T(8), T(ENT), END ) : MACRO_NONE ); //case VOLUP: // return (record->event.pressed ? // MACRO( D(VOLU), U(VOLU), END ) : // MACRO_NONE ); //case ALT_TAB: // return (record->event.pressed ? // MACRO( D(LALT), D(TAB), END ) : // MACRO( U(TAB), END )); } return MACRO_NONE; }