From c370c1e1f3c27027c0a6513d34a749a1a88603fc Mon Sep 17 00:00:00 2001 From: Gunther Gruber Date: Mon, 27 Feb 2017 09:48:58 +0100 Subject: [PATCH 01/17] guni keymap --- keyboard/ergodox_ez/keymaps/guni/keymap.c | 176 ++++++++++++++++++++++ 1 file changed, 176 insertions(+) create mode 100644 keyboard/ergodox_ez/keymaps/guni/keymap.c diff --git a/keyboard/ergodox_ez/keymaps/guni/keymap.c b/keyboard/ergodox_ez/keymaps/guni/keymap.c new file mode 100644 index 000000000..fc8567e68 --- /dev/null +++ b/keyboard/ergodox_ez/keymaps/guni/keymap.c @@ -0,0 +1,176 @@ +#include "ergodox_ez.h" +#include "debug.h" +#include "action_layer.h" + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + KEYMAP( // layer 0 : default + // left hand + KC_EQL , KC_1, KC_2, KC_3, KC_4, KC_5, KC_LBRC, + KC_FN25 , KC_Q, KC_W, KC_E, KC_R, KC_T, KC_HOME, + KC_FN27 , KC_A, KC_S, KC_D, KC_F, KC_G, + KC_LSFT , KC_Z, KC_X, KC_C, KC_V, KC_B, KC_PGUP, + KC_LGUI , KC_GRV,KC_LEFT,KC_RGHT,KC_LALT, + KC_NO , KC_NO , + KC_NO , + KC_BSPC,KC_DEL ,KC_FN23, + // right hand + KC_RBRC , KC_6, KC_7 , KC_8, KC_9, KC_0, KC_MINS, + KC_END , KC_Y, KC_U , KC_I, KC_O, KC_P, KC_FN28, + KC_H , KC_J, KC_K , KC_L, KC_SCLN,KC_FN30, + KC_PGDN , KC_N, KC_M , KC_COMM,KC_DOT, KC_SLSH,KC_FN29, + KC_RALT , KC_DOWN,KC_UP, KC_NO ,KC_RGUI, + KC_NO , KC_NO, + KC_NO , + KC_FN29,KC_ENT ,KC_SPC + ), + + KEYMAP( // layer 1 : function and symbol keys + // left hand + KC_TRNS,KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F11, + KC_TRNS,KC_AT,KC_UNDS ,KC_LBRC,KC_RBRC,KC_CIRC ,KC_TRNS, + KC_TRNS,KC_BSLS,KC_SLSH,KC_LCBR ,KC_RCBR ,KC_ASTR, + KC_TRNS,KC_HASH ,KC_DLR ,KC_PIPE ,KC_TILD ,KC_GRV ,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS, + KC_TRNS, + KC_TRNS,KC_TRNS,KC_FN1, + // right hand + KC_F12, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_TRNS, + KC_TRNS,KC_EXLM,LSFT(KC_COMM),LSFT(KC_DOT),KC_EQL,KC_AMPR, KC_TRNS, + LSFT(KC_SLSH),KC_LPRN,KC_RPRN,KC_MINS,LSFT(KC_SCLN),KC_TRNS, + KC_TRNS,KC_PLUS,LSFT(KC_5),LSFT(KC_QUOT),KC_QUOT,KC_SCLN,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS, + KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS + ), + + KEYMAP( // layer 2: navigation + // left hand + KC_NO,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_PGUP,KC_HOME,KC_UP ,KC_END,KC_NO ,KC_TRNS, + KC_TRNS,KC_PGDN,KC_LEFT,KC_DOWN,KC_RGHT,KC_NO, + KC_TRNS,KC_NO, KC_NO, KC_NO, KC_NO,KC_NO,KC_NO, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS, + KC_TRNS, + KC_TRNS,KC_TRNS,KC_FN1 , + // right hand + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS ,KC_TRNS, KC_HOME, KC_TRNS, KC_TRNS, KC_END ,KC_TRNS, + KC_NO, KC_LEFT, KC_UP, KC_DOWN, KC_RGHT,KC_TRNS, + KC_TRNS,KC_TRNS, KC_HOME, KC_UP, KC_END, KC_PGUP,KC_TRNS, + KC_LEFT, KC_DOWN,KC_RGHT,KC_PGDN,KC_TRNS, + KC_TRNS,KC_TRNS, + KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS + ), + KEYMAP( // layer 3 : teensy bootloader functions + // left hand + KC_FN0, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS, + KC_TRNS, + KC_TRNS,KC_TRNS,KC_FN1 , + // right hand + KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS, + KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS + ), + + + KEYMAP( // layer 4: numpad + // left hand + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS, + KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS, + // right hand + KC_TRNS,KC_NLCK,KC_PSLS,KC_PAST,KC_PAST,KC_PMNS,KC_BSPC, + KC_TRNS,KC_NO, KC_P7, KC_P8, KC_P9, KC_PMNS,KC_BSPC, + KC_NO, KC_P4, KC_P5, KC_P6, KC_PPLS,KC_PENT, + KC_TRNS,KC_NO, KC_P1, KC_P2, KC_P3, KC_PPLS,KC_PENT, + KC_P0, KC_PDOT,KC_SLSH,KC_PENT,KC_PENT, + KC_TRNS,KC_TRNS, + KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS + ), + +}; + +/* id for user defined functions */ +enum function_id { + TEENSY_KEY, +}; + +/* + * Fn action definition + */ +const uint16_t PROGMEM fn_actions[] = { + [0] = ACTION_FUNCTION(TEENSY_KEY), // FN0 - Teensy key + [1] = ACTION_LAYER_SET(0, ON_PRESS), + //[11] = ACTION_MODS_KEY(MOD_LSFT, KC_COMM), + //[12] = ACTION_MODS_KEY(MOD_LSFT, KC_DOT), + + //[14] = ACTION_MODS_KEY(MOD_LSFT, KC_SLSH), + //[17] = ACTION_MODS_KEY(MOD_LSFT, KC_SCLN), + //[20] = ACTION_MODS_KEY(MOD_LSFT, KC_5), + //[21] = ACTION_MODS_KEY(MOD_LSFT, KC_QUOT), + [23] = ACTION_LAYER_SET(3, ON_PRESS), + [24] = ACTION_LAYER_SET(2, ON_PRESS), + [25] = ACTION_MODS_TAP_KEY(MOD_LCTL, KC_TAB), + [26] = ACTION_LAYER_SET(1, ON_PRESS), + [27] = ACTION_LAYER_TAP_KEY(1, KC_CAPS), + [28] = ACTION_MODS_TAP_KEY(MOD_RCTL,KC_BSLS), + //[29] = ACTION_LAYER_TOGGLE(4), + [29] = ACTION_MODS_TAP_KEY(MOD_RSFT,KC_ESC), + [30] = ACTION_LAYER_TAP_KEY(1, KC_QUOT), + [31] = ACTION_LAYER_MOMENTARY(2), + //[] = ACTION_LAYER_TAP_KEY(4, KC_S), +}; + + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + // MACRODOWN only works in this function + switch(id) { + case 0: + if (record->event.pressed) { + register_code(KC_RSFT); + } else { + unregister_code(KC_RSFT); + } + break; + } + return MACRO_NONE; +}; + +// Runs just one time when the keyboard initializes. +void * matrix_init_user(void) { + +}; + + +void action_function(keyrecord_t *event, uint8_t id, uint8_t opt) +{ + + if (id == TEENSY_KEY) { + clear_keyboard(); + print("\n\nJump to bootloader... "); + _delay_ms(250); + bootloader_jump(); // should not return + print("not supported.\n"); + } +} From 38cf08697b571e5efd55428a4682e248295091fb Mon Sep 17 00:00:00 2001 From: Gunther Gruber Date: Mon, 27 Feb 2017 09:55:24 +0100 Subject: [PATCH 02/17] small changes in guni.c keymap to work with new qmk_firmware packet --- .../ergodox_ez => keyboards/ergodox}/keymaps/guni/keymap.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) rename {keyboard/ergodox_ez => keyboards/ergodox}/keymaps/guni/keymap.c (98%) diff --git a/keyboard/ergodox_ez/keymaps/guni/keymap.c b/keyboards/ergodox/keymaps/guni/keymap.c similarity index 98% rename from keyboard/ergodox_ez/keymaps/guni/keymap.c rename to keyboards/ergodox/keymaps/guni/keymap.c index fc8567e68..f33829b8a 100644 --- a/keyboard/ergodox_ez/keymaps/guni/keymap.c +++ b/keyboards/ergodox/keymaps/guni/keymap.c @@ -1,6 +1,7 @@ -#include "ergodox_ez.h" +#include "ergodox.h" #include "debug.h" #include "action_layer.h" +#include "bootloader.h" const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KEYMAP( // layer 0 : default @@ -158,7 +159,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) }; // Runs just one time when the keyboard initializes. -void * matrix_init_user(void) { +void matrix_init_user(void) { }; From 08cba6c09b505340ec6c1932df4b17aab1816d97 Mon Sep 17 00:00:00 2001 From: Joshua Colbeck Date: Tue, 7 Mar 2017 09:43:08 -0600 Subject: [PATCH 03/17] Fixed minor error in ergodox infinity section. --- keyboards/ergodox/readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboards/ergodox/readme.md b/keyboards/ergodox/readme.md index 45b3354c1..5e50548be 100644 --- a/keyboards/ergodox/readme.md +++ b/keyboards/ergodox/readme.md @@ -100,7 +100,7 @@ for the left and right halves seperately. To flash them: - Install the firmware with `sudo make infinity-keymapname-dfu-util` - - Build left hand firmware with `make infinity-keymapname MASTER=right` + - Build right hand firmware with `make infinity-keymapname MASTER=right` - Plug in the right hand keyboard only. From 1023a47be6b91282b92b9a44f4492aa88375bf8e Mon Sep 17 00:00:00 2001 From: Danny Nguyen Date: Wed, 22 Feb 2017 16:51:25 -0500 Subject: [PATCH 04/17] Copy CMD60 as starting point and rename files --- keyboards/handwired/magicforce68/README.md | 35 ++++ keyboards/handwired/magicforce68/config.h | 162 ++++++++++++++++++ .../magicforce68/keymaps/default/keymap.c | 66 +++++++ .../handwired/magicforce68/magicforce68.c | 8 + .../handwired/magicforce68/magicforce68.h | 20 +++ keyboards/handwired/magicforce68/rules.mk | 73 ++++++++ 6 files changed, 364 insertions(+) create mode 100644 keyboards/handwired/magicforce68/README.md create mode 100644 keyboards/handwired/magicforce68/config.h create mode 100644 keyboards/handwired/magicforce68/keymaps/default/keymap.c create mode 100644 keyboards/handwired/magicforce68/magicforce68.c create mode 100644 keyboards/handwired/magicforce68/magicforce68.h create mode 100644 keyboards/handwired/magicforce68/rules.mk diff --git a/keyboards/handwired/magicforce68/README.md b/keyboards/handwired/magicforce68/README.md new file mode 100644 index 000000000..83e371543 --- /dev/null +++ b/keyboards/handwired/magicforce68/README.md @@ -0,0 +1,35 @@ +CMD60 keyboard firmware +====================== + +##CMD60 + +This layout has been designed to optimize use of the left-hand, and it focussed specifically on programmers who work +with text editors like SublimeText and Atom. It utilizes the power of Space_fn, and features a caps lock swap for Fn2 +and enter key on tap. These features allow you to keep your right hand on the mouse more and should enable you to +achieve a higher level of productivity if you take the time to learn its function layers. + +## Quantum MK Firmware + +For the full Quantum feature list, see [the parent readme.md](/doc/readme.md). + +## Building + +Download or clone the whole firmware and navigate to the keyboards/handwired/CMD60 folder. +Once your dev env is setup, you'll be able to type `make` to generate your .hex - you can then use +the Teensy Loader to program your .hex file. + +Depending on which keymap you would like to use, you will have to compile slightly differently. + +### Default + +To build with the default keymap, simply run `make`. + +### Other Keymaps + +To build the firmware binary hex file with a keymap just do `make` with `keymap` option like: + +``` +$ make keymap=[default|jack|] +``` + +Keymaps follow the format **__keymap.c__** and are stored in folders in the `keymaps` folder, eg `keymaps/my_keymap/` diff --git a/keyboards/handwired/magicforce68/config.h b/keyboards/handwired/magicforce68/config.h new file mode 100644 index 000000000..9671b66ba --- /dev/null +++ b/keyboards/handwired/magicforce68/config.h @@ -0,0 +1,162 @@ +/* +Copyright 2012 Jun Wako + +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 . +*/ + +#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 Hexwire +#define PRODUCT Magicforce 68 +#define DESCRIPTION Advanced Programming Keeb Layout + +/* key matrix size */ +#define MATRIX_ROWS 5 +#define MATRIX_COLS 14 + +/* + * Keyboard Matrix Assignments + * + * Change this to how you wired your keyboard + * COLS: AVR pins used for columns, left to right + * ROWS: AVR pins used for rows, top to bottom + * DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode) + * ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode) + * +*/ +#define MATRIX_ROW_PINS { F0, F4, F5, F6, F7 } +#define MATRIX_COL_PINS { B0, B1, B2, B3, B7, D0, D1, D2, D3, C6, D7, B4, B5, B6 } +#define UNUSED_PINS + +/* COL2ROW or ROW2COL */ +#define DIODE_DIRECTION COL2ROW + +// #define BACKLIGHT_PIN B7 +// #define BACKLIGHT_BREATHING +// #define BACKLIGHT_LEVELS 3 + + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCING_DELAY 5 + +/* define if matrix has ghost (lacks anti-ghosting diodes) */ +//#define MATRIX_HAS_GHOST + +/* number of backlight levels */ + +/* 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 + +/* + * Force NKRO + * + * Force NKRO (nKey Rollover) to be enabled by default, regardless of the saved + * state in the bootmagic EEPROM settings. (Note that NKRO must be enabled in the + * makefile for this to work.) + * + * If forced on, NKRO can be disabled via magic key (default = LShift+RShift+N) + * until the next keyboard reset. + * + * NKRO may prevent your keystrokes from being detected in the BIOS, but it is + * fully operational during normal computer usage. + * + * For a less heavy-handed approach, enable NKRO via magic key (LShift+RShift+N) + * or via bootmagic (hold SPACE+N while plugging in the keyboard). Once set by + * bootmagic, NKRO mode will always be enabled until it is toggled again during a + * power-up. + * + */ +//#define FORCE_NKRO + +/* + * Magic Key Options + * + * Magic keys are hotkey commands that allow control over firmware functions of + * the keyboard. They are best used in combination with the HID Listen program, + * found here: https://www.pjrc.com/teensy/hid_listen.html + * + * The options below allow the magic key functionality to be changed. This is + * useful if your keyboard/keypad is missing keys and you want magic key support. + * + */ + +/* key combination for magic key command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* control how magic key switches layers */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false + +/* override magic key keymap */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM +//#define MAGIC_KEY_HELP1 H +//#define MAGIC_KEY_HELP2 SLASH +//#define MAGIC_KEY_DEBUG D +//#define MAGIC_KEY_DEBUG_MATRIX X +//#define MAGIC_KEY_DEBUG_KBD K +//#define MAGIC_KEY_DEBUG_MOUSE M +//#define MAGIC_KEY_VERSION V +//#define MAGIC_KEY_STATUS S +//#define MAGIC_KEY_CONSOLE C +//#define MAGIC_KEY_LAYER0_ALT1 ESC +//#define MAGIC_KEY_LAYER0_ALT2 GRAVE +//#define MAGIC_KEY_LAYER0 0 +//#define MAGIC_KEY_LAYER1 1 +//#define MAGIC_KEY_LAYER2 2 +//#define MAGIC_KEY_LAYER3 3 +//#define MAGIC_KEY_LAYER4 4 +//#define MAGIC_KEY_LAYER5 5 +//#define MAGIC_KEY_LAYER6 6 +//#define MAGIC_KEY_LAYER7 7 +//#define MAGIC_KEY_LAYER8 8 +//#define MAGIC_KEY_LAYER9 9 +//#define MAGIC_KEY_BOOTLOADER PAUSE +//#define MAGIC_KEY_LOCK CAPS +//#define MAGIC_KEY_EEPROM E +//#define MAGIC_KEY_NKRO N +//#define MAGIC_KEY_SLEEP_LED Z + +/* + * 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 diff --git a/keyboards/handwired/magicforce68/keymaps/default/keymap.c b/keyboards/handwired/magicforce68/keymaps/default/keymap.c new file mode 100644 index 000000000..9f9cbcd66 --- /dev/null +++ b/keyboards/handwired/magicforce68/keymaps/default/keymap.c @@ -0,0 +1,66 @@ +#include "CMD60.h" + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = KEYMAP( /* CMD60 - QWERTY */ + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, \ + LT(3, KC_ENT), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NO, KC_ENT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_NO, KC_NO, KC_RSFT, \ + KC_LCTL, KC_LGUI, KC_LALT, LT(2, KC_SPC), MO(3), MO(4), MO(5), TG(1) \ + ), + [1] = KEYMAP( /* CMD60 - GameMode */ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_CAPS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, KC_TRNS, \ + KC_LSFT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, KC_NO, KC_RSFT, \ + KC_TRNS, KC_NO, KC_TRNS, KC_SPC, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS \ + ), + [2] = KEYMAP( /* CMD60 - Arrows */ + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, \ + KC_TRNS, KC_BSPC, KC_UP, KC_DEL, KC_TRNS, KC_TRNS, KC_TRNS, KC_BSPC, KC_UP, KC_DEL, KC_PSCR, KC_SLCK, KC_PAUS, KC_TRNS, \ + KC_TRNS, KC_LEFT, KC_DOWN, KC_RIGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_RIGHT, KC_TRNS, KC_TRNS, KC_NO, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_SPC, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, KC_NO, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS \ + ), + [3] = KEYMAP( /* CMD60 - Functions */ + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, \ + KC_AUDIO_MUTE, KC_BSPC, KC_PGUP, KC_DEL, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGUP, KC_UP, KC_PGDN, KC_TRNS, KC_PAUSE, KC_SLCK, KC_PSCREEN, \ + KC_TRNS, KC_HOME, KC_PGDN, KC_END, KC_TRNS, KC_TRNS, KC_HOME, KC_LEFT, KC_DOWN, KC_RIGHT, KC_TRNS, KC_INSERT, KC_NO, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_END, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, KC_NO, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS \ + ), + [4] = KEYMAP( /* CMD60 - Mouse */ + KC_SYSTEM_SLEEP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_BTN1, KC_MS_UP, KC_MS_BTN2, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT, KC_TRNS, KC_NO, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_WH_UP, KC_MS_BTN3, KC_MS_WH_DOWN, KC_NO, KC_NO, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS \ + ), + [5] = KEYMAP( /* CMD60 - Media */ + KC_SYSTEM_WAKE, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_AUDIO_VOL_DOWN, KC_AUDIO_VOL_UP, KC_AUDIO_MUTE, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MEDIA_PREV_TRACK, KC_MEDIA_NEXT_TRACK, KC_MEDIA_PLAY_PAUSE, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_WWW_BACK, KC_WWW_FORWARD, KC_NO, KC_NO, KC_WWW_REFRESH, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS \ + ), +}; + +const uint16_t PROGMEM fn_actions[] = { + +}; + + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + // MACRODOWN only works in this function + switch(id) { + case 0: + if (record->event.pressed) { + register_code(KC_RSFT); + } else { + unregister_code(KC_RSFT); + } + break; + } + return MACRO_NONE; +}; diff --git a/keyboards/handwired/magicforce68/magicforce68.c b/keyboards/handwired/magicforce68/magicforce68.c new file mode 100644 index 000000000..84b1007e2 --- /dev/null +++ b/keyboards/handwired/magicforce68/magicforce68.c @@ -0,0 +1,8 @@ +#include "magicforce68.h" + +void matrix_init_kb(void) { + // put your keyboard start-up code here + // runs once when the firmware starts up + + matrix_init_user(); +} diff --git a/keyboards/handwired/magicforce68/magicforce68.h b/keyboards/handwired/magicforce68/magicforce68.h new file mode 100644 index 000000000..de465a828 --- /dev/null +++ b/keyboards/handwired/magicforce68/magicforce68.h @@ -0,0 +1,20 @@ +#ifndef MAGICFORCE68_H +#define MAGICFORCE68_H + +#include "quantum.h" + +#define KEYMAP( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, \ + K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, \ + K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, \ + K40, K41, K42, K45, K4A, K4B, K4C, K4D \ + ) { \ + { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D }, \ + { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D }, \ + { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D }, \ + { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D }, \ + { K40, K41, K42, KC_NO, KC_NO, K45, KC_NO, KC_NO, KC_NO, KC_NO,K4A, K4B, K4C, K4D } \ +} + +#endif \ No newline at end of file diff --git a/keyboards/handwired/magicforce68/rules.mk b/keyboards/handwired/magicforce68/rules.mk new file mode 100644 index 000000000..711759917 --- /dev/null +++ b/keyboards/handwired/magicforce68/rules.mk @@ -0,0 +1,73 @@ + +# MCU name +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=512 + + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE ?= no # 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 ?= no # Breathing sleep LED during USB suspend +# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +NKRO_ENABLE ?= no # USB Nkey Rollover +BACKLIGHT_ENABLE ?= no # Enable keyboard backlight functionality on B7 by default +MIDI_ENABLE ?= no # MIDI controls +UNICODE_ENABLE ?= no # Unicode +BLUETOOTH_ENABLE ?= no # Enable Bluetooth with the Adafruit EZ-Key HID +AUDIO_ENABLE ?= no # Audio output on port C6 + +ifndef QUANTUM_DIR + include ../../../Makefile +endif + + From 6ee823a821d9c89a67c53f65ecf4d745223694a0 Mon Sep 17 00:00:00 2001 From: Danny Nguyen Date: Sun, 26 Feb 2017 10:16:24 -0500 Subject: [PATCH 05/17] Add rule for flashing microcontroller using avrdude --- keyboards/handwired/magicforce68/rules.mk | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/keyboards/handwired/magicforce68/rules.mk b/keyboards/handwired/magicforce68/rules.mk index 711759917..e897ef252 100644 --- a/keyboards/handwired/magicforce68/rules.mk +++ b/keyboards/handwired/magicforce68/rules.mk @@ -70,4 +70,14 @@ ifndef QUANTUM_DIR include ../../../Makefile endif +avrdude: build + ls /dev/tty* > /tmp/1; \ + echo "Reset your Pro Micro now"; \ + while [[ -z $$USB ]]; do \ + sleep 1; \ + ls /dev/tty* > /tmp/2; \ + USB=`diff /tmp/1 /tmp/2 | grep -o '/dev/tty.*'`; \ + done; \ + avrdude -p $(MCU) -c avr109 -P $$USB -U flash:w:$(BUILD_DIR)/$(TARGET).hex +.PHONY: avrdude From f3aef727e174279e69d8d5831d859d00802eb8c4 Mon Sep 17 00:00:00 2001 From: Danny Nguyen Date: Tue, 7 Mar 2017 11:41:10 -0500 Subject: [PATCH 06/17] Set pinout and layout --- keyboards/handwired/magicforce68/config.h | 6 +- .../magicforce68/keymaps/default/keymap.c | 90 ++++++++++--------- .../handwired/magicforce68/magicforce68.h | 20 ++--- 3 files changed, 61 insertions(+), 55 deletions(-) diff --git a/keyboards/handwired/magicforce68/config.h b/keyboards/handwired/magicforce68/config.h index 9671b66ba..8a49b0935 100644 --- a/keyboards/handwired/magicforce68/config.h +++ b/keyboards/handwired/magicforce68/config.h @@ -30,7 +30,7 @@ along with this program. If not, see . /* key matrix size */ #define MATRIX_ROWS 5 -#define MATRIX_COLS 14 +#define MATRIX_COLS 15 /* * Keyboard Matrix Assignments @@ -42,8 +42,8 @@ along with this program. If not, see . * ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode) * */ -#define MATRIX_ROW_PINS { F0, F4, F5, F6, F7 } -#define MATRIX_COL_PINS { B0, B1, B2, B3, B7, D0, D1, D2, D3, C6, D7, B4, B5, B6 } +#define MATRIX_ROW_PINS { F0, F1, F4, F5, F6 } +#define MATRIX_COL_PINS { B2, B0, D3, D2, D1, D0, D4, C6, D7, E6, B4, B5, B6, B7, D6 } #define UNUSED_PINS /* COL2ROW or ROW2COL */ diff --git a/keyboards/handwired/magicforce68/keymaps/default/keymap.c b/keyboards/handwired/magicforce68/keymaps/default/keymap.c index 9f9cbcd66..628249c2d 100644 --- a/keyboards/handwired/magicforce68/keymaps/default/keymap.c +++ b/keyboards/handwired/magicforce68/keymaps/default/keymap.c @@ -1,52 +1,58 @@ -#include "CMD60.h" +#include "magicforce68.h" + +#define _QWERTY 0 +#define _FN1 1 +#define _FN2 2 +#define KC_ KC_TRNS const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [0] = KEYMAP( /* CMD60 - QWERTY */ - KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, \ - KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, \ - LT(3, KC_ENT), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NO, KC_ENT, \ - KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_NO, KC_NO, KC_RSFT, \ - KC_LCTL, KC_LGUI, KC_LALT, LT(2, KC_SPC), MO(3), MO(4), MO(5), TG(1) \ + [_QWERTY] = KEYMAP( + /*,----+----+----+----+----+----+----+----+----+----+----+----+----+--------. ,----+----. */ + ESC , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 ,MINS,EQL , BSPC , INS ,PGUP, + /*|----`----`----`----`----`----`----`----`----`----`----`----`----`--------| |----`----| */ + TAB , Q , W , E , R , T , Y , U , I , O , P ,LBRC,RBRC, BSLS , DEL ,PGDN, + /*|------`----`----`----`----`----`----`----`----`----`----`----`----`------| `----`----' */ + FN0 , A , S , D , F , G , H , J , K , L ,SCLN,QUOT, ENTER , + /*|-------`----`----`----`----`----`----`----`----`----`----`----`----------| ,----. */ + LSFT , Z , X , C , V , B , N , M ,COMM,DOT ,SLSH, RSFT , UP , + /*|---------`----`----`----`----`----`----`----`----`----`----`-------------.--|----|----. */ + LCTL ,LGUI ,LALT , SPACE , FN1 ,RALT ,RCTL , LEFT,DOWN,RGHT + /*`-----+-----+-----+------------------------------+------+-----+-----' `----+----+----' */ ), - [1] = KEYMAP( /* CMD60 - GameMode */ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ - KC_CAPS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, KC_TRNS, \ - KC_LSFT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, KC_NO, KC_RSFT, \ - KC_TRNS, KC_NO, KC_TRNS, KC_SPC, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS \ - ), - [2] = KEYMAP( /* CMD60 - Arrows */ - KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, \ - KC_TRNS, KC_BSPC, KC_UP, KC_DEL, KC_TRNS, KC_TRNS, KC_TRNS, KC_BSPC, KC_UP, KC_DEL, KC_PSCR, KC_SLCK, KC_PAUS, KC_TRNS, \ - KC_TRNS, KC_LEFT, KC_DOWN, KC_RIGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_RIGHT, KC_TRNS, KC_TRNS, KC_NO, KC_TRNS, \ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_SPC, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, KC_NO, KC_TRNS, \ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS \ - ), - [3] = KEYMAP( /* CMD60 - Functions */ - KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, \ - KC_AUDIO_MUTE, KC_BSPC, KC_PGUP, KC_DEL, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGUP, KC_UP, KC_PGDN, KC_TRNS, KC_PAUSE, KC_SLCK, KC_PSCREEN, \ - KC_TRNS, KC_HOME, KC_PGDN, KC_END, KC_TRNS, KC_TRNS, KC_HOME, KC_LEFT, KC_DOWN, KC_RIGHT, KC_TRNS, KC_INSERT, KC_NO, KC_TRNS, \ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_END, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, KC_NO, KC_TRNS, \ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS \ - ), - [4] = KEYMAP( /* CMD60 - Mouse */ - KC_SYSTEM_SLEEP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_BTN1, KC_MS_UP, KC_MS_BTN2, KC_TRNS, KC_TRNS, KC_TRNS, \ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT, KC_TRNS, KC_NO, KC_TRNS, \ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_WH_UP, KC_MS_BTN3, KC_MS_WH_DOWN, KC_NO, KC_NO, KC_TRNS, \ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS \ - ), - [5] = KEYMAP( /* CMD60 - Media */ - KC_SYSTEM_WAKE, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_AUDIO_VOL_DOWN, KC_AUDIO_VOL_UP, KC_AUDIO_MUTE, \ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MEDIA_PREV_TRACK, KC_MEDIA_NEXT_TRACK, KC_MEDIA_PLAY_PAUSE, \ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_WWW_BACK, KC_WWW_FORWARD, KC_NO, KC_NO, KC_WWW_REFRESH, \ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS \ + + [_FN1] = KEYMAP( + /*,----+----+----+----+----+----+----+----+----+----+----+----+----+--------. ,----+----. */ + GRV , F1 , F2 , F3 , F4 , F5 , F6 , F7 , F8 , F9 ,F10 ,F11 ,F12 , BSPC , VOLU,HOME, + /*|esc-`-1--`-2--`-3--`-4--`-5--`-6--`-7--`-8--`-9--`-0--`mnus`plus`--bksp--| |ins-`pgup| */ + , , , UP , , , , , , , , , , , VOLD,END, + /*|tab---`-q--`-w--`-e--`-r--`-t--`-y--`-u--`-i--`-o--`-p--`-{--`-}--`--|---| `del-`pgdn' */ + , ,LEFT,DOWN,RGHT, , , , , , , , , + /*|caps---`-a--`-s--`-d--`-f--`-g--`-h--`-j--`-k--`-l--`-;--`-'--`----enter-| ,----. */ + , , , , , , ,MUTE, , , , , MUTE, + /*|shift----`-z--`-x--`-c--`-v--`-b--`-n--`-m--`-,--`-.--`-/--`-------shift-.--|-up-|----. */ + , , , , , , , MPRV,MPLY,MNXT + /*`ctrl-+-gui-+-alt-+----------space---------------+-fn---+-alt-+ctrl-' `left+down+rght' */ ), + + [_FN2] = KEYMAP( + /*,----+----+----+----+----+----+----+----+----+----+----+----+----+--------. ,----+----. */ + GRV , F1 , F2 , F3 , F4 , F5 , F6 , F7 , F8 , F9 ,F10 ,F11 ,F12 , BSPC , VOLU,HOME, + /*|esc-`-1--`-2--`-3--`-4--`-5--`-6--`-7--`-8--`-9--`-0--`mnus`plus`--bksp--| |ins-`pgup| */ + , , , UP , , , , 7 , 8 , 9 , , , , , VOLD,END, + /*|tab---`-q--`-w--`-e--`-r--`-t--`-y--`-u--`-i--`-o--`-p--`-{--`-}--`--|---| `del-`pgdn' */ + , ,LEFT,DOWN,RGHT, , , 4 , 5 , 6 , , , , + /*|caps---`-a--`-s--`-d--`-f--`-g--`-h--`-j--`-k--`-l--`-;--`-'--`----enter-| ,----. */ + , , , , , , 0 , 1 , 2 , 3 , , , MUTE, + /*|shift----`-z--`-x--`-c--`-v--`-b--`-n--`-m--`-,--`-.--`-/--`-------shift-.--|-up-|----. */ + , , , , , , , MPRV,MPLY,MNXT + /*`ctrl-+-gui-+-alt-+----------space---------------+-fn---+-alt-+ctrl-' `left+down+rght' */ + ) }; const uint16_t PROGMEM fn_actions[] = { - + [0] = LT(KC_FN2, KC_GRV), + [1] = MO(_FN1), + [2] = MO(_FN2), }; diff --git a/keyboards/handwired/magicforce68/magicforce68.h b/keyboards/handwired/magicforce68/magicforce68.h index de465a828..cfcdce38d 100644 --- a/keyboards/handwired/magicforce68/magicforce68.h +++ b/keyboards/handwired/magicforce68/magicforce68.h @@ -4,17 +4,17 @@ #include "quantum.h" #define KEYMAP( \ - K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, \ - K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \ - K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, \ - K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, \ - K40, K41, K42, K45, K4A, K4B, K4C, K4D \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K2E, \ + K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E, K3E, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, \ + K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3C, K3D, \ + K40, K41, K42, K45, K49, K4A, K4B, K4C, K4D, K4E \ ) { \ - { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D }, \ - { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D }, \ - { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D }, \ - { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D }, \ - { K40, K41, K42, KC_NO, KC_NO, K45, KC_NO, KC_NO, KC_NO, KC_NO,K4A, K4B, K4C, K4D } \ + { KC_##K00, KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07, KC_##K08, KC_##K09, KC_##K0A, KC_##K0B, KC_##K0C, KC_##K0D, KC_##K0E }, \ + { KC_##K10, KC_##K11, KC_##K12, KC_##K13, KC_##K14, KC_##K15, KC_##K16, KC_##K17, KC_##K18, KC_##K19, KC_##K1A, KC_##K1B, KC_##K1C, KC_##K1D, KC_##K1E }, \ + { KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26, KC_##K27, KC_##K28, KC_##K29, KC_##K2A, KC_##K2B, KC_##K2C, KC_NO, KC_##K2E }, \ + { KC_##K30, KC_##K31, KC_##K32, KC_##K33, KC_##K34, KC_##K35, KC_##K36, KC_##K37, KC_##K38, KC_##K39, KC_##K3A, KC_NO, KC_##K3C, KC_##K3D, KC_##K3E }, \ + { KC_##K40, KC_##K41, KC_##K42, KC_NO, KC_NO, KC_##K45, KC_NO, KC_NO, KC_NO, KC_##K49, KC_##K4A, KC_##K4B, KC_##K4C, KC_##K4D, KC_##K4E } \ } #endif \ No newline at end of file From 2cd2ac02d1c215167a1d82d675dc7cab1d5d90be Mon Sep 17 00:00:00 2001 From: Danny Nguyen Date: Tue, 7 Mar 2017 12:19:29 -0500 Subject: [PATCH 07/17] Add readme file --- keyboards/handwired/magicforce68/README.md | 39 ++++++------------ .../handwired/magicforce68/wiring-layout.png | Bin 0 -> 73739 bytes 2 files changed, 12 insertions(+), 27 deletions(-) create mode 100644 keyboards/handwired/magicforce68/wiring-layout.png diff --git a/keyboards/handwired/magicforce68/README.md b/keyboards/handwired/magicforce68/README.md index 83e371543..4f0ccecf9 100644 --- a/keyboards/handwired/magicforce68/README.md +++ b/keyboards/handwired/magicforce68/README.md @@ -1,35 +1,20 @@ -CMD60 keyboard firmware -====================== +Magicforce 68 Handwired +======================= -##CMD60 +This firmware is for a Magicforce 68 that's had its PCB removed and is handwired with an Arduino Micro. NOTE: The Arduino Micro is different than the Arduino *Pro* Micro. -This layout has been designed to optimize use of the left-hand, and it focussed specifically on programmers who work -with text editors like SublimeText and Atom. It utilizes the power of Space_fn, and features a caps lock swap for Fn2 -and enter key on tap. These features allow you to keep your right hand on the mouse more and should enable you to -achieve a higher level of productivity if you take the time to learn its function layers. +## Wiring Layout -## Quantum MK Firmware +![Wiring Layout](wiring-layout.png) -For the full Quantum feature list, see [the parent readme.md](/doc/readme.md). +## Pinout -## Building +The following pins are used: +- Columns 1-15: B2, B0, D3, D2, D1, D0, D4, C6, D7, E6, B4, B5, B6, B7, D6 +- Rows 1-5: F0, F1, F4, F5, F6 -Download or clone the whole firmware and navigate to the keyboards/handwired/CMD60 folder. -Once your dev env is setup, you'll be able to type `make` to generate your .hex - you can then use -the Teensy Loader to program your .hex file. +## Compiling and loading the firmware -Depending on which keymap you would like to use, you will have to compile slightly differently. +To build the firmware, run `make`. -### Default - -To build with the default keymap, simply run `make`. - -### Other Keymaps - -To build the firmware binary hex file with a keymap just do `make` with `keymap` option like: - -``` -$ make keymap=[default|jack|] -``` - -Keymaps follow the format **__keymap.c__** and are stored in folders in the `keymaps` folder, eg `keymaps/my_keymap/` +To flash the firemware onto the microcontroller, run `make avrdude`, and press the reset button. diff --git a/keyboards/handwired/magicforce68/wiring-layout.png b/keyboards/handwired/magicforce68/wiring-layout.png new file mode 100644 index 0000000000000000000000000000000000000000..816b10b2b5394e95cc1b78b64a505f39878bc64a GIT binary patch literal 73739 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 literal 0 HcmV?d00001 From 38a83700c3c21326e691452c4dc002d398812679 Mon Sep 17 00:00:00 2001 From: Danny Nguyen Date: Tue, 7 Mar 2017 12:29:48 -0500 Subject: [PATCH 08/17] Update description --- keyboards/handwired/magicforce68/config.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboards/handwired/magicforce68/config.h b/keyboards/handwired/magicforce68/config.h index 8a49b0935..1e2b7d3e7 100644 --- a/keyboards/handwired/magicforce68/config.h +++ b/keyboards/handwired/magicforce68/config.h @@ -26,7 +26,7 @@ along with this program. If not, see . #define DEVICE_VER 0x0001 #define MANUFACTURER Hexwire #define PRODUCT Magicforce 68 -#define DESCRIPTION Advanced Programming Keeb Layout +#define DESCRIPTION Handwired Magicforce 68 /* key matrix size */ #define MATRIX_ROWS 5 From a9959783c0a190410307e3e6cc1be4c024e9cddd Mon Sep 17 00:00:00 2001 From: stites Date: Tue, 7 Mar 2017 11:45:47 -0500 Subject: [PATCH 09/17] Add freebsd support in "util/install_dependencies.sh" A simple addition to the `install_dependencies` script which remaps the debian dependencies to their freebsd package-names. After a recursive clone and using gmake, I can successfully build all firmware from the root directory (minus some warnings generated by gcc-4.9.4 which I can procure on request). however there is a problem running tests. --- util/install_dependencies.sh | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/util/install_dependencies.sh b/util/install_dependencies.sh index 936a86593..1b73a8b3b 100755 --- a/util/install_dependencies.sh +++ b/util/install_dependencies.sh @@ -92,4 +92,23 @@ elif [[ -n "$(type -P zypper)" ]]; then # TODO: The avr and eabi tools are not available as default packages, so we need # another way to install them +elif [[ -n "$(type -P pkg)" ]]; then + # FreeBSD + pkg update + pkg install -y \ + git \ + wget \ + gmake \ + gcc \ + zip \ + unzip \ + avr-binutils \ + avr-gcc \ + avr-libc \ + dfu-programmer \ + dfu-util \ + arm-none-eabi-gcc \ + arm-none-eabi-binutils \ + arm-none-eabi-newlib \ + diffutils fi From 7042af702057d4d129f1517712fab7f28e75b2f3 Mon Sep 17 00:00:00 2001 From: Danny Nguyen Date: Tue, 7 Mar 2017 23:06:41 -0500 Subject: [PATCH 10/17] Add Makefile --- keyboards/handwired/magicforce68/Makefile | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 keyboards/handwired/magicforce68/Makefile diff --git a/keyboards/handwired/magicforce68/Makefile b/keyboards/handwired/magicforce68/Makefile new file mode 100644 index 000000000..191c6bb66 --- /dev/null +++ b/keyboards/handwired/magicforce68/Makefile @@ -0,0 +1,3 @@ +ifndef MAKEFILE_INCLUDED + include ../../../Makefile +endif \ No newline at end of file From 3d082382b20ab338bb7f41b33329daffc994169a Mon Sep 17 00:00:00 2001 From: Danny Nguyen Date: Tue, 7 Mar 2017 23:08:44 -0500 Subject: [PATCH 11/17] Fix function layer actions --- .../handwired/magicforce68/keymaps/default/keymap.c | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/keyboards/handwired/magicforce68/keymaps/default/keymap.c b/keyboards/handwired/magicforce68/keymaps/default/keymap.c index 628249c2d..22553f714 100644 --- a/keyboards/handwired/magicforce68/keymaps/default/keymap.c +++ b/keyboards/handwired/magicforce68/keymaps/default/keymap.c @@ -4,6 +4,8 @@ #define _FN1 1 #define _FN2 2 #define KC_ KC_TRNS +#define KC_X0 LT(_FN2, KC_GRV) +#define KC_X1 MO(_FN1) const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_QWERTY] = KEYMAP( @@ -12,11 +14,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /*|----`----`----`----`----`----`----`----`----`----`----`----`----`--------| |----`----| */ TAB , Q , W , E , R , T , Y , U , I , O , P ,LBRC,RBRC, BSLS , DEL ,PGDN, /*|------`----`----`----`----`----`----`----`----`----`----`----`----`------| `----`----' */ - FN0 , A , S , D , F , G , H , J , K , L ,SCLN,QUOT, ENTER , + X0 , A , S , D , F , G , H , J , K , L ,SCLN,QUOT, ENTER , /*|-------`----`----`----`----`----`----`----`----`----`----`----`----------| ,----. */ LSFT , Z , X , C , V , B , N , M ,COMM,DOT ,SLSH, RSFT , UP , /*|---------`----`----`----`----`----`----`----`----`----`----`-------------.--|----|----. */ - LCTL ,LGUI ,LALT , SPACE , FN1 ,RALT ,RCTL , LEFT,DOWN,RGHT + LCTL ,LGUI ,LALT , SPACE , X1 ,RALT ,RCTL , LEFT,DOWN,RGHT /*`-----+-----+-----+------------------------------+------+-----+-----' `----+----+----' */ ), @@ -49,13 +51,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ) }; -const uint16_t PROGMEM fn_actions[] = { - [0] = LT(KC_FN2, KC_GRV), - [1] = MO(_FN1), - [2] = MO(_FN2), -}; - - const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { // MACRODOWN only works in this function From cd1eb8d24649662dcc1e916634beb481c98173d7 Mon Sep 17 00:00:00 2001 From: Gunther Gruber Date: Wed, 8 Mar 2017 11:13:19 +0100 Subject: [PATCH 12/17] added readme file --- keyboards/ergodox/keymaps/guni/readme.txt | 133 ++++++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 keyboards/ergodox/keymaps/guni/readme.txt diff --git a/keyboards/ergodox/keymaps/guni/readme.txt b/keyboards/ergodox/keymaps/guni/readme.txt new file mode 100644 index 000000000..93ae5f056 --- /dev/null +++ b/keyboards/ergodox/keymaps/guni/readme.txt @@ -0,0 +1,133 @@ +My main layout (Layer 0) is based on qwerty. I tried to fit the layout of the kinesis keyboard onto the ergodox. Furthermore I did some tweaks. +The other layers are seldom used. Except the F Keys and the teensy key. As I own a ergodox I cant press the reset button, so i need a key to send the teensy into reprogram mode. +There is a layer with symbols a numpad. These layers are seldom used. Except the F Keys and the teensy key. As I own a ergodox I need a key to reprogram, because I can't access the reset button. + +I am a linux user and need the esc key and str keys often therefore it is easyly accessed. Switching console str+alt+tab+f2 (layer 2 and 2) is tricky but you get it after a while. +As I live in germany and need to type umlaut frquently, i mapped the CAPS to the meta key, and swapped ' and ". So I can type ö with CAPS o + ¨. no need to press o+SHIFT+' +As a note for linux users i use str+p to get last command, instead of using the cursor keys. + +HOWTO to convert CAPS to Meta-Key and swap ' with " + +* create file with following content +.Xmodmap + clear Lock + keycode 48 = quotedbl apostrophe quotedbl apostrophe + keycode 66 = Multi_key + +* apply with +xmodmap .Xmodmap + +* convert to xkbmap +xkbcomp $DISPLAY $HOME/.xkbmap + +* automatic startup each time you startup x +echo 'xkbcomp $HOME/.xkbmap $DISPLAY' >> ~/.xinitrc + + KEYMAP( // layer 0 : default + // left hand + KC_EQL , KC_1, KC_2, KC_3, KC_4, KC_5, KC_LBRC, + KC_FN25 , KC_Q, KC_W, KC_E, KC_R, KC_T, KC_HOME, + KC_FN27 , KC_A, KC_S, KC_D, KC_F, KC_G, + KC_LSFT , KC_Z, KC_X, KC_C, KC_V, KC_B, KC_PGUP, + KC_LGUI , KC_GRV,KC_LEFT,KC_RGHT,KC_LALT, + KC_NO , KC_NO , + KC_NO , + KC_BSPC,KC_DEL ,KC_FN23, + // right hand + KC_RBRC , KC_6, KC_7 , KC_8, KC_9, KC_0, KC_MINS, + KC_END , KC_Y, KC_U , KC_I, KC_O, KC_P, KC_FN28, + KC_H , KC_J, KC_K , KC_L, KC_SCLN,KC_FN30, + KC_PGDN , KC_N, KC_M , KC_COMM,KC_DOT, KC_SLSH,KC_FN29, + KC_RALT , KC_DOWN,KC_UP, KC_NO ,KC_RGUI, + KC_NO , KC_NO, + KC_NO , + KC_FN29,KC_ENT ,KC_SPC + ), + + KEYMAP( // layer 1 : function and symbol keys + // left hand + KC_TRNS,KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F11, + KC_TRNS,KC_AT,KC_UNDS ,KC_LBRC,KC_RBRC,KC_CIRC ,KC_TRNS, + KC_TRNS,KC_BSLS,KC_SLSH,KC_LCBR ,KC_RCBR ,KC_ASTR, + KC_TRNS,KC_HASH ,KC_DLR ,KC_PIPE ,KC_TILD ,KC_GRV ,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS, + KC_TRNS, + KC_TRNS,KC_TRNS,KC_FN1, + // right hand + KC_F12, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_TRNS, + KC_TRNS,KC_EXLM,LSFT(KC_COMM),LSFT(KC_DOT),KC_EQL,KC_AMPR, KC_TRNS, + LSFT(KC_SLSH),KC_LPRN,KC_RPRN,KC_MINS,LSFT(KC_SCLN),KC_TRNS, + KC_TRNS,KC_PLUS,LSFT(KC_5),LSFT(KC_QUOT),KC_QUOT,KC_SCLN,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS, + KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS + ), + + KEYMAP( // layer 2: navigation + // left hand + KC_NO,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_PGUP,KC_HOME,KC_UP ,KC_END,KC_NO ,KC_TRNS, + KC_TRNS,KC_PGDN,KC_LEFT,KC_DOWN,KC_RGHT,KC_NO, + KC_TRNS,KC_NO, KC_NO, KC_NO, KC_NO,KC_NO,KC_NO, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS, + KC_TRNS, + KC_TRNS,KC_TRNS,KC_FN1 , + // right hand + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS ,KC_TRNS, KC_HOME, KC_TRNS, KC_TRNS, KC_END ,KC_TRNS, + KC_NO, KC_LEFT, KC_UP, KC_DOWN, KC_RGHT,KC_TRNS, + KC_TRNS,KC_TRNS, KC_HOME, KC_UP, KC_END, KC_PGUP,KC_TRNS, + KC_LEFT, KC_DOWN,KC_RGHT,KC_PGDN,KC_TRNS, + KC_TRNS,KC_TRNS, + KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS + ), + KEYMAP( // layer 3 : teensy bootloader functions + // left hand + KC_FN0, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS, + KC_TRNS, + KC_TRNS,KC_TRNS,KC_FN1 , + // right hand + KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS, + KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS + ), + + + KEYMAP( // layer 4: numpad + // left hand + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS, + KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS, + // right hand + KC_TRNS,KC_NLCK,KC_PSLS,KC_PAST,KC_PAST,KC_PMNS,KC_BSPC, + KC_TRNS,KC_NO, KC_P7, KC_P8, KC_P9, KC_PMNS,KC_BSPC, + KC_NO, KC_P4, KC_P5, KC_P6, KC_PPLS,KC_PENT, + KC_TRNS,KC_NO, KC_P1, KC_P2, KC_P3, KC_PPLS,KC_PENT, + KC_P0, KC_PDOT,KC_SLSH,KC_PENT,KC_PENT, + KC_TRNS,KC_TRNS, + KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS + ), + +}; + + From 2aa079d93e31403debd467fb4eed98fb98cced0f Mon Sep 17 00:00:00 2001 From: Lukas Stiebig Date: Wed, 8 Mar 2017 20:41:35 +0100 Subject: [PATCH 13/17] Left control and alt Use the left control and the left alt key. --- quantum/quantum_keycodes.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/quantum/quantum_keycodes.h b/quantum/quantum_keycodes.h index 63b626926..903d57f1e 100644 --- a/quantum/quantum_keycodes.h +++ b/quantum/quantum_keycodes.h @@ -183,6 +183,7 @@ enum quantum_keycodes { #define ALTG(kc) (kc | QK_RCTL | QK_RALT) #define SCMD(kc) (kc | QK_LGUI | QK_LSFT) #define SWIN(kc) SCMD(kc) +#define LCA(kc) (kc | QK_LCTL | QK_LALT) #define MOD_HYPR 0xf #define MOD_MEH 0x7 @@ -339,6 +340,7 @@ enum quantum_keycodes { #define ALL_T(kc) MT((MOD_LCTL | MOD_LSFT | MOD_LALT | MOD_LGUI), kc) // see http://brettterpstra.com/2012/12/08/a-useful-caps-lock-key/ #define SCMD_T(kc) MT((MOD_LGUI | MOD_LSFT), kc) #define SWIN_T(kc) SCMD_T(kc) +#define LCA_T(kc) MT((MOD_LCTL | MOD_LALT), kc) // Left control and left alt // Dedicated keycode versions for Hyper and Meh, if you want to use them as standalone keys rather than mod-tap #define KC_HYPR HYPR(KC_NO) From 8cc70f4d9dd75e4efb186ec71ee4a3a7a0dd4587 Mon Sep 17 00:00:00 2001 From: Lukas Stiebig Date: Wed, 8 Mar 2017 20:58:55 +0100 Subject: [PATCH 14/17] Added german-lukas Added my keymap called germman-lukas. --- .../ergodox/keymaps/german-lukas/keymap.c | 235 ++++++++++++++++++ 1 file changed, 235 insertions(+) create mode 100644 keyboards/ergodox/keymaps/german-lukas/keymap.c diff --git a/keyboards/ergodox/keymaps/german-lukas/keymap.c b/keyboards/ergodox/keymaps/german-lukas/keymap.c new file mode 100644 index 000000000..f6709595e --- /dev/null +++ b/keyboards/ergodox/keymaps/german-lukas/keymap.c @@ -0,0 +1,235 @@ +#include "ergodox.h" +#include "debug.h" +#include "action_layer.h" +#include "keymap_german.h" + +// Layer names +#define BASE 0 // default layer +#define SYMB 1 // symbol layer +#define MDIA 2 // media keys +#define SHRT 3 // shortcut layer + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +/* Keymap 0: Basic layer + * + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | Caps | 1 | 2 | 3 | 4 | 5 |X ` X| | PRSC | 6 | 7 | 8 | 9 | 0 | ß | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | Tab | Q | W | E | R | T | L1 | | L1 | Z | U | I | O | P | Ü | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | Esc | A | S | D | F | G |------| |------| H | J | K | L | Ö | Ä/L2 | + * |--------+------+------+------+------+------| L2 | | L2 |------+------+------+------+------+--------| + * | LShift | Y | X | C | V | B | | | | N | M | , | . | - | RShift | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | LGui | ^ | < | LEFT | RIGHT| | Up | Down | # | + | LCA | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | CTRL | ALT | | Alt |Ctrl/Esc| + * ,------+------+------| |------+--------+------. + * | | | Home | | PgUp | | | + * | Space|Del |------| |------| Bkspc | Enter| + * | | | End | | PgDn | | | + * `--------------------' `----------------------' + */ +// If it accepts an argument (i.e, is a function), it doesn't need KC_. +// Otherwise, it needs KC_* +[BASE] = KEYMAP( // layer 0 : default + // left hand + KC_CAPS, KC_1, KC_2, KC_3, KC_4, KC_5, DE_ACUT, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, TG(SYMB), + KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, + KC_LSFT, DE_Y, KC_X, KC_C, KC_V, KC_B, ALL_T(KC_NO), + KC_LGUI, DE_CIRC, DE_LESS, KC_LEFT, KC_RIGHT, + KC_LCTRL, KC_LALT, + KC_HOME, + KC_SPC ,KC_DELT,KC_END, + // right hand + KC_PSCREEN, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, + TG(MDIA), DE_Z, KC_U, KC_I, KC_O, KC_P, LT(SHRT,DE_UE), + KC_H, KC_J, KC_K, KC_L, DE_OE, LT(MDIA,DE_AE), + MEH_T(KC_NO), KC_N, KC_M, KC_COMM, KC_DOT, DE_MINS, KC_RSFT, + KC_UP, KC_DOWN, DE_HASH, DE_PLUS, LCA_T(KC_NO), + KC_RALT, KC_RCTRL, + KC_PGUP, + KC_PGDN, KC_BSPC, KC_ENT + ), + +/* Keymap 1: Symbol Layer + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | F11 | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | | ! | @ | { | } | | | | | | Up | 7 | 8 | 9 | * | F12 | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | # | $ | ( | ) | ` |------| |------| Down | 4 | 5 | 6 | + | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | % | ^ | [ | ] | ~ | | | | & | 1 | 2 | 3 | \ | | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | | | | | | | . | 0 | = | | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | | | | | | + * ,------|------|------| |------+------+------. + * | | | | | | | | + * | | |------| |------| | | + * | | | | | | | | + * `--------------------' `--------------------' + */ +// SYMBOLS +[SYMB] = KEYMAP( + // left hand + KC_TRNS,KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS, + KC_TRNS,DE_EXLM,DE_AT, DE_LCBR,DE_RCBR,DE_PIPE,KC_TRNS, + KC_TRNS,DE_HASH,DE_DLR, DE_LPRN,DE_RPRN,DE_GRV, + KC_TRNS,DE_PERC,DE_CIRC,DE_LBRC,DE_RBRC,DE_TILD,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS, + KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS, + // right hand + KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, + KC_TRNS, KC_UP, KC_7, KC_8, KC_9, DE_ASTR, KC_F12, + KC_DOWN, KC_4, KC_5, KC_6, DE_PLUS, KC_TRNS, + KC_TRNS, DE_AMPR, KC_1, KC_2, KC_3, DE_BSLS, KC_TRNS, + KC_TRNS,KC_DOT, KC_0, DE_EQL, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS +), + +/* Keymap 2: Media and mouse keys + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | F11 | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | | | Lclk | MsUp | Rclk | | | | | |VolDwn| Mute |VolUp | | F12 | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | Btn4 |MsLeft|MsDown|MsRght| Btn5 |------| |------| | Prev | Stop | Play | Next | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | |WhRght|WhDown| WhUp |WhLeft|WhClk | | | |BwSrch|BwBack|BwHome|BwRefr|BwFwd | | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | |MsAcl0|MsAcl1|MsAcl2| | | | | | | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | | | | | | + * ,------|------|------| |------+------+------. + * | | | | | |Brwser|Brwser| + * | Lclk | Rclk |------| |------|Back |Forwd | + * | | | | | | | | + * `--------------------' `--------------------' + */ +// MEDIA AND MOUSE +[MDIA] = KEYMAP( + // left hand + KC_TRNS, KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_F5 , KC_TRNS, + KC_TRNS, KC_TRNS, KC_BTN1, KC_MS_U, KC_BTN2, KC_TRNS, KC_TRNS, + KC_TRNS, KC_BTN4, KC_MS_L, KC_MS_D, KC_MS_R, KC_BTN5, + KC_TRNS, KC_WH_L, KC_WH_D, KC_WH_U, KC_WH_R, KC_BTN3, KC_TRNS, + KC_TRNS, KC_TRNS, KC_ACL0, KC_ACL1, KC_ACL2, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_BTN1, KC_BTN2, KC_TRNS, + // right hand + KC_TRNS, KC_F6 , KC_F7 , KC_F8 , KC_F9 , KC_F10 , KC_F11, + KC_TRNS, KC_TRNS, KC_VOLD, KC_MUTE, KC_VOLU, KC_TRNS, KC_F12, + KC_TRNS, KC_MPRV, KC_MSTP, KC_MPLY, KC_MNXT, KC_TRNS, + KC_TRNS, KC_WSCH, KC_WBAK, KC_WHOM, KC_WREF, KC_WFWD, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_WBAK, KC_WFWD +), + +/* Keymap 3: Linux shortcuts + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | | | | | | | | | | | | | | | | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | |LCA-F1|LCA-F2|LCA-F3|LCA-F4|LCA-F5| | | |LCA-F6|LCA-F7|LCA-F8|LCA-F9| | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | |LCA-Le| |LCA-Ri| |------| |------| | | | | | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | | | | | | | | | | | | | | | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | | |LCA-Le|LCA-Ri| | | | | | | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | | | | | | + * ,------|------|------| |------+------+------. + * | | | | | | | | + * | | |------| |------| | | + * | | | | | | | | + * `--------------------' `--------------------' + */ +// MEDIA AND MOUSE +[SHRT] = KEYMAP( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, LCA(KC_F1), LCA(KC_F2), LCA(KC_F3), LCA(KC_F4), LCA(KC_F5), KC_TRNS, + KC_TRNS, KC_TRNS, LCA(KC_LEFT), KC_TRNS, LCA(KC_RIGHT), KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, LCA(KC_LEFT), LCA(KC_RIGHT), + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, + // right hand + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, LCA(KC_F6), LCA(KC_F7), LCA(KC_F8), LCA(KC_F9), KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + LCA(KC_UP), LCA(KC_DOWN), KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS +), +}; + +const uint16_t PROGMEM fn_actions[] = { + [1] = ACTION_LAYER_TAP_TOGGLE(SYMB) // FN1 - Momentary Layer 1 (Symbols) +}; + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + // MACRODOWN only works in this function + switch(id) { + case 0: + if (record->event.pressed) { + register_code(KC_RSFT); + } else { + unregister_code(KC_RSFT); + } + break; + } + return MACRO_NONE; +}; + +// Runs just one time when the keyboard initializes. +void matrix_init_user(void) { + +}; + +// Runs constantly in the background, in a loop. +void matrix_scan_user(void) { + + uint8_t layer = biton32(layer_state); + + ergodox_board_led_off(); + ergodox_right_led_1_off(); + ergodox_right_led_2_off(); + ergodox_right_led_3_off(); + switch (layer) { + case SYMB: + ergodox_right_led_1_on(); + break; + case MDIA: + ergodox_right_led_2_on(); + break; + case SHRT: + ergodox_right_led_3_on(); + break; + default: + ergodox_board_led_off(); + break; + } + +}; From 2f5143e219c8410cfaeeadb87782b3dc212aa3b9 Mon Sep 17 00:00:00 2001 From: Lukas Stiebig Date: Wed, 8 Mar 2017 21:09:51 +0100 Subject: [PATCH 15/17] Corrected the description of the layer Corrected the description of the Shortcuts layer. --- keyboards/ergodox/keymaps/german-lukas/keymap.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/keyboards/ergodox/keymaps/german-lukas/keymap.c b/keyboards/ergodox/keymaps/german-lukas/keymap.c index f6709595e..c6e9f2f90 100644 --- a/keyboards/ergodox/keymaps/german-lukas/keymap.c +++ b/keyboards/ergodox/keymaps/german-lukas/keymap.c @@ -162,8 +162,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | | | | * `--------------------' `--------------------' */ -// MEDIA AND MOUSE +// Shortcuts [SHRT] = KEYMAP( + // left hand KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, LCA(KC_F1), LCA(KC_F2), LCA(KC_F3), LCA(KC_F4), LCA(KC_F5), KC_TRNS, KC_TRNS, KC_TRNS, LCA(KC_LEFT), KC_TRNS, LCA(KC_RIGHT), KC_TRNS, From 34fa8fd5d3f0c46135f22d5d24b098c9e7117b67 Mon Sep 17 00:00:00 2001 From: Lukas Stiebig Date: Wed, 8 Mar 2017 21:14:16 +0100 Subject: [PATCH 16/17] readme Added a readme.md file for the keymap german-lukas. --- keyboards/ergodox/keymaps/german-lukas/README.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 keyboards/ergodox/keymaps/german-lukas/README.md diff --git a/keyboards/ergodox/keymaps/german-lukas/README.md b/keyboards/ergodox/keymaps/german-lukas/README.md new file mode 100644 index 000000000..3566b4ee6 --- /dev/null +++ b/keyboards/ergodox/keymaps/german-lukas/README.md @@ -0,0 +1,12 @@ +# About this keymap + +This keymap is based on the qwertz layout. +It has a key for pressing the left control and the left alt key at once. + +Linux makes a difference between AltGr and Control + Alt. Some keybindings are easier to press now. + +Also, I added a layer for pressing Control + Alt + F-Keys very fast. + +# Layer + +Each layer in the *keymap.c*-file has a comment showing the mappings of the layer. From 7c7a77d4bf8f35cd7f59119be0e95b5d28063988 Mon Sep 17 00:00:00 2001 From: Erez Zukerman Date: Wed, 8 Mar 2017 19:43:10 -0500 Subject: [PATCH 17/17] Tweaks keymap to reset on boot --- keyboards/ergodox/keymaps/reset_eeprom/keymap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboards/ergodox/keymaps/reset_eeprom/keymap.c b/keyboards/ergodox/keymaps/reset_eeprom/keymap.c index f708454ce..8d6897658 100644 --- a/keyboards/ergodox/keymaps/reset_eeprom/keymap.c +++ b/keyboards/ergodox/keymaps/reset_eeprom/keymap.c @@ -111,7 +111,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { // Runs just one time when the keyboard initializes. void matrix_init_user(void) { - + eeconfig_init(); };