@ -0,0 +1,31 @@ | |||
#include QMK_KEYBOARD_H | |||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | |||
/* 0: qwerty */ | |||
LAYOUT_all( | |||
KC_GRV, 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, | |||
CTL_T(KC_ESC), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, | |||
KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, RSFT_T(KC_UP), _______, | |||
MO(1), KC_LALT, KC_LGUI, KC_SPC, _______, RGUI_T(KC_LEFT), RALT_T(KC_DOWN), LT(2, KC_RIGHT) | |||
), | |||
/* 1: fn1 */ | |||
LAYOUT_all( | |||
_______, 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_HOME, KC_PGUP, _______, | |||
_______, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, KC_END, KC_PGDOWN, _______, | |||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, | |||
_______, _______, _______, _______, _______, _______, _______, _______ | |||
), | |||
/* 2: fn2 */ | |||
LAYOUT_all( | |||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, | |||
_______, _______, _______, _______, RESET, _______, _______, _______, _______, _______, KC_VOLD, KC_MUTE, KC_VOLU, _______, | |||
_______, _______, _______, DEBUG, _______, _______, _______, _______, _______, _______, KC_SCROLLLOCK, KC_PAUSE, _______, | |||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, | |||
_______, _______, _______, _______, _______, _______, _______, _______ | |||
), | |||
} | |||
; | |||
const uint16_t PROGMEM fn_actions[] = {}; |
@ -0,0 +1,35 @@ | |||
# Contra layout | |||
My current setup consists of a very simple base layer, numbers layer, mouse layer and emoji layer. | |||
Still many options, but time will tell if changes are needed. | |||
## Keymap | |||
``` | |||
#define SP_MSE LT(_MOUSE, KC_SPC) | |||
BASE layer | |||
{ KC_GESC , KC_Q , KC_W , KC_E , KC_R , KC_T , KC_Y , KC_U , KC_I , KC_O , KC_P , KC_BSPC }, | |||
{ KC_TAB , KC_A , KC_S , KC_D , KC_F , KC_G , KC_H , KC_J , KC_K , KC_L , KC_SCLN , 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_QUOT }, | |||
{ KC_LCTL , KC_GRV , KC_LALT , KC_LGUI , MO(1) , SP_MSE , SP_MSE , KC_LEFT , KC_DOWN , KC_UP , KC_RGHT , MO(2) }, | |||
LOWER layer | |||
{ _______ , KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , KC_DEL }, | |||
{ _______ , KC_F1 , KC_F2 , KC_F3 , KC_LBRC , KC_MINS , KC_EQL , KC_RBRC , KC_F7 , KC_F8 , KC_F9 , _______ }, | |||
{ _______ , KC_F4 , KC_F5 , KC_F6 , KC_HOME , KC_BSLS , KC_MPLY , KC_END , KC_F10 , KC_F11 , KC_F12 , _______ }, | |||
{ _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ }, | |||
EMOJI layer | |||
{ _______ , X(CLAP) , X(CUM) , X(BNIS) , X(BUTT) , X(CAR) , X(FIRE) , X(REDB) , X(MONY) , X(HNDR) , X(SOS) , _______ }, | |||
{ _______ , X(CELE) , X(PRAY) , X(NAIL) , X(OK) , X(THNK) , X(UNAM) , X(HEYE) , X(COOL) , X(EYES) , X(SMIR) , _______ }, | |||
{ _______ , X(TRIU) , X(SCRM) , X(VOMI) , X(DTIV) , X(EXPL) , X(HAIR) , X(DANC) , X(STRN) , X(LEFT) , X(RGHT) , _______ }, | |||
{ _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ }, | |||
MOUSE layer | |||
{ _______ , KC_WH_L , KC_BTN1 , KC_MS_U , KC_BTN2 , KC_WH_U , KC_WH_U , KC_BTN1 , KC_MS_U , KC_BTN2 , KC_WH_L , _______ }, | |||
{ _______ , KC_WH_R , KC_MS_L , KC_MS_D , KC_MS_R , KC_WH_D , KC_WH_D , KC_MS_L , KC_MS_D , KC_MS_R , KC_WH_R , _______ }, | |||
{ _______ , KC_VOLD , KC_VOLU , KC_MPRV , KC_MNXT , KC_MPLY , KC_MPLY , KC_MPRV , KC_MNXT , KC_VOLD , KC_VOLU , _______ }, | |||
{ _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ }, | |||
``` |
@ -0,0 +1,9 @@ | |||
#pragma once | |||
#define MOUSEKEY_DELAY 0 | |||
#define MOUSEKEY_INTERVAL 16 | |||
#define MOUSEKEY_MAX_SPEED 7 | |||
#define MOUSEKEY_TIME_TO_MAX 60 | |||
#define MOUSEKEY_WHEEL_MAX_SPEED 8 | |||
#define MOUSEKEY_WHEEL_TIME_TO_MAX 40 | |||
#define MOUSEKEY_WHEEL_DELAY 0 |
@ -0,0 +1,126 @@ | |||
/* Copyright 2018 darm | |||
* | |||
* 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/>. | |||
*/ | |||
#include QMK_KEYBOARD_H | |||
enum emoji_map { | |||
UNAM, // unamused 😒 | |||
HEYE, // smiling face with heart shaped eyes 😍 | |||
OK, // ok hand sign 👌 | |||
SMIR, // smirk 😏 | |||
PRAY, // pray 🙏 | |||
CELE, // celebration 🙌 | |||
COOL, // smile with sunglasses 😎 | |||
EYES, // eyes | |||
THNK, // BIG THONK | |||
NAIL, // Nailcare | |||
SOS, // Vuile sos | |||
REDB, // Red B | |||
HNDR, // 100 | |||
MONY, | |||
FIRE, | |||
CAR, | |||
BUTT, | |||
BNIS, | |||
CUM, | |||
CLAP, | |||
TRIU, // Fart from nose | |||
SCRM, | |||
VOMI, | |||
DTIV, // Detective | |||
EXPL, // Brainsplosion | |||
HAIR, // Haircut | |||
DANC, // Salsa dancer | |||
STRN, // Stronk | |||
LEFT, // Point Left | |||
RGHT, // Point Right | |||
}; | |||
const uint32_t PROGMEM unicode_map[] = { | |||
[UNAM] = 0x1F612, | |||
[HEYE] = 0x1f60d, | |||
[OK] = 0x1F44C, | |||
[SMIR] = 0x1F60F, | |||
[PRAY] = 0x1F64F, | |||
[CELE] = 0x1F64C, | |||
[COOL] = 0x1F60E, | |||
[EYES] = 0x1F440, | |||
[THNK] = 0x1F914, | |||
[NAIL] = 0x1F485, | |||
[SOS] = 0x1F198, | |||
[REDB] = 0x1F171, | |||
[HNDR] = 0x1F4AF, | |||
[MONY] = 0x1F480, | |||
[FIRE] = 0x1F525, | |||
[CAR] = 0x1F697, | |||
[BUTT] = 0x1F351, | |||
[BNIS] = 0x1F346, | |||
[CUM] = 0x1F4A6, | |||
[CLAP] = 0x1F44F, | |||
[TRIU] = 0x1F624, | |||
[SCRM] = 0x1F631, | |||
[VOMI] = 0x1F92E, | |||
[DTIV] = 0x1F575, | |||
[EXPL] = 0x1F92F, | |||
[HAIR] = 0x2640, | |||
[DANC] = 0x1F483, | |||
[STRN] = 0x1F4AA, | |||
[LEFT] = 0x1F448, | |||
[RGHT] = 0x1F449, | |||
}; | |||
// Layer shorthand | |||
#define _BASE 0 | |||
#define _LOWER 1 | |||
#define _EMOJI 2 | |||
#define _MOUSE 3 | |||
#define SP_MSE LT(_MOUSE, KC_SPC) | |||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | |||
[_BASE] = LAYOUT_ortho_4x12( | |||
KC_GESC , KC_Q , KC_W , KC_E , KC_R , KC_T , KC_Y , KC_U , KC_I , KC_O , KC_P , KC_BSPC , | |||
KC_TAB , KC_A , KC_S , KC_D , KC_F , KC_G , KC_H , KC_J , KC_K , KC_L , KC_SCLN , 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_QUOT , | |||
KC_LCTL , KC_GRV , KC_LALT , KC_LGUI , MO(1) , SP_MSE , SP_MSE , KC_LEFT , KC_DOWN , KC_UP , KC_RGHT , MO(2) | |||
), | |||
[_LOWER] = LAYOUT_ortho_4x12( | |||
_______ , KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , KC_DEL , | |||
_______ , KC_F1 , KC_F2 , KC_F3 , KC_LBRC , KC_MINS , KC_EQL , KC_RBRC , KC_F7 , KC_F8 , KC_F9 , _______ , | |||
_______ , KC_F4 , KC_F5 , KC_F6 , KC_HOME , KC_BSLS , KC_MPLY , KC_END , KC_F10 , KC_F11 , KC_F12 , _______ , | |||
_______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ | |||
), | |||
[_EMOJI] = LAYOUT_ortho_4x12( | |||
_______ , X(CLAP) , X(CUM) , X(BNIS) , X(BUTT) , X(CAR) , X(FIRE) , X(REDB) , X(MONY) , X(HNDR) , X(SOS) , _______ , | |||
_______ , X(CELE) , X(PRAY) , X(NAIL) , X(OK) , X(THNK) , X(UNAM) , X(HEYE) , X(COOL) , X(EYES) , X(SMIR) , _______ , | |||
_______ , X(TRIU) , X(SCRM) , X(VOMI) , X(DTIV) , X(EXPL) , X(HAIR) , X(DANC) , X(STRN) , X(LEFT) , X(RGHT) , _______ , | |||
_______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ | |||
), | |||
[_MOUSE] = LAYOUT_ortho_4x12( | |||
_______ , KC_WH_L , KC_BTN1 , KC_MS_U , KC_BTN2 , KC_WH_U , KC_WH_U , KC_BTN1 , KC_MS_U , KC_BTN2 , KC_WH_L , _______ , | |||
_______ , KC_WH_R , KC_MS_L , KC_MS_D , KC_MS_R , KC_WH_D , KC_WH_D , KC_MS_L , KC_MS_D , KC_MS_R , KC_WH_R , _______ , | |||
_______ , KC_VOLD , KC_VOLU , KC_MPRV , KC_MNXT , KC_MPLY , KC_MPLY , KC_MPRV , KC_MNXT , KC_VOLD , KC_VOLU , _______ , | |||
_______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ | |||
) | |||
}; | |||
void matrix_init_user(void) { | |||
set_unicode_input_mode(UC_LNX); | |||
} |
@ -0,0 +1,6 @@ | |||
MOUSEKEY_ENABLE = yes # Mouse keys(+4700) | |||
EXTRAKEY_ENABLE = yes # Audio control and System control(+450) | |||
NKRO_ENABLE = yes # USB Nkey Rollover | |||
UNICODEMAP_ENABLE = yes # Unicode | |||
BOOTLOADER = atmel-dfu | |||
@ -0,0 +1,41 @@ | |||
#include QMK_KEYBOARD_H | |||
#include "keymap_slovenian.h" | |||
#define CARON LT(3, SI_CIRC) | |||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | |||
[0] = LAYOUT( \ | |||
KC_GESC,SI_1, SI_2, SI_3, SI_4, SI_5, SI_6, SI_7, SI_8, SI_9, SI_0, SI_QOT, SI_PLUS,XXXXXXX,KC_BSPC, \ | |||
KC_TAB, SI_Q, SI_W, SI_E, SI_R, SI_T, SI_Z, SI_U, SI_I, SI_O, SI_P, SI_GRV, SI_TILD,CARON, \ | |||
MO(2), SI_A, SI_S, SI_D, SI_F, SI_G, SI_H, SI_J, SI_K, SI_L, KC_SCLN,KC_QUOT,KC_ENT, \ | |||
KC_LSFT,XXXXXXX,SI_Y, SI_X, SI_C, SI_V, SI_B, SI_N, SI_M, SI_COMM,SI_DOT, SI_MINS, KC_RSFT,XXXXXXX, \ | |||
KC_LCTL,KC_LGUI, KC_LALT,KC_SPC, KC_SPC, KC_SPC, KC_RALT,MO(3), XXXXXXX,MO(1), KC_F5 \ | |||
), | |||
[1] = LAYOUT( \ | |||
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, \ | |||
_______, RGB_TOG,RGB_MOD,RGB_HUI,RGB_HUD,RGB_SAI,RGB_SAD,RGB_VAI,RGB_VAD,_______,_______,_______,_______,RESET, \ | |||
_______, _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, \ | |||
_______,_______,_______,_______,BL_DEC, BL_TOGG,BL_INC, BL_STEP,_______,_______,_______,_______, _______,_______, \ | |||
_______,_______, _______,_______, _______, _______, _______,_______,_______,_______,_______ \ | |||
), | |||
[2] = LAYOUT( \ | |||
_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, \ | |||
_______, KC_BSPC,KC_UP, KC_DEL, _______,_______,_______,_______,_______,_______,_______,_______,KC_HOME, KC_END, \ | |||
_______, KC_LEFT,KC_DOWN,KC_RGHT,_______,_______,_______,_______,_______,_______,_______,_______,_______, \ | |||
_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, _______,_______, \ | |||
_______,_______, _______,_______, _______, _______, _______,_______,_______,_______,_______ \ | |||
), | |||
[3] = LAYOUT( \ | |||
_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, \ | |||
_______, _______,_______,_______,_______,_______,SI_ZV, _______,_______,_______,_______,_______,_______,_______, \ | |||
_______, _______,SI_SV, _______,_______,_______,_______,_______,_______,_______,_______,_______,_______, \ | |||
_______,_______,_______,_______,SI_CV, _______,_______,_______,_______,_______,_______,_______, _______,_______, \ | |||
_______,_______, _______,_______, _______, _______, _______,_______,_______,_______,_______ \ | |||
), | |||
}; |
@ -0,0 +1,114 @@ | |||
/* | |||
Copyright 2018 Elliot Powell | |||
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/>. | |||
*/ | |||
#pragma once | |||
#include "config_common.h" | |||
/* USB Device descriptor parameter */ | |||
#define VENDOR_ID 0xFEED | |||
#define PRODUCT_ID 0x4040 | |||
#define DEVICE_VER 0x0001 | |||
#define MANUFACTURER Elliot Powell | |||
#define PRODUCT ep40 | |||
#define DESCRIPTION A simple 40% keyboard | |||
/* key matrix size */ | |||
#define MATRIX_ROWS 4 | |||
#define MATRIX_COLS 12 | |||
/* | |||
* 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 { C7, C6, B6, B5 } | |||
#define MATRIX_COL_PINS { F6, F5, F4, F1, F0, D2, D3, D5, D4, D6, D7, B4 } | |||
/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ | |||
#define DIODE_DIRECTION COL2ROW | |||
/* 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 | |||
/* If defined, GRAVE_ESC will always act as ESC when CTRL is held. | |||
* This is userful for the Windows task manager shortcut (ctrl+shift+esc). | |||
*/ | |||
// #define GRAVE_ESC_CTRL_OVERRIDE | |||
/* | |||
* 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)) \ | |||
) | |||
/* | |||
* 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 |
@ -0,0 +1,43 @@ | |||
/* Copyright 2018 Elliot Powell | |||
* | |||
* 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/>. | |||
*/ | |||
#include "ep40.h" | |||
void matrix_init_kb(void) { | |||
// put your keyboard start-up code here | |||
// runs once when the firmware starts up | |||
matrix_init_user(); | |||
} | |||
void matrix_scan_kb(void) { | |||
// put your looping keyboard code here | |||
// runs every cycle (a lot) | |||
matrix_scan_user(); | |||
} | |||
bool process_record_kb(uint16_t keycode, keyrecord_t *record) { | |||
// put your per-action keyboard code here | |||
// runs for every action, just before processing by the firmware | |||
return process_record_user(keycode, record); | |||
} | |||
void led_set_kb(uint8_t usb_led) { | |||
// put your keyboard LED indicator (ex: Caps Lock LED) toggling code here | |||
led_set_user(usb_led); | |||
} |
@ -0,0 +1,44 @@ | |||
/* Copyright 2018 Elliot Powell | |||
* | |||
* 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 EP40_H | |||
#define EP40_H | |||
#include "quantum.h" | |||
/* This a shortcut to help you visually see your layout. | |||
* | |||
* The first section contains all of the arguments representing the physical | |||
* layout of the board and position of the keys. | |||
* | |||
* The second converts the arguments into a two-dimensional array which | |||
* represents the switch matrix. | |||
*/ | |||
#define xxx KC_NO | |||
#define LAYOUT(\ | |||
k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b,\ | |||
k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1b,\ | |||
k20, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b,\ | |||
k30, k31, k32, k34, k36, k38, k39, k3a, k3b \ | |||
) \ | |||
{ \ | |||
{k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b},\ | |||
{k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, xxx, k1b},\ | |||
{k20, xxx, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b},\ | |||
{k30, k31, k32, xxx, k34, xxx, k36, xxx, k38, k39, k3a, k3b} \ | |||
} | |||
#endif |
@ -0,0 +1,12 @@ | |||
{ | |||
"keyboard_name":"ep40", | |||
"url":null, | |||
"maintainer":"e11i0t23", | |||
"width":12, | |||
"hight":4, | |||
"layouts": { | |||
"LAYOUT": { | |||
"layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":6, "y":0}, {"x":7, "y":0}, {"x":8, "y":0}, {"x":9, "y":0}, {"x":10, "y":0}, {"x":11, "y":0}, {"x":0, "y":1, "w":1.25}, {"x":1.25, "y":1}, {"x":2.25, "y":1}, {"x":3.25, "y":1}, {"x":4.25, "y":1}, {"x":5.25, "y":1}, {"x":6.25, "y":1}, {"x":7.25, "y":1}, {"x":8.25, "y":1}, {"x":9.25, "y":1}, {"x":10.25, "y":1, "w":1.75}, {"x":0, "y":2, "w":1.75}, {"x":1.75, "y":2}, {"x":2.75, "y":2}, {"x":3.75, "y":2}, {"x":4.75, "y":2}, {"x":5.75, "y":2}, {"x":6.75, "y":2}, {"x":7.75, "y":2}, {"x":8.75, "y":2}, {"x":9.75, "y":2}, {"x":10.75, "y":2, "w":1.25}, {"x":0, "y":3}, {"x":1, "y":3}, {"x":2, "y":3}, {"x":3, "y":3, "w":2.25}, {"x":5.25, "y":3, "w":2.75}, {"x":8, "y":3}, {"x":9, "y":3}, {"x":10, "y":3}, {"x":11, "y":3}] | |||
} | |||
} | |||
} |
@ -0,0 +1,39 @@ | |||
/* Copyright 2018 Elliot Powell | |||
* | |||
* 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/>. | |||
*/ | |||
#include QMK_KEYBOARD_H | |||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | |||
[0] = LAYOUT( /* Base */ | |||
KC_GESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC,\ | |||
KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_ENT, \ | |||
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_RSFT,\ | |||
LCTL_T(KC_LBRC), KC_LGUI, KC_LALT, KC_SPC, LT(1, KC_SPC), KC_RGUI, MO(2), RCTL_T(KC_RBRC), KC_RALT \ | |||
), | |||
[1] = LAYOUT( /* Base */ | |||
KC_TRNS, KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_6 , KC_7 , KC_8 , KC_9 , KC_0, KC_DEL ,\ | |||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LEFT, KC_UP, KC_DOWN, KC_RIGHT, KC_TRNS,\ | |||
KC_TRNS, KC_VOLD, KC_MUTE, KC_VOLU, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MINS, KC_EQL, KC_TRNS,\ | |||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS \ | |||
), | |||
[2] = LAYOUT( /* Base */ | |||
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_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_SCLN, KC_QUOT, KC_NUHS, KC_TRNS,\ | |||
KC_TRNS, KC_NUBS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_SLSH, KC_TRNS, KC_TRNS,\ | |||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RESET \ | |||
), | |||
}; |
@ -0,0 +1 @@ | |||
# The default keymap for ep40 |
@ -0,0 +1,15 @@ | |||
# ep40 | |||
![ep40](https://i.imgur.com/Jl7w6I9.jpg) | |||
A simple 40% keyboard | |||
Keyboard Maintainer: [Elliot Powell](https://reddit.com/u/e11i0t23, https://github.com/e11i0t23) | |||
Hardware Supported: EP40 PCB | |||
Hardware Availability: None at the moment | |||
Make example for this keyboard (after setting up your build environment): | |||
make ep40:default | |||
See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). |
@ -0,0 +1,80 @@ | |||
# 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 | |||
# Bootloader selection | |||
# Teensy halfkay | |||
# Pro Micro caterina | |||
# Atmel DFU atmel-dfu | |||
# LUFA DFU lufa-dfu | |||
# QMK DFU qmk-dfu | |||
# atmega32a bootloadHID | |||
BOOTLOADER = atmel-dfu | |||
# If you don't know the bootloader type, then you can specify the | |||
# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line | |||
# Teensy halfKay 512 | |||
# Teensy++ halfKay 1024 | |||
# Atmel DFU loader 4096 | |||
# LUFA bootloader 4096 | |||
# USBaspLoader 2048 | |||
# OPT_DEFS += -DBOOTLOADER_SIZE=4096 | |||
# Build Options | |||
# change yes to no to disable | |||
# | |||
BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) | |||
MOUSEKEY_ENABLE = no # 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 | |||
RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow | |||
MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config) | |||
UNICODE_ENABLE = no # Unicode | |||
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID | |||
AUDIO_ENABLE = no # Audio output on port C6 | |||
FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches | |||
HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) |
@ -0,0 +1,126 @@ | |||
/* | |||
ChibiOS - Copyright (C) 2006..2016 Giovanni Di Sirio | |||
Licensed under the Apache License, Version 2.0 (the "License"); | |||
you may not use this file except in compliance with the License. | |||
You may obtain a copy of the License at | |||
http://www.apache.org/licenses/LICENSE-2.0 | |||
Unless required by applicable law or agreed to in writing, software | |||
distributed under the License is distributed on an "AS IS" BASIS, | |||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
See the License for the specific language governing permissions and | |||
limitations under the License. | |||
*/ | |||
#include "hal.h" | |||
#if HAL_USE_PAL || defined(__DOXYGEN__) | |||
/** | |||
* @brief PAL setup. | |||
* @details Digital I/O ports static configuration as defined in @p board.h. | |||
* This variable is used by the HAL when initializing the PAL driver. | |||
*/ | |||
const PALConfig pal_default_config = { | |||
#if STM32_HAS_GPIOA | |||
{VAL_GPIOA_MODER, VAL_GPIOA_OTYPER, VAL_GPIOA_OSPEEDR, VAL_GPIOA_PUPDR, | |||
VAL_GPIOA_ODR, VAL_GPIOA_AFRL, VAL_GPIOA_AFRH}, | |||
#endif | |||
#if STM32_HAS_GPIOB | |||
{VAL_GPIOB_MODER, VAL_GPIOB_OTYPER, VAL_GPIOB_OSPEEDR, VAL_GPIOB_PUPDR, | |||
VAL_GPIOB_ODR, VAL_GPIOB_AFRL, VAL_GPIOB_AFRH}, | |||
#endif | |||
#if STM32_HAS_GPIOC | |||
{VAL_GPIOC_MODER, VAL_GPIOC_OTYPER, VAL_GPIOC_OSPEEDR, VAL_GPIOC_PUPDR, | |||
VAL_GPIOC_ODR, VAL_GPIOC_AFRL, VAL_GPIOC_AFRH}, | |||
#endif | |||
#if STM32_HAS_GPIOD | |||
{VAL_GPIOD_MODER, VAL_GPIOD_OTYPER, VAL_GPIOD_OSPEEDR, VAL_GPIOD_PUPDR, | |||
VAL_GPIOD_ODR, VAL_GPIOD_AFRL, VAL_GPIOD_AFRH}, | |||
#endif | |||
#if STM32_HAS_GPIOE | |||
{VAL_GPIOE_MODER, VAL_GPIOE_OTYPER, VAL_GPIOE_OSPEEDR, VAL_GPIOE_PUPDR, | |||
VAL_GPIOE_ODR, VAL_GPIOE_AFRL, VAL_GPIOE_AFRH}, | |||
#endif | |||
#if STM32_HAS_GPIOF | |||
{VAL_GPIOF_MODER, VAL_GPIOF_OTYPER, VAL_GPIOF_OSPEEDR, VAL_GPIOF_PUPDR, | |||
VAL_GPIOF_ODR, VAL_GPIOF_AFRL, VAL_GPIOF_AFRH}, | |||
#endif | |||
#if STM32_HAS_GPIOG | |||
{VAL_GPIOG_MODER, VAL_GPIOG_OTYPER, VAL_GPIOG_OSPEEDR, VAL_GPIOG_PUPDR, | |||
VAL_GPIOG_ODR, VAL_GPIOG_AFRL, VAL_GPIOG_AFRH}, | |||
#endif | |||
#if STM32_HAS_GPIOH | |||
{VAL_GPIOH_MODER, VAL_GPIOH_OTYPER, VAL_GPIOH_OSPEEDR, VAL_GPIOH_PUPDR, | |||
VAL_GPIOH_ODR, VAL_GPIOH_AFRL, VAL_GPIOH_AFRH}, | |||
#endif | |||
#if STM32_HAS_GPIOI | |||
{VAL_GPIOI_MODER, VAL_GPIOI_OTYPER, VAL_GPIOI_OSPEEDR, VAL_GPIOI_PUPDR, | |||
VAL_GPIOI_ODR, VAL_GPIOI_AFRL, VAL_GPIOI_AFRH} | |||
#endif | |||
}; | |||
#endif | |||
void enter_bootloader_mode_if_requested(void); | |||
/** | |||
* @brief Early initialization code. | |||
* @details This initialization must be performed just after stack setup | |||
* and before any other initialization. | |||
*/ | |||
void __early_init(void) { | |||
enter_bootloader_mode_if_requested(); | |||
stm32_clock_init(); | |||
} | |||
#if HAL_USE_SDC || defined(__DOXYGEN__) | |||
/** | |||
* @brief SDC card detection. | |||
*/ | |||
bool sdc_lld_is_card_inserted(SDCDriver *sdcp) { | |||
(void)sdcp; | |||
/* TODO: Fill the implementation.*/ | |||
return true; | |||
} | |||
/** | |||
* @brief SDC card write protection detection. | |||
*/ | |||
bool sdc_lld_is_write_protected(SDCDriver *sdcp) { | |||
(void)sdcp; | |||
/* TODO: Fill the implementation.*/ | |||
return false; | |||
} | |||
#endif /* HAL_USE_SDC */ | |||
#if HAL_USE_MMC_SPI || defined(__DOXYGEN__) | |||
/** | |||
* @brief MMC_SPI card detection. | |||
*/ | |||
bool mmc_lld_is_card_inserted(MMCDriver *mmcp) { | |||
(void)mmcp; | |||
/* TODO: Fill the implementation.*/ | |||
return true; | |||
} | |||
/** | |||
* @brief MMC_SPI card write protection detection. | |||
*/ | |||
bool mmc_lld_is_write_protected(MMCDriver *mmcp) { | |||
(void)mmcp; | |||
/* TODO: Fill the implementation.*/ | |||
return false; | |||
} | |||
#endif | |||
/** | |||
* @brief Board-specific initialization code. | |||
* @todo Add your board-specific code, if any. | |||
*/ | |||
void boardInit(void) { | |||
} |
@ -0,0 +1,5 @@ | |||
# List of all the board related files. | |||
BOARDSRC = $(BOARD_PATH)/boards/GENERIC_STM32_F303XC/board.c | |||
# Required include directories | |||
BOARDINC = $(BOARD_PATH)/boards/GENERIC_STM32_F303XC |
@ -0,0 +1,7 @@ | |||
/* Address for jumping to bootloader on STM32 chips. */ | |||
/* It is chip dependent, the correct number can be looked up here: | |||
* http://www.st.com/web/en/resource/technical/document/application_note/CD00167594.pdf | |||
* This also requires a patch to chibios: | |||
* <tmk_dir>/tmk_core/tool/chibios/ch-bootloader-jump.patch | |||
*/ | |||
#define STM32_BOOTLOADER_ADDRESS 0x1FFFD800 |
@ -0,0 +1,520 @@ | |||
/* | |||
ChibiOS - Copyright (C) 2006..2016 Giovanni Di Sirio | |||
Licensed under the Apache License, Version 2.0 (the "License"); | |||
you may not use this file except in compliance with the License. | |||
You may obtain a copy of the License at | |||
http://www.apache.org/licenses/LICENSE-2.0 | |||
Unless required by applicable law or agreed to in writing, software | |||
distributed under the License is distributed on an "AS IS" BASIS, | |||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
See the License for the specific language governing permissions and | |||
limitations under the License. | |||
*/ | |||
/** | |||
* @file templates/chconf.h | |||
* @brief Configuration file template. | |||
* @details A copy of this file must be placed in each project directory, it | |||
* contains the application specific kernel settings. | |||
* | |||
* @addtogroup config | |||
* @details Kernel related settings and hooks. | |||
* @{ | |||
*/ | |||
#ifndef CHCONF_H | |||
#define CHCONF_H | |||
#define _CHIBIOS_RT_CONF_ | |||
/*===========================================================================*/ | |||
/** | |||
* @name System timers settings | |||
* @{ | |||
*/ | |||
/*===========================================================================*/ | |||
/** | |||
* @brief System time counter resolution. | |||
* @note Allowed values are 16 or 32 bits. | |||
*/ | |||
#define CH_CFG_ST_RESOLUTION 32 | |||
/** | |||
* @brief System tick frequency. | |||
* @details Frequency of the system timer that drives the system ticks. This | |||
* setting also defines the system tick time unit. | |||
*/ | |||
#define CH_CFG_ST_FREQUENCY 100000 | |||
/** | |||
* @brief Time delta constant for the tick-less mode. | |||
* @note If this value is zero then the system uses the classic | |||
* periodic tick. This value represents the minimum number | |||
* of ticks that is safe to specify in a timeout directive. | |||
* The value one is not valid, timeouts are rounded up to | |||
* this value. | |||
*/ | |||
#define CH_CFG_ST_TIMEDELTA 2 | |||
/** @} */ | |||
/*===========================================================================*/ | |||
/** | |||
* @name Kernel parameters and options | |||
* @{ | |||
*/ | |||
/*===========================================================================*/ | |||
/** | |||
* @brief Round robin interval. | |||
* @details This constant is the number of system ticks allowed for the | |||
* threads before preemption occurs. Setting this value to zero | |||
* disables the preemption for threads with equal priority and the | |||
* round robin becomes cooperative. Note that higher priority | |||
* threads can still preempt, the kernel is always preemptive. | |||
* @note Disabling the round robin preemption makes the kernel more compact | |||
* and generally faster. | |||
* @note The round robin preemption is not supported in tickless mode and | |||
* must be set to zero in that case. | |||
*/ | |||
#define CH_CFG_TIME_QUANTUM 0 | |||
/** | |||
* @brief Managed RAM size. | |||
* @details Size of the RAM area to be managed by the OS. If set to zero | |||
* then the whole available RAM is used. The core memory is made | |||
* available to the heap allocator and/or can be used directly through | |||
* the simplified core memory allocator. | |||
* | |||
* @note In order to let the OS manage the whole RAM the linker script must | |||
* provide the @p __heap_base__ and @p __heap_end__ symbols. | |||
* @note Requires @p CH_CFG_USE_MEMCORE. | |||
*/ | |||
#define CH_CFG_MEMCORE_SIZE 0 | |||
/** | |||
* @brief Idle thread automatic spawn suppression. | |||
* @details When this option is activated the function @p chSysInit() | |||
* does not spawn the idle thread. The application @p main() | |||
* function becomes the idle thread and must implement an | |||
* infinite loop. | |||
*/ | |||
#define CH_CFG_NO_IDLE_THREAD FALSE | |||
/** @} */ | |||
/*===========================================================================*/ | |||
/** | |||
* @name Performance options | |||
* @{ | |||
*/ | |||
/*===========================================================================*/ | |||
/** | |||
* @brief OS optimization. | |||
* @details If enabled then time efficient rather than space efficient code | |||
* is used when two possible implementations exist. | |||
* | |||
* @note This is not related to the compiler optimization options. | |||
* @note The default is @p TRUE. | |||
*/ | |||
#define CH_CFG_OPTIMIZE_SPEED TRUE | |||
/** @} */ | |||
/*===========================================================================*/ | |||
/** | |||
* @name Subsystem options | |||
* @{ | |||
*/ | |||
/*===========================================================================*/ | |||
/** | |||
* @brief Time Measurement APIs. | |||
* @details If enabled then the time measurement APIs are included in | |||
* the kernel. | |||
* | |||
* @note The default is @p TRUE. | |||
*/ | |||
#define CH_CFG_USE_TM TRUE | |||
/** | |||
* @brief Threads registry APIs. | |||
* @details If enabled then the registry APIs are included in the kernel. | |||
* | |||
* @note The default is @p TRUE. | |||
*/ | |||
#define CH_CFG_USE_REGISTRY TRUE | |||
/** | |||
* @brief Threads synchronization APIs. | |||
* @details If enabled then the @p chThdWait() function is included in | |||
* the kernel. | |||
* | |||
* @note The default is @p TRUE. | |||
*/ | |||
#define CH_CFG_USE_WAITEXIT TRUE | |||
/** | |||
* @brief Semaphores APIs. | |||
* @details If enabled then the Semaphores APIs are included in the kernel. | |||
* | |||
* @note The default is @p TRUE. | |||
*/ | |||
#define CH_CFG_USE_SEMAPHORES TRUE | |||
/** | |||
* @brief Semaphores queuing mode. | |||
* @details If enabled then the threads are enqueued on semaphores by | |||
* priority rather than in FIFO order. | |||
* | |||
* @note The default is @p FALSE. Enable this if you have special | |||
* requirements. | |||
* @note Requires @p CH_CFG_USE_SEMAPHORES. | |||
*/ | |||
#define CH_CFG_USE_SEMAPHORES_PRIORITY FALSE | |||
/** | |||
* @brief Mutexes APIs. | |||
* @details If enabled then the mutexes APIs are included in the kernel. | |||
* | |||
* @note The default is @p TRUE. | |||
*/ | |||
#define CH_CFG_USE_MUTEXES TRUE | |||
/** | |||
* @brief Enables recursive behavior on mutexes. | |||
* @note Recursive mutexes are heavier and have an increased | |||
* memory footprint. | |||
* | |||
* @note The default is @p FALSE. | |||
* @note Requires @p CH_CFG_USE_MUTEXES. | |||
*/ | |||
#define CH_CFG_USE_MUTEXES_RECURSIVE FALSE | |||
/** | |||
* @brief Conditional Variables APIs. | |||
* @details If enabled then the conditional variables APIs are included | |||
* in the kernel. | |||
* | |||
* @note The default is @p TRUE. | |||
* @note Requires @p CH_CFG_USE_MUTEXES. | |||
*/ | |||
#define CH_CFG_USE_CONDVARS TRUE | |||
/** | |||
* @brief Conditional Variables APIs with timeout. | |||
* @details If enabled then the conditional variables APIs with timeout | |||
* specification are included in the kernel. | |||
* | |||
* @note The default is @p TRUE. | |||
* @note Requires @p CH_CFG_USE_CONDVARS. | |||
*/ | |||
#define CH_CFG_USE_CONDVARS_TIMEOUT TRUE | |||
/** | |||
* @brief Events Flags APIs. | |||
* @details If enabled then the event flags APIs are included in the kernel. | |||
* | |||
* @note The default is @p TRUE. | |||
*/ | |||
#define CH_CFG_USE_EVENTS TRUE | |||
/** | |||
* @brief Events Flags APIs with timeout. | |||
* @details If enabled then the events APIs with timeout specification | |||
* are included in the kernel. | |||
* | |||
* @note The default is @p TRUE. | |||
* @note Requires @p CH_CFG_USE_EVENTS. | |||
*/ | |||
#define CH_CFG_USE_EVENTS_TIMEOUT TRUE | |||
/** | |||
* @brief Synchronous Messages APIs. | |||
* @details If enabled then the synchronous messages APIs are included | |||
* in the kernel. | |||
* | |||
* @note The default is @p TRUE. | |||
*/ | |||
#define CH_CFG_USE_MESSAGES TRUE | |||
/** | |||
* @brief Synchronous Messages queuing mode. | |||
* @details If enabled then messages are served by priority rather than in | |||
* FIFO order. | |||
* | |||
* @note The default is @p FALSE. Enable this if you have special | |||
* requirements. | |||
* @note Requires @p CH_CFG_USE_MESSAGES. | |||
*/ | |||
#define CH_CFG_USE_MESSAGES_PRIORITY TRUE | |||
/** | |||
* @brief Mailboxes APIs. | |||
* @details If enabled then the asynchronous messages (mailboxes) APIs are | |||
* included in the kernel. | |||
* | |||
* @note The default is @p TRUE. | |||
* @note Requires @p CH_CFG_USE_SEMAPHORES. | |||
*/ | |||
#define CH_CFG_USE_MAILBOXES TRUE | |||
/** | |||
* @brief Core Memory Manager APIs. | |||
* @details If enabled then the core memory manager APIs are included | |||
* in the kernel. | |||
* | |||
* @note The default is @p TRUE. | |||
*/ | |||
#define CH_CFG_USE_MEMCORE TRUE | |||
/** | |||
* @brief Heap Allocator APIs. | |||
* @details If enabled then the memory heap allocator APIs are included | |||
* in the kernel. | |||
* | |||
* @note The default is @p TRUE. | |||
* @note Requires @p CH_CFG_USE_MEMCORE and either @p CH_CFG_USE_MUTEXES or | |||
* @p CH_CFG_USE_SEMAPHORES. | |||
* @note Mutexes are recommended. | |||
*/ | |||
#define CH_CFG_USE_HEAP TRUE | |||
/** | |||
* @brief Memory Pools Allocator APIs. | |||
* @details If enabled then the memory pools allocator APIs are included | |||
* in the kernel. | |||
* | |||
* @note The default is @p TRUE. | |||
*/ | |||
#define CH_CFG_USE_MEMPOOLS TRUE | |||
/** | |||
* @brief Dynamic Threads APIs. | |||
* @details If enabled then the dynamic threads creation APIs are included | |||
* in the kernel. | |||
* | |||
* @note The default is @p TRUE. | |||
* @note Requires @p CH_CFG_USE_WAITEXIT. | |||
* @note Requires @p CH_CFG_USE_HEAP and/or @p CH_CFG_USE_MEMPOOLS. | |||
*/ | |||
#define CH_CFG_USE_DYNAMIC TRUE | |||
/** @} */ | |||
/*===========================================================================*/ | |||
/** | |||
* @name Debug options | |||
* @{ | |||
*/ | |||
/*===========================================================================*/ | |||
/** | |||
* @brief Debug option, kernel statistics. | |||
* | |||
* @note The default is @p FALSE. | |||
*/ | |||
#define CH_DBG_STATISTICS FALSE | |||
/** | |||
* @brief Debug option, system state check. | |||
* @details If enabled the correct call protocol for system APIs is checked | |||
* at runtime. | |||
* | |||
* @note The default is @p FALSE. | |||
*/ | |||
#define CH_DBG_SYSTEM_STATE_CHECK FALSE | |||
/** | |||
* @brief Debug option, parameters checks. | |||
* @details If enabled then the checks on the API functions input | |||
* parameters are activated. | |||
* | |||
* @note The default is @p FALSE. | |||
*/ | |||
#define CH_DBG_ENABLE_CHECKS FALSE | |||
/** | |||
* @brief Debug option, consistency checks. | |||
* @details If enabled then all the assertions in the kernel code are | |||
* activated. This includes consistency checks inside the kernel, | |||
* runtime anomalies and port-defined checks. | |||
* | |||
* @note The default is @p FALSE. | |||
*/ | |||
#define CH_DBG_ENABLE_ASSERTS FALSE | |||
/** | |||
* @brief Debug option, trace buffer. | |||
* @details If enabled then the trace buffer is activated. | |||
* | |||
* @note The default is @p CH_DBG_TRACE_MASK_DISABLED. | |||
*/ | |||
#define CH_DBG_TRACE_MASK CH_DBG_TRACE_MASK_DISABLED | |||
/** | |||
* @brief Trace buffer entries. | |||
* @note The trace buffer is only allocated if @p CH_DBG_TRACE_MASK is | |||
* different from @p CH_DBG_TRACE_MASK_DISABLED. | |||
*/ | |||
#define CH_DBG_TRACE_BUFFER_SIZE 128 | |||
/** | |||
* @brief Debug option, stack checks. | |||
* @details If enabled then a runtime stack check is performed. | |||
* | |||
* @note The default is @p FALSE. | |||
* @note The stack check is performed in a architecture/port dependent way. | |||
* It may not be implemented or some ports. | |||
* @note The default failure mode is to halt the system with the global | |||
* @p panic_msg variable set to @p NULL. | |||
*/ | |||
#define CH_DBG_ENABLE_STACK_CHECK TRUE | |||
/** | |||
* @brief Debug option, stacks initialization. | |||
* @details If enabled then the threads working area is filled with a byte | |||
* value when a thread is created. This can be useful for the | |||
* runtime measurement of the used stack. | |||
* | |||
* @note The default is @p FALSE. | |||
*/ | |||
#define CH_DBG_FILL_THREADS FALSE | |||
/** | |||
* @brief Debug option, threads profiling. | |||
* @details If enabled then a field is added to the @p thread_t structure that | |||
* counts the system ticks occurred while executing the thread. | |||
* | |||
* @note The default is @p FALSE. | |||
* @note This debug option is not currently compatible with the | |||
* tickless mode. | |||
*/ | |||
#define CH_DBG_THREADS_PROFILING FALSE | |||
/** @} */ | |||
/*===========================================================================*/ | |||
/** | |||
* @name Kernel hooks | |||
* @{ | |||
*/ | |||
/*===========================================================================*/ | |||
/** | |||
* @brief Threads descriptor structure extension. | |||
* @details User fields added to the end of the @p thread_t structure. | |||
*/ | |||
#define CH_CFG_THREAD_EXTRA_FIELDS \ | |||
/* Add threads custom fields here.*/ | |||
/** | |||
* @brief Threads initialization hook. | |||
* @details User initialization code added to the @p chThdInit() API. | |||
* | |||
* @note It is invoked from within @p chThdInit() and implicitly from all | |||
* the threads creation APIs. | |||
*/ | |||
#define CH_CFG_THREAD_INIT_HOOK(tp) { \ | |||
/* Add threads initialization code here.*/ \ | |||
} | |||
/** | |||
* @brief Threads finalization hook. | |||
* @details User finalization code added to the @p chThdExit() API. | |||
*/ | |||
#define CH_CFG_THREAD_EXIT_HOOK(tp) { \ | |||
/* Add threads finalization code here.*/ \ | |||
} | |||
/** | |||
* @brief Context switch hook. | |||
* @details This hook is invoked just before switching between threads. | |||
*/ | |||
#define CH_CFG_CONTEXT_SWITCH_HOOK(ntp, otp) { \ | |||
/* Context switch code here.*/ \ | |||
} | |||
/** | |||
* @brief ISR enter hook. | |||
*/ | |||
#define CH_CFG_IRQ_PROLOGUE_HOOK() { \ | |||
/* IRQ prologue code here.*/ \ | |||
} | |||
/** | |||
* @brief ISR exit hook. | |||
*/ | |||
#define CH_CFG_IRQ_EPILOGUE_HOOK() { \ | |||
/* IRQ epilogue code here.*/ \ | |||
} | |||
/** | |||
* @brief Idle thread enter hook. | |||
* @note This hook is invoked within a critical zone, no OS functions | |||
* should be invoked from here. | |||
* @note This macro can be used to activate a power saving mode. | |||
*/ | |||
#define CH_CFG_IDLE_ENTER_HOOK() { \ | |||
/* Idle-enter code here.*/ \ | |||
} | |||
/** | |||
* @brief Idle thread leave hook. | |||
* @note This hook is invoked within a critical zone, no OS functions | |||
* should be invoked from here. | |||
* @note This macro can be used to deactivate a power saving mode. | |||
*/ | |||
#define CH_CFG_IDLE_LEAVE_HOOK() { \ | |||
/* Idle-leave code here.*/ \ | |||
} | |||
/** | |||
* @brief Idle Loop hook. | |||
* @details This hook is continuously invoked by the idle thread loop. | |||
*/ | |||
#define CH_CFG_IDLE_LOOP_HOOK() { \ | |||
/* Idle loop code here.*/ \ | |||
} | |||
/** | |||
* @brief System tick event hook. | |||
* @details This hook is invoked in the system tick handler immediately | |||
* after processing the virtual timers queue. | |||
*/ | |||
#define CH_CFG_SYSTEM_TICK_HOOK() { \ | |||
/* System tick event code here.*/ \ | |||
} | |||
/** | |||
* @brief System halt hook. | |||
* @details This hook is invoked in case to a system halting error before | |||
* the system is halted. | |||
*/ | |||
#define CH_CFG_SYSTEM_HALT_HOOK(reason) { \ | |||
/* System halt code here.*/ \ | |||
} | |||
/** | |||
* @brief Trace hook. | |||
* @details This hook is invoked each time a new record is written in the | |||
* trace buffer. | |||
*/ | |||
#define CH_CFG_TRACE_HOOK(tep) { \ | |||
/* Trace code here.*/ \ | |||
} | |||
/** @} */ | |||
/*===========================================================================*/ | |||
/* Port-specific settings (override port settings defaulted in chcore.h). */ | |||
/*===========================================================================*/ | |||
#endif /* CHCONF_H */ | |||
/** @} */ |
@ -0,0 +1,117 @@ | |||
/* | |||
Copyright 2018 Yiancar | |||
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/>. | |||
*/ | |||
#pragma once | |||
#include "config_common.h" | |||
/* USB Device descriptor parameter */ | |||
#define VENDOR_ID 0xFEED | |||
#define PRODUCT_ID 0x0258 | |||
#define DEVICE_VER 0x0001 | |||
#define MANUFACTURER Yiancar-Designs | |||
#define PRODUCT HS60 V2 | |||
#define DESCRIPTION GH60 compatible, tool free RGB keyboard | |||
/* key matrix size */ | |||
#define MATRIX_ROWS 5 | |||
#define MATRIX_COLS 14 | |||
#define MATRIX_ROW_PINS { B3, B4, B5, A8, A4 } | |||
#define MATRIX_COL_PINS { A13, A10, A9, A14, A15, B8, B9, C13, C14, C15, A0, A1, A2, A3 } | |||
// To enable debugger set A13 A14 -> A5 A6 | |||
/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ | |||
#define DIODE_DIRECTION COL2ROW | |||
/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ | |||
#define DEBOUNCE 0 | |||
/* define if matrix has ghost (lacks anti-ghosting diodes) */ | |||
//#define MATRIX_HAS_GHOST | |||
/* If defined, GRAVE_ESC will always act as ESC when CTRL is held. | |||
* This is userful for the Windows task manager shortcut (ctrl+shift+esc). | |||
*/ | |||
// #define GRAVE_ESC_CTRL_OVERRIDE | |||
/* | |||
* 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)) \ | |||
) | |||
/* | |||
* Feature disable options | |||
* These options are also useful to firmware size reduction. | |||
*/ | |||
/* disable debug print */ | |||
//#define NO_DEBUG | |||
/* disable print */ | |||
//#define NO_PRINT | |||
/* Backlight options */ | |||
#define RGB_DISABLE_AFTER_TIMEOUT 0 // number of ticks to wait until disabling effects | |||
#define RGB_DISABLE_WHEN_USB_SUSPENDED false // turn off effects when suspended | |||
#define RGB_MATRIX_SKIP_FRAMES 3 | |||
#define DRIVER_ADDR_1 0b1010000 | |||
#define DRIVER_ADDR_2 0b1010000 // this is here for compliancy reasons. | |||
#define DRIVER_COUNT 2 | |||
#ifdef HS60_ANSI | |||
#define DRIVER_1_LED_TOTAL 61 | |||
#else | |||
#define DRIVER_1_LED_TOTAL 62 | |||
#endif | |||
#define DRIVER_LED_TOTAL DRIVER_1_LED_TOTAL |
@ -0,0 +1,388 @@ | |||
/* | |||
ChibiOS - Copyright (C) 2006..2016 Giovanni Di Sirio | |||
Licensed under the Apache License, Version 2.0 (the "License"); | |||
you may not use this file except in compliance with the License. | |||
You may obtain a copy of the License at | |||
http://www.apache.org/licenses/LICENSE-2.0 | |||
Unless required by applicable law or agreed to in writing, software | |||
distributed under the License is distributed on an "AS IS" BASIS, | |||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
See the License for the specific language governing permissions and | |||
limitations under the License. | |||
*/ | |||
/** | |||
* @file templates/halconf.h | |||
* @brief HAL configuration header. | |||
* @details HAL configuration file, this file allows to enable or disable the | |||
* various device drivers from your application. You may also use | |||
* this file in order to override the device drivers default settings. | |||
* | |||
* @addtogroup HAL_CONF | |||
* @{ | |||
*/ | |||
#ifndef HALCONF_H | |||
#define HALCONF_H | |||
#include "mcuconf.h" | |||
/** | |||
* @brief Enables the PAL subsystem. | |||
*/ | |||
#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) | |||
#define HAL_USE_PAL TRUE | |||
#endif | |||
/** | |||
* @brief Enables the ADC subsystem. | |||
*/ | |||
#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) | |||
#define HAL_USE_ADC FALSE | |||
#endif | |||
/** | |||
* @brief Enables the CAN subsystem. | |||
*/ | |||
#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) | |||
#define HAL_USE_CAN FALSE | |||
#endif | |||
/** | |||
* @brief Enables the DAC subsystem. | |||
*/ | |||
#if !defined(HAL_USE_DAC) || defined(__DOXYGEN__) | |||
#define HAL_USE_DAC TRUE | |||
#endif | |||
/** | |||
* @brief Enables the EXT subsystem. | |||
*/ | |||
#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) | |||
#define HAL_USE_EXT FALSE | |||
#endif | |||
/** | |||
* @brief Enables the GPT subsystem. | |||
*/ | |||
#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) | |||
#define HAL_USE_GPT TRUE | |||
#endif | |||
/** | |||
* @brief Enables the I2C subsystem. | |||
*/ | |||
#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) | |||
#define HAL_USE_I2C TRUE | |||
#endif | |||
/** | |||
* @brief Enables the I2S subsystem. | |||
*/ | |||
#if !defined(HAL_USE_I2S) || defined(__DOXYGEN__) | |||
#define HAL_USE_I2S FALSE | |||
#endif | |||
/** | |||
* @brief Enables the ICU subsystem. | |||
*/ | |||
#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) | |||
#define HAL_USE_ICU FALSE | |||
#endif | |||
/** | |||
* @brief Enables the MAC subsystem. | |||
*/ | |||
#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) | |||
#define HAL_USE_MAC FALSE | |||
#endif | |||
/** | |||
* @brief Enables the MMC_SPI subsystem. | |||
*/ | |||
#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) | |||
#define HAL_USE_MMC_SPI FALSE | |||
#endif | |||
/** | |||
* @brief Enables the PWM subsystem. | |||
*/ | |||
#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) | |||
#define HAL_USE_PWM FALSE | |||
#endif | |||
/** | |||
* @brief Enables the QSPI subsystem. | |||
*/ | |||
#if !defined(HAL_USE_QSPI) || defined(__DOXYGEN__) | |||
#define HAL_USE_QSPI FALSE | |||
#endif | |||
/** | |||
* @brief Enables the RTC subsystem. | |||
*/ | |||
#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) | |||
#define HAL_USE_RTC FALSE | |||
#endif | |||
/** | |||
* @brief Enables the SDC subsystem. | |||
*/ | |||
#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) | |||
#define HAL_USE_SDC FALSE | |||
#endif | |||
/** | |||
* @brief Enables the SERIAL subsystem. | |||
*/ | |||
#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) | |||
#define HAL_USE_SERIAL FALSE | |||
#endif | |||
/** | |||
* @brief Enables the SERIAL over USB subsystem. | |||
*/ | |||
#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) | |||
#define HAL_USE_SERIAL_USB FALSE | |||
#endif | |||
/** | |||
* @brief Enables the SPI subsystem. | |||
*/ | |||
#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) | |||
#define HAL_USE_SPI FALSE | |||
#endif | |||
/** | |||
* @brief Enables the UART subsystem. | |||
*/ | |||
#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) | |||
#define HAL_USE_UART FALSE | |||
#endif | |||
/** | |||
* @brief Enables the USB subsystem. | |||
*/ | |||
#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) | |||
#define HAL_USE_USB TRUE | |||
#endif | |||
/** | |||
* @brief Enables the WDG subsystem. | |||
*/ | |||
#if !defined(HAL_USE_WDG) || defined(__DOXYGEN__) | |||
#define HAL_USE_WDG FALSE | |||
#endif | |||
/*===========================================================================*/ | |||
/* ADC driver related settings. */ | |||
/*===========================================================================*/ | |||
/** | |||
* @brief Enables synchronous APIs. | |||
* @note Disabling this option saves both code and data space. | |||
*/ | |||
#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) | |||
#define ADC_USE_WAIT TRUE | |||
#endif | |||
/** | |||
* @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. | |||
* @note Disabling this option saves both code and data space. | |||
*/ | |||
#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) | |||
#define ADC_USE_MUTUAL_EXCLUSION TRUE | |||
#endif | |||
/*===========================================================================*/ | |||
/* CAN driver related settings. */ | |||
/*===========================================================================*/ | |||
/** | |||
* @brief Sleep mode related APIs inclusion switch. | |||
*/ | |||
#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) | |||
#define CAN_USE_SLEEP_MODE TRUE | |||
#endif | |||
/*===========================================================================*/ | |||
/* I2C driver related settings. */ | |||
/*===========================================================================*/ | |||
/** | |||
* @brief Enables the mutual exclusion APIs on the I2C bus. | |||
*/ | |||
#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) | |||
#define I2C_USE_MUTUAL_EXCLUSION TRUE | |||
#endif | |||
/*===========================================================================*/ | |||
/* MAC driver related settings. */ | |||
/*===========================================================================*/ | |||
/** | |||
* @brief Enables an event sources for incoming packets. | |||
*/ | |||
#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) | |||
#define MAC_USE_ZERO_COPY FALSE | |||
#endif | |||
/** | |||
* @brief Enables an event sources for incoming packets. | |||
*/ | |||
#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) | |||
#define MAC_USE_EVENTS TRUE | |||
#endif | |||
/*===========================================================================*/ | |||
/* MMC_SPI driver related settings. */ | |||
/*===========================================================================*/ | |||
/** | |||
* @brief Delays insertions. | |||
* @details If enabled this options inserts delays into the MMC waiting | |||
* routines releasing some extra CPU time for the threads with | |||
* lower priority, this may slow down the driver a bit however. | |||
* This option is recommended also if the SPI driver does not | |||
* use a DMA channel and heavily loads the CPU. | |||
*/ | |||
#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) | |||
#define MMC_NICE_WAITING TRUE | |||
#endif | |||
/*===========================================================================*/ | |||
/* SDC driver related settings. */ | |||
/*===========================================================================*/ | |||
/** | |||
* @brief Number of initialization attempts before rejecting the card. | |||
* @note Attempts are performed at 10mS intervals. | |||
*/ | |||
#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) | |||
#define SDC_INIT_RETRY 100 | |||
#endif | |||
/** | |||
* @brief Include support for MMC cards. | |||
* @note MMC support is not yet implemented so this option must be kept | |||
* at @p FALSE. | |||
*/ | |||
#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) | |||
#define SDC_MMC_SUPPORT FALSE | |||
#endif | |||
/** | |||
* @brief Delays insertions. | |||
* @details If enabled this options inserts delays into the MMC waiting | |||
* routines releasing some extra CPU time for the threads with | |||
* lower priority, this may slow down the driver a bit however. | |||
*/ | |||
#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) | |||
#define SDC_NICE_WAITING TRUE | |||
#endif | |||
/*===========================================================================*/ | |||
/* SERIAL driver related settings. */ | |||
/*===========================================================================*/ | |||
/** | |||
* @brief Default bit rate. | |||
* @details Configuration parameter, this is the baud rate selected for the | |||
* default configuration. | |||
*/ | |||
#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) | |||
#define SERIAL_DEFAULT_BITRATE 38400 | |||
#endif | |||
/** | |||
* @brief Serial buffers size. | |||
* @details Configuration parameter, you can change the depth of the queue | |||
* buffers depending on the requirements of your application. | |||
* @note The default is 16 bytes for both the transmission and receive | |||
* buffers. | |||
*/ | |||
#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) | |||
#define SERIAL_BUFFERS_SIZE 16 | |||
#endif | |||
/*===========================================================================*/ | |||
/* SERIAL_USB driver related setting. */ | |||
/*===========================================================================*/ | |||
/** | |||
* @brief Serial over USB buffers size. | |||
* @details Configuration parameter, the buffer size must be a multiple of | |||
* the USB data endpoint maximum packet size. | |||
* @note The default is 256 bytes for both the transmission and receive | |||
* buffers. | |||
*/ | |||
#if !defined(SERIAL_USB_BUFFERS_SIZE) || defined(__DOXYGEN__) | |||
#define SERIAL_USB_BUFFERS_SIZE 1 | |||
#endif | |||
/** | |||
* @brief Serial over USB number of buffers. | |||
* @note The default is 2 buffers. | |||
*/ | |||
#if !defined(SERIAL_USB_BUFFERS_NUMBER) || defined(__DOXYGEN__) | |||
#define SERIAL_USB_BUFFERS_NUMBER 2 | |||
#endif | |||
/*===========================================================================*/ | |||
/* SPI driver related settings. */ | |||
/*===========================================================================*/ | |||
/** | |||
* @brief Enables synchronous APIs. | |||
* @note Disabling this option saves both code and data space. | |||
*/ | |||
#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) | |||
#define SPI_USE_WAIT TRUE | |||
#endif | |||
/** | |||
* @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. | |||
* @note Disabling this option saves both code and data space. | |||
*/ | |||
#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) | |||
#define SPI_USE_MUTUAL_EXCLUSION TRUE | |||
#endif | |||
/*===========================================================================*/ | |||
/* UART driver related settings. */ | |||
/*===========================================================================*/ | |||
/** | |||
* @brief Enables synchronous APIs. | |||
* @note Disabling this option saves both code and data space. | |||
*/ | |||
#if !defined(UART_USE_WAIT) || defined(__DOXYGEN__) | |||
#define UART_USE_WAIT FALSE | |||
#endif | |||
/** | |||
* @brief Enables the @p uartAcquireBus() and @p uartReleaseBus() APIs. | |||
* @note Disabling this option saves both code and data space. | |||
*/ | |||
#if !defined(UART_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) | |||
#define UART_USE_MUTUAL_EXCLUSION FALSE | |||
#endif | |||
/*===========================================================================*/ | |||
/* USB driver related settings. */ | |||
/*===========================================================================*/ | |||
/** | |||
* @brief Enables synchronous APIs. | |||
* @note Disabling this option saves both code and data space. | |||
*/ | |||
#if !defined(USB_USE_WAIT) || defined(__DOXYGEN__) | |||
#define USB_USE_WAIT TRUE | |||
#endif | |||
#endif /* HALCONF_H */ | |||
/** @} */ |
@ -0,0 +1,21 @@ | |||
/* | |||
Copyright 2018 Yiancar | |||
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/>. | |||
*/ | |||
#pragma once | |||
/* Include overwrites for specific keymap */ | |||
#define HS60_ANSI |
@ -0,0 +1,46 @@ | |||
/* Copyright 2018 Yiancar | |||
* | |||
* 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/>. | |||
*/ | |||
#include QMK_KEYBOARD_H | |||
//This is the ANSI version of the PCB | |||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | |||
[0] = LAYOUT_60_ansi( /* Base */ | |||
KC_GESC, 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,\ | |||
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, 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_RSFT,\ | |||
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1) , KC_APP, KC_RCTL), | |||
[1] = LAYOUT_60_ansi( /* FN */ | |||
KC_TRNS, 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_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RESET , KC_TRNS,\ | |||
KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,\ | |||
KC_TRNS, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, RGB_SPI, RGB_SPD, KC_TRNS,\ | |||
KC_VOLU, KC_VOLD, KC_MUTE, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), | |||
}; | |||
void matrix_init_user(void) { | |||
//user initialization | |||
} | |||
void matrix_scan_user(void) { | |||
//user matrix | |||
} | |||
bool process_record_user(uint16_t keycode, keyrecord_t *record) { | |||
return true; | |||
} |
@ -0,0 +1,6 @@ | |||
The default keymap for ANSI HS60 | |||
================================ | |||
![Layout image](https://imgur.com/CSyPw0J.png) | |||
Default layer is normal ANSI and Fn layer is used for RGB functions, Volume control and arrow cluster |
@ -0,0 +1,46 @@ | |||
/* Copyright 2018 Yiancar | |||
* | |||
* 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/>. | |||
*/ | |||
#include QMK_KEYBOARD_H | |||
//This is the ISO version of the PCB | |||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | |||
[0] = LAYOUT_60_iso( /* Base */ | |||
KC_GESC, 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_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, \ | |||
KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,\ | |||
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1) , KC_APP, KC_RCTL), | |||
[1] = LAYOUT_60_iso( /* FN */ | |||
KC_TRNS, 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_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RESET , \ | |||
KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,\ | |||
KC_TRNS, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, RGB_SPI, RGB_SPD, KC_TRNS, KC_TRNS,\ | |||
KC_VOLU, KC_VOLD, KC_MUTE, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), | |||
}; | |||
void matrix_init_user(void) { | |||
//user initialization | |||
} | |||
void matrix_scan_user(void) { | |||
//user matrix | |||
} | |||
bool process_record_user(uint16_t keycode, keyrecord_t *record) { | |||
return true; | |||
} |
@ -0,0 +1,6 @@ | |||
The default keymap for ISO HS60 | |||
=============================== | |||
![Layout image](https://imgur.com/HXj4tYL.png) | |||
Default layer is normal ISO and Fn layer is used for RGB functions, Volume control and arrow cluster |
@ -0,0 +1,21 @@ | |||
/* | |||
Copyright 2018 Yiancar | |||
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/>. | |||
*/ | |||
#pragma once | |||
/* Include overwrites for specific keymap */ | |||
#define HS60_HHKB |
@ -0,0 +1,46 @@ | |||
/* Copyright 2018 Yiancar | |||
* | |||
* 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/>. | |||
*/ | |||
#include QMK_KEYBOARD_H | |||
//This is the HHKB version of the PCB | |||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | |||
[0] = LAYOUT_60_hhkb( /* Base */ | |||
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_GRV, KC_BSLS, \ | |||
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_BSPC, \ | |||
KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, 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_RSFT, MO(1), \ | |||
KC_LCTL, KC_LGUI,KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_RCTL ), | |||
[1] = LAYOUT_60_hhkb( /* FN */ | |||
RESET, 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_TRNS, KC_TRNS,\ | |||
KC_TRNS, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, RGB_SPI, RGB_SPD, KC_UP, KC_TRNS, KC_DEL, \ | |||
KC_TRNS, KC_VOLD, KC_VOLU, KC_MUTE, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_PGUP, KC_LEFT, KC_RGHT, KC_TRNS, \ | |||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_END, KC_PGDN, KC_DOWN, KC_TRNS, KC_TRNS, \ | |||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ) | |||
}; | |||
void matrix_init_user(void) { | |||
//user initialization | |||
} | |||
void matrix_scan_user(void) { | |||
//user matrix | |||
} | |||
bool process_record_user(uint16_t keycode, keyrecord_t *record) { | |||
return true; | |||
} |
@ -0,0 +1,257 @@ | |||
/* | |||
ChibiOS - Copyright (C) 2006..2016 Giovanni Di Sirio | |||
Licensed under the Apache License, Version 2.0 (the "License"); | |||
you may not use this file except in compliance with the License. | |||
You may obtain a copy of the License at | |||
http://www.apache.org/licenses/LICENSE-2.0 | |||
Unless required by applicable law or agreed to in writing, software | |||
distributed under the License is distributed on an "AS IS" BASIS, | |||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
See the License for the specific language governing permissions and | |||
limitations under the License. | |||
*/ | |||
#ifndef MCUCONF_H | |||
#define MCUCONF_H | |||
/* | |||
* STM32F3xx drivers configuration. | |||
* The following settings override the default settings present in | |||
* the various device driver implementation headers. | |||
* Note that the settings for each driver only have effect if the whole | |||
* driver is enabled in halconf.h. | |||
* | |||
* IRQ priorities: | |||
* 15...0 Lowest...Highest. | |||
* | |||
* DMA priorities: | |||
* 0...3 Lowest...Highest. | |||
*/ | |||
#define STM32F3xx_MCUCONF | |||
/* | |||
* HAL driver system settings. | |||
*/ | |||
#define STM32_NO_INIT FALSE | |||
#define STM32_PVD_ENABLE FALSE | |||
#define STM32_PLS STM32_PLS_LEV0 | |||
#define STM32_HSI_ENABLED TRUE | |||
#define STM32_LSI_ENABLED TRUE | |||
#define STM32_HSE_ENABLED TRUE | |||
#define STM32_LSE_ENABLED FALSE | |||
#define STM32_SW STM32_SW_PLL | |||
#define STM32_PLLSRC STM32_PLLSRC_HSE | |||
#define STM32_PREDIV_VALUE 1 | |||
#define STM32_PLLMUL_VALUE 9 | |||
#define STM32_HPRE STM32_HPRE_DIV1 | |||
#define STM32_PPRE1 STM32_PPRE1_DIV2 | |||
#define STM32_PPRE2 STM32_PPRE2_DIV2 | |||
#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK | |||
#define STM32_ADC12PRES STM32_ADC12PRES_DIV1 | |||
#define STM32_ADC34PRES STM32_ADC34PRES_DIV1 | |||
#define STM32_USART1SW STM32_USART1SW_PCLK | |||
#define STM32_USART2SW STM32_USART2SW_PCLK | |||
#define STM32_USART3SW STM32_USART3SW_PCLK | |||
#define STM32_UART4SW STM32_UART4SW_PCLK | |||
#define STM32_UART5SW STM32_UART5SW_PCLK | |||
#define STM32_I2C1SW STM32_I2C1SW_SYSCLK | |||
#define STM32_I2C2SW STM32_I2C2SW_SYSCLK | |||
#define STM32_TIM1SW STM32_TIM1SW_PCLK2 | |||
#define STM32_TIM8SW STM32_TIM8SW_PCLK2 | |||
#define STM32_RTCSEL STM32_RTCSEL_LSI | |||
#define STM32_USB_CLOCK_REQUIRED TRUE | |||
#define STM32_USBPRE STM32_USBPRE_DIV1P5 | |||
#undef STM32_HSE_BYPASS | |||
// #error "oh no" | |||
// #endif | |||
/* | |||
* ADC driver system settings. | |||
*/ | |||
#define STM32_ADC_DUAL_MODE FALSE | |||
#define STM32_ADC_COMPACT_SAMPLES FALSE | |||
#define STM32_ADC_USE_ADC1 FALSE | |||
#define STM32_ADC_USE_ADC2 FALSE | |||
#define STM32_ADC_USE_ADC3 FALSE | |||
#define STM32_ADC_USE_ADC4 FALSE | |||
#define STM32_ADC_ADC1_DMA_STREAM STM32_DMA_STREAM_ID(1, 1) | |||
#define STM32_ADC_ADC2_DMA_STREAM STM32_DMA_STREAM_ID(2, 1) | |||
#define STM32_ADC_ADC3_DMA_STREAM STM32_DMA_STREAM_ID(2, 5) | |||
#define STM32_ADC_ADC4_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) | |||
#define STM32_ADC_ADC1_DMA_PRIORITY 2 | |||
#define STM32_ADC_ADC2_DMA_PRIORITY 2 | |||
#define STM32_ADC_ADC3_DMA_PRIORITY 2 | |||
#define STM32_ADC_ADC4_DMA_PRIORITY 2 | |||
#define STM32_ADC_ADC12_IRQ_PRIORITY 5 | |||
#define STM32_ADC_ADC3_IRQ_PRIORITY 5 | |||
#define STM32_ADC_ADC4_IRQ_PRIORITY 5 | |||
#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 5 | |||
#define STM32_ADC_ADC2_DMA_IRQ_PRIORITY 5 | |||
#define STM32_ADC_ADC3_DMA_IRQ_PRIORITY 5 | |||
#define STM32_ADC_ADC4_DMA_IRQ_PRIORITY 5 | |||
#define STM32_ADC_ADC12_CLOCK_MODE ADC_CCR_CKMODE_AHB_DIV1 | |||
#define STM32_ADC_ADC34_CLOCK_MODE ADC_CCR_CKMODE_AHB_DIV1 | |||
/* | |||
* CAN driver system settings. | |||
*/ | |||
#define STM32_CAN_USE_CAN1 FALSE | |||
#define STM32_CAN_CAN1_IRQ_PRIORITY 11 | |||
/* | |||
* DAC driver system settings. | |||
*/ | |||
#define STM32_DAC_DUAL_MODE FALSE | |||
#define STM32_DAC_USE_DAC1_CH1 TRUE | |||
#define STM32_DAC_USE_DAC1_CH2 TRUE | |||
#define STM32_DAC_DAC1_CH1_IRQ_PRIORITY 10 | |||
#define STM32_DAC_DAC1_CH2_IRQ_PRIORITY 10 | |||
#define STM32_DAC_DAC1_CH1_DMA_PRIORITY 2 | |||
#define STM32_DAC_DAC1_CH2_DMA_PRIORITY 2 | |||
/* | |||
* EXT driver system settings. | |||
*/ | |||
#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 | |||
#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 | |||
#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 | |||
#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 | |||
#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 | |||
#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 | |||
#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 | |||
#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 | |||
#define STM32_EXT_EXTI17_IRQ_PRIORITY 6 | |||
#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 | |||
#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 | |||
#define STM32_EXT_EXTI20_IRQ_PRIORITY 6 | |||
#define STM32_EXT_EXTI21_22_29_IRQ_PRIORITY 6 | |||
#define STM32_EXT_EXTI30_32_IRQ_PRIORITY 6 | |||
#define STM32_EXT_EXTI33_IRQ_PRIORITY 6 | |||
/* | |||
* GPT driver system settings. | |||
*/ | |||
#define STM32_GPT_USE_TIM1 FALSE | |||
#define STM32_GPT_USE_TIM2 FALSE | |||
#define STM32_GPT_USE_TIM3 FALSE | |||
#define STM32_GPT_USE_TIM4 FALSE | |||
#define STM32_GPT_USE_TIM6 TRUE | |||
#define STM32_GPT_USE_TIM7 TRUE | |||
#define STM32_GPT_USE_TIM8 TRUE | |||
#define STM32_GPT_TIM1_IRQ_PRIORITY 7 | |||
#define STM32_GPT_TIM2_IRQ_PRIORITY 7 | |||
#define STM32_GPT_TIM3_IRQ_PRIORITY 7 | |||
#define STM32_GPT_TIM4_IRQ_PRIORITY 7 | |||
#define STM32_GPT_TIM6_IRQ_PRIORITY 7 | |||
#define STM32_GPT_TIM7_IRQ_PRIORITY 7 | |||
#define STM32_GPT_TIM8_IRQ_PRIORITY 7 | |||
/* | |||
* I2C driver system settings. | |||
*/ | |||
#define STM32_I2C_USE_I2C1 TRUE | |||
#define STM32_I2C_USE_I2C2 FALSE | |||
#define STM32_I2C_BUSY_TIMEOUT 50 | |||
#define STM32_I2C_I2C1_IRQ_PRIORITY 10 | |||
#define STM32_I2C_I2C2_IRQ_PRIORITY 10 | |||
#define STM32_I2C_USE_DMA TRUE | |||
#define STM32_I2C_I2C1_DMA_PRIORITY 1 | |||
#define STM32_I2C_I2C2_DMA_PRIORITY 1 | |||
#define STM32_I2C_DMA_ERROR_HOOK(i2cp) osalSysHalt("DMA failure") | |||
/* | |||
* ICU driver system settings. | |||
*/ | |||
#define STM32_ICU_USE_TIM1 FALSE | |||
#define STM32_ICU_USE_TIM2 FALSE | |||
#define STM32_ICU_USE_TIM3 FALSE | |||
#define STM32_ICU_USE_TIM4 FALSE | |||
#define STM32_ICU_USE_TIM8 FALSE | |||
#define STM32_ICU_TIM1_IRQ_PRIORITY 7 | |||
#define STM32_ICU_TIM2_IRQ_PRIORITY 7 | |||
#define STM32_ICU_TIM3_IRQ_PRIORITY 7 | |||
#define STM32_ICU_TIM4_IRQ_PRIORITY 7 | |||
#define STM32_ICU_TIM8_IRQ_PRIORITY 7 | |||
/* | |||
* PWM driver system settings. | |||
*/ | |||
#define STM32_PWM_USE_ADVANCED FALSE | |||
#define STM32_PWM_USE_TIM1 FALSE | |||
#define STM32_PWM_USE_TIM2 FALSE | |||
#define STM32_PWM_USE_TIM3 FALSE | |||
#define STM32_PWM_USE_TIM4 FALSE | |||
#define STM32_PWM_USE_TIM8 FALSE | |||
#define STM32_PWM_TIM1_IRQ_PRIORITY 7 | |||
#define STM32_PWM_TIM2_IRQ_PRIORITY 7 | |||
#define STM32_PWM_TIM3_IRQ_PRIORITY 7 | |||
#define STM32_PWM_TIM4_IRQ_PRIORITY 7 | |||
#define STM32_PWM_TIM8_IRQ_PRIORITY 7 | |||
/* | |||
* SERIAL driver system settings. | |||
*/ | |||
#define STM32_SERIAL_USE_USART1 FALSE | |||
#define STM32_SERIAL_USE_USART2 FALSE | |||
#define STM32_SERIAL_USE_USART3 FALSE | |||
#define STM32_SERIAL_USE_UART4 FALSE | |||
#define STM32_SERIAL_USE_UART5 FALSE | |||
#define STM32_SERIAL_USART1_PRIORITY 12 | |||
#define STM32_SERIAL_USART2_PRIORITY 12 | |||
#define STM32_SERIAL_USART3_PRIORITY 12 | |||
#define STM32_SERIAL_UART4_PRIORITY 12 | |||
#define STM32_SERIAL_UART5_PRIORITY 12 | |||
/* | |||
* SPI driver system settings. | |||
*/ | |||
#define STM32_SPI_USE_SPI1 FALSE | |||
#define STM32_SPI_USE_SPI2 FALSE | |||
#define STM32_SPI_USE_SPI3 FALSE | |||
#define STM32_SPI_SPI1_DMA_PRIORITY 1 | |||
#define STM32_SPI_SPI2_DMA_PRIORITY 1 | |||
#define STM32_SPI_SPI3_DMA_PRIORITY 1 | |||
#define STM32_SPI_SPI1_IRQ_PRIORITY 10 | |||
#define STM32_SPI_SPI2_IRQ_PRIORITY 10 | |||
#define STM32_SPI_SPI3_IRQ_PRIORITY 10 | |||
#define STM32_SPI_DMA_ERROR_HOOK(spip) osalSysHalt("DMA failure") | |||
/* | |||
* ST driver system settings. | |||
*/ | |||
#define STM32_ST_IRQ_PRIORITY 8 | |||
#define STM32_ST_USE_TIMER 2 | |||
/* | |||
* UART driver system settings. | |||
*/ | |||
#define STM32_UART_USE_USART1 FALSE | |||
#define STM32_UART_USE_USART2 FALSE | |||
#define STM32_UART_USE_USART3 FALSE | |||
#define STM32_UART_USART1_IRQ_PRIORITY 12 | |||
#define STM32_UART_USART2_IRQ_PRIORITY 12 | |||
#define STM32_UART_USART3_IRQ_PRIORITY 12 | |||
#define STM32_UART_USART1_DMA_PRIORITY 0 | |||
#define STM32_UART_USART2_DMA_PRIORITY 0 | |||
#define STM32_UART_USART3_DMA_PRIORITY 0 | |||
#define STM32_UART_DMA_ERROR_HOOK(uartp) osalSysHalt("DMA failure") | |||
/* | |||
* USB driver system settings. | |||
*/ | |||
#define STM32_USB_USE_USB1 TRUE | |||
#define STM32_USB_LOW_POWER_ON_SUSPEND FALSE | |||
#define STM32_USB_USB1_HP_IRQ_PRIORITY 13 | |||
#define STM32_USB_USB1_LP_IRQ_PRIORITY 14 | |||
/* | |||
* WDG driver system settings. | |||
*/ | |||
#define STM32_WDG_USE_IWDG FALSE | |||
#endif /* MCUCONF_H */ |
@ -0,0 +1,18 @@ | |||
HS60 V2.0 | |||
========= | |||
[HS60](https://mechboards.co.uk/wp-content/uploads/2018/04/IMG_20180420_140353.jpg) | |||
This is a standard fixed layout 60% PCB. It comes in three variants; ISO, ANSI and HHKB and support full per-key RGB. | |||
Keyboard Maintainer: [Yiancar](http://yiancar-designs.com/) and on [github](https://github.com/yiancar) | |||
Hardware Supported: HS60 ISO, ANSI and HHKB PCBs with STM32F303CC | |||
Hardware Availability: http://groupbuys.mechboards.co.uk/shop/hs60-hotswap-60-pcb/ | |||
Due to the RGB implementation, the HS60 is currently not compatible with community layouts. | |||
Make example for this keyboard (after setting up your build environment): | |||
make hs60/v2:default | |||
See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. |
@ -0,0 +1,58 @@ | |||
# project specific files | |||
## chip/board settings | |||
# the next two should match the directories in | |||
# <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES) | |||
MCU_FAMILY = STM32 | |||
MCU_SERIES = STM32F3xx | |||
# Linker script to use | |||
# it should exist either in <chibios>/os/common/ports/ARMCMx/compilers/GCC/ld/ | |||
# or <this_dir>/ld/ | |||
MCU_LDSCRIPT = STM32F303xC | |||
# Startup code to use | |||
# - it should exist in <chibios>/os/common/startup/ARMCMx/compilers/GCC/mk/ | |||
MCU_STARTUP = stm32f3xx | |||
# Board: it should exist either in <chibios>/os/hal/boards/ | |||
# or <this_dir>/boards | |||
BOARD = GENERIC_STM32_F303XC | |||
# Cortex version | |||
MCU = cortex-m4 | |||
# ARM version, CORTEX-M0/M1 are 6, CORTEX-M3/M4/M7 are 7 | |||
ARMV = 7 | |||
USE_FPU = yes | |||
# Vector table for application | |||
# 0x00000000-0x00001000 area is occupied by bootlaoder.*/ | |||
# The CORTEX_VTOR... is needed only for MCHCK/Infinity KB | |||
# OPT_DEFS = -DCORTEX_VTOR_INIT=0x08005000 | |||
OPT_DEFS = | |||
# Do not put the microcontroller into power saving mode | |||
# when we get USB suspend event. We want it to keep updating | |||
# backlight effects. | |||
OPT_DEFS += -DNO_SUSPEND_POWER_DOWN | |||
# Options to pass to dfu-util when flashing | |||
DFU_ARGS = -d 0483:df11 -a 0 -s 0x08000000:leave | |||
# Build Options | |||
# comment out to disable the options. | |||
# | |||
BACKLIGHT_ENABLE = no | |||
BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration | |||
MOUSEKEY_ENABLE = yes # Mouse keys | |||
EXTRAKEY_ENABLE = yes # Audio control and System control | |||
CONSOLE_ENABLE = no # Console for debug | |||
COMMAND_ENABLE = no # Commands for debug and configuration | |||
#SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend | |||
NKRO_ENABLE = yes # USB Nkey Rollover | |||
AUDIO_ENABLE = no | |||
RGB_MATRIX_ENABLE = IS31FL3733 # Use RGB matrix | |||
NO_USB_STARTUP_CHECK = no # Disable initialization only when usb is plugged in | |||
#SERIAL_LINK_ENABLE = yes |
@ -0,0 +1,635 @@ | |||
/* Copyright 2018 Yiancar | |||
* | |||
* 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/>. | |||
*/ | |||
#include "v2.h" | |||
//#include "is31fl3733.h" | |||
// Please ignore this is for upcoming features | |||
/*#ifdef RAW_ENABLE | |||
void raw_hid_receive( uint8_t *data, uint8_t length ) | |||
{ | |||
uint8_t command = data[0]; | |||
switch ( command ) | |||
{ | |||
case id_protocol_version: | |||
{ | |||
msg_protocol_version *msg = (msg_protocol_version*)&data[1]; | |||
msg->version = PROTOCOL_VERSION; | |||
break; | |||
} | |||
#if USE_KEYMAPS_IN_EEPROM | |||
case id_keymap_keycode_load: | |||
{ | |||
msg_keymap_keycode_load *msg = (msg_keymap_keycode_load*)&data[1]; | |||
msg->keycode = keymap_keycode_load( msg->layer, msg->row, msg->column ); | |||
break; | |||
} | |||
case id_keymap_keycode_save: | |||
{ | |||
msg_keymap_keycode_save *msg = (msg_keymap_keycode_save*)&data[1]; | |||
keymap_keycode_save( msg->layer, msg->row, msg->column, msg->keycode); | |||
break; | |||
} | |||
case id_keymap_default_save: | |||
{ | |||
keymap_default_save(); | |||
break; | |||
} | |||
#endif // USE_KEYMAPS_IN_EEPROM | |||
case id_backlight_config_set_values: | |||
{ | |||
msg_backlight_config_set_values *msg = (msg_backlight_config_set_values*)&data[1]; | |||
backlight_config_set_values(msg); | |||
backlight_config_save(); | |||
break; | |||
} | |||
case id_backlight_config_set_alphas_mods: | |||
{ | |||
msg_backlight_config_set_alphas_mods *msg = (msg_backlight_config_set_alphas_mods*)&data[1]; | |||
backlight_config_set_alphas_mods( msg->alphas_mods ); | |||
backlight_config_save(); | |||
break; | |||
} | |||
case id_backlight_set_key_color: | |||
{ | |||
msg_backlight_set_key_color *msg = (msg_backlight_set_key_color*)&data[1]; | |||
backlight_set_key_color(msg->row, msg->column, msg->hsv); | |||
break; | |||
} | |||
case id_system_get_state: | |||
{ | |||
msg_system_state *msg = (msg_system_state*)&data[1]; | |||
msg->value = backlight_get_tick(); | |||
break; | |||
} | |||
default: | |||
{ | |||
// Unhandled message. | |||
data[0] = id_unhandled; | |||
break; | |||
} | |||
} | |||
// Return same buffer with values changed | |||
raw_hid_send( data, length ); | |||
} | |||
#endif*/ | |||
#ifdef HS60_ANSI | |||
const is31_led g_is31_leds[DRIVER_LED_TOTAL] = { | |||
/* Refer to IS31 manual for these locations | |||
* driver | |||
* | R location | |||
* | | G location | |||
* | | | B location | |||
* | | | | */ | |||
{0, B_1, A_1, C_1}, //MX1 | |||
{0, E_1, D_1, F_1}, //MX2 | |||
{0, H_1, G_1, I_1}, //MX3 | |||
{0, K_1, J_1, L_1}, //MX4 | |||
{0, B_2, A_2, C_2}, //MX6 | |||
{0, E_2, D_2, F_2}, //MX7 | |||
{0, H_2, G_2, I_2}, //MX8 | |||
{0, K_2, J_2, L_2}, //MX14 | |||
{0, B_3, A_3, C_3}, //MX11 | |||
{0, E_3, D_3, F_3}, //MX12 | |||
{0, H_3, G_3, I_3}, //MX13 | |||
{0, K_3, J_3, L_3}, //MX19 | |||
{0, B_4, A_4, C_4}, //MX16 | |||
{0, E_4, D_4, F_4}, //MX17 | |||
{0, H_4, G_4, I_4}, //MX18 | |||
{0, K_4, J_4, L_4}, //MX23 | |||
{0, B_5, A_5, C_5}, //MX20 | |||
{0, E_5, D_5, F_5}, //MX21 | |||
{0, H_5, G_5, I_5}, //MX22 | |||
{0, K_5, J_5, L_5}, //MX27 | |||
{0, B_6, A_6, C_6}, //MX24 | |||
{0, E_6, D_6, F_6}, //MX25 | |||
{0, H_6, G_6, I_6}, //MX26 | |||
{0, K_6, J_6, L_6}, //MX31 | |||
{0, B_7, A_7, C_7}, //MX28 | |||
{0, E_7, D_7, F_7}, //MX29 | |||
{0, H_7, G_7, I_7}, //MX30 | |||
{0, K_7, J_7, L_7}, //MX36 | |||
{0, B_8, A_8, C_8}, //MX33 | |||
{0, E_8, D_8, F_8}, //MX34 | |||
{0, H_8, G_8, I_8}, //MX35 | |||
{0, K_8, J_8, L_8}, //MX40 | |||
{0, B_9, A_9, C_9}, //MX37 | |||
{0, E_9, D_9, F_9}, //MX38 | |||
{0, H_9, G_9, I_9}, //MX39 | |||
{0, K_9, J_9, L_9}, //MX44 | |||
{0, B_10, A_10, C_10}, //MX41 | |||
{0, E_10, D_10, F_10}, //MX42 | |||
{0, H_10, G_10, I_10}, //MX43 | |||
{0, K_10, J_10, L_10}, //MX48 | |||
{0, B_11, A_11, C_11}, //MX45 | |||
{0, E_11, D_11, F_11}, //MX46 | |||
{0, H_11, G_11, I_11}, //MX47 | |||
{0, K_11, J_11, L_11}, //MX53 | |||
{0, B_12, A_12, C_12}, //MX50 | |||
{0, E_12, D_12, F_12}, //MX51 | |||
{0, H_12, G_12, I_12}, //MX52 | |||
{0, B_13, A_13, C_13}, //MX55 | |||
{0, E_13, D_13, F_13}, //MX56 | |||
{0, K_13, J_13, L_13}, //MX61 | |||
{0, B_14, A_14, C_14}, //MX59 | |||
{0, E_14, D_14, F_14}, //MX57 | |||
{0, H_14, G_14, I_14}, //MX60 | |||
{0, K_14, J_14, L_14}, //MX62 | |||
{0, B_15, A_15, C_15}, //MX5 | |||
{0, E_15, D_15, F_15}, //MX10 | |||
{0, H_15, G_15, I_15}, //MX15 | |||
{0, K_15, J_15, L_15}, //MX32 | |||
{0, E_16, D_16, F_16}, //MX49 | |||
{0, H_16, G_16, I_16}, //MX54 | |||
{0, K_16, J_16, L_16}, //MX58 | |||
}; | |||
const rgb_led g_rgb_leds[DRIVER_LED_TOTAL] = { | |||
// | |||
// MX1, MX6, MX11, MX16, MX20, MX24, MX28, MX33, MX37, MX41, MX45, MX50, MX55, MX59, | |||
// MX2, MX7, MX12, MX17, MX21, MX25, MX29, MX34, MX38, MX42, MX46, MX51, MX56, ---, | |||
// MX3, MX8, MX13, MX18, MX22, MX26, MX30, MX35, MX39, MX43, MX47, MX52, MX57, MX60, | |||
// MX4, ---, MX14, MX19, MX23, MX27, MX31, MX36, MX40, MX44, MX48, MX53, ---, MX61, | |||
// MX5, MX10, MX15, ---, ---, ---, MX32, ---, ---, ---, MX49, MX54, MX58, MX62 | |||
/* {row | col << 4} | |||
* | {x=0..224, y=0..64} | |||
* | | modifier | |||
* | | | */ | |||
{{0|(0<<4)}, { 0, 0}, 1}, //MX1 | |||
{{1|(0<<4)}, { 0, 16}, 1}, //MX2 | |||
{{2|(0<<4)}, { 0, 32}, 1}, //MX3 | |||
{{3|(0<<4)}, { 0, 48}, 1}, //MX4 | |||
{{0|(1<<4)}, { 17, 0}, 0}, //MX6 | |||
{{1|(1<<4)}, { 17, 16}, 0}, //MX7 | |||
{{2|(1<<4)}, { 17, 32}, 0}, //MX8 | |||
{{3|(2<<4)}, { 34, 48}, 0}, //MX14 | |||
{{0|(2<<4)}, { 34, 0}, 0}, //MX11 | |||
{{1|(2<<4)}, { 34, 16}, 0}, //MX12 | |||
{{2|(2<<4)}, { 34, 32}, 0}, //MX13 | |||
{{3|(3<<4)}, { 51, 48}, 0}, //MX19 | |||
{{0|(3<<4)}, { 51, 0}, 0}, //MX16 | |||
{{1|(3<<4)}, { 51, 16}, 0}, //MX17 | |||
{{2|(3<<4)}, { 51, 32}, 0}, //MX18 | |||
{{3|(4<<4)}, { 68, 48}, 0}, //MX23 | |||
{{0|(4<<4)}, { 68, 0}, 0}, //MX20 | |||
{{1|(4<<4)}, { 68, 16}, 0}, //MX21 | |||
{{2|(4<<4)}, { 68, 32}, 0}, //MX22 | |||
{{3|(5<<4)}, { 85, 48}, 0}, //MX27 | |||
{{0|(5<<4)}, { 85, 0}, 0}, //MX24 | |||
{{1|(5<<4)}, { 85, 16}, 0}, //MX25 | |||
{{2|(5<<4)}, { 85, 32}, 0}, //MX26 | |||
{{3|(6<<4)}, {102, 48}, 0}, //MX31 | |||
{{0|(6<<4)}, {102, 0}, 0}, //MX28 | |||
{{1|(6<<4)}, {102, 16}, 0}, //MX29 | |||
{{2|(6<<4)}, {102, 32}, 0}, //MX30 | |||
{{3|(7<<4)}, {119, 48}, 0}, //MX36 | |||
{{0|(7<<4)}, {119, 0}, 0}, //MX33 | |||
{{1|(7<<4)}, {119, 16}, 0}, //MX34 | |||
{{2|(7<<4)}, {119, 32}, 0}, //MX35 | |||
{{3|(8<<4)}, {136, 48}, 0}, //MX40 | |||
{{0|(8<<4)}, {136, 0}, 0}, //MX37 | |||
{{1|(8<<4)}, {136, 16}, 0}, //MX38 | |||
{{2|(8<<4)}, {136, 32}, 0}, //MX39 | |||
{{3|(9<<4)}, {153, 48}, 0}, //MX44 | |||
{{0|(9<<4)}, {153, 0}, 0}, //MX41 | |||
{{1|(9<<4)}, {153, 16}, 0}, //MX42 | |||
{{2|(9<<4)}, {153, 32}, 0}, //MX43 | |||
{{3|(10<<4)}, {170, 48}, 0}, //MX48 | |||
{{0|(10<<4)}, {170, 0}, 0}, //MX45 | |||
{{1|(10<<4)}, {170, 16}, 0}, //MX46 | |||
{{2|(10<<4)}, {170, 32}, 0}, //MX47 | |||
{{3|(11<<4)}, {187, 48}, 0}, //MX53 | |||
{{0|(11<<4)}, {187, 0}, 0}, //MX50 | |||
{{1|(11<<4)}, {187, 16}, 0}, //MX51 | |||
{{2|(11<<4)}, {187, 32}, 0}, //MX52 | |||
{{0|(12<<4)}, {204, 0}, 0}, //MX55 | |||
{{1|(12<<4)}, {204, 16}, 0}, //MX56 | |||
{{3|(13<<4)}, {221, 48}, 1}, //MX61 | |||
{{0|(13<<4)}, {221, 0}, 1}, //MX59 | |||
{{2|(12<<4)}, {221, 16}, 0}, //MX57 | |||
{{2|(13<<4)}, {221, 32}, 1}, //MX60 | |||
{{4|(13<<4)}, {221, 64}, 1}, //MX62 | |||
{{4|(0<<4)}, { 0, 64}, 1}, //MX5 | |||
{{4|(1<<4)}, { 17, 64}, 1}, //MX10 | |||
{{4|(2<<4)}, { 34, 64}, 1}, //MX15 | |||
{{4|(5<<4)}, {102, 64}, 0}, //MX32 | |||
{{4|(10<<4)}, {170, 64}, 1}, //MX49 | |||
{{4|(11<<4)}, {187, 64}, 1}, //MX54 | |||
{{4|(12<<4)}, {204, 64}, 1} //MX58 | |||
}; | |||
#elif defined(HS60_HHKB) | |||
const is31_led g_is31_leds[DRIVER_LED_TOTAL] = { | |||
/* Refer to IS31 manual for these locations | |||
* driver | |||
* | R location | |||
* | | G location | |||
* | | | B location | |||
* | | | | */ | |||
{0, B_1, A_1, C_1}, //MX1 | |||
{0, E_1, D_1, F_1}, //MX2 | |||
{0, H_1, G_1, I_1}, //MX3 | |||
{0, K_1, J_1, L_1}, //MX4 | |||
{0, B_2, A_2, C_2}, //MX6 | |||
{0, E_2, D_2, F_2}, //MX7 | |||
{0, H_2, G_2, I_2}, //MX8 | |||
{0, K_2, J_2, L_2}, //MX14 | |||
{0, B_3, A_3, C_3}, //MX11 | |||
{0, E_3, D_3, F_3}, //MX12 | |||
{0, H_3, G_3, I_3}, //MX13 | |||
{0, K_3, J_3, L_3}, //MX19 | |||
{0, B_4, A_4, C_4}, //MX16 | |||
{0, E_4, D_4, F_4}, //MX17 | |||
{0, H_4, G_4, I_4}, //MX18 | |||
{0, K_4, J_4, L_4}, //MX23 | |||
{0, B_5, A_5, C_5}, //MX20 | |||
{0, E_5, D_5, F_5}, //MX21 | |||
{0, H_5, G_5, I_5}, //MX22 | |||
{0, K_5, J_5, L_5}, //MX27 | |||
{0, B_6, A_6, C_6}, //MX24 | |||
{0, E_6, D_6, F_6}, //MX25 | |||
{0, H_6, G_6, I_6}, //MX26 | |||
{0, K_6, J_6, L_6}, //MX31 | |||
{0, B_7, A_7, C_7}, //MX28 | |||
{0, E_7, D_7, F_7}, //MX29 | |||
{0, H_7, G_7, I_7}, //MX30 | |||
{0, K_7, J_7, L_7}, //MX36 | |||
{0, B_8, A_8, C_8}, //MX33 | |||
{0, E_8, D_8, F_8}, //MX34 | |||
{0, H_8, G_8, I_8}, //MX35 | |||
{0, K_8, J_8, L_8}, //MX40 | |||
{0, B_9, A_9, C_9}, //MX37 | |||
{0, E_9, D_9, F_9}, //MX38 | |||
{0, H_9, G_9, I_9}, //MX39 | |||
{0, K_9, J_9, L_9}, //MX44 | |||
{0, B_10, A_10, C_10}, //MX41 | |||
{0, E_10, D_10, F_10}, //MX42 | |||
{0, H_10, G_10, I_10}, //MX43 | |||
{0, K_10, J_10, L_10}, //MX48 | |||
{0, B_11, A_11, C_11}, //MX45 | |||
{0, E_11, D_11, F_11}, //MX46 | |||
{0, H_11, G_11, I_11}, //MX47 | |||
{0, K_11, J_11, L_11}, //MX53 | |||
{0, B_12, A_12, C_12}, //MX50 | |||
{0, E_12, D_12, F_12}, //MX51 | |||
{0, H_12, G_12, I_12}, //MX52 | |||
{0, K_12, J_12, L_12}, //MX64 | |||
{0, B_13, A_13, C_13}, //MX55 | |||
{0, E_13, D_13, F_13}, //MX56 | |||
{0, H_13, G_13, I_13}, //MX63 | |||
{0, K_13, J_13, L_13}, //MX61 | |||
{0, B_14, A_14, C_14}, //MX59 | |||
{0, E_14, D_14, F_14}, //MX57 | |||
{0, H_14, G_14, I_14}, //MX60 | |||
{0, K_14, J_14, L_14}, //MX62 | |||
{0, B_15, A_15, C_15}, //MX5 | |||
{0, E_15, D_15, F_15}, //MX10 | |||
{0, H_15, G_15, I_15}, //MX15 | |||
{0, K_15, J_15, L_15}, //MX32 | |||
{0, H_16, G_16, I_16}, //MX54 | |||
{0, K_16, J_16, L_16}, //MX58 | |||
}; | |||
const rgb_led g_rgb_leds[DRIVER_LED_TOTAL] = { | |||
// | |||
// MX1, MX6, MX11, MX16, MX20, MX24, MX28, MX33, MX37, MX41, MX45, MX50, MX55, MX59, | |||
// MX2, MX7, MX12, MX17, MX21, MX25, MX29, MX34, MX38, MX42, MX46, MX51, MX56, MX64, | |||
// MX3, MX8, MX13, MX18, MX22, MX26, MX30, MX35, MX39, MX43, MX47, MX52, MX57, MX60, | |||
// MX4, ----, MX14, MX19, MX23, MX27, MX31, MX36, MX40, MX44, MX48, MX53, MX63, MX61, | |||
// MX5, MX10, MX15, ----, ----, ----, MX32, ----, ---, ----, ----, MX54, MX58, MX62 | |||
/* {row | col << 4} | |||
* | {x=0..224, y=0..64} | |||
* | | modifier | |||
* | | | */ | |||
{{0|(0<<4)}, { 0, 0}, 1}, //MX1 | |||
{{1|(0<<4)}, { 0, 16}, 1}, //MX2 | |||
{{2|(0<<4)}, { 0, 32}, 1}, //MX3 | |||
{{3|(0<<4)}, { 0, 48}, 1}, //MX4 | |||
{{0|(1<<4)}, { 17, 0}, 0}, //MX6 | |||
{{1|(1<<4)}, { 17, 16}, 0}, //MX7 | |||
{{2|(1<<4)}, { 17, 32}, 0}, //MX8 | |||
{{3|(2<<4)}, { 34, 48}, 0}, //MX14 | |||
{{0|(2<<4)}, { 34, 0}, 0}, //MX11 | |||
{{1|(2<<4)}, { 34, 16}, 0}, //MX12 | |||
{{2|(2<<4)}, { 34, 32}, 0}, //MX13 | |||
{{3|(3<<4)}, { 51, 48}, 0}, //MX19 | |||
{{0|(3<<4)}, { 51, 0}, 0}, //MX16 | |||
{{1|(3<<4)}, { 51, 16}, 0}, //MX17 | |||
{{2|(3<<4)}, { 51, 32}, 0}, //MX18 | |||
{{3|(4<<4)}, { 68, 48}, 0}, //MX23 | |||
{{0|(4<<4)}, { 68, 0}, 0}, //MX20 | |||
{{1|(4<<4)}, { 68, 16}, 0}, //MX21 | |||
{{2|(4<<4)}, { 68, 32}, 0}, //MX22 | |||
{{3|(5<<4)}, { 85, 48}, 0}, //MX27 | |||
{{0|(5<<4)}, { 85, 0}, 0}, //MX24 | |||
{{1|(5<<4)}, { 85, 16}, 0}, //MX25 | |||
{{2|(5<<4)}, { 85, 32}, 0}, //MX26 | |||
{{3|(6<<4)}, {102, 48}, 0}, //MX31 | |||
{{0|(6<<4)}, {102, 0}, 0}, //MX28 | |||
{{1|(6<<4)}, {102, 16}, 0}, //MX29 | |||
{{2|(6<<4)}, {102, 32}, 0}, //MX30 | |||
{{3|(7<<4)}, {119, 48}, 0}, //MX36 | |||
{{0|(7<<4)}, {119, 0}, 0}, //MX33 | |||
{{1|(7<<4)}, {119, 16}, 0}, //MX34 | |||
{{2|(7<<4)}, {119, 32}, 0}, //MX35 | |||
{{3|(8<<4)}, {136, 48}, 0}, //MX40 | |||
{{0|(8<<4)}, {136, 0}, 0}, //MX37 | |||
{{1|(8<<4)}, {136, 16}, 0}, //MX38 | |||
{{2|(8<<4)}, {136, 32}, 0}, //MX39 | |||
{{3|(9<<4)}, {153, 48}, 0}, //MX44 | |||
{{0|(9<<4)}, {153, 0}, 0}, //MX41 | |||
{{1|(9<<4)}, {153, 16}, 0}, //MX42 | |||
{{2|(9<<4)}, {153, 32}, 0}, //MX43 | |||
{{3|(10<<4)}, {170, 48}, 0}, //MX48 | |||
{{0|(10<<4)}, {170, 0}, 0}, //MX45 | |||
{{1|(10<<4)}, {170, 16}, 0}, //MX46 | |||
{{2|(10<<4)}, {170, 32}, 0}, //MX47 | |||
{{3|(11<<4)}, {187, 48}, 0}, //MX53 | |||
{{0|(11<<4)}, {187, 0}, 0}, //MX50 | |||
{{1|(11<<4)}, {187, 16}, 0}, //MX51 | |||
{{2|(11<<4)}, {187, 32}, 0}, //MX52 | |||
{{1|(13<<4)}, {221, 0}, 1}, //MX64 | |||
{{0|(12<<4)}, {204, 0}, 0}, //MX55 | |||
{{1|(12<<4)}, {204, 16}, 0}, //MX56 | |||
{{3|(12<<4)}, {204, 48}, 0}, //MX63 | |||
{{3|(13<<4)}, {212, 48}, 1}, //MX61 | |||
{{0|(13<<4)}, {221, 0}, 0}, //MX59 | |||
{{2|(12<<4)}, {221, 16}, 0}, //MX57 | |||
{{2|(13<<4)}, {221, 32}, 1}, //MX60 | |||
{{4|(13<<4)}, {221, 64}, 1}, //MX62 | |||
{{4|(0<<4)}, { 0, 64}, 1}, //MX5 | |||
{{4|(1<<4)}, { 17, 64}, 1}, //MX10 | |||
{{4|(2<<4)}, { 34, 64}, 1}, //MX15 | |||
{{4|(5<<4)}, {102, 64}, 0}, //MX32 | |||
{{4|(11<<4)}, {187, 64}, 1}, //MX54 | |||
{{4|(12<<4)}, {204, 64}, 1} //MX58 | |||
}; | |||
#else //ISO layout | |||
const is31_led g_is31_leds[DRIVER_LED_TOTAL] = { | |||
/* Refer to IS31 manual for these locations | |||
* driver | |||
* | R location | |||
* | | G location | |||
* | | | B location | |||
* | | | | */ | |||
{0, B_1, A_1, C_1}, //MX1 | |||
{0, E_1, D_1, F_1}, //MX2 | |||
{0, H_1, G_1, I_1}, //MX3 | |||
{0, K_1, J_1, L_1}, //MX4 | |||
{0, B_2, A_2, C_2}, //MX6 | |||
{0, E_2, D_2, F_2}, //MX7 | |||
{0, H_2, G_2, I_2}, //MX8 | |||
{0, K_2, J_2, L_2}, //MX14 | |||
{0, B_3, A_3, C_3}, //MX11 | |||
{0, E_3, D_3, F_3}, //MX12 | |||
{0, H_3, G_3, I_3}, //MX13 | |||
{0, K_3, J_3, L_3}, //MX19 | |||
{0, B_4, A_4, C_4}, //MX16 | |||
{0, E_4, D_4, F_4}, //MX17 | |||
{0, H_4, G_4, I_4}, //MX18 | |||
{0, K_4, J_4, L_4}, //MX23 | |||
{0, B_5, A_5, C_5}, //MX20 | |||
{0, E_5, D_5, F_5}, //MX21 | |||
{0, H_5, G_5, I_5}, //MX22 | |||
{0, K_5, J_5, L_5}, //MX27 | |||
{0, B_6, A_6, C_6}, //MX24 | |||
{0, E_6, D_6, F_6}, //MX25 | |||
{0, H_6, G_6, I_6}, //MX26 | |||
{0, K_6, J_6, L_6}, //MX31 | |||
{0, B_7, A_7, C_7}, //MX28 | |||
{0, E_7, D_7, F_7}, //MX29 | |||
{0, H_7, G_7, I_7}, //MX30 | |||
{0, K_7, J_7, L_7}, //MX36 | |||
{0, B_8, A_8, C_8}, //MX33 | |||
{0, E_8, D_8, F_8}, //MX34 | |||
{0, H_8, G_8, I_8}, //MX35 | |||
{0, K_8, J_8, L_8}, //MX40 | |||
{0, B_9, A_9, C_9}, //MX37 | |||
{0, E_9, D_9, F_9}, //MX38 | |||
{0, H_9, G_9, I_9}, //MX39 | |||
{0, K_9, J_9, L_9}, //MX44 | |||
{0, B_10, A_10, C_10}, //MX41 | |||
{0, E_10, D_10, F_10}, //MX42 | |||
{0, H_10, G_10, I_10}, //MX43 | |||
{0, K_10, J_10, L_10}, //MX48 | |||
{0, B_11, A_11, C_11}, //MX45 | |||
{0, E_11, D_11, F_11}, //MX46 | |||
{0, H_11, G_11, I_11}, //MX47 | |||
{0, K_11, J_11, L_11}, //MX53 | |||
{0, B_12, A_12, C_12}, //MX50 | |||
{0, E_12, D_12, F_12}, //MX51 | |||
{0, H_12, G_12, I_12}, //MX52 | |||
{0, K_12, J_12, L_12}, //MX9 | |||
{0, B_13, A_13, C_13}, //MX55 | |||
{0, E_13, D_13, F_13}, //MX56 | |||
{0, K_13, J_13, L_13}, //MX61 | |||
{0, B_14, A_14, C_14}, //MX59 | |||
{0, E_14, D_14, F_14}, //MX57 | |||
{0, H_14, G_14, I_14}, //MX60 | |||
{0, K_14, J_14, L_14}, //MX62 | |||
{0, B_15, A_15, C_15}, //MX5 | |||
{0, E_15, D_15, F_15}, //MX10 | |||
{0, H_15, G_15, I_15}, //MX15 | |||
{0, K_15, J_15, L_15}, //MX32 | |||
{0, E_16, D_16, F_16}, //MX49 | |||
{0, H_16, G_16, I_16}, //MX54 | |||
{0, K_16, J_16, L_16}, //MX58 | |||
}; | |||
const rgb_led g_rgb_leds[DRIVER_LED_TOTAL] = { | |||
// | |||
// MX1, MX6, MX11, MX16, MX20, MX24, MX28, MX33, MX37, MX41, MX45, MX50, MX55, MX59, | |||
// MX2, MX7, MX12, MX17, MX21, MX25, MX29, MX34, MX38, MX42, MX46, MX51, MX56, ---, | |||
// MX3, MX8, MX13, MX18, MX22, MX26, MX30, MX35, MX39, MX43, MX47, MX52, MX57, MX60, | |||
// MX4, ---, MX14, MX19, MX23, MX27, MX31, MX36, MX40, MX44, MX48, MX53, ---, MX61, | |||
// MX5, MX10, MX15, ---, ---, ---, MX32, ---, ---, ---, MX49, MX54, MX58, MX62 | |||
/* {row | col << 4} | |||
* | {x=0..224, y=0..64} | |||
* | | modifier | |||
* | | | */ | |||
{{0|(0<<4)}, { 0, 0}, 1}, //MX1 | |||
{{1|(0<<4)}, { 0, 16}, 1}, //MX2 | |||
{{2|(0<<4)}, { 0, 32}, 1}, //MX3 | |||
{{3|(0<<4)}, { 0, 48}, 1}, //MX4 | |||
{{0|(1<<4)}, { 17, 0}, 0}, //MX6 | |||
{{1|(1<<4)}, { 17, 16}, 0}, //MX7 | |||
{{2|(1<<4)}, { 17, 32}, 0}, //MX8 | |||
{{3|(2<<4)}, { 34, 48}, 0}, //MX14 | |||
{{0|(2<<4)}, { 34, 0}, 0}, //MX11 | |||
{{1|(2<<4)}, { 34, 16}, 0}, //MX12 | |||
{{2|(2<<4)}, { 34, 32}, 0}, //MX13 | |||
{{3|(3<<4)}, { 51, 48}, 0}, //MX19 | |||
{{0|(3<<4)}, { 51, 0}, 0}, //MX16 | |||
{{1|(3<<4)}, { 51, 16}, 0}, //MX17 | |||
{{2|(3<<4)}, { 51, 32}, 0}, //MX18 | |||
{{3|(4<<4)}, { 68, 48}, 0}, //MX23 | |||
{{0|(4<<4)}, { 68, 0}, 0}, //MX20 | |||
{{1|(4<<4)}, { 68, 16}, 0}, //MX21 | |||
{{2|(4<<4)}, { 68, 32}, 0}, //MX22 | |||
{{3|(5<<4)}, { 85, 48}, 0}, //MX27 | |||
{{0|(5<<4)}, { 85, 0}, 0}, //MX24 | |||
{{1|(5<<4)}, { 85, 16}, 0}, //MX25 | |||
{{2|(5<<4)}, { 85, 32}, 0}, //MX26 | |||
{{3|(6<<4)}, {102, 48}, 0}, //MX31 | |||
{{0|(6<<4)}, {102, 0}, 0}, //MX28 | |||
{{1|(6<<4)}, {102, 16}, 0}, //MX29 | |||
{{2|(6<<4)}, {102, 32}, 0}, //MX30 | |||
{{3|(7<<4)}, {119, 48}, 0}, //MX36 | |||
{{0|(7<<4)}, {119, 0}, 0}, //MX33 | |||
{{1|(7<<4)}, {119, 16}, 0}, //MX34 | |||
{{2|(7<<4)}, {119, 32}, 0}, //MX35 | |||
{{3|(8<<4)}, {136, 48}, 0}, //MX40 | |||
{{0|(8<<4)}, {136, 0}, 0}, //MX37 | |||
{{1|(8<<4)}, {136, 16}, 0}, //MX38 | |||
{{2|(8<<4)}, {136, 32}, 0}, //MX39 | |||
{{3|(9<<4)}, {153, 48}, 0}, //MX44 | |||
{{0|(9<<4)}, {153, 0}, 0}, //MX41 | |||
{{1|(9<<4)}, {153, 16}, 0}, //MX42 | |||
{{2|(9<<4)}, {153, 32}, 0}, //MX43 | |||
{{3|(10<<4)}, {170, 48}, 0}, //MX48 | |||
{{0|(10<<4)}, {170, 0}, 0}, //MX45 | |||
{{1|(10<<4)}, {170, 16}, 0}, //MX46 | |||
{{2|(10<<4)}, {170, 32}, 0}, //MX47 | |||
{{3|(11<<4)}, {187, 48}, 0}, //MX53 | |||
{{0|(11<<4)}, {187, 0}, 0}, //MX50 | |||
{{1|(11<<4)}, {187, 16}, 0}, //MX51 | |||
{{2|(11<<4)}, {187, 32}, 0}, //MX52 | |||
{{3|(2<<4)}, { 17, 32}, 1}, //MX9 | |||
{{0|(12<<4)}, {204, 0}, 0}, //MX55 | |||
{{1|(12<<4)}, {204, 16}, 0}, //MX56 | |||
{{3|(13<<4)}, {221, 48}, 1}, //MX61 | |||
{{0|(13<<4)}, {221, 0}, 1}, //MX59 | |||
{{2|(12<<4)}, {204, 32}, 0}, //MX57 | |||
{{2|(13<<4)}, {221, 24}, 1}, //MX60 | |||
{{4|(13<<4)}, {221, 64}, 1}, //MX62 | |||
{{4|(0<<4)}, { 0, 64}, 1}, //MX5 | |||
{{4|(1<<4)}, { 17, 64}, 1}, //MX10 | |||
{{4|(2<<4)}, { 34, 64}, 1}, //MX15 | |||
{{4|(5<<4)}, {102, 64}, 0}, //MX32 | |||
{{4|(10<<4)}, {170, 64}, 1}, //MX49 | |||
{{4|(11<<4)}, {187, 64}, 1}, //MX54 | |||
{{4|(12<<4)}, {204, 64}, 1} //MX58 | |||
}; | |||
#endif | |||
void bootmagic_lite(void) | |||
{ | |||
// The lite version of TMK's bootmagic made by Wilba. | |||
// 100% less potential for accidentally making the | |||
// keyboard do stupid things. | |||
// We need multiple scans because debouncing can't be turned off. | |||
matrix_scan(); | |||
wait_ms(10); | |||
matrix_scan(); | |||
// If the Esc and space bar are held down on power up, | |||
// reset the EEPROM valid state and jump to bootloader. | |||
// Assumes Esc is at [0,0] and spacebar is at [4,6]. | |||
// This isn't very generalized, but we need something that doesn't | |||
// rely on user's keymaps in firmware or EEPROM. | |||
if ( ( matrix_get_row(0) & (1<<0) ) && | |||
( matrix_get_row(4) & (1<<6) ) ) | |||
{ | |||
// Set the TMK/QMK EEPROM state as invalid. | |||
eeconfig_disable(); | |||
//eeprom_set_valid(false); | |||
// Jump to bootloader. | |||
bootloader_jump(); | |||
} | |||
} | |||
void matrix_init_kb(void) { | |||
// put your keyboard start-up code here | |||
// runs once when the firmware starts up | |||
bootmagic_lite(); | |||
// Please ignore this is for upcoming features | |||
// If the EEPROM has the magic, the data is good. | |||
// OK to load from EEPROM. | |||
/*if (eeprom_is_valid()) | |||
{ | |||
backlight_config_load(); | |||
// TODO: do something to "turn on" keymaps in EEPROM? | |||
} | |||
else | |||
{ | |||
// If the EEPROM has not been saved before, or is out of date, | |||
// save the default values to the EEPROM. Default values | |||
// come from construction of the zeal_backlight_config instance. | |||
backlight_config_save(); | |||
// Clear the LED colors stored in EEPROM | |||
for ( int row=0; row < MATRIX_ROWS; row++ ) | |||
{ | |||
HSV hsv; | |||
for ( int column=0; column < MATRIX_COLS; column++ ) | |||
{ | |||
hsv.h = rand() & 0xFF; | |||
hsv.s = rand() & 0x7F; | |||
hsv.v = 255; | |||
backlight_set_key_color( row, column, hsv ); | |||
} | |||
} | |||
#ifdef USE_KEYMAPS_IN_EEPROM | |||
keymap_default_save(); | |||
#endif | |||
// Save the magic number last, in case saving was interrupted | |||
eeprom_set_valid(true); | |||
}*/ | |||
matrix_init_user(); | |||
} | |||
void matrix_scan_kb(void) { | |||
matrix_scan_user(); | |||
} | |||
bool process_record_kb(uint16_t keycode, keyrecord_t *record) { | |||
return process_record_user(keycode, record); | |||
} | |||
void led_set_kb(uint8_t usb_led) { | |||
//backlight_set_indicator_state(usb_led); | |||
} |
@ -0,0 +1,67 @@ | |||
/* Copyright 2018 Yiancar | |||
* | |||
* 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 HS60_H | |||
#define HS60_H | |||
#define XXX KC_NO | |||
#include "quantum.h" | |||
// This a shortcut to help you visually see your layout. | |||
#define LAYOUT_60_iso( \ | |||
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, \ | |||
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, K3D, \ | |||
K40, K41, K42, K46, 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, XXX }, \ | |||
{ 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, XXX, K3D }, \ | |||
{ K40, K41, K42, XXX, XXX, XXX, K46, XXX, XXX, XXX, K4A, K4B, K4C, K4D } \ | |||
} | |||
#define LAYOUT_60_ansi( \ | |||
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, K2C, \ | |||
K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2D, \ | |||
K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3D, \ | |||
K40, K41, K42, K46, 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, XXX }, \ | |||
{ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D }, \ | |||
{ K30, XXX, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, XXX, K3D }, \ | |||
{ K40, K41, K42, XXX, XXX, XXX, K46, XXX, XXX, XXX, K4A, K4B, K4C, K4D } \ | |||
} | |||
#define LAYOUT_60_hhkb( \ | |||
K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K1D, \ | |||
K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K2C, \ | |||
K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2D, \ | |||
K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, \ | |||
K40, K41, K42, K46, 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, XXX, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D }, \ | |||
{ K40, K41, K42, XXX, XXX, XXX, K46, XXX, XXX, XXX, XXX, K4B, K4C, K4D } \ | |||
} | |||
#endif |
@ -1,21 +1,4 @@ | |||
USER_NAME := drashna | |||
BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) | |||
MOUSEKEY_ENABLE = no # Mouse keys(+4700) | |||
EXTRAKEY_ENABLE = yes # Audio control and System control(+450) | |||
CONSOLE_ENABLE = no # Console for debug(+400) | |||
COMMAND_ENABLE = no # Commands for debug and configuration | |||
TAP_DANCE_ENABLE = no | |||
RGBLIGHT_ENABLE = yes | |||
AUDIO_ENABLE = yes | |||
NKRO_ENABLE = yes | |||
BACKLIGHT_ENABLE = no | |||
SWAP_HANDS_ENABLE = no | |||
INDICATOR_LIGHTS = yes | |||
MACROS_ENABLED = no | |||
RGBLIGHT_TWINKLE = yes | |||
SRC += ../drashna/keymap.c | |||
BOOTLOADER = qmk-dfu | |||
include $(KEYBOARD_PATH_2)/keymaps/drashna/rules.mk |
@ -0,0 +1,9 @@ | |||
This layout is an attempt to make switching between the Iris and my laptop keyboard as seemless as possible. I switch caps lock and Ctrl/ESC on my laptop and I am able to adjust well with everything else... I still miss the Iris, but I am able to get work done. | |||
I use the following lighting queues to indicate layer changes. | |||
* Momentary toggled layer : LEDs brighten and dim when layer is released. | |||
* Locked layer : LEDs breath. | |||
* Config layer locked : LEDs off. | |||
NOTE you will need to flash both sides to update the brightness_levels so that breathing works on both sides as expected. |
@ -0,0 +1,224 @@ | |||
/* | |||
Copyright 2018 Jeff Shufelt <jshuf@puppyfish.com> @jshuf | |||
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/>. | |||
*/ | |||
#pragma once | |||
#include "config_common.h" | |||
/* USB Device descriptor parameter */ | |||
#define VENDOR_ID 0xFEED | |||
#define PRODUCT_ID 0x0000 | |||
#define DEVICE_VER 0x0001 | |||
#define MANUFACTURER KBDFans | |||
#define PRODUCT kbd19x | |||
#define DESCRIPTION A compact-1800 keyboard kit. | |||
/* key matrix size */ | |||
#define MATRIX_ROWS 8 | |||
#define MATRIX_COLS 13 | |||
/* | |||
* 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 { B7, B3, E6, F0, D5, D4, D6, C7 } | |||
#define MATRIX_COL_PINS { C6, F1, F4, F5, F6, F7, D7, B4, B5, D0, D1, D2, D3 } | |||
#define UNUSED_PINS | |||
/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ | |||
#define DIODE_DIRECTION COL2ROW | |||
#define BACKLIGHT_PIN B6 | |||
// #define BACKLIGHT_BREATHING | |||
#define BACKLIGHT_LEVELS 3 | |||
#define RGB_DI_PIN E2 | |||
#ifdef RGB_DI_PIN | |||
#define RGBLIGHT_ANIMATIONS | |||
#define RGBLED_NUM 18 | |||
#define RGBLIGHT_HUE_STEP 8 | |||
#define RGBLIGHT_SAT_STEP 8 | |||
#define RGBLIGHT_VAL_STEP 8 | |||
#endif | |||
/* 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 | |||
/* If defined, GRAVE_ESC will always act as ESC when CTRL is held. | |||
* This is userful for the Windows task manager shortcut (ctrl+shift+esc). | |||
*/ | |||
// #define GRAVE_ESC_CTRL_OVERRIDE | |||
/* | |||
* 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 | |||
/* | |||
* MIDI options | |||
*/ | |||
/* Prevent use of disabled MIDI features in the keymap */ | |||
//#define MIDI_ENABLE_STRICT 1 | |||
/* enable basic MIDI features: | |||
- MIDI notes can be sent when in Music mode is on | |||
*/ | |||
//#define MIDI_BASIC | |||
/* enable advanced MIDI features: | |||
- MIDI notes can be added to the keymap | |||
- Octave shift and transpose | |||
- Virtual sustain, portamento, and modulation wheel | |||
- etc. | |||
*/ | |||
//#define MIDI_ADVANCED | |||
/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ | |||
//#define MIDI_TONE_KEYCODE_OCTAVES 1 | |||
/* | |||
* HD44780 LCD Display Configuration | |||
*/ | |||
/* | |||
#define LCD_LINES 2 //< number of visible lines of the display | |||
#define LCD_DISP_LENGTH 16 //< visibles characters per line of the display | |||
#define LCD_IO_MODE 1 //< 0: memory mapped mode, 1: IO port mode | |||
#if LCD_IO_MODE | |||
#define LCD_PORT PORTB //< port for the LCD lines | |||
#define LCD_DATA0_PORT LCD_PORT //< port for 4bit data bit 0 | |||
#define LCD_DATA1_PORT LCD_PORT //< port for 4bit data bit 1 | |||
#define LCD_DATA2_PORT LCD_PORT //< port for 4bit data bit 2 | |||
#define LCD_DATA3_PORT LCD_PORT //< port for 4bit data bit 3 | |||
#define LCD_DATA0_PIN 4 //< pin for 4bit data bit 0 | |||
#define LCD_DATA1_PIN 5 //< pin for 4bit data bit 1 | |||
#define LCD_DATA2_PIN 6 //< pin for 4bit data bit 2 | |||
#define LCD_DATA3_PIN 7 //< pin for 4bit data bit 3 | |||
#define LCD_RS_PORT LCD_PORT //< port for RS line | |||
#define LCD_RS_PIN 3 //< pin for RS line | |||
#define LCD_RW_PORT LCD_PORT //< port for RW line | |||
#define LCD_RW_PIN 2 //< pin for RW line | |||
#define LCD_E_PORT LCD_PORT //< port for Enable line | |||
#define LCD_E_PIN 1 //< pin for Enable line | |||
#endif | |||
*/ | |||
@ -0,0 +1,218 @@ | |||
{ | |||
"keyboard_name": "KBD19x", | |||
"url": "https://github.com/qmk/qmk_firmware/tree/master/keyboards/kbd19x", | |||
"maintainer": "qmk", | |||
"width": 19.5, | |||
"height": 6.75, | |||
"layouts": { | |||
"LAYOUT_ansi": { | |||
"key_count": 99, | |||
"layout": [{"label":"Esc", "x":0, "y":0}, | |||
{"label":"F1", "x":1.25, "y":0}, | |||
{"label":"F2", "x":2.25, "y":0}, | |||
{"label":"F3", "x":3.25, "y":0}, | |||
{"label":"F4", "x":4.25, "y":0}, | |||
{"label":"F5", "x":5.5, "y":0}, | |||
{"label":"F6", "x":6.5, "y":0}, | |||
{"label":"F7", "x":7.5, "y":0}, | |||
{"label":"F8", "x":8.5, "y":0}, | |||
{"label":"F9", "x":9.75, "y":0}, | |||
{"label":"F10", "x":10.75, "y":0}, | |||
{"label":"F11", "x":11.75, "y":0}, | |||
{"label":"F12", "x":12.75, "y":0}, | |||
{"label":"BkLgt Step", "x":14, "y":0}, | |||
{"label":"Print Screen", "x":15.5, "y":0}, | |||
{"label":"Scroll Lock", "x":16.5, "y":0}, | |||
{"label":"Pause Break", "x":17.5, "y":0}, | |||
{"label":"PgDn", "x":18.5, "y":0}, | |||
{"label":"~", "x":0, "y":1.5}, | |||
{"label":"!", "x":1, "y":1.5}, | |||
{"label":"@", "x":2, "y":1.5}, | |||
{"label":"#", "x":3, "y":1.5}, | |||
{"label":"$", "x":4, "y":1.5}, | |||
{"label":"%", "x":5, "y":1.5}, | |||
{"label":"^", "x":6, "y":1.5}, | |||
{"label":"&", "x":7, "y":1.5}, | |||
{"label":"*", "x":8, "y":1.5}, | |||
{"label":"(", "x":9, "y":1.5}, | |||
{"label":")", "x":10, "y":1.5}, | |||
{"label":"_", "x":11, "y":1.5}, | |||
{"label":"+", "x":12, "y":1.5}, | |||
{"label":"Backspace", "x":13, "y":1.5, "w":2}, | |||
{"label":"Num Lock", "x":15.5, "y":1.5}, | |||
{"label":"/", "x":16.5, "y":1.5}, | |||
{"label":"*", "x":17.5, "y":1.5}, | |||
{"label":"-", "x":18.5, "y":1.5}, | |||
{"label":"Tab", "x":0, "y":2.5, "w":1.5}, | |||
{"label":"Q", "x":1.5, "y":2.5}, | |||
{"label":"W", "x":2.5, "y":2.5}, | |||
{"label":"E", "x":3.5, "y":2.5}, | |||
{"label":"R", "x":4.5, "y":2.5}, | |||
{"label":"T", "x":5.5, "y":2.5}, | |||
{"label":"Y", "x":6.5, "y":2.5}, | |||
{"label":"U", "x":7.5, "y":2.5}, | |||
{"label":"I", "x":8.5, "y":2.5}, | |||
{"label":"O", "x":9.5, "y":2.5}, | |||
{"label":"P", "x":10.5, "y":2.5}, | |||
{"label":"{", "x":11.5, "y":2.5}, | |||
{"label":"}", "x":12.5, "y":2.5}, | |||
{"label":"|", "x":13.5, "y":2.5, "w":1.5}, | |||
{"label":"7", "x":15.5, "y":2.5}, | |||
{"label":"8", "x":16.5, "y":2.5}, | |||
{"label":"9", "x":17.5, "y":2.5}, | |||
{"label":"+", "x":18.5, "y":2.5, "h":2}, | |||
{"label":"Caps Lock", "x":0, "y":3.5, "w":1.75}, | |||
{"label":"A", "x":1.75, "y":3.5}, | |||
{"label":"S", "x":2.75, "y":3.5}, | |||
{"label":"D", "x":3.75, "y":3.5}, | |||
{"label":"F", "x":4.75, "y":3.5}, | |||
{"label":"G", "x":5.75, "y":3.5}, | |||
{"label":"H", "x":6.75, "y":3.5}, | |||
{"label":"J", "x":7.75, "y":3.5}, | |||
{"label":"K", "x":8.75, "y":3.5}, | |||
{"label":"L", "x":9.75, "y":3.5}, | |||
{"label":":", "x":10.75, "y":3.5}, | |||
{"label":"\"", "x":11.75, "y":3.5}, | |||
{"label":"Enter", "x":12.75, "y":3.5, "w":2.25}, | |||
{"label":"4", "x":15.5, "y":3.5}, | |||
{"label":"5", "x":16.5, "y":3.5}, | |||
{"label":"6", "x":17.5, "y":3.5}, | |||
{"label":"Shift", "x":0, "y":4.5, "w":2.25}, | |||
{"label":"Z", "x":2.25, "y":4.5}, | |||
{"label":"X", "x":3.25, "y":4.5}, | |||
{"label":"C", "x":4.25, "y":4.5}, | |||
{"label":"V", "x":5.25, "y":4.5}, | |||
{"label":"B", "x":6.25, "y":4.5}, | |||
{"label":"N", "x":7.25, "y":4.5}, | |||
{"label":"M", "x":8.25, "y":4.5}, | |||
{"label":"<", "x":9.25, "y":4.5}, | |||
{"label":">", "x":10.25, "y":4.5}, | |||
{"label":"?", "x":11.25, "y":4.5}, | |||
{"label":"Shift", "x":12.25, "y":4.5, "w":1.75}, | |||
{"label":"1", "x":15.5, "y":4.5}, | |||
{"label":"2", "x":16.5, "y":4.5}, | |||
{"label":"3", "x":17.5, "y":4.5}, | |||
{"label":"Enter", "x":18.5, "y":4.5, "h":2}, | |||
{"label":"\u2191", "x":14.25, "y":4.75}, | |||
{"label":"Ctrl", "x":0, "y":5.5, "w":1.25}, | |||
{"label":"Win", "x":1.25, "y":5.5}, | |||
{"label":"Alt", "x":2.25, "y":5.5, "w":1.25}, | |||
{"x":3.5, "y":5.5, "w":6.25}, | |||
{"label":"Alt", "x":9.75, "y":5.5}, | |||
{"label":"MO(1)", "x":10.75, "y":5.5}, | |||
{"label":"Ctrl", "x":11.75, "y":5.5, "w":1.25}, | |||
{"label":"0", "x":16.5, "y":5.5}, | |||
{"label":".", "x":17.5, "y":5.5}, | |||
{"label":"\u2190", "x":13.25, "y":5.75}, | |||
{"label":"\u2193", "x":14.25, "y":5.75}, | |||
{"label":"\u2192", "x":15.25, "y":5.75}] | |||
}, | |||
"LAYOUT_all": { | |||
"key_count": 103, | |||
"layout": [{"label":"Esc", "x":0, "y":0}, | |||
{"label":"F1", "x":1.25, "y":0}, | |||
{"label":"F2", "x":2.25, "y":0}, | |||
{"label":"F3", "x":3.25, "y":0}, | |||
{"label":"F4", "x":4.25, "y":0}, | |||
{"label":"F5", "x":5.5, "y":0}, | |||
{"label":"F6", "x":6.5, "y":0}, | |||
{"label":"F7", "x":7.5, "y":0}, | |||
{"label":"F8", "x":8.5, "y":0}, | |||
{"label":"F9", "x":9.75, "y":0}, | |||
{"label":"F10", "x":10.75, "y":0}, | |||
{"label":"F11", "x":11.75, "y":0}, | |||
{"label":"F12", "x":12.75, "y":0}, | |||
{"label":"BkLgt Step", "x":14, "y":0}, | |||
{"label":"Print Screen", "x":15.5, "y":0}, | |||
{"label":"Scroll Lock", "x":16.5, "y":0}, | |||
{"label":"Pause Break", "x":17.5, "y":0}, | |||
{"label":"PgDn", "x":18.5, "y":0}, | |||
{"label":"~", "x":0, "y":1.5}, | |||
{"label":"!", "x":1, "y":1.5}, | |||
{"label":"@", "x":2, "y":1.5}, | |||
{"label":"#", "x":3, "y":1.5}, | |||
{"label":"$", "x":4, "y":1.5}, | |||
{"label":"%", "x":5, "y":1.5}, | |||
{"label":"^", "x":6, "y":1.5}, | |||
{"label":"&", "x":7, "y":1.5}, | |||
{"label":"*", "x":8, "y":1.5}, | |||
{"label":"(", "x":9, "y":1.5}, | |||
{"label":")", "x":10, "y":1.5}, | |||
{"label":"_", "x":11, "y":1.5}, | |||
{"label":"+", "x":12, "y":1.5}, | |||
{"x":13, "y":1.5}, | |||
{"label":"BS", "x":14, "y":1.5}, | |||
{"label":"Num Lock", "x":15.5, "y":1.5}, | |||
{"label":"/", "x":16.5, "y":1.5}, | |||
{"label":"*", "x":17.5, "y":1.5}, | |||
{"label":"-", "x":18.5, "y":1.5}, | |||
{"label":"Tab", "x":0, "y":2.5, "w":1.5}, | |||
{"label":"Q", "x":1.5, "y":2.5}, | |||
{"label":"W", "x":2.5, "y":2.5}, | |||
{"label":"E", "x":3.5, "y":2.5}, | |||
{"label":"R", "x":4.5, "y":2.5}, | |||
{"label":"T", "x":5.5, "y":2.5}, | |||
{"label":"Y", "x":6.5, "y":2.5}, | |||
{"label":"U", "x":7.5, "y":2.5}, | |||
{"label":"I", "x":8.5, "y":2.5}, | |||
{"label":"O", "x":9.5, "y":2.5}, | |||
{"label":"P", "x":10.5, "y":2.5}, | |||
{"label":"{", "x":11.5, "y":2.5}, | |||
{"label":"}", "x":12.5, "y":2.5}, | |||
{"label":"|", "x":13.5, "y":2.5, "w":1.5}, | |||
{"label":"7", "x":15.5, "y":2.5}, | |||
{"label":"8", "x":16.5, "y":2.5}, | |||
{"label":"9", "x":17.5, "y":2.5}, | |||
{"label":"+", "x":18.5, "y":2.5}, | |||
{"label":"Caps Lock", "x":0, "y":3.5, "w":1.75}, | |||
{"label":"A", "x":1.75, "y":3.5}, | |||
{"label":"S", "x":2.75, "y":3.5}, | |||
{"label":"D", "x":3.75, "y":3.5}, | |||
{"label":"F", "x":4.75, "y":3.5}, | |||
{"label":"G", "x":5.75, "y":3.5}, | |||
{"label":"H", "x":6.75, "y":3.5}, | |||
{"label":"J", "x":7.75, "y":3.5}, | |||
{"label":"K", "x":8.75, "y":3.5}, | |||
{"label":"L", "x":9.75, "y":3.5}, | |||
{"label":":", "x":10.75, "y":3.5}, | |||
{"label":"\"", "x":11.75, "y":3.5}, | |||
{"label":"Enter", "x":12.75, "y":3.5, "w":2.25}, | |||
{"label":"4", "x":15.5, "y":3.5}, | |||
{"label":"5", "x":16.5, "y":3.5}, | |||
{"label":"6", "x":17.5, "y":3.5}, | |||
{"x":18.5, "y":3.5}, | |||
{"label":"Shift", "x":0, "y":4.5, "w":1.25}, | |||
{"x":1.25, "y":4.5}, | |||
{"label":"Z", "x":2.25, "y":4.5}, | |||
{"label":"X", "x":3.25, "y":4.5}, | |||
{"label":"C", "x":4.25, "y":4.5}, | |||
{"label":"V", "x":5.25, "y":4.5}, | |||
{"label":"B", "x":6.25, "y":4.5}, | |||
{"label":"N", "x":7.25, "y":4.5}, | |||
{"label":"M", "x":8.25, "y":4.5}, | |||
{"label":"<", "x":9.25, "y":4.5}, | |||
{"label":">", "x":10.25, "y":4.5}, | |||
{"label":"?", "x":11.25, "y":4.5}, | |||
{"label":"Shift", "x":12.25, "y":4.5, "w":1.75}, | |||
{"label":"1", "x":15.5, "y":4.5}, | |||
{"label":"2", "x":16.5, "y":4.5}, | |||
{"label":"3", "x":17.5, "y":4.5}, | |||
{"label":"Enter", "x":18.5, "y":4.5}, | |||
{"label":"\u2191", "x":14.25, "y":4.75}, | |||
{"label":"Ctrl", "x":0, "y":5.5, "w":1.25}, | |||
{"label":"Win", "x":1.25, "y":5.5}, | |||
{"label":"Alt", "x":2.25, "y":5.5, "w":1.25}, | |||
{"x":3.5, "y":5.5, "w":6.25}, | |||
{"label":"Alt", "x":9.75, "y":5.5}, | |||
{"label":"Menu", "x":10.75, "y":5.5}, | |||
{"label":"Ctrl", "x":11.75, "y":5.5, "w":1.25}, | |||
{"label":"0", "x":16.5, "y":5.5}, | |||
{"label":".", "x":17.5, "y":5.5}, | |||
{"x":18.5, "y":5.5}, | |||
{"label":"\u2190", "x":13.25, "y":5.75}, | |||
{"label":"\u2193", "x":14.25, "y":5.75}, | |||
{"label":"\u2192", "x":15.25, "y":5.75}] | |||
} | |||
} | |||
} | |||
@ -0,0 +1,63 @@ | |||
/* | |||
Copyright 2018 Jeff Shufelt <jshuf@puppyfish.com> @jshuf | |||
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/>. | |||
*/ | |||
#include "kbd19x.h" | |||
void matrix_init_kb(void) { | |||
// put your keyboard start-up code here | |||
// runs once when the firmware starts up | |||
matrix_init_user(); | |||
} | |||
void matrix_scan_kb(void) { | |||
// put your looping keyboard code here | |||
// runs every cycle (a lot) | |||
matrix_scan_user(); | |||
} | |||
bool process_record_kb(uint16_t keycode, keyrecord_t *record) { | |||
// put your per-action keyboard code here | |||
// runs for every action, just before processing by the firmware | |||
return process_record_user(keycode, record); | |||
} | |||
void led_set_kb(uint8_t usb_led) { | |||
// put your keyboard LED indicator (ex: Caps Lock LED) toggling code here | |||
if (usb_led & (1<<USB_LED_NUM_LOCK)) { | |||
kbd19x_nmlk_led_on(); | |||
} else { | |||
kbd19x_nmlk_led_off(); | |||
} | |||
if (usb_led & (1<<USB_LED_CAPS_LOCK)) { | |||
kbd19x_caps_led_on(); | |||
} else { | |||
kbd19x_caps_led_off(); | |||
} | |||
if (usb_led & (1<<USB_LED_SCROLL_LOCK)) { | |||
kbd19x_sclk_led_on(); | |||
} else { | |||
kbd19x_sclk_led_off(); | |||
} | |||
led_set_user(usb_led); | |||
} |
@ -0,0 +1,103 @@ | |||
/* | |||
Copyright 2018 Jeff Shufelt <jshuf@puppyfish.com> @jshuf | |||
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 KBD19X_H | |||
#define KBD19X_H | |||
#include "quantum.h" | |||
#include "led.h" | |||
inline void kbd19x_caps_led_on(void) { DDRB |= (1<<0); PORTB &= ~(1<<0); } | |||
inline void kbd19x_caps_led_off(void) { DDRB &= ~(1<<0); PORTB &= ~(1<<0); } | |||
inline void kbd19x_sclk_led_on(void) { DDRB |= (1<<1); PORTB &= ~(1<<1); } | |||
inline void kbd19x_sclk_led_off(void) { DDRB &= ~(1<<1); PORTB &= ~(1<<1); } | |||
inline void kbd19x_nmlk_led_on(void) { DDRB |= (1<<2); PORTB &= ~(1<<2); } | |||
inline void kbd19x_nmlk_led_off(void) { DDRB &= ~(1<<2); PORTB &= ~(1<<2); } | |||
// readability | |||
#define XXX KC_NO | |||
/* This is a shortcut to help you visually see your layout. | |||
* | |||
* The first section contains all of the arguments representing the physical | |||
* layout of the board and position of the keys. | |||
* | |||
* The second converts the arguments into a two-dimensional array which | |||
* represents the switch matrix. | |||
*/ | |||
// 2u backspace: XXX, k1e | |||
// split backspace: k1d, k1e | |||
// 2u numpad +: k2i, XXX | |||
// split numpad +: k2i, k3i | |||
// 2u numpad enter: k4i, XXX | |||
// split numpad enter: k4i, k5i | |||
// 2.25u lshift: k40, XXX | |||
// split (1.25u, 1u) lshift: k40, k41 | |||
// ANSI enter or ISO enter: k3e | |||
// backslash or NUHS: k2e | |||
// left winkey: k50, k51, k52 | |||
// left WKL: k50, XXX, k52 | |||
// right winkey: k59, k5a, k5b | |||
// right WKL: k59, XXX, k5b | |||
#define LAYOUT_all( \ | |||
k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0e, k0f, k0g, k0h, k0i, \ | |||
k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1e, k1f, k1g, k1h, k1i, \ | |||
k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2e, k2f, k2g, k2h, k2i, \ | |||
k30, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, k3e, k3f, k3g, k3h, k3i, \ | |||
k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, k4b, k4c, k4e, k4f, k4g, k4h, k4i, \ | |||
k50, k51, k52, k56, k59, k5a, k5b, k5d, k5e, k5f, k5g, k5h, k5i \ | |||
)\ | |||
{\ | |||
{k00, k01, k02, k03, k04, k09, k0a, k0b, k0c, k0f, k0g, k0h, k0i},\ | |||
{k10, k11, k12, k13, k14, k19, k1a, k1b, k1c, k1f, k1g, k1h, k1i},\ | |||
{k20, k21, k22, k23, k24, k29, k2a, k2b, k2c, k2f, k2g, k2h, k2i},\ | |||
{k30, k32, k33, k34, k35, k3a, k3b, k3c, k3e, k3f, k3g, k3h, k3i},\ | |||
{k40, k41, k42, k43, k44, k49, k4a, k4b, k4c, k4f, k4g, k4h, k4i},\ | |||
{k50, k51, k52, k5e, k5f, k59, k5a, k5b, k5d, k56, k5g, k5h, k5i},\ | |||
{k05, k06, k07, k08, k15, k16, k17, k18, k25, k26, k27, k28, k36},\ | |||
{k1d, k1e, k0e, k2e, k4e, k37, k38, k39, k45, k46, k47, k48, XXX},\ | |||
} | |||
#define LAYOUT_ansi( \ | |||
k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0e, k0f, k0g, k0h, k0i, \ | |||
k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1e, k1f, k1g, k1h, k1i, \ | |||
k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2e, k2f, k2g, k2h, k2i, \ | |||
k30, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, k3e, k3f, k3g, k3h, \ | |||
k40, k42, k43, k44, k45, k46, k47, k48, k49, k4a, k4b, k4c, k4e, k4f, k4g, k4h, k4i, \ | |||
k50, k51, k52, k56, k59, k5a, k5b, k5d, k5e, k5f, k5g, k5h \ | |||
)\ | |||
{\ | |||
{k00, k01, k02, k03, k04, k09, k0a, k0b, k0c, k0f, k0g, k0h, k0i},\ | |||
{k10, k11, k12, k13, k14, k19, k1a, k1b, k1c, k1f, k1g, k1h, k1i},\ | |||
{k20, k21, k22, k23, k24, k29, k2a, k2b, k2c, k2f, k2g, k2h, k2i},\ | |||
{k30, k32, k33, k34, k35, k3a, k3b, k3c, k3e, k3f, k3g, k3h, XXX},\ | |||
{k40, XXX, k42, k43, k44, k49, k4a, k4b, k4c, k4f, k4g, k4h, k4i},\ | |||
{k50, k51, k52, k5e, k5f, k59, k5a, k5b, k5d, k56, k5g, k5h, XXX},\ | |||
{k05, k06, k07, k08, k15, k16, k17, k18, k25, k26, k27, k28, k36},\ | |||
{XXX, k1e, k0e, k2e, k4e, k37, k38, k39, k45, k46, k47, k48, XXX},\ | |||
} | |||
#endif |
@ -0,0 +1,20 @@ | |||
/* | |||
Copyright 2018 Jeff Shufelt <jshuf@puppyfish.com> @jshuf | |||
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/>. | |||
*/ | |||
#pragma once | |||
// place overrides here |
@ -0,0 +1,52 @@ | |||
/* | |||
Copyright 2018 Jeff Shufelt <jshuf@puppyfish.com> @jshuf | |||
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/>. | |||
*/ | |||
#include QMK_KEYBOARD_H | |||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | |||
[0] = LAYOUT_ansi( /* Base */ | |||
KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, BL_STEP, KC_PSCR, KC_SLCK, KC_PAUS, KC_PGDN, \ | |||
KC_GRV, 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_NLCK, KC_PSLS, KC_PAST, KC_PMNS, \ | |||
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, KC_P7, KC_P8, KC_P9, KC_PPLS, \ | |||
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_P4, KC_P5, KC_P6, \ | |||
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT, \ | |||
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT \ | |||
), | |||
[1] = LAYOUT_ansi( /* Func */ | |||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_TOG, _______, _______, _______, _______, \ | |||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RESET, _______, _______, _______, _______, \ | |||
_______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ | |||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ | |||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ | |||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ | |||
), | |||
}; | |||
bool process_record_user(uint16_t keycode, keyrecord_t *record) { | |||
return true; | |||
} | |||
void matrix_init_user(void) { | |||
} | |||
void matrix_scan_user(void) { | |||
} | |||
void led_set_user(uint8_t usb_led) { | |||
} |
@ -0,0 +1,13 @@ | |||
# Default KBD19x Layout | |||
This is the default KBD19x layout, consisting of the base layer and the function layer. Backlighting and RGB controls are accessible on the function layer. | |||
**Base layer** | |||
![kbd19x default base layer](https://i.imgur.com/XhT980a.png) | |||
**Function layer** | |||
![kbd19x default function layer](https://i.imgur.com/3w3PXN2.png) | |||
@ -0,0 +1,19 @@ | |||
# kbd19x | |||
![kbd19x](https://i.imgur.com/0hWTEnh.jpg) | |||
**Layout possibilities for the KBD19x** | |||
![kbd19x](https://i.imgur.com/pVaR2zY.png) | |||
The KBD19x is a compact-1800 keyboard kit produced by KBDfans, offering a number of layout options. | |||
Keyboard Maintainer: [jshuf](https://github.com/jshuf) | |||
Hardware Supported: KBD19x PCB | |||
Hardware Availability: [KBDfans](https://kbdfans.cn) | |||
Make example for this keyboard (after setting up your build environment): | |||
make kbd19x:default | |||
See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). |
@ -0,0 +1,80 @@ | |||
# 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 | |||
# Bootloader selection | |||
# Teensy halfkay | |||
# Pro Micro caterina | |||
# Atmel DFU atmel-dfu | |||
# LUFA DFU lufa-dfu | |||
# QMK DFU qmk-dfu | |||
# atmega32a bootloadHID | |||
BOOTLOADER = atmel-dfu | |||
# If you don't know the bootloader type, then you can specify the | |||
# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line | |||
# Teensy halfKay 512 | |||
# Teensy++ halfKay 1024 | |||
# Atmel DFU loader 4096 | |||
# LUFA bootloader 4096 | |||
# USBaspLoader 2048 | |||
# OPT_DEFS += -DBOOTLOADER_SIZE=4096 | |||
# Build Options | |||
# change yes to no to disable | |||
# | |||
BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) | |||
MOUSEKEY_ENABLE = no # Mouse keys(+4700) | |||
EXTRAKEY_ENABLE = yes # Audio control and System control(+450) | |||
CONSOLE_ENABLE = no # Console for debug(+400) | |||
COMMAND_ENABLE = no # 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 = yes # Enable keyboard backlight functionality on B7 by default | |||
RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow | |||
MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config) | |||
UNICODE_ENABLE = no # Unicode | |||
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID | |||
AUDIO_ENABLE = no # Audio output on port C6 | |||
FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches | |||
HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) |
@ -0,0 +1,22 @@ | |||
/* | |||
This is the c configuration file for the keymap | |||
Copyright 2012 Jun Wako <wakojun@gmail.com> | |||
Copyright 2015 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/>. | |||
*/ | |||
#pragma once | |||
#define MASTER_LEFT |
@ -0,0 +1,41 @@ | |||
#include QMK_KEYBOARD_H | |||
#define _QW 0 | |||
#define _RS 1 | |||
#define _LW 2 | |||
/* | |||
* q w e r t || y u i o p | |||
* a s d f g || h j k l ; | |||
* z x c v b || n m , . / | |||
* esc tab gui shift bksp ctrl || alt space raise - ' enter | |||
*/ | |||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | |||
[_QW] = LAYOUT_ortho_4x12( /* Qwerty */ | |||
KC_Q, KC_W, KC_E, KC_R, KC_T, KC_NO, KC_NO, KC_Y, KC_U, KC_I, KC_O, KC_P, | |||
KC_A, KC_S, KC_D, KC_F, KC_G, KC_NO, KC_NO, KC_H, KC_J, KC_K, KC_L, KC_SCLN , | |||
KC_Z, KC_X, KC_C, KC_V, KC_B, KC_NO, KC_NO, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH , | |||
KC_ESC, KC_TAB, KC_LGUI, KC_LSFT, KC_BSPC, KC_LCTL, KC_LALT, KC_SPC, MO(_RS), KC_MINS, KC_QUOT, KC_ENT ), | |||
/* | |||
* ! @ up { } || pgup 7 8 9 * | |||
* # left down right $ || pgdn 4 5 6 + | |||
* [ ] ( ) & || ` 1 2 3 \ | |||
* lower insert super shift bksp ctrl || alt space fn . 0 = | |||
*/ | |||
[_RS] = LAYOUT_ortho_4x12( /* [> RAISE <] */ | |||
KC_EXLM, KC_AT, KC_UP, KC_LCBR, KC_RCBR, KC_NO, KC_NO, KC_PGUP, KC_7, KC_8, KC_9, KC_ASTR , | |||
KC_HASH, KC_LEFT, KC_DOWN, KC_RGHT, KC_DLR, KC_NO, KC_NO, KC_PGDN, KC_4, KC_5, KC_6, KC_PLUS , | |||
KC_LBRC, KC_RBRC, KC_LPRN, KC_RPRN, KC_AMPR, KC_NO, KC_NO, KC_GRV, KC_1, KC_2, KC_3, KC_BSLS , | |||
TG(_LW), KC_INS, KC_LGUI, KC_LSFT, KC_BSPC, KC_LCTL, KC_LALT, KC_SPC, KC_TRNS, KC_DOT, KC_0, KC_EQL ), | |||
/* | |||
* insert home up end pgup || up F7 F8 F9 F10 | |||
* del left down right pgdn || down F4 F5 F6 F11 | |||
* volup reset || F1 F2 F3 F12 | |||
* voldn super shift bksp ctrl || alt space L0 prtsc scroll pause | |||
*/ | |||
[_LW] = LAYOUT_ortho_4x12( /* [> LOWER <] */ | |||
KC_INS, KC_HOME, KC_UP, KC_END, KC_PGUP, KC_NO, KC_NO, KC_UP, KC_F7, KC_F8, KC_F9, KC_F10 , | |||
KC_DELT, KC_LEFT, KC_DOWN, KC_RGHT, KC_DOWN, KC_NO, KC_NO, KC_DOWN, KC_F4, KC_F5, KC_F6, KC_F11 , | |||
KC_NO, KC_VOLU, KC_NO, KC_NO, RESET, KC_NO, KC_NO, KC_NO, KC_F1, KC_F2, KC_F3, KC_F12 , | |||
KC_NO, KC_VOLD, KC_LGUI, KC_LSFT, KC_BSPC, KC_LCTL, KC_LALT, KC_SPC, TO(_QW), KC_PSCR, KC_SLCK, KC_PAUS ) | |||
}; |
@ -0,0 +1,8 @@ | |||
# Atreus layout port | |||
Port the default Atreus layout to the Levinson/Let's Split. | |||
The purpose is to try out the layout to get a sense of what works in it. | |||
The 'extra' keys on the Levinson are dead in this version, to make a | |||
more faithful emulation of the atreus layout. |
@ -0,0 +1,29 @@ | |||
/* | |||
This is the c configuration file for the keymap | |||
Copyright 2012 Jun Wako <wakojun@gmail.com> | |||
Copyright 2015 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/>. | |||
*/ | |||
#pragma once | |||
/* Select hand configuration */ | |||
#define MASTER_LEFT | |||
/* Tap Dance timing */ | |||
#define TAPPING_TERM 150 | |||
/* Toggling layer requires # taps */ | |||
#define TAPPING_TOGGLE 2 |
@ -0,0 +1,215 @@ | |||
#include QMK_KEYBOARD_H | |||
extern keymap_config_t keymap_config; | |||
// Each layer gets a name for readability, which is then used in the keymap matrix below. | |||
// The underscores don't mean anything - you can have a layer called STUFF or any other name. | |||
// Layer names don't all need to be of the same length, obviously, and you can also skip them | |||
// entirely and just use numbers. | |||
#define _QWERTY 0 | |||
#define _LOWER 3 /* Symbols, Media */ | |||
#define _RAISE 4 /* Numbers, Arrows */ | |||
#define _FUNC 5 /* Function Keys */ | |||
#define _NUMS 6 /* Numpad */ | |||
#define _ADJUST 16 | |||
enum custom_keycodes { | |||
QWERTY = SAFE_RANGE, | |||
LOWER, | |||
RAISE, | |||
ADJUST, | |||
}; | |||
// Fillers to make layering more clear | |||
#define KC_ KC_TRNS | |||
// tap toggle numpad on | |||
#define NUMPAD TT(_NUMS) | |||
// Mod Tap Definitions | |||
// ------------------- | |||
// Tap Hold | |||
// ------------------ | |||
#define CTL_ESC MT(MOD_LCTL, KC_ESC) // Esc Left Control | |||
#define SFT_ENT MT(MOD_RSFT, KC_ENT) // Enter Right Shift | |||
#define CTL_SPC MT(MOD_LCTL, KC_SPC) // Space Left Control | |||
#define ALT_SPC MT(MOD_LALT, KC_SPC) // Space Left Alt | |||
#define ALT_BSP MT(MOD_LALT, KC_BSPC) // Bkspace Left Alt | |||
#define HPR_TAB MT(MOD_HYPR, KC_TAB) // Tab Hyper (Super+Ctrl+Alt+Shift) | |||
#define HPR_GRV MT(MOD_HYPR, KC_GRV) // ` Hyper | |||
#define HPR_TIL MT(MOD_HYPR, KC_TILD) // ~ Hyper | |||
#define MEH_TIL MT(MOD_MEH, KC_GRV) // ` Meh (Ctrl+Alt+Shift) | |||
#define SFT_MIN MT(MOD_LSFT, KC_MINS) // - Left Shift | |||
#define NPD_UND LT(_NUMS, KC_UNDS) // _ Layer Numpad | |||
#define FNC_PIP LT(_FUNC, KC_PIPE) // | Layer Function Keys | |||
#define CTL_DEL MT(MOD_LCTL, KC_DEL) // Del Left Control | |||
#define CTL_QOT MT(MOD_RCTL, KC_QUOT) // ' Right Control | |||
#define CTL_BSL MT(MOD_RCTL, KC_BSLS) // \ Right Control | |||
#define CTL_PIP MT(MOD_RCTL, KC_PIPE) // | Right Control | |||
// Redefine for LAYOUT_kc | |||
#define KC_CTL_BSL CTL_BSL | |||
#define KC_CTL_PIP CTL_PIP | |||
#define KC_CTL_DEL CTL_DEL | |||
#define KC_HPR_TIL HPR_TIL | |||
#define KC_HPR_GRV HPR_GRV | |||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | |||
/* Qwerty | |||
* | |||
* ,-----------------------------------------. ,-----------------------------------------. | |||
* | Tab | Q | W | E | R | T | | Y | U | I | O | P | Bksp | | |||
* |------+------+------+------+------+------| |------+------+------+------+------+------| | |||
* | Esc | A | S | D | F | G | | H | J | K | L | ; | ' | | |||
* |------+------+------+------+------+------| |------+------+------+------+------+------| | |||
* | - | Z | X | C | V | B | | N | M | , | . | / | Enter| | |||
* |------+------+------+------+------+------| |------+------+------+------+------+------| | |||
* | Numpd| Meh | Meta | Alt | Lower| Space| | Space| Raise| Alt | Meta | Hyper| Func | | |||
* `-----------------------------------------' `-----------------------------------------' | |||
* | |||
* with Hold (Emacs-oriented) | |||
* ,-----------------------------------------. ,-----------------------------------------. | |||
* | Hyper| | | | | | | | | | | | | | |||
* |------+------+------+------+------+------| |------+------+------+------+------+------| | |||
* | Ctrl | | | | | | | | | | | | Ctrl | | |||
* |------+------+------+------+------+------| |------+------+------+------+------+------| | |||
* | Shift| | | | | | | | | | | | Shift| | |||
* |------+------+------+------+------+------| |------+------+------+------+------+------| | |||
* | | | | | | | | | | | | | | | |||
* `-----------------------------------------' `-----------------------------------------' | |||
*/ | |||
[_QWERTY] = LAYOUT_ortho_4x12( | |||
HPR_TAB, KC_Q , KC_W , KC_E , KC_R , KC_T , KC_Y , KC_U , KC_I , KC_O , KC_P , KC_BSPC, | |||
CTL_ESC, KC_A , KC_S , KC_D , KC_F , KC_G , KC_H , KC_J , KC_K , KC_L , KC_SCLN, CTL_QOT, | |||
SFT_MIN, KC_Z , KC_X , KC_C , KC_V , KC_B , KC_N , KC_M , KC_COMM, KC_DOT , KC_SLSH, SFT_ENT, | |||
NUMPAD , KC_MEH , KC_LGUI, KC_LALT, LOWER, CTL_SPC, KC_SPC, RAISE, KC_RALT, KC_RGUI, KC_HYPR, MO(_FUNC) | |||
), | |||
/* Raise | |||
* ,-----------------------------------------. ,-----------------------------------------. | |||
* | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | | | |||
* |------+------+------+------+------+------| |------+------+------+------+------+------| | |||
* | | Left | Up | Down | Right| ( | | ) | - | = | [ | ] | | | | |||
* |------+------+------+------+------+------| |------+------+------+------+------+------| | |||
* | | ; | ' | * | , | { | | } | _ | + | . | / | | | |||
* |------+------+------+------+------+------| |------+------+------+------+------+------| | |||
* | | | | | | | | | | | | | | | |||
* `-----------------------------------------' `-----------------------------------------' | |||
*/ | |||
[_RAISE] = LAYOUT_kc_ortho_4x12( | |||
HPR_GRV, 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 , , | |||
,LEFT, UP ,DOWN,RGHT,LPRN, RPRN,MINS, EQL,LBRC,RBRC,CTL_PIP, | |||
,COLN,QUOT,ASTR,COMM,LCBR, RCBR,UNDS,PLUS, , , , | |||
, , , , , , , , , , , | |||
), | |||
/* Lower | |||
* ,-----------------------------------------. ,-----------------------------------------. | |||
* | ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | | | |||
* |------+------+------+------+------+------| |------+------+------+------+------+------| | |||
* | Del | Vol+ | Mute | Play | PgUp | : | | ' | - | = | [ | ] | \ | | |||
* |------+------+------+------+------+------| |------+------+------+------+------+------| | |||
* | | Vol- | < M | M > | PgDn | ; | | " | | | , | . | / | | | |||
* |------+------+------+------+------+------| |------+------+------+------+------+------| | |||
* | | | | | | | | | | | | | | | |||
* `-----------------------------------------' `-----------------------------------------' | |||
*/ | |||
[_LOWER] = LAYOUT_kc_ortho_4x12( | |||
HPR_TIL,EXLM, AT ,HASH,DLR , PERC , CIRC,AMPR,ASTR,LPRN,RPRN, , | |||
CTL_DEL,VOLU,MUTE,MPLY,PGUP, COLN , QUOT,MINS, EQL,LBRC,RBRC,CTL_BSL, | |||
,VOLD,MPRV,MNXT,PGDN, SCLN , DQUO,PIPE,COMM, DOT,SLSH, , | |||
, , , , , , , , , , , | |||
), | |||
[_FUNC] = LAYOUT_kc_ortho_4x12( | |||
// ,----+----+----+----+----+----. ,----+----+----+----+----+----. | |||
, F1 , F2 , F3 , F4 , F5 , F6 , F7 , F8 , F9 , F10, , | |||
// |----+----+----+----+----+----| |----+----+----+----+----+----| | |||
, F11, F12, F13, F14, F15, F16, F17, F18, F19, F20, , | |||
// |----+----+----+----+----+----| |----+----+----+----+----+----| | |||
, F21, F22, F23, F24, NO , NO , NO , NO , NO , NO , , | |||
// |----+----+----+----+----+----| |----+----+----+----+----+----| | |||
, , , , , , , , , , , | |||
// `----+----+----+----+----+----' `----+----+----+----+----+----' | |||
), | |||
[_NUMS] = LAYOUT_kc_ortho_4x12( | |||
// ,----+----+----+----+----+----. ,----+----+----+----+----+----. | |||
, 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ,SLSH, , | |||
// |----+----+----+----+----+----| |----+----+----+----+----+----| | |||
,CAPS, INS,HOME,PGUP,LPRN, RPRN, 4 , 5 , 6 ,ASTR, , | |||
// |----+----+----+----+----+----| |----+----+----+----+----+----| | |||
,NLCK, DEL, END,PGDN,SCLN, COMM, 1 , 2 , 3 ,MINS, , | |||
// |----+----+----+----+----+----| |----+----+----+----+----+----| | |||
, , , , , , , 0 ,DOT ,EQL ,PLUS, | |||
// `----+----+----+----+----+----' `----+----+----+----+----+----' | |||
), | |||
[_ADJUST] = LAYOUT_ortho_4x12( | |||
// ,-------+--------+--------+--------+--------+--------. ,-------+--------+--------+--------+--------+--------. | |||
RESET , XXXXXXX, KC_UP , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_DEL , \ | |||
// |-------+--------+--------+--------+--------+--------| |-------+--------+--------+--------+--------+--------| | |||
_______, KC_LEFT, KC_DOWN, KC_RGHT, XXXXXXX, XXXXXXX, BL_TOGG, BL_STEP, XXXXXXX, XXXXXXX, XXXXXXX, _______, \ | |||
// |-------+--------+--------+--------+--------+--------| |-------+--------+--------+--------+--------+--------| | |||
_______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, \ | |||
// |-------+--------+--------+--------+--------+--------| |-------+--------+--------+--------+--------+--------| | |||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ | |||
// `-------+--------+--------+--------+--------+--------' `-------+--------+--------+--------+--------+--------, | |||
) | |||
/* | |||
* ,-----------------------------------------. ,-----------------------------------------. | |||
* | | | | | | | | | | | | | | | |||
* |------+------+------+------+------+------| |------+------+------+------+------+------| | |||
* | | | | | | | | | | | | | | | |||
* |------+------+------+------+------+------| |------+------+------+------+------+------| | |||
* | | | | | | | | | | | | | | | |||
* |------+------+------+------+------+------| |------+------+------+------+------+------| | |||
* | | | | | | | | | | | | | | | |||
* `-----------------------------------------' `-----------------------------------------' | |||
*/ | |||
}; | |||
bool process_record_user(uint16_t keycode, keyrecord_t *record) { | |||
switch (keycode) { | |||
case QWERTY: | |||
if (record->event.pressed) { | |||
set_single_persistent_default_layer(_QWERTY); | |||
} | |||
return false; | |||
break; | |||
case LOWER: | |||
if (record->event.pressed) { | |||
layer_on(_LOWER); | |||
update_tri_layer(_LOWER, _RAISE, _ADJUST); | |||
} else { | |||
layer_off(_LOWER); | |||
update_tri_layer(_LOWER, _RAISE, _ADJUST); | |||
} | |||
return false; | |||
break; | |||
case RAISE: | |||
if (record->event.pressed) { | |||
layer_on(_RAISE); | |||
update_tri_layer(_LOWER, _RAISE, _ADJUST); | |||
} else { | |||
layer_off(_RAISE); | |||
update_tri_layer(_LOWER, _RAISE, _ADJUST); | |||
} | |||
return false; | |||
break; | |||
case ADJUST: | |||
if (record->event.pressed) { | |||
layer_on(_ADJUST); | |||
} else { | |||
layer_off(_ADJUST); | |||
} | |||
return false; | |||
break; | |||
} | |||
return true; | |||
} |
@ -0,0 +1,32 @@ | |||
# jyh's levinson layout | |||
[Levinson](https://keeb.io/products/levinson-lets-split-w-led-backlight) | |||
built on rev2 PCBs. A split 4x12 keyboard with LED backlights. | |||
The layout is oriented towards needs for programming, Emacs, XMonad, | |||
and experience with 60% keyboards with no base layer arrow keys | |||
(Poker). It makes heavy use of modifiers and layers. | |||
## Layout features | |||
* Extensive use of _Mod Tap_, e.g. | |||
* Tap sends Esc, Hold sends Left Control | |||
* Tap sends Enter, Hold sends Right Shift | |||
* ... and many more | |||
* Hyper and Meh keys | |||
* Right modifier keys in place of arrow keys | |||
* Arrows are instead available in two alternate locations: | |||
* WASD arrows on _Adjust_ | |||
* Arrow cluster on _Raise_ (inspired by hexwire) | |||
* Centered symbol/bracket cluster on _Lower/Raise_ | |||
* Inspired by hexwire layout | |||
* Programming-oriented | |||
* Spacebar sends modifier keys on hold (_this is finicky in practice. may shut off completely_) | |||
* Control ~~and Alt/Meta~~ on left ~~and right~~ space, respectively | |||
* Strict space available on _Function_ and _Numpad_ layers | |||
* For Emacs keychords | |||
* Extra dedicated layers | |||
* Numpad (available with tap toggle) | |||
* Function key (F01-24) | |||
* Redunant keys where it is convenient to have characters together | |||
on one layer |
@ -0,0 +1 @@ | |||
BACKLIGHT_ENABLE=yes |
@ -0,0 +1,33 @@ | |||
/* | |||
This is the c configuration file for the keymap | |||
Copyright 2012 Jun Wako <wakojun@gmail.com> | |||
Copyright 2015 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/>. | |||
*/ | |||
#pragma once | |||
/* Select hand configuration */ | |||
#define MASTER_LEFT | |||
/* Tap Dance timing */ | |||
#define TAPPING_TERM 150 | |||
/* Toggling layer requires # taps */ | |||
#define TAPPING_TOGGLE 3 | |||
#define RGBLIGHT_ANIMATIONS | |||
#define RGBLED_NUM 12 | |||
@ -0,0 +1,222 @@ | |||
#include QMK_KEYBOARD_H | |||
extern keymap_config_t keymap_config; | |||
// Each layer gets a name for readability, which is then used in the keymap matrix below. | |||
// The underscores don't mean anything - you can have a layer called STUFF or any other name. | |||
// Layer names don't all need to be of the same length, obviously, and you can also skip them | |||
// entirely and just use numbers. | |||
#define _QWERTY 0 | |||
#define _LOWER 3 /* Symbols, Media */ | |||
#define _RAISE 4 /* Numbers, Arrows */ | |||
#define _FUNC 5 /* Function Keys */ | |||
#define _NUMS 6 /* Numpad */ | |||
#define _ADJUST 16 | |||
/* short layer aliases */ | |||
#define _QW _QWERTY | |||
#define _LW _LOWER | |||
#define _RS _RAISE | |||
#define _NM _NUMS | |||
#define _AD _ADJUST | |||
enum custom_keycodes { | |||
QWERTY = SAFE_RANGE, | |||
LOWER, | |||
RAISE, | |||
ADJUST, | |||
MKITPNK, | |||
DYNAMIC_MACRO_RANGE | |||
}; | |||
#include "dynamic_macro.h" | |||
#define DREC_1 DYN_REC_START1 | |||
#define DREC_2 DYN_REC_START2 | |||
#define DPLAY_1 DYN_MACRO_PLAY1 | |||
#define DPLAY_2 DYN_MACRO_PLAY2 | |||
#define DSTOP DYN_REC_STOP | |||
// Mod Tap Definitions | |||
// ------------------- | |||
// Tap Hold | |||
// ------------------ | |||
#define GUI_GRV MT(MOD_LGUI, KC_GRV) // ` Meta | |||
#define CTL_ESC MT(MOD_LCTL, KC_ESC) // Esc Left Control | |||
#define SFT_MIN MT(MOD_LSFT, KC_MINS) // - Left Shift | |||
#define MEH_LBC MT(MOD_MEH, KC_LBRC) // [ Meh | |||
#define CTL_BSP MT(MOD_LCTL, KC_BSPC) // Bkspce Left Control | |||
#define HPR_RBC MT(MOD_HYPR, KC_RBRC) // ] Hyper | |||
#define SFT_EQL MT(MOD_RSFT, KC_EQL) // = Right Shift | |||
#define GUI_BSL MT(MOD_RGUI, KC_BSLS) // \ Meta | |||
#define NUM_TAB LT(_NUMS, KC_TAB) // Tab Layer Numpad | |||
#define CTL_DEL MT(MOD_LCTL, KC_DEL) // Del Left Control | |||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | |||
/* Qwerty | |||
* ,-----------------------------------------. ,-----------------------------------------. | |||
* | ` | Q | W | E | R | T | | Y | U | I | O | P | \ | | |||
* |------+------+------+------+------+------| |------+------+------+------+------+------| | |||
* | Esc | A | S | D | F | G | | H | J | K | L | ; | ' | | |||
* |------+------+------+------+------+------| |------+------+------+------+------+------| | |||
* | - | Z | X | C | V | B | | N | M | , | . | / | = | | |||
* |------+------+------+------+------+------| |------+------+------+------+------+------| | |||
* | Tab | [ | Meta | Alt | Lower| Bksp | | Space| Raise| Alt | Meta | ] | Enter| | |||
* `-----------------------------------------' `-----------------------------------------' | |||
* with Hold (Emacs-oriented) | |||
* ,-----------------------------------------. ,-----------------------------------------. | |||
* | Meta | | | | | | | | | | | | Meta | | |||
* |------+------+------+------+------+------| |------+------+------+------+------+------| | |||
* | Ctrl | | | | | | | | | | | | | | |||
* |------+------+------+------+------+------| |------+------+------+------+------+------| | |||
* | Shift| | | | | | | | | | | | Shift| | |||
* |------+------+------+------+------+------| |------+------+------+------+------+------| | |||
* | Numpd| Meh | | | | Ctrl | | | | | | Hyper| | | |||
* `-----------------------------------------' `-----------------------------------------' | |||
*/ | |||
[_QW] = LAYOUT_ortho_4x12( | |||
GUI_GRV, KC_Q , KC_W , KC_E , KC_R , KC_T , KC_Y , KC_U , KC_I , KC_O , KC_P , GUI_BSL, | |||
CTL_ESC, KC_A , KC_S , KC_D , KC_F , KC_G , KC_H , KC_J , KC_K , KC_L , KC_SCLN, KC_QUOT, | |||
SFT_MIN, KC_Z , KC_X , KC_C , KC_V , KC_B , KC_N , KC_M , KC_COMM, KC_DOT , KC_SLSH, SFT_EQL, | |||
NUM_TAB, MEH_LBC, KC_LGUI, KC_LALT, LOWER , CTL_BSP, KC_SPC , RAISE , KC_RALT, KC_RGUI, HPR_RBC, KC_ENT | |||
), | |||
/* Raise | |||
* ,-----------------------------------------. ,-----------------------------------------. | |||
* | | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | | | |||
* |------+------+------+------+------+------| |------+------+------+------+------+------| | |||
* | | Left | Up | Down | Right| ; | | ' | 4 | 5 | 6 | * | | | |||
* |------+------+------+------+------+------| |------+------+------+------+------+------| | |||
* | | { | } | ( | ) | , | | - | 1 | 2 | 3 | / | = | | |||
* |------+------+------+------+------+------| |------+------+------+------+------+------| | |||
* | | | | |Adjust| | | | RAISE| . | 0 | + | Enter| | |||
* `-----------------------------------------' `-----------------------------------------' | |||
*/ | |||
[_RS] = LAYOUT_ortho_4x12( | |||
_______, KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , _______, | |||
_______, KC_LEFT, KC_UP , KC_DOWN, KC_RGHT, KC_SCLN, KC_QUOT, KC_4 , KC_5 , KC_6 , KC_ASTR, _______, | |||
_______, KC_LCBR, KC_RCBR, KC_LPRN, KC_RPRN, KC_COMM, KC_MINS, KC_1 , KC_2 , KC_3 , KC_SLSH, _______, | |||
_______, _______, _______, _______, _______, _______, _______, _______, KC_DOT , KC_0 , KC_PLUS, _______ | |||
), | |||
/* Lower | |||
* ,-----------------------------------------. ,-----------------------------------------. | |||
* | ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | | | |||
* |------+------+------+------+------+------| |------+------+------+------+------+------| | |||
* | Del | Vol+ | Mute | Play | PgUp | Home | | F1 | F2 | F3 | F4 | F5 | F6 | | |||
* |------+------+------+------+------+------| |------+------+------+------+------+------| | |||
* | | Vol- | < M | M > | PgDn | End | | F7 | F8 | F9 | F10 | F11 | F12 | | |||
* |------+------+------+------+------+------| |------+------+------+------+------+------| | |||
* | | | | |LOWER | | | |Adjust| | | | Enter| | |||
* `-----------------------------------------' `-----------------------------------------' | |||
*/ | |||
[_LW] = LAYOUT_ortho_4x12( | |||
_______, KC_EXLM, KC_AT , KC_HASH, KC_DLR , KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, _______, | |||
CTL_DEL, KC_VOLU, KC_MUTE, KC_MPLY, KC_PGUP, KC_HOME, KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_F5 , KC_F6 , | |||
_______, KC_VOLD, KC_MPRV, KC_MNXT, KC_PGDN, KC_END , KC_F7 , KC_F8 , KC_F9 , KC_F10 , KC_F11 , KC_F12 , | |||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ | |||
), | |||
/* Numpad | |||
* ,-----------------------------------------. ,-----------------------------------------. | |||
* | | | PrSc | ScrLk| Pause| | | | 7 | 8 | 9 | 0 | Lock | | |||
* |------+------+------+------+------+------| |------+------+------+------+------+------| | |||
* | | | Ins | Home | PgUp | | | | 4 | 5 | 6 | / | | | |||
* |------+------+------+------+------+------| |------+------+------+------+------+------| | |||
* | | | Del | End | PgDn | | | | 1 | 2 | 3 | * | = | | |||
* |------+------+------+------+------+------| |------+------+------+------+------+------| | |||
* |NUMPAD| | | | | | | | 0 | . | + | - | Enter| | |||
* `-----------------------------------------' `-----------------------------------------' | |||
*/ | |||
[_NM] = LAYOUT_ortho_4x12( | |||
XXXXXXX, XXXXXXX, KC_PSCR, KC_SLCK, KC_PAUS, XXXXXXX, XXXXXXX, KC_7 , KC_8 , KC_9 , KC_0 , TO(_NM), | |||
XXXXXXX, XXXXXXX, KC_INS , KC_HOME, KC_PGUP, XXXXXXX, XXXXXXX, KC_4 , KC_5 , KC_6 , KC_SLSH, XXXXXXX, | |||
XXXXXXX, XXXXXXX, KC_DEL , KC_END , KC_PGDN, XXXXXXX, XXXXXXX, KC_1 , KC_2 , KC_3 , KC_ASTR, KC_EQL , | |||
_______, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, _______, KC_0 , KC_DOT , KC_PLUS, KC_MINS, _______ | |||
), | |||
/* Adjust | |||
* ,-----------------------------------------. ,-----------------------------------------. | |||
* | Reset| | Up | | | Rec1 | | Rec2 | Plain| Snake|Gradnt| | Del | | |||
* |------+------+------+------+------+------| |------+------+------+------+------+------| | |||
* | Caps | Left | Down | Right|MkItPk| Play1| | Play2| RGB | HUE+ | SAT+ | BRI+ | | | |||
* |------+------+------+------+------+------| |------+------+------+------+------+------| | |||
* | | | | | | Stop1| | Stop2| MODE | HUE- | SAT- | BRI- | | | |||
* |------+------+------+------+------+------| |------+------+------+------+------+------| | |||
* | | | | | | | | | | | | | | | |||
* `-----------------------------------------' `-----------------------------------------' | |||
*/ | |||
[_ADJUST] = LAYOUT_ortho_4x12( | |||
RESET , XXXXXXX, KC_UP , XXXXXXX, XXXXXXX, DREC_1 , DREC_2 , RGB_M_P, RGB_M_SN,RGB_M_G, XXXXXXX, KC_DEL , | |||
KC_CAPS, KC_LEFT, KC_DOWN, KC_RGHT, MKITPNK, DPLAY_1, DPLAY_2, RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, _______, | |||
_______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, DSTOP , DSTOP , RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD, _______, | |||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ | |||
) | |||
}; | |||
void make_it_pink_blue(void) { | |||
uint16_t blue_hue = 210; | |||
uint16_t pink_hue = 315; | |||
/* key is pressed */ | |||
uint16_t hue = rgblight_get_hue(); | |||
uint8_t sat = rgblight_get_sat(); | |||
uint8_t val = rgblight_get_val(); | |||
if (hue != blue_hue) | |||
rgblight_sethsv(blue_hue, sat, val); | |||
else | |||
rgblight_sethsv(pink_hue, sat, val); | |||
} | |||
bool process_record_user(uint16_t keycode, keyrecord_t *record) { | |||
if (!process_record_dynamic_macro(keycode, record)) | |||
return false; | |||
switch (keycode) { | |||
case QWERTY: | |||
if (record->event.pressed) { | |||
set_single_persistent_default_layer(_QWERTY); | |||
} | |||
return false; | |||
break; | |||
case LOWER: | |||
if (record->event.pressed) { | |||
layer_on(_LOWER); | |||
update_tri_layer(_LOWER, _RAISE, _ADJUST); | |||
} else { | |||
layer_off(_LOWER); | |||
update_tri_layer(_LOWER, _RAISE, _ADJUST); | |||
} | |||
return false; | |||
break; | |||
case RAISE: | |||
if (record->event.pressed) { | |||
layer_on(_RAISE); | |||
update_tri_layer(_LOWER, _RAISE, _ADJUST); | |||
} else { | |||
layer_off(_RAISE); | |||
update_tri_layer(_LOWER, _RAISE, _ADJUST); | |||
} | |||
return false; | |||
break; | |||
case ADJUST: | |||
if (record->event.pressed) { | |||
layer_on(_ADJUST); | |||
} else { | |||
layer_off(_ADJUST); | |||
} | |||
return false; | |||
break; | |||
case MKITPNK: | |||
if (record->event.pressed) | |||
make_it_pink_blue(); | |||
return false; | |||
break; | |||
} | |||
return true; | |||
} |
@ -0,0 +1,32 @@ | |||
# jyh's levinson layout | |||
[Levinson](https://keeb.io/products/levinson-lets-split-w-led-backlight) | |||
built on rev2 PCBs. A split 4x12 keyboard with LED backlights. | |||
The layout is oriented towards needs for programming, Emacs, XMonad, | |||
and experience with 60% keyboards with no base layer arrow keys | |||
(Poker). It makes heavy use of modifiers and layers. It is influenced | |||
by good ideas from the Atreus keyboard layout. | |||
## Layout features | |||
* Extensive use of _Mod Tap_, e.g. | |||
* Tap sends Esc, Hold sends Left Control | |||
* Tap sends Tab, Hold activates Numpad layer | |||
* Tap sends - , Hold sends Shift | |||
* ... and many more | |||
* Places Tab and Enter on bottom corners, for hitting with palm | |||
* Meta is available on top corners, for controlling XMonad | |||
* Control on center key, for Emacs (among other things) | |||
* Backspace (Control Hold) and Space on center keys | |||
* All 60% keys available on base layer, except for numbers | |||
* Hyper and Meh keys | |||
* Right modifier keys in place of arrow keys | |||
* Arrows are instead available in two alternate locations: | |||
* WASD arrows on _Adjust_ | |||
* Arrow cluster on _Raise_ (inspired by hexwire) | |||
* Numpad and Numrow on _Raise_ layer. Each is faster in some contexts | |||
* Function keys on _Lower_ | |||
* Dynamic macros from QMK firmware on _Adjust_ | |||
* Redunant keys where it is convenient to have characters together | |||
on one layer |
@ -0,0 +1,2 @@ | |||
RGBLIGHT_ENABLE=yes | |||
BOOTMAGIC_ENABLE=no |
@ -0,0 +1,245 @@ | |||
/* | |||
Copyright 2018 ENDO Katsuhiro <ka2hiro@curlybracket.co.jp> | |||
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/>. | |||
*/ | |||
#pragma once | |||
#include "config_common.h" | |||
/* USB Device descriptor parameter */ | |||
#define VENDOR_ID 0xFEED | |||
#define PRODUCT_ID 0x3939 | |||
#define DEVICE_VER 0x0001 | |||
#define MANUFACTURER ENDO Katsuhiro | |||
#define PRODUCT MiniAxe | |||
#define DESCRIPTION Yet another split keyboard | |||
/* key matrix size */ | |||
#define MATRIX_ROWS 8 | |||
#define MATRIX_COLS 5 | |||
/* | |||
* 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) | |||
* NO_DIODE = switches are directly connected to AVR pins | |||
* | |||
*/ | |||
// #define MATRIX_ROW_PINS { D0, D5 } | |||
// #define MATRIX_COL_PINS { F1, F0, B0 } | |||
#define NO_PIN 0xFF | |||
#define MATRIX_ROW_COL_PINS { \ | |||
{ F1, E6, B0, B2, B3 }, \ | |||
{ F5, F0, B1, B7, D2 }, \ | |||
{ F6, F7, C7, D5, D3 }, \ | |||
{ B5, C6, B6, NO_PIN, NO_PIN } \ | |||
} | |||
#define UNUSED_PINS | |||
/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ | |||
#define DIODE_DIRECTION CUSTOM_MATRIX | |||
// #define BACKLIGHT_PIN B7 | |||
// #define BACKLIGHT_BREATHING | |||
// #define BACKLIGHT_LEVELS 3 | |||
/* Uncomment below if use underglow */ | |||
#define RGB_DI_PIN F4 | |||
#ifdef RGB_DI_PIN | |||
#define RGBLIGHT_ANIMATIONS | |||
#define RGBLED_NUM 6 | |||
#define RGBLIGHT_HUE_STEP 8 | |||
#define RGBLIGHT_SAT_STEP 8 | |||
#define RGBLIGHT_VAL_STEP 8 | |||
#endif | |||
/* 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 | |||
/* If defined, GRAVE_ESC will always act as ESC when CTRL is held. | |||
* This is userful for the Windows task manager shortcut (ctrl+shift+esc). | |||
*/ | |||
// #define GRAVE_ESC_CTRL_OVERRIDE | |||
/* | |||
* 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 | |||
/* | |||
* MIDI options | |||
*/ | |||
/* Prevent use of disabled MIDI features in the keymap */ | |||
//#define MIDI_ENABLE_STRICT 1 | |||
/* enable basic MIDI features: | |||
- MIDI notes can be sent when in Music mode is on | |||
*/ | |||
//#define MIDI_BASIC | |||
/* enable advanced MIDI features: | |||
- MIDI notes can be added to the keymap | |||
- Octave shift and transpose | |||
- Virtual sustain, portamento, and modulation wheel | |||
- etc. | |||
*/ | |||
//#define MIDI_ADVANCED | |||
/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ | |||
//#define MIDI_TONE_KEYCODE_OCTAVES 1 | |||
/* | |||
* HD44780 LCD Display Configuration | |||
*/ | |||
/* | |||
#define LCD_LINES 2 //< number of visible lines of the display | |||
#define LCD_DISP_LENGTH 16 //< visibles characters per line of the display | |||
#define LCD_IO_MODE 1 //< 0: memory mapped mode, 1: IO port mode | |||
#if LCD_IO_MODE | |||
#define LCD_PORT PORTB //< port for the LCD lines | |||
#define LCD_DATA0_PORT LCD_PORT //< port for 4bit data bit 0 | |||
#define LCD_DATA1_PORT LCD_PORT //< port for 4bit data bit 1 | |||
#define LCD_DATA2_PORT LCD_PORT //< port for 4bit data bit 2 | |||
#define LCD_DATA3_PORT LCD_PORT //< port for 4bit data bit 3 | |||
#define LCD_DATA0_PIN 4 //< pin for 4bit data bit 0 | |||
#define LCD_DATA1_PIN 5 //< pin for 4bit data bit 1 | |||
#define LCD_DATA2_PIN 6 //< pin for 4bit data bit 2 | |||
#define LCD_DATA3_PIN 7 //< pin for 4bit data bit 3 | |||
#define LCD_RS_PORT LCD_PORT //< port for RS line | |||
#define LCD_RS_PIN 3 //< pin for RS line | |||
#define LCD_RW_PORT LCD_PORT //< port for RW line | |||
#define LCD_RW_PIN 2 //< pin for RW line | |||
#define LCD_E_PORT LCD_PORT //< port for Enable line | |||
#define LCD_E_PIN 1 //< pin for Enable line | |||
#endif | |||
*/ | |||
/* Bootmagic Lite key configuration */ | |||
// #define BOOTMAGIC_LITE_ROW 0 | |||
// #define BOOTMAGIC_LITE_COLUMN 0 | |||
/* Serial settings */ | |||
#define USE_SERIAL | |||
//#define EE_HANDS | |||
#define I2C_MASTER_LEFT | |||
//#define I2C_MASTER_RIGHT | |||
#define DISABLE_JTAG | |||
@ -0,0 +1,12 @@ | |||
{ | |||
"keyboard_name": "MiniAxe", | |||
"url": "", | |||
"maintainer": "ka2hiro", | |||
"width": 11, | |||
"height": 4, | |||
"layouts": { | |||
"LAYOUT": { | |||
"layout": [{"label":"Q", "x":0, "y":0}, {"label":"W", "x":1, "y":0}, {"label":"E", "x":2, "y":0}, {"label":"R", "x":3, "y":0}, {"label":"T", "x":4, "y":0}, {"label":"Y", "x":6, "y":0}, {"label":"U", "x":7, "y":0}, {"label":"I", "x":8, "y":0}, {"label":"O", "x":9, "y":0}, {"label":"P", "x":10, "y":0}, {"label":"A", "x":0, "y":1}, {"label":"S", "x":1, "y":1}, {"label":"D", "x":2, "y":1}, {"label":"F", "x":3, "y":1}, {"label":"G", "x":4, "y":1}, {"label":"J", "x":6, "y":1}, {"label":"J", "x":7, "y":1}, {"label":"K", "x":8, "y":1}, {"label":"L", "x":9, "y":1}, {"label":";", "x":10, "y":1}, {"label":"Z", "x":0, "y":2}, {"label":"X", "x":1, "y":2}, {"label":"C", "x":2, "y":2}, {"label":"V", "x":3, "y":2}, {"label":"B", "x":4, "y":2}, {"label":"N", "x":6, "y":2}, {"label":"M", "x":7, "y":2}, {"label":",", "x":8, "y":2}, {"label":".", "x":9, "y":2}, {"label":"/", "x":10, "y":2}, {"label":"Cmd", "x":2, "y":3}, {"label":"⇓", "x":3, "y":3}, {"label":"Ctrl", "x":4, "y":3}, {"x":6, "y":3}, {"label":"⇑", "x":7, "y":3}, {"label":"Opt", "x":8, "y":3}] | |||
} | |||
} | |||
} |
@ -0,0 +1,159 @@ | |||
/* Copyright 2018 ENDO Katsuhiro <ka2hiro@curlybracket.co.jp> | |||
* | |||
* 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/>. | |||
*/ | |||
#include QMK_KEYBOARD_H | |||
// Defines the keycodes used by our macros in process_record_user | |||
#define _QWERTY 0 | |||
#define _LOWER 1 | |||
#define _RAISE 2 | |||
#define _ADJUST 16 | |||
enum custom_keycodes { | |||
QWERTY = SAFE_RANGE, | |||
LOWER, | |||
RAISE, | |||
ADJUST, | |||
}; | |||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | |||
/* Qwerty | |||
* | |||
* ,----------------------------------. ,----------------------------------. | |||
* | Q | W | E | R | T | | Y | U | I | O | P | | |||
* |------+------+------+------+------| |------+------+------+------+------| | |||
* | A | S | D | F | G | | H | J | K | L | ; | | |||
* |------+------+------+------+------| |------+------+------+------+------| | |||
* | Z | X | C | V | B | | N | M | , | . | / | | |||
* `-------------+------+------+------| |------+------+------+------+------' | |||
* | GUI | LOWER|Ctrl/Esc| |Spc/Sft| RAISE|Alt/BkSp | | |||
* `--------------------' `--------------------' | |||
*/ | |||
[_QWERTY] = LAYOUT( \ | |||
KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, \ | |||
KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, \ | |||
KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, \ | |||
KC_LGUI, LOWER, MT(MOD_LCTL, KC_ESC), MT(MOD_LSFT, KC_SPC), RAISE, MT(MOD_LALT, KC_BSPC) \ | |||
), | |||
/* Raise | |||
* | |||
* ,----------------------------------. ,----------------------------------. | |||
* | ! | @ | # | $ | % | | ^ | & | * | ( | ) | | |||
* |------+------+------+------+------| |------+------+------+------+------| | |||
* | Tab | _ | + | | | ~ | | : | " | > | { | } | | |||
* |------+------+------+------+------| |------+------+------+------+------| | |||
* | Caps| - | = | \ | ` | | ; | ' | < | [ | ] | | |||
* `-------------+------+------+------| |------+------+------+------+------' | |||
* | | LOWER| | | Esc | RAISE| | | |||
* `--------------------' `--------------------' | |||
*/ | |||
[_RAISE] = LAYOUT( \ | |||
KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, \ | |||
KC_TAB, KC_UNDS, KC_PLUS, KC_PIPE, KC_TILD, KC_COLN, KC_DQUO, KC_GT, KC_LCBR, KC_RCBR, \ | |||
KC_CAPS, KC_MINS, KC_EQL, KC_BSLS, KC_GRV, KC_SCLN, KC_QUOT, KC_LT, KC_LBRC, KC_RBRC, \ | |||
_______, _______, _______, _______, _______, _______\ | |||
), | |||
/* Lower | |||
* | |||
* ,----------------------------------. ,----------------------------------. | |||
* | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | | |||
* |------+------+------+------+------| |------+------+------+------+------| | |||
* | Tab | | | | | | Left | Down | Up | Right| Enter| | |||
* |------+------+------+------+------| |------+------+------+------+------| | |||
* | Ctrl| ` | GUI | Alt | Del | | BkSp | PgUp | PgDn | \ | ' | | |||
* `-------------+------+------+------| |------+------+------+------+------' | |||
* | | LOWER| | | | RAISE| | | |||
* `--------------------' `--------------------' | |||
*/ | |||
[_LOWER] = LAYOUT( \ | |||
KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, \ | |||
KC_TAB, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_ENT, \ | |||
KC_LCTL, KC_GRV, KC_LGUI, KC_LALT, KC_DEL, KC_BSPC, KC_PGUP, KC_PGDN, KC_BSLS, KC_QUOT, \ | |||
_______, _______, _______, _______, _______, _______ \ | |||
), | |||
/* Adjust (Lower + Raise) | |||
* | |||
* ,----------------------------------. ,----------------------------------. | |||
* | F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10 | | |||
* |------+------+------+------+------| |------+------+------+------+------| | |||
* | F11 | F12 | | | | | | | | | | | |||
* |------+------+------+------+------| |------+------+------+------+------| | |||
* | Reset| | | | | | Prev | Next | Vol- | Vol+ | Play | | |||
* `-------------+------+------+------| |------+------+------+------+------' | |||
* | | LOWER| | | | RAISE| | | |||
* `--------------------' `--------------------' | |||
*/ | |||
[_ADJUST] = LAYOUT( \ | |||
KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, \ | |||
KC_F11, KC_F12, _______, _______, _______, _______, _______, _______, _______, _______, \ | |||
RESET, _______, _______, _______, _______, KC_MPRV, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY, \ | |||
_______, _______, _______, _______, _______, _______ \ | |||
) | |||
}; | |||
bool process_record_user(uint16_t keycode, keyrecord_t *record) { | |||
switch (keycode) { | |||
case QWERTY: | |||
if (record->event.pressed) { | |||
// persistant_default_layer_set(1UL<<_QWERTY); | |||
set_single_persistent_default_layer(_QWERTY); | |||
} | |||
return false; | |||
break; | |||
case LOWER: | |||
if (record->event.pressed) { | |||
layer_on(_LOWER); | |||
update_tri_layer(_LOWER, _RAISE, _ADJUST); | |||
} else { | |||
layer_off(_LOWER); | |||
update_tri_layer(_LOWER, _RAISE, _ADJUST); | |||
} | |||
return false; | |||
break; | |||
case RAISE: | |||
if (record->event.pressed) { | |||
layer_on(_RAISE); | |||
update_tri_layer(_LOWER, _RAISE, _ADJUST); | |||
} else { | |||
layer_off(_RAISE); | |||
update_tri_layer(_LOWER, _RAISE, _ADJUST); | |||
} | |||
return false; | |||
break; | |||
case ADJUST: | |||
if (record->event.pressed) { | |||
layer_on(_ADJUST); | |||
} else { | |||
layer_off(_ADJUST); | |||
} | |||
return false; | |||
break; | |||
} | |||
return true; | |||
} | |||
void matrix_init_user(void) { | |||
} | |||
void matrix_scan_user(void) { | |||
} | |||
void led_set_user(uint8_t usb_led) { | |||
} |
@ -0,0 +1,159 @@ | |||
/* Copyright 2018 ENDO Katsuhiro <ka2hiro@curlybracket.co.jp> | |||
* | |||
* 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/>. | |||
*/ | |||
#include QMK_KEYBOARD_H | |||
// Defines the keycodes used by our macros in process_record_user | |||
#define _QWERTY 0 | |||
#define _LOWER 1 | |||
#define _RAISE 2 | |||
#define _ADJUST 16 | |||
enum custom_keycodes { | |||
QWERTY = SAFE_RANGE, | |||
LOWER, | |||
RAISE, | |||
ADJUST, | |||
}; | |||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | |||
/* Qwerty | |||
* | |||
* ,----------------------------------. ,----------------------------------. | |||
* | Q | W | E | R | T | | Y | U | I | O | P | | |||
* |------+------+------+------+------| |------+------+------+------+------| | |||
* | A | S | D | F | G | | H | J | K | L | ; | | |||
* |------+------+------+------+------| |------+------+------+------+------| | |||
* | Z | X | C | V | B | | N | M | , | . | / | | |||
* `-------------+------+------+------| |------+------+------+------+------' | |||
* | GUI | LOWER|Ctrl/Esc| |Spc/Sft| RAISE|Alt/BkSp | | |||
* `--------------------' `--------------------' | |||
*/ | |||
[_QWERTY] = LAYOUT( \ | |||
KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, \ | |||
KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, \ | |||
KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, \ | |||
KC_LGUI, LOWER, MT(MOD_LCTL, KC_ESC), MT(MOD_LSFT, KC_SPC), RAISE, MT(MOD_LALT, KC_BSPC) \ | |||
), | |||
/* Raise | |||
* | |||
* ,----------------------------------. ,----------------------------------. | |||
* | ! | @ | # | $ | % | | ^ | & | * | ( | ) | | |||
* |------+------+------+------+------| |------+------+------+------+------| | |||
* | Tab | _ | + | | | ~ | | : | " | > | { | } | | |||
* |------+------+------+------+------| |------+------+------+------+------| | |||
* | Caps| - | = | \ | ` | | ; | ' | < | [ | ] | | |||
* `-------------+------+------+------| |------+------+------+------+------' | |||
* | | LOWER| | | Esc | RAISE| | | |||
* `--------------------' `--------------------' | |||
*/ | |||
[_RAISE] = LAYOUT( \ | |||
KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, \ | |||
KC_TAB, KC_UNDS, KC_PLUS, KC_PIPE, KC_TILD, KC_COLN, KC_DQUO, KC_GT, KC_LCBR, KC_RCBR, \ | |||
KC_CAPS, KC_MINS, KC_EQL, KC_BSLS, KC_GRV, KC_SCLN, KC_QUOT, KC_LT, KC_LBRC, KC_RBRC, \ | |||
_______, _______, _______, _______, _______, _______\ | |||
), | |||
/* Lower | |||
* | |||
* ,----------------------------------. ,----------------------------------. | |||
* | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | | |||
* |------+------+------+------+------| |------+------+------+------+------| | |||
* | Tab | | | | Play | | Left | Down | Up | Right| Enter| | |||
* |------+------+------+------+------| |------+------+------+------+------| | |||
* | Ctrl| ` | GUI | Alt | Del | | BkSp | PgUp | PgDn | \ | ' | | |||
* `-------------+------+------+------| |------+------+------+------+------' | |||
* | | LOWER| | | | RAISE| | | |||
* `--------------------' `--------------------' | |||
*/ | |||
[_LOWER] = LAYOUT( \ | |||
KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, \ | |||
KC_TAB, _______, _______, _______, KC_MPLY, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_ENT, \ | |||
KC_LCTL, KC_GRV, KC_LGUI, KC_LALT, KC_DEL, KC_BSPC, KC_PGUP, KC_PGDN, KC_BSLS, KC_QUOT, \ | |||
_______, _______, _______, _______, _______, _______ \ | |||
), | |||
/* Adjust (Lower + Raise) | |||
* | |||
* ,----------------------------------. ,----------------------------------. | |||
* | F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10 | | |||
* |------+------+------+------+------| |------+------+------+------+------| | |||
* | F11 | F12 | |RGBSAI|RGBSAD| |RGBVAI|RGBVAD| | | | | |||
* |------+------+------+------+------| |------+------+------+------+------| | |||
* | Reset|RGBTOG|RGBMOD|RGBHUI|RGBHUD| | Prev | Next | Vol- | Vol+ | Play | | |||
* `-------------+------+------+------| |------+------+------+------+------' | |||
* | | LOWER| | | | RAISE| | | |||
* `--------------------' `--------------------' | |||
*/ | |||
[_ADJUST] = LAYOUT( \ | |||
KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, \ | |||
KC_F11, KC_F12, RGB_RMOD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, _______, _______, \ | |||
RESET, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, KC_MPRV, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY, \ | |||
_______, _______, _______, _______, _______, _______ \ | |||
) | |||
}; | |||
bool process_record_user(uint16_t keycode, keyrecord_t *record) { | |||
switch (keycode) { | |||
case QWERTY: | |||
if (record->event.pressed) { | |||
// persistant_default_layer_set(1UL<<_QWERTY); | |||
set_single_persistent_default_layer(_QWERTY); | |||
} | |||
return false; | |||
break; | |||
case LOWER: | |||
if (record->event.pressed) { | |||
layer_on(_LOWER); | |||
update_tri_layer(_LOWER, _RAISE, _ADJUST); | |||
} else { | |||
layer_off(_LOWER); | |||
update_tri_layer(_LOWER, _RAISE, _ADJUST); | |||
} | |||
return false; | |||
break; | |||
case RAISE: | |||
if (record->event.pressed) { | |||
layer_on(_RAISE); | |||
update_tri_layer(_LOWER, _RAISE, _ADJUST); | |||
} else { | |||
layer_off(_RAISE); | |||
update_tri_layer(_LOWER, _RAISE, _ADJUST); | |||
} | |||
return false; | |||
break; | |||
case ADJUST: | |||
if (record->event.pressed) { | |||
layer_on(_ADJUST); | |||
} else { | |||
layer_off(_ADJUST); | |||
} | |||
return false; | |||
break; | |||
} | |||
return true; | |||
} | |||
void matrix_init_user(void) { | |||
} | |||
void matrix_scan_user(void) { | |||
} | |||
void led_set_user(uint8_t usb_led) { | |||
} |
@ -0,0 +1,2 @@ | |||
RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow | |||
@ -0,0 +1,596 @@ | |||
/* | |||
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/>. | |||
*/ | |||
/* | |||
* scan matrix | |||
*/ | |||
#include <stdint.h> | |||
#include <stdbool.h> | |||
#include <avr/io.h> | |||
#include "wait.h" | |||
#include "print.h" | |||
#include "debug.h" | |||
#include "util.h" | |||
#include "matrix.h" | |||
#include "split_util.h" | |||
#include "pro_micro.h" | |||
#include "config.h" | |||
#include "timer.h" | |||
#include "split_flags.h" | |||
#ifdef RGBLIGHT_ENABLE | |||
# include "rgblight.h" | |||
#endif | |||
#ifdef BACKLIGHT_ENABLE | |||
# include "backlight.h" | |||
extern backlight_config_t backlight_config; | |||
#endif | |||
#if defined(USE_I2C) || defined(EH) | |||
# include "i2c.h" | |||
#else // USE_SERIAL | |||
# include "serial.h" | |||
#endif | |||
#ifndef DEBOUNCING_DELAY | |||
# define DEBOUNCING_DELAY 5 | |||
#endif | |||
#if (DEBOUNCING_DELAY > 0) | |||
static uint16_t debouncing_time; | |||
static bool debouncing = false; | |||
#endif | |||
#if (MATRIX_COLS <= 8) | |||
# define print_matrix_header() print("\nr/c 01234567\n") | |||
# define print_matrix_row(row) print_bin_reverse8(matrix_get_row(row)) | |||
# define matrix_bitpop(i) bitpop(matrix[i]) | |||
# define ROW_SHIFTER ((uint8_t)1) | |||
#else | |||
# error "Currently only supports 8 COLS" | |||
#endif | |||
static matrix_row_t matrix_debouncing[MATRIX_ROWS]; | |||
#define ERROR_DISCONNECT_COUNT 5 | |||
#define ROWS_PER_HAND (MATRIX_ROWS/2) | |||
static uint8_t error_count = 0; | |||
#if ((DIODE_DIRECTION == COL2ROW) || (DIODE_DIRECTION == ROW2COL)) | |||
static uint8_t row_pins[MATRIX_ROWS] = MATRIX_ROW_PINS; | |||
static uint8_t col_pins[MATRIX_COLS] = MATRIX_COL_PINS; | |||
#elif (DIODE_DIRECTION == CUSTOM_MATRIX) | |||
static uint8_t row_col_pins[MATRIX_ROWS][MATRIX_COLS] = MATRIX_ROW_COL_PINS; | |||
#endif | |||
/* matrix state(1:on, 0:off) */ | |||
static matrix_row_t matrix[MATRIX_ROWS]; | |||
static matrix_row_t matrix_debouncing[MATRIX_ROWS]; | |||
#if (DIODE_DIRECTION == COL2ROW) | |||
static void init_cols(void); | |||
static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row); | |||
static void unselect_rows(void); | |||
static void select_row(uint8_t row); | |||
static void unselect_row(uint8_t row); | |||
#elif (DIODE_DIRECTION == ROW2COL) | |||
static void init_rows(void); | |||
static bool read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col); | |||
static void unselect_cols(void); | |||
static void unselect_col(uint8_t col); | |||
static void select_col(uint8_t col); | |||
#elif (DIODE_DIRECTION == CUSTOM_MATRIX) | |||
static void init_cols_rows(void); | |||
static bool read_cols(matrix_row_t current_matrix[], uint8_t current_row); | |||
#endif | |||
__attribute__ ((weak)) | |||
void matrix_init_kb(void) { | |||
matrix_init_user(); | |||
} | |||
__attribute__ ((weak)) | |||
void matrix_scan_kb(void) { | |||
matrix_scan_user(); | |||
} | |||
__attribute__ ((weak)) | |||
void matrix_init_user(void) { | |||
} | |||
__attribute__ ((weak)) | |||
void matrix_scan_user(void) { | |||
} | |||
__attribute__ ((weak)) | |||
void matrix_slave_scan_user(void) { | |||
} | |||
inline | |||
uint8_t matrix_rows(void) | |||
{ | |||
return MATRIX_ROWS; | |||
} | |||
inline | |||
uint8_t matrix_cols(void) | |||
{ | |||
return MATRIX_COLS; | |||
} | |||
void matrix_init(void) | |||
{ | |||
#ifdef DISABLE_JTAG | |||
// JTAG disable for PORT F. write JTD bit twice within four cycles. | |||
MCUCR |= (1<<JTD); | |||
MCUCR |= (1<<JTD); | |||
#endif | |||
debug_enable = true; | |||
debug_matrix = true; | |||
debug_mouse = true; | |||
// Set pinout for right half if pinout for that half is defined | |||
if (!isLeftHand) { | |||
#ifdef MATRIX_ROW_PINS_RIGHT | |||
const uint8_t row_pins_right[MATRIX_ROWS] = MATRIX_ROW_PINS_RIGHT; | |||
for (uint8_t i = 0; i < MATRIX_ROWS; i++) | |||
row_pins[i] = row_pins_right[i]; | |||
#endif | |||
#ifdef MATRIX_COL_PINS_RIGHT | |||
const uint8_t col_pins_right[MATRIX_COLS] = MATRIX_COL_PINS_RIGHT; | |||
for (uint8_t i = 0; i < MATRIX_COLS; i++) | |||
col_pins[i] = col_pins_right[i]; | |||
#endif | |||
} | |||
// initialize row and col | |||
#if (DIODE_DIRECTION == COL2ROW) | |||
unselect_rows(); | |||
init_cols(); | |||
#elif (DIODE_DIRECTION == ROW2COL) | |||
unselect_cols(); | |||
init_rows(); | |||
#elif (DIODE_DIRECTION == CUSTOM_MATRIX) | |||
init_cols_rows(); | |||
#endif | |||
// initialize matrix state: all keys off | |||
for (uint8_t i=0; i < MATRIX_ROWS; i++) { | |||
matrix[i] = 0; | |||
matrix_debouncing[i] = 0; | |||
} | |||
matrix_init_quantum(); | |||
} | |||
uint8_t _matrix_scan(void) | |||
{ | |||
int offset = isLeftHand ? 0 : (ROWS_PER_HAND); | |||
#if (DIODE_DIRECTION == COL2ROW) | |||
// Set row, read cols | |||
for (uint8_t current_row = 0; current_row < ROWS_PER_HAND; current_row++) { | |||
# if (DEBOUNCING_DELAY > 0) | |||
bool matrix_changed = read_cols_on_row(matrix_debouncing+offset, current_row); | |||
if (matrix_changed) { | |||
debouncing = true; | |||
debouncing_time = timer_read(); | |||
} | |||
# else | |||
read_cols_on_row(matrix+offset, current_row); | |||
# endif | |||
} | |||
#elif (DIODE_DIRECTION == ROW2COL) | |||
// Set col, read rows | |||
for (uint8_t current_col = 0; current_col < MATRIX_COLS; current_col++) { | |||
# if (DEBOUNCING_DELAY > 0) | |||
bool matrix_changed = read_rows_on_col(matrix_debouncing+offset, current_col); | |||
if (matrix_changed) { | |||
debouncing = true; | |||
debouncing_time = timer_read(); | |||
} | |||
# else | |||
read_rows_on_col(matrix+offset, current_col); | |||
# endif | |||
} | |||
#elif (DIODE_DIRECTION == CUSTOM_MATRIX) | |||
// Set row, read cols | |||
for (uint8_t current_row = 0; current_row < ROWS_PER_HAND; current_row++) { | |||
# if (DEBOUNCING_DELAY > 0) | |||
bool matrix_changed = read_cols(matrix_debouncing+offset, current_row); | |||
if (matrix_changed) { | |||
debouncing = true; | |||
debouncing_time = timer_read(); | |||
} | |||
# else | |||
read_cols(matrix+offset, current_row); | |||
# endif | |||
} | |||
#endif | |||
# if (DEBOUNCING_DELAY > 0) | |||
if (debouncing && (timer_elapsed(debouncing_time) > DEBOUNCING_DELAY)) { | |||
for (uint8_t i = 0; i < ROWS_PER_HAND; i++) { | |||
matrix[i+offset] = matrix_debouncing[i+offset]; | |||
} | |||
debouncing = false; | |||
} | |||
# endif | |||
return 1; | |||
} | |||
#if defined(USE_I2C) || defined(EH) | |||
// Get rows from other half over i2c | |||
int i2c_transaction(void) { | |||
int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0; | |||
int err = 0; | |||
// write backlight info | |||
#ifdef BACKLIGHT_ENABLE | |||
if (BACKLIT_DIRTY) { | |||
err = i2c_master_start(SLAVE_I2C_ADDRESS + I2C_WRITE); | |||
if (err) goto i2c_error; | |||
// Backlight location | |||
err = i2c_master_write(I2C_BACKLIT_START); | |||
if (err) goto i2c_error; | |||
// Write backlight | |||
i2c_master_write(get_backlight_level()); | |||
BACKLIT_DIRTY = false; | |||
} | |||
#endif | |||
err = i2c_master_start(SLAVE_I2C_ADDRESS + I2C_WRITE); | |||
if (err) goto i2c_error; | |||
// start of matrix stored at I2C_KEYMAP_START | |||
err = i2c_master_write(I2C_KEYMAP_START); | |||
if (err) goto i2c_error; | |||
// Start read | |||
err = i2c_master_start(SLAVE_I2C_ADDRESS + I2C_READ); | |||
if (err) goto i2c_error; | |||
if (!err) { | |||
int i; | |||
for (i = 0; i < ROWS_PER_HAND-1; ++i) { | |||
matrix[slaveOffset+i] = i2c_master_read(I2C_ACK); | |||
} | |||
matrix[slaveOffset+i] = i2c_master_read(I2C_NACK); | |||
i2c_master_stop(); | |||
} else { | |||
i2c_error: // the cable is disconnceted, or something else went wrong | |||
i2c_reset_state(); | |||
return err; | |||
} | |||
#ifdef RGBLIGHT_ENABLE | |||
if (RGB_DIRTY) { | |||
err = i2c_master_start(SLAVE_I2C_ADDRESS + I2C_WRITE); | |||
if (err) goto i2c_error; | |||
// RGB Location | |||
err = i2c_master_write(I2C_RGB_START); | |||
if (err) goto i2c_error; | |||
uint32_t dword = eeconfig_read_rgblight(); | |||
// Write RGB | |||
err = i2c_master_write_data(&dword, 4); | |||
if (err) goto i2c_error; | |||
RGB_DIRTY = false; | |||
i2c_master_stop(); | |||
} | |||
#endif | |||
return 0; | |||
} | |||
#else // USE_SERIAL | |||
int serial_transaction(void) { | |||
int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0; | |||
if (serial_update_buffers()) { | |||
return 1; | |||
} | |||
for (int i = 0; i < ROWS_PER_HAND; ++i) { | |||
matrix[slaveOffset+i] = serial_slave_buffer[i]; | |||
} | |||
#ifdef RGBLIGHT_ENABLE | |||
// Code to send RGB over serial goes here (not implemented yet) | |||
#endif | |||
#ifdef BACKLIGHT_ENABLE | |||
// Write backlight level for slave to read | |||
serial_master_buffer[SERIAL_BACKLIT_START] = backlight_config.enable ? backlight_config.level : 0; | |||
#endif | |||
return 0; | |||
} | |||
#endif | |||
uint8_t matrix_scan(void) | |||
{ | |||
uint8_t ret = _matrix_scan(); | |||
#if defined(USE_I2C) || defined(EH) | |||
if( i2c_transaction() ) { | |||
#else // USE_SERIAL | |||
if( serial_transaction() ) { | |||
#endif | |||
error_count++; | |||
if (error_count > ERROR_DISCONNECT_COUNT) { | |||
// reset other half if disconnected | |||
int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0; | |||
for (int i = 0; i < ROWS_PER_HAND; ++i) { | |||
matrix[slaveOffset+i] = 0; | |||
} | |||
} | |||
} else { | |||
error_count = 0; | |||
} | |||
matrix_scan_quantum(); | |||
return ret; | |||
} | |||
void matrix_slave_scan(void) { | |||
_matrix_scan(); | |||
int offset = (isLeftHand) ? 0 : ROWS_PER_HAND; | |||
#if defined(USE_I2C) || defined(EH) | |||
for (int i = 0; i < ROWS_PER_HAND; ++i) { | |||
i2c_slave_buffer[I2C_KEYMAP_START+i] = matrix[offset+i]; | |||
} | |||
#else // USE_SERIAL | |||
for (int i = 0; i < ROWS_PER_HAND; ++i) { | |||
serial_slave_buffer[i] = matrix[offset+i]; | |||
} | |||
#endif | |||
matrix_slave_scan_user(); | |||
} | |||
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; | |||
} | |||
#if (DIODE_DIRECTION == COL2ROW) | |||
static void init_cols(void) | |||
{ | |||
for(uint8_t x = 0; x < MATRIX_COLS; x++) { | |||
uint8_t pin = col_pins[x]; | |||
_SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN | |||
_SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI | |||
} | |||
} | |||
static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row) | |||
{ | |||
// Store last value of row prior to reading | |||
matrix_row_t last_row_value = current_matrix[current_row]; | |||
// Clear data in matrix row | |||
current_matrix[current_row] = 0; | |||
// Select row and wait for row selecton to stabilize | |||
select_row(current_row); | |||
wait_us(30); | |||
// For each col... | |||
for(uint8_t col_index = 0; col_index < MATRIX_COLS; col_index++) { | |||
// Select the col pin to read (active low) | |||
uint8_t pin = col_pins[col_index]; | |||
uint8_t pin_state = (_SFR_IO8(pin >> 4) & _BV(pin & 0xF)); | |||
// Populate the matrix row with the state of the col pin | |||
current_matrix[current_row] |= pin_state ? 0 : (ROW_SHIFTER << col_index); | |||
} | |||
// Unselect row | |||
unselect_row(current_row); | |||
return (last_row_value != current_matrix[current_row]); | |||
} | |||
static void select_row(uint8_t row) | |||
{ | |||
uint8_t pin = row_pins[row]; | |||
_SFR_IO8((pin >> 4) + 1) |= _BV(pin & 0xF); // OUT | |||
_SFR_IO8((pin >> 4) + 2) &= ~_BV(pin & 0xF); // LOW | |||
} | |||
static void unselect_row(uint8_t row) | |||
{ | |||
uint8_t pin = row_pins[row]; | |||
_SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN | |||
_SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI | |||
} | |||
static void unselect_rows(void) | |||
{ | |||
for(uint8_t x = 0; x < ROWS_PER_HAND; x++) { | |||
uint8_t pin = row_pins[x]; | |||
_SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN | |||
_SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI | |||
} | |||
} | |||
#elif (DIODE_DIRECTION == ROW2COL) | |||
static void init_rows(void) | |||
{ | |||
for(uint8_t x = 0; x < ROWS_PER_HAND; x++) { | |||
uint8_t pin = row_pins[x]; | |||
_SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN | |||
_SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI | |||
} | |||
} | |||
static bool read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col) | |||
{ | |||
bool matrix_changed = false; | |||
// Select col and wait for col selecton to stabilize | |||
select_col(current_col); | |||
wait_us(30); | |||
// For each row... | |||
for(uint8_t row_index = 0; row_index < ROWS_PER_HAND; row_index++) | |||
{ | |||
// Store last value of row prior to reading | |||
matrix_row_t last_row_value = current_matrix[row_index]; | |||
// Check row pin state | |||
if ((_SFR_IO8(row_pins[row_index] >> 4) & _BV(row_pins[row_index] & 0xF)) == 0) | |||
{ | |||
// Pin LO, set col bit | |||
current_matrix[row_index] |= (ROW_SHIFTER << current_col); | |||
} | |||
else | |||
{ | |||
// Pin HI, clear col bit | |||
current_matrix[row_index] &= ~(ROW_SHIFTER << current_col); | |||
} | |||
// Determine if the matrix changed state | |||
if ((last_row_value != current_matrix[row_index]) && !(matrix_changed)) | |||
{ | |||
matrix_changed = true; | |||
} | |||
} | |||
// Unselect col | |||
unselect_col(current_col); | |||
return matrix_changed; | |||
} | |||
static void select_col(uint8_t col) | |||
{ | |||
uint8_t pin = col_pins[col]; | |||
_SFR_IO8((pin >> 4) + 1) |= _BV(pin & 0xF); // OUT | |||
_SFR_IO8((pin >> 4) + 2) &= ~_BV(pin & 0xF); // LOW | |||
} | |||
static void unselect_col(uint8_t col) | |||
{ | |||
uint8_t pin = col_pins[col]; | |||
_SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN | |||
_SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI | |||
} | |||
static void unselect_cols(void) | |||
{ | |||
for(uint8_t x = 0; x < MATRIX_COLS; x++) { | |||
uint8_t pin = col_pins[x]; | |||
_SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN | |||
_SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI | |||
} | |||
} | |||
#elif (DIODE_DIRECTION == CUSTOM_MATRIX) | |||
static void init_cols_rows(void) | |||
{ | |||
for(int row = 0; row < MATRIX_ROWS; row++) { | |||
for(int col = 0; col < MATRIX_COLS; col++) { | |||
uint8_t pin = row_col_pins[row][col]; | |||
if(pin == NO_PIN) { | |||
continue; | |||
} | |||
// DDxn set 0 for input | |||
_SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); | |||
// PORTxn set 1 for input/pullup | |||
_SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); | |||
} | |||
} | |||
} | |||
static bool read_cols(matrix_row_t current_matrix[], uint8_t current_row) | |||
{ | |||
matrix_row_t last_row_value = current_matrix[current_row]; | |||
current_matrix[current_row] = 0; | |||
for(uint8_t col_index = 0; col_index < MATRIX_COLS; col_index++) { | |||
uint8_t pin = row_col_pins[current_row][col_index]; | |||
if(pin == NO_PIN) { | |||
current_matrix[current_row] |= 0; | |||
} | |||
else { | |||
uint8_t pin_state = (_SFR_IO8(pin >> 4) & _BV(pin & 0xF)); | |||
current_matrix[current_row] |= pin_state ? 0 : (ROW_SHIFTER << col_index); | |||
} | |||
} | |||
return (last_row_value != current_matrix[current_row]); | |||
} | |||
#endif |
@ -0,0 +1,43 @@ | |||
/* Copyright 2018 ENDO Katsuhiro <ka2hiro@curlybracket.co.jp> | |||
* | |||
* 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/>. | |||
*/ | |||
#include "miniaxe.h" | |||
void matrix_init_kb(void) { | |||
// put your keyboard start-up code here | |||
// runs once when the firmware starts up | |||
matrix_init_user(); | |||
} | |||
void matrix_scan_kb(void) { | |||
// put your looping keyboard code here | |||
// runs every cycle (a lot) | |||
matrix_scan_user(); | |||
} | |||
bool process_record_kb(uint16_t keycode, keyrecord_t *record) { | |||
// put your per-action keyboard code here | |||
// runs for every action, just before processing by the firmware | |||
return process_record_user(keycode, record); | |||
} | |||
void led_set_kb(uint8_t usb_led) { | |||
// put your keyboard LED indicator (ex: Caps Lock LED) toggling code here | |||
led_set_user(usb_led); | |||
} |
@ -0,0 +1,50 @@ | |||
/* Copyright 2018 ENDO Katsuhiro <ka2hiro@curlybracket.co.jp> | |||
* | |||
* 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 MINIAXE_H | |||
#define MINIAXE_H | |||
#include "quantum.h" | |||
/* This a shortcut to help you visually see your layout. | |||
* | |||
* The first section contains all of the arguments representing the physical | |||
* layout of the board and position of the keys. | |||
* | |||
* The second converts the arguments into a two-dimensional array which | |||
* represents the switch matrix. | |||
*/ | |||
// readability | |||
#define ___ KC_NO | |||
#define LAYOUT( \ | |||
L01, L02, L03, L04, L05, R01, R02, R03, R04, R05, \ | |||
L06, L07, L08, L09, L10, R06, R07, R08, R09, R10, \ | |||
L11, L12, L13, L14, L15, R11, R12, R13, R14, R15, \ | |||
L16, L17, L18, R16, R17, R18 \ | |||
) \ | |||
{ \ | |||
{ L01, L02, L03, L04, L05 }, \ | |||
{ L06, L07, L08, L09, L10 }, \ | |||
{ L11, L12, L13, L14, L15 }, \ | |||
{ L16, L17, L18, ___, ___ }, \ | |||
{ R01, R02, R03, R04, R05 }, \ | |||
{ R06, R07, R08, R09, R10 }, \ | |||
{ R11, R12, R13, R14, R15 }, \ | |||
{ R16, R17, R18, ___, ___ } \ | |||
} | |||
#endif |
@ -0,0 +1,16 @@ | |||
MiniAxe | |||
=== | |||
![MiniAxe](https://i.imgur.com/1ApzrCz.jpg) | |||
Yet another split ortholinear keyboard with 3x5+3 keys. | |||
Keyboard Maintainer: [ka2hiro](https://github.com/ka2hiro) [@ka2hiro](https://twitter.com/ka2hiro) | |||
Hardware Supported: MiniAxe PCB, ATMEGA32U4 | |||
Hardware Availability: [@ka2hiro](https://twitter.com/ka2hiro) | |||
Make example for this keyboard (after setting up your build environment): | |||
make miniaxe:default:dfu | |||
See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). |
@ -0,0 +1,88 @@ | |||
SRC += matrix.c | |||
# MCU name | |||
#MCU = at90usb1286 | |||
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 | |||
# Bootloader selection | |||
# Teensy halfkay | |||
# Pro Micro caterina | |||
# Atmel DFU atmel-dfu | |||
# LUFA DFU lufa-dfu | |||
# QMK DFU qmk-dfu | |||
# atmega32a bootloadHID | |||
BOOTLOADER = atmel-dfu | |||
# If you don't know the bootloader type, then you can specify the | |||
# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line | |||
# Teensy halfKay 512 | |||
# Teensy++ halfKay 1024 | |||
# Atmel DFU loader 4096 | |||
# LUFA bootloader 4096 | |||
# USBaspLoader 2048 | |||
# OPT_DEFS += -DBOOTLOADER_SIZE=4096 | |||
# Build Options | |||
# change yes to no to disable | |||
# | |||
BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) | |||
MOUSEKEY_ENABLE = no # Mouse keys(+4700) | |||
EXTRAKEY_ENABLE = yes # Audio control and System control(+450) | |||
CONSOLE_ENABLE = no # Console for debug(+400) | |||
COMMAND_ENABLE = no # 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 | |||
RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow | |||
MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config) | |||
UNICODE_ENABLE = no # Unicode | |||
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID | |||
AUDIO_ENABLE = no # Audio output on port C6 | |||
FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches | |||
HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) | |||
DEBUG_ENABLE = no | |||
CUSTOM_MATRIX = yes # Use custom matrix code | |||
SPLIT_KEYBOARD = yes # Use shared split_common code | |||