Merge pull request #996 from milestogo/master

kinesis keyboard with subdirectories for different hardware - matches pull #911
pull/1013/head
Jack Humbert 8 years ago committed by GitHub
commit 81b89f8b2b

@ -1,3 +1,5 @@
SUBPROJECT_DEFAULT = alvicstep
ifndef MAKEFILE_INCLUDED
include ../../Makefile
endif

@ -0,0 +1,3 @@
ifndef MAKEFILE_INCLUDED
include ../../../Makefile
endif

@ -0,0 +1,105 @@
#include "kinesis.h"
// begin section origin https://github.com/alvicstep/tmk_keyboard
void all_led_off(void)
{
PORTD = 0b11111111;
}
void all_led_on(void)
{
PORTD = 0b00000000;
}
void num_lock_led_on(void)
{
PORTD = 0b11101111;
}
void caps_lock_led_on(void)
{
PORTD = 0b01111111;
}
void scroll_lock_led_on(void)
{
PORTD = 0b11011111;
}
void keypad_led_on(void)
{
PORTD = 0b10111111;
}
void blink_all_leds(void)
{
all_led_on();
_delay_ms(500);
all_led_off();
_delay_ms(100);
caps_lock_led_on();
_delay_ms(100);
num_lock_led_on();
_delay_ms(100);
scroll_lock_led_on();
_delay_ms(100);
keypad_led_on();
_delay_ms(100);
//back
scroll_lock_led_on();
_delay_ms(100);
num_lock_led_on();
_delay_ms(100);
caps_lock_led_on();
_delay_ms(100);
all_led_off();
}
// End section origin https://github.com/alvicstep/tmk_keyboard
void matrix_init_kb(void) {
blink_all_leds();
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
//Copyright 2014 Warren Janssens <warren.janssens@gmail.com>
uint8_t leds = 0xF0;
if (usb_led & 1 << USB_LED_NUM_LOCK)
leds &= ~0x10;
if (usb_led & 1 << USB_LED_CAPS_LOCK)
leds &= ~0x80;
if (usb_led & 1 << USB_LED_SCROLL_LOCK)
leds &= ~0x20;
PORTD = (PORTD & 0x0F) | leds;
led_set_user(usb_led);
}

@ -0,0 +1,67 @@
#ifndef KINESIS_ALVICSTEP_H
#define KINESIS_ALVICSTEP_H
#include "../kinesis.h"
#define KEYMAP( \
k02,k22,k12,k01,k21,k11,k00,k20,k10, \
k80,k70,k60,k50,k40,k30, \
k81,k71,k61,k51,k41,k31, \
k82,k72,k62,k52,k42,k32, \
k83,k73,k63,k53,k43,k33, \
k74,k64,k54,k34, \
k36,k35, \
k55, \
k56,k46,k75, \
k03,k23,k13,k04,k24,k14,k05,k85,k84, \
k94,kA4,kB4,kD4,kE4,kF4, \
k95,kA5,kB5,kD5,kE5,kF5, \
k96,kA6,kB6,kD6,kE6,kF6, \
k97,kA7,kB7,kD7,kE7,kF7, \
k93,kB3,kD3,kE3, \
k47,k66, \
k67, \
k87,k76,k86 \
) { \
{ k00, k01, k02, k03, k04, k05, KC_NO, KC_NO }, \
{ k10, k11, k12, k13, k14, KC_NO, KC_NO, KC_NO }, \
{ k20, k21, k22, k23, k24, KC_NO, KC_NO, KC_NO }, \
{ k30, k31, k32, k33, k34, k35, k36, KC_NO }, \
{ k40, k41, k42, k43, KC_NO, KC_NO, k46, k47 }, \
{ k50, k51, k52, k53, k54, k55, k56, KC_NO }, \
{ k60, k61, k62, k63, k64, KC_NO, k66, k67 }, \
{ k70, k71, k72, k73, k74, k75, k76, KC_NO }, \
{ k80, k81, k82, k83, k84, k85, k86, k87}, \
{ KC_NO, KC_NO ,KC_NO ,k93, k94, k95, k96, k97}, \
{ KC_NO, KC_NO ,KC_NO ,KC_NO, kA4, kA5, kA6, kA7}, \
{ KC_NO, KC_NO ,KC_NO ,kB3, kB4, kB5, kB6, kB7}, \
{ KC_NO, KC_NO ,KC_NO ,KC_NO, KC_NO, KC_NO, KC_NO, KC_NO}, \
{ KC_NO, KC_NO ,KC_NO ,kD3, kD4, kD5, kD6, kD7}, \
{ KC_NO, KC_NO ,KC_NO ,kE3, kE4, kE5, kE6, kE7}, \
{ KC_NO, KC_NO ,KC_NO ,KC_NO, kF4, kF5, kF6, kF7} \
}
/* Row pin configuration
PF0 A
PF1 B
PF2 C
PF3 G 0 = U4, 1 = U5
r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 rA rB rC rD rE rF
PB0 c0| f6 f8 f7 5 4 3 2 1 =+
PB1 c1| f3 f5 f4 t r e w q TAB
PB2 c2| ESC f2 f1 g f d s a CL
PB3 c3| f9 f11 f10 b v c x z LS UP DN [{ ]}
PB4 c4| f12 SL PS RT LT §± `~ 6 7 8 9 0 -_
PB5 c5| PB PGM KPD y u i o p \
PB6 c6| LC DL BS RC EN SP h j k l ;: '"
PB7 c7| RA PU PD n m ,< .> /? RS
*/
#endif

@ -0,0 +1,35 @@
#ifndef ALVICSTEP_CONFIG_H
#define ALVICSTEP_CONFIG_H
#include "../config.h"
/* USB Device descriptor parameter */
#define PRODUCT_ID 0x6060
#define DEVICE_VER 0x0001
/* key matrix size */
#define MATRIX_ROWS 16
#define MATRIX_COLS 8
/*
* 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)
*
*/
//Passed through the port multipler, so 4 pins =16
#define MATRIX_ROW_PINS { F0,F1, F2, F3 }
// May be upside down.
#define MATRIX_COL_PINS { B0,B1, B2, B3, B4, B5, B6, B7 }
#define UNUSED_PINS
/* COL2ROW or ROW2COL */
#define DIODE_DIRECTION COL2ROW
#endif

Before

Width:  |  Height:  |  Size: 174 KiB

After

Width:  |  Height:  |  Size: 174 KiB

Before

Width:  |  Height:  |  Size: 336 KiB

After

Width:  |  Height:  |  Size: 336 KiB

Before

Width:  |  Height:  |  Size: 260 KiB

After

Width:  |  Height:  |  Size: 260 KiB

Before

Width:  |  Height:  |  Size: 171 KiB

After

Width:  |  Height:  |  Size: 171 KiB

@ -0,0 +1,46 @@
kinesis-advantage keyboard firmware
======================
This directory is called alvicstep because https://github.com/alvicstep did the heavy work and took the photos in the doc directory.
alvicstep did NOT do anything related to the QMK implementation, so don't bug him/her.
There are other ways of replacing the CPU in the kinesis, this one uses jumper wires from the Teensy to the original DIP socket
## Kinesis specific information
This is a port of https://github.com/alvicstep/tmk_keyboard,
which is a fork of https://github.com/wjanssens/tmk_keyboard,
which is based on work from https://github.com/chrisandreae/keyboard-firmware
If you replace the kinesis CPU as described in the doc folder, then this code should allow you to use QMK.
I've tested with a Teensy 2++, remember to change the CPU if you use a 32u4 instead.
Not yet implemented:
- Kinesis EEProm reading or writing
- Audio - this should be simple if we remove hardcoded pins from audio.h and switch to E7
## Quantum MK Firmware
For the full Quantum feature list, see [the parent readme.md](/doc/readme.md).
## Building
Download or clone the whole firmware and navigate to the keyboards/kinesis-advantage folder. Once your dev env is setup, you'll be able to type `make` to generate your .hex - you can then use the Teensy Loader to program your .hex file.
Depending on which keymap you would like to use, you will have to compile slightly differently.
### Default
To build with the default keymap, simply run `make`.
### Other Keymaps
Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create a folder with the name of your keymap in the keymaps folder, and see keymap documentation (you can find in top readme.md) and existant keymap files.
To build the firmware binary hex file with a keymap just do `make` with `keymap` option like:
$ make keymap=[default|jack|<name>]
Keymaps follow the format **__keymap.c__** and are stored in folders in the `keymaps` folder, eg `keymaps/my_keymap/`

@ -0,0 +1,10 @@
ifndef QUANTUM_DIR
include ../../../Makefile
endif
# just silently stop, since we need to upload with teensy uploader
upload: build

@ -22,58 +22,22 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
/* USB Device descriptor parameter */
#define VENDOR_ID 0xFEED
#define PRODUCT_ID 0x6060
#define DEVICE_VER 0x0001
#define MANUFACTURER You
#define PRODUCT kinesis-advantage
#define DESCRIPTION A custom keyboard
// Mouse
#define MOUSEKEY_DELAY 20
#define MOUSEKEY_DELAY 60
#define MOUSEKEY_INTERVAL 20
#define MOUSEKEY_MAX_SPEED 4
#define MOUSEKEY_TIME_TO_MAX 20
#define MOUSEKEY_TIME_TO_MAX 10
#define MOUSEKEY_WHEEL_MAX_SPEED 1
#define MOUSEKEY_WHEEL_DELTA 1
#define MOUSEKEY_WHEEL_TIME_TO_MAX 1
/* key matrix size */
#define MATRIX_ROWS 16
#define MATRIX_COLS 8
/*
* 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)
*
*/
//Passed through the port multipler, so 4 pins =16
#define MATRIX_ROW_PINS { F0,F1, F2, F3 }
// May be upside down.
#define MATRIX_COL_PINS { B0,B1, B2, B3, B4, B5, B6, B7 }
#define UNUSED_PINS
/* COL2ROW or ROW2COL */
#define DIODE_DIRECTION COL2ROW
// #define BACKLIGHT_PIN B7
// #define BACKLIGHT_BREATHING
// #define BACKLIGHT_LEVELS 3
/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
#define DEBOUNCING_DELAY 5
/* define if matrix has ghost (lacks anti-ghosting diodes) */
//#define MATRIX_HAS_GHOST
/* number of backlight levels */
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
#define LOCKING_SUPPORT_ENABLE
/* Locking resynchronize hack */
@ -171,4 +135,13 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
//#define NO_ACTION_MACRO
//#define NO_ACTION_FUNCTION
#ifdef SUBPROJECT_alvicstep
#include "alvicstep/config.h"
#endif
#ifdef SUBPROJECT_stapelberg
#include "stapelberg/config.h"
#endif
#endif

@ -1,10 +1,6 @@
#include "kinesis.h"
#include "action_layer.h"
#define QWERTY 0 // Base qerty
#define SYMB 1// Symbol layer
// An almost entirely blank keymap. Test layers with the upper right hand key - 1 in normal mode, reset in layer 2.
#define QWERTY 0 // Base qwerty
/****************************************************************************************************
@ -33,7 +29,6 @@
* `--------------------' `--------------------'
*/
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[QWERTY] = KEYMAP(
KC_ESC, KC_F1 ,KC_F2 ,KC_F3 ,KC_F4 ,KC_F5 ,KC_F6 ,KC_F7 ,KC_F8,
@ -45,7 +40,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KC_LCTL,KC_LALT,
KC_HOME,
KC_BSPC,KC_DEL ,KC_END ,
KC_F9 ,KC_F10 ,KC_F11 ,KC_F12 ,KC_PSCR ,KC_SLCK ,KC_PAUS, KC_FN0, KC_1,
KC_F9 ,KC_F10 ,KC_F11 ,KC_F12 ,KC_PSCR ,KC_SLCK ,KC_PAUS, KC_FN0, KC_1,
KC_6 ,KC_7 ,KC_8 ,KC_9 ,KC_0 ,KC_MINS,
KC_Y ,KC_U ,KC_I ,KC_O ,KC_P ,KC_BSLS,
KC_H ,KC_J ,KC_K ,KC_L ,KC_SCLN,KC_QUOT,
@ -54,32 +49,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KC_RGUI,KC_RCTL,
KC_PGUP,
KC_PGDN,KC_ENTER ,KC_SPC
),
[SYMB] = KEYMAP(
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_FN0, RESET,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS
)
};
const uint16_t PROGMEM fn_actions[] = {
[0] = ACTION_LAYER_TAP_TOGGLE(SYMB) , // FN1 - Momentary Layer 1 (Symbols)
const uint16_t PROGMEM fn_actions[] = {
};

@ -0,0 +1,93 @@
#include "kinesis.h"
#define _DVORAK 0 // Base Dvorak layer
#define _MEDIA 1 // Media layer
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_DVORAK] = KEYMAP(
// left hand
KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8,
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5,
KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y,
KC_BSPC, KC_A, KC_O, KC_E, KC_U, KC_I,
KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X,
KC_ESC, KC_LBRC, KC_DOWN, KC_UP,
// left thumb
KC_LGUI, KC_LCTL,
KC_LALT,
KC_BSPC, KC_DEL, TG(_MEDIA),
// right hand
KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, KC_FN0, KC_1,
KC_6, KC_7, KC_8, KC_9, KC_0, KC_EQL,
KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH,
KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS,
KC_B, KC_M, KC_W, KC_V, KC_Z, KC_RSFT,
KC_LEFT, KC_RIGHT, KC_RBRC, KC_BSLS,
// right thumb
KC_RCTL, KC_RGUI,
KC_RALT,
TG(_MEDIA), KC_ENT, KC_SPC
),
[_MEDIA] = KEYMAP(
// left hand
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
KC_NO, KC_BTN4, KC_BTN3, KC_BTN2, KC_BTN1, KC_NO,
KC_NO, KC_NO, KC_MUTE, KC_VOLD, KC_VOLU, KC_NO,
KC_NO, KC_NO, KC_MS_D, KC_MS_U,
// left thumb
KC_NO, KC_NO,
KC_NO,
KC_NO, KC_NO, KC_TRNS,
// right hand
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_POWER,
KC_NO, KC_VOLU, KC_MS_U, KC_VOLD, KC_NO, KC_NO,
KC_NO, KC_MS_L, KC_MS_D, KC_MS_R, KC_NO, KC_NO,
KC_NO, KC_MPRV, KC_MPLY, KC_MNXT, KC_NO, KC_NO,
KC_MS_L, KC_MS_R, KC_NO, KC_NO,
// right thumb
KC_NO, KC_NO,
KC_NO,
KC_TRNS, KC_ENT, KC_NO
)
};
const uint16_t PROGMEM fn_actions[] = {
};
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
{
// MACRODOWN only works in this function
switch(id) {
case 0:
if (record->event.pressed) {
register_code(KC_RSFT);
} else {
unregister_code(KC_RSFT);
}
break;
}
return MACRO_NONE;
};
void matrix_init_user(void) {
}
void matrix_scan_user(void) {
}
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
return true;
}
void led_set_user(uint8_t usb_led) {
}

@ -0,0 +1,21 @@
# Build Options
# change to "no" to disable the options, or define them in the Makefile in
# the appropriate keymap folder that will get included automatically
#
BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000)
MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
CONSOLE_ENABLE = no # Console for debug(+400)
COMMAND_ENABLE = yes # Commands for debug and configuration
NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
MIDI_ENABLE = no # MIDI controls
AUDIO_ENABLE = no # Audio output on port C6
UNICODE_ENABLE = no # Unicode
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time.
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
ifndef QUANTUM_DIR
include ../../../../Makefile
endif

@ -0,0 +1,8 @@
#ifndef CONFIG_USER_H
#define CONFIG_USER_H
#include "../../config.h"
// place overrides here
#endif

@ -2,10 +2,10 @@
#include "action_layer.h"
#include "mousekey.h"
#define QWERTY 0 // Base qerty
#define SYMB 1// Symbol layer
#define MOUSE 2//
#define _QWERTY 0 // Base qerty
#define _SYMB 1// Symbol layer
#define _MOUSE 2//
#define _TRANS 3//
@ -20,27 +20,26 @@ enum {
};
// Borrowing very heavily from
// https://github.com/alvicstep/tmk_keyboard
// Why so many gui keys, why not just map all the OS X stuff to buttons? Good question.
/****************************************************************************************************
*
* Keymap: Default Layer in Qwerty
*
* ,-------------------------------------------------------------------------------------------------------------------.
* | Esc | F1 | F2 | F3 | F4 | F5 | F6 | F8 | F9 | F10 | F12 | FN0 | FN1 | FN2 | | bOOT |
* | ESC | F1 | F2 | F3 | F4 | F5 | F6 | F8 | F9 | F10 | F12 | FN0 | FN1 | FN2 | | bOOT |
* |--------+------+------+------+------+------+---------------------------+------+------+------+------+------+--------|
* | =+ | 1! | 2@ | 3# | 4$ | 5% | | 6^ | 7& | 8* | 9( | 0) | -_ |
* |--------+------+------+------+------+------| +------+------+------+------+------+--------|
* | Tab | Q | W | E | R | T | | Y | U | I | O | P | \| |
* |--------+------+------+------+------+------| |------+------+------+------+------+--------|
* |MouseFN1| A | S | D | F | G | | H | J | K | L | ;: | '" |
* |MouseFN0| A | S | D | F | G | | H | J | K | L | ;: | '" |
* |--------+------+------+------+------+------| |------+------+------+------+------+--------|
* | Shift | Z | X | C | V | B | | N | M | ,. | .> | /? | Shift |
* `--------+------+------+------+------+------- `------+------+------+------+------+--------'
* | `~ | ESC |MOUSE1|MOUSE2| | [{ | ]} | ESC | GUI |
* | ~` | ESC |GUI/L |L1/RT | | L1/UP|GUI/DN| [{ | ]} |
* `---------------------------' `---------------------------'
* ,-------------. ,-------------.
* | Ctrl | Alt | | Gui | Ctrl |
* | CTRL | GUI | | ALT | GUI |
* ,------|------|------| |------+------+------.
* | | | Home | | PgUp | | |
* | BkSp | Del |------| |------|Return| Space|
@ -48,16 +47,15 @@ enum {
* `--------------------' `--------------------'
*/
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[QWERTY] = KEYMAP(
[_QWERTY] = KEYMAP(
KC_ESC, KC_F1 ,KC_F2 ,KC_F3 ,KC_F4 ,KC_F5 ,KC_F6 ,KC_F7 ,KC_F8,
KC_EQL, KC_1 ,KC_2 ,KC_3 ,KC_4 ,KC_5 ,
KC_TAB, KC_Q ,KC_W ,KC_E ,KC_R ,KC_T ,
KC_FN1 ,KC_A ,KC_S ,KC_D ,KC_F ,KC_G ,
KC_FN0 ,KC_A ,KC_S ,KC_D ,KC_F ,KC_G ,
KC_LSFT,KC_Z ,KC_X ,KC_C ,KC_V ,KC_B ,
KC_GRV ,KC_ESC, KC_BTN1,KC_BTN2,
KC_LCTL,KC_LALT,
KC_GRAVE, KC_ESC, KC_FN4, KC_FN5,
KC_LCTL,KC_LGUI,
KC_HOME,
KC_BSPC,KC_DEL ,KC_FN0 ,
KC_F9 ,KC_F10 ,KC_F11 ,KC_F12 ,KC_FN0 ,KC_FN1 ,KC_FN2, KC_NO, RESET,
@ -65,18 +63,45 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KC_Y ,KC_U ,KC_I ,KC_O ,KC_P ,KC_BSLS,
KC_H ,KC_J ,KC_K ,KC_L ,KC_SCLN,KC_QUOT,
KC_N ,KC_M ,KC_COMM,KC_DOT ,KC_SLSH,KC_RSFT,
KC_LBRC,KC_RBRC, KC_ESC, KC_RGUI,
KC_RGUI,KC_RCTL,
KC_FN6, KC_FN7, KC_LBRC ,KC_RBRC,
KC_RALT,KC_RGUI,
KC_PGUP,
KC_PGDN,KC_ENTER ,KC_SPC
),
[SYMB] = KEYMAP(
/* _SYMBol level
*
* ,-------------------------------------------------------------------------------------------------------------------.
* | | | | | | | | | | | | | | | | bOOT |
* |--------+------+------+------+------+------+---------------------------+------+------+------+------+------+--------|
* | | | * | # | | | | | | | | | |
* |--------+------+------+------+------+------| +------+------+------+------+------+--------|
* | | / | [ | ] | | | | | | | | | |
* |--------+------+------+------+------+------| |------+------+------+------+------+--------|
* | | | { | } | | | | | | | | | |
* |--------+------+------+------+------+------| |------+------+------+------+------+--------|
* | | = | ( | ) | | | | | | | | | |
* `--------+------+------+------+------+------- `------+------+------+------+------+--------'
* | | |GUI/L |L1/RT | | L1/UP|GUI/DN| { | } |
* `---------------------------' `---------------------------'
* ,-------------. ,-------------.
* | CTRL | GUI | | ALT | GUI |
* ,------|------|------| |------+------+------.
* | | | Home | | PgUp | | |
* | BkSp | Del |------| |------|Mouse1|Mouse2|
* | | | End | | PgDn |LClick|Rclick|
* `--------------------' `--------------------'
*/
[_SYMB] = KEYMAP(
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_ASTR, KC_HASH, KC_TRNS, KC_TRNS,
KC_TRNS, KC_SLSH, KC_LBRC, KC_RBRC, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, RSFT(KC_LBRC), RSFT(KC_RBRC), KC_TRNS, KC_TRNS,
KC_TRNS, KC_EQL, RSFT(KC_9), RSFT(KC_0), KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_FN4, KC_FN5,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS,
@ -85,7 +110,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_FN6, KC_FN7, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS
@ -103,10 +128,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* |--------+------+------+------+------+------| |------+------+------+------+------+--------|
* | | GuiZ | GUI X| GUI C| GUI_V|PgDown| | MWD | MDown|MS Dwn|MS_DR | ? | |
* `--------+------+------+------+------+------- `------+------+------+------+------+--------'
* | `~ | ESC | < | > | | { | } | ESC | |
* | `~ | ESC | | | | | | { | } |
* `---------------------------' `---------------------------'
* ,-------------. ,-------------.
* | Ctrl | Alt | | Gui | Ctrl |
* | CTRL | GUI | | ALT | GUI |
* ,------|------|------| |------+------+------.
* | | | Home | | PgUp | | |
* | BkSp | Del |------| |------|Mouse1|Mouse2|
@ -115,13 +140,13 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
*/
[MOUSE] = KEYMAP(
[_MOUSE] = KEYMAP(
KC_CAPS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_EXLM ,KC_AT, KC_HASH, KC_DLR ,KC_PERC ,
KC_TRNS, KC_NO, KC_NO, KC_UP, KC_NO, KC_PGUP,
KC_FN1, LCTL(KC_A),KC_LEFT, KC_DOWN, KC_RIGHT, LCTL(KC_E),
KC_TRNS, LGUI(KC_Z),LGUI(KC_X),LGUI(KC_C),LGUI(KC_V),KC_PGDN,
KC_TRNS, KC_TRNS, KC_LABK, KC_RABK,
KC_TRNS, KC_TRNS, KC_NO, KC_NO,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS,
@ -129,20 +154,75 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_ACL2,
KC_WH_U, M(A_MUL), KC_MS_U, M(A_MUR), KC_NO, KC_ACL1,
KC_NO, KC_MS_L, KC_MS_D, KC_MS_R, KC_NO, KC_ACL0,
KC_WH_D, M(A_MDL), KC_MS_D, M(A_MDR), KC_TRNS, KC_TRNS,
KC_LCBR, KC_RCBR, KC_ESC, KC_TRNS,
KC_WH_D, M(A_MDL), KC_MS_D, M(A_MDR), RSFT(KC_LBRC), RSFT(KC_RBRC),
KC_LCBR, KC_RCBR, KC_NO, KC_NO,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_BTN1, KC_BTN2
),
/* EMPTY
*
* ,-------------------------------------------------------------------------------------------------------------------.
* | | | | | | | | | | | | | | | | bOOT |
* |--------+------+------+------+------+------+---------------------------+------+------+------+------+------+--------|
* | | | | | | | | | | | | | |
* |--------+------+------+------+------+------| +------+------+------+------+------+--------|
* | | | | | | | | | | | | | |
* |--------+------+------+------+------+------| |------+------+------+------+------+--------|
* | | | | | | | | | | | | | |
* |--------+------+------+------+------+------| |------+------+------+------+------+--------|
* | | | | | | | | | | | | | |
* `--------+------+------+------+------+------- `------+------+------+------+------+--------'
* | | | | | | | | | |
* `---------------------------' `---------------------------'
* ,-------------. ,-------------.
* | Ctrl | Alt | | Gui | Ctrl |
* ,------|------|------| |------+------+------.
* | | | Home | | PgUp | | |
* | BkSp | Del |------| |------|Mouse1|Mouse2|
* | | | End | | PgDn |LClick|Rclick|
* `--------------------' `--------------------'
*/
[_TRANS] = KEYMAP(
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_FN10, KC_FN11, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_FN0, KC_2,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS
),
};
const uint16_t PROGMEM fn_actions[] = {
[0] = ACTION_LAYER_TAP_TOGGLE(MOUSE) , // FN1 - Momentary Layer 1 (Symbols)
[1] = ACTION_LAYER_TOGGLE(MOUSE) , // FN1 - Momentary Layer 1 (Symbols)
[2] = ACTION_LAYER_TAP_TOGGLE(SYMB) , // FN1 - Momentary Layer 1 (Symbols)
[0] = ACTION_LAYER_TAP_TOGGLE(_MOUSE) ,
[1] = ACTION_LAYER_TOGGLE(_MOUSE) ,
[2] = ACTION_LAYER_TAP_TOGGLE(_SYMB) ,
[5]= ACTION_LAYER_TAP_KEY(_SYMB,KC_RIGHT),
[4]= ACTION_MODS_TAP_KEY(MOD_LGUI,KC_LEFT),
[6]= ACTION_LAYER_TAP_KEY(_SYMB,KC_UP),
[7]= ACTION_MODS_TAP_KEY(MOD_LGUI,KC_DOWN),
};
@ -214,18 +294,23 @@ void matrix_init_user(void) {
}
void matrix_scan_user(void) {
#ifdef ALVICSTEP_CONFIG_H
int8_t layer = biton32(layer_state);
switch (layer) {
case 1:
all_led_off();
break;
case 2:
if (!(host_keyboard_leds() & (1 << USB_LED_CAPS_LOCK))) {
all_led_off();
caps_lock_led_on();
}
break;
case 2:
if (!(host_keyboard_leds() & (1 << USB_LED_SCROLL_LOCK))) {
all_led_off();
scroll_lock_led_on();
}
case 0:
all_led_off();
num_lock_led_on();
@ -233,6 +318,7 @@ void matrix_scan_user(void) {
default:
break;
}
#endif
}

@ -1,106 +1 @@
#include "kinesis.h"
// begin section origin https://github.com/alvicstep/tmk_keyboard
void all_led_off(void)
{
PORTD = 0b11111111;
}
void all_led_on(void)
{
PORTD = 0b00000000;
}
void num_lock_led_on(void)
{
PORTD = 0b11101111;
}
void caps_lock_led_on(void)
{
PORTD = 0b01111111;
}
void scroll_lock_led_on(void)
{
PORTD = 0b11011111;
}
void keypad_led_on(void)
{
PORTD = 0b10111111;
}
void blink_all_leds(void)
{
all_led_on();
_delay_ms(500);
all_led_off();
_delay_ms(100);
caps_lock_led_on();
_delay_ms(100);
num_lock_led_on();
_delay_ms(100);
scroll_lock_led_on();
_delay_ms(100);
keypad_led_on();
_delay_ms(100);
//back
scroll_lock_led_on();
_delay_ms(100);
num_lock_led_on();
_delay_ms(100);
caps_lock_led_on();
_delay_ms(100);
all_led_off();
}
// End section origin https://github.com/alvicstep/tmk_keyboard
void matrix_init_kb(void) {
blink_all_leds();
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
//Copyright 2014 Warren Janssens <warren.janssens@gmail.com>
uint8_t leds = 0xF0;
if (usb_led & 1 << USB_LED_NUM_LOCK)
leds &= ~0x10;
if (usb_led & 1 << USB_LED_CAPS_LOCK)
leds &= ~0x80;
if (usb_led & 1 << USB_LED_SCROLL_LOCK)
leds &= ~0x20;
PORTD = (PORTD & 0x0F) | leds;
led_set_user(usb_led);
}

@ -1,67 +1,23 @@
#ifndef KINESIS_H
#define KINESIS_H
#include "quantum.h"
// The first section contains all of the arguements
// The second converts the arguments into a two-dimensional array
#ifdef SUBPROJECT_alvicstep
#include "alvicstep.h"
#endif
#ifdef SUBPROJECT_stapelberg
#include "stapelberg.h"
#endif
#define KEYMAP( \
k02,k22,k12,k01,k21,k11,k00,k20,k10, \
k80,k70,k60,k50,k40,k30, \
k81,k71,k61,k51,k41,k31, \
k82,k72,k62,k52,k42,k32, \
k83,k73,k63,k53,k43,k33, \
k74,k64,k54,k34, \
k36,k35, \
k55, \
k56,k46,k75, \
k03,k23,k13,k04,k24,k14,k05,k85,k84, \
k94,kA4,kB4,kD4,kE4,kF4, \
k95,kA5,kB5,kD5,kE5,kF5, \
k96,kA6,kB6,kD6,kE6,kF6, \
k97,kA7,kB7,kD7,kE7,kF7, \
k93,kB3,kD3,kE3, \
k47,k66, \
k67, \
k87,k76,k86 \
) { \
{ k00, k01, k02, k03, k04, k05, KC_NO, KC_NO }, \
{ k10, k11, k12, k13, k14, KC_NO, KC_NO, KC_NO }, \
{ k20, k21, k22, k23, k24, KC_NO, KC_NO, KC_NO }, \
{ k30, k31, k32, k33, k34, k35, k36, KC_NO }, \
{ k40, k41, k42, k43, KC_NO, KC_NO, k46, k47 }, \
{ k50, k51, k52, k53, k54, k55, k56, KC_NO }, \
{ k60, k61, k62, k63, k64, KC_NO, k66, k67 }, \
{ k70, k71, k72, k73, k74, k75, k76, KC_NO }, \
{ k80, k81, k82, k83, KC_NO ,KC_NO, k86, k87}, \
{ KC_NO, KC_NO ,KC_NO ,k93, k94, k95, k96, k97}, \
{ KC_NO, KC_NO ,KC_NO ,KC_NO, kA4, kA5, kA6, kA7}, \
{ KC_NO, KC_NO ,KC_NO ,kB3, kB4, kB5, kB6, kB7}, \
{ KC_NO, KC_NO ,KC_NO ,KC_NO, KC_NO, KC_NO, k84, k85}, \
{ KC_NO, KC_NO ,KC_NO ,kD3, kD4, kD5, kD6, kD7}, \
{ KC_NO, KC_NO ,KC_NO ,kE3, kE4, kE5, kE6, kE7}, \
{ KC_NO, KC_NO ,KC_NO ,KC_NO, kF4, kF5, kF6, kF7} \
}
#include "quantum.h"
/* 4y0 A 4y1 B 4y2 4y3 D 4y4 E 4y5 F 4y6 G 4y7 H 5y0 I 5y1 J 5y2 K 5y3 L 5y4 M 5y5 N 5y6 O 5y7 P */
void all_led_off(void);
void all_led_on(void);
void num_lock_led_on(void);
void caps_lock_led_on(void);
void scroll_lock_led_on(void);
void keypad_led_on(void);
/*
0 1 2 3 4 5 6 7 8 9 A B C D E F
A B C D E F G H I J K L M N O P
4y0 4y1 4y2 4y3 4y4 4y5 4y6 4y7 5y0 5y1 5y2 5y3 5y4 5y5 5y6 5y7
r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 r15
0 PB0 21 c0 f6 f8 f7 5 4 3 2 1 =+
1 PB1 22 c1 f3 f5 f4 t r e w q TAB
2 PB2 23 c2 ESC f2 f1 g f d s a CL
3 PB3 24 c3 f9 f11 f10 b v c x z LS UP DN [{ ]}
4 PB4 25 c4 f12 SL PS RT LT §± `~ 6 7 8 9 0 -_
5 PB5 26 c5 PB PGM KPD LA HM END y u i o p \
6 PB6 27 c6 LC DEL BS RC ENT SP h j k l ;: '"
7 PB7 28 c7 RA PU PD n m ,< .> /? RS
*/
#endif

@ -1,42 +1,12 @@
kinesis-advantage keyboard firmware
======================
# Firmware for the Kinesis advantage keyboard
## Kinesis specific information
This is a port of https://github.com/alvicstep/tmk_keyboard,
which is a fork of https://github.com/wjanssens/tmk_keyboard,
which is based on work from https://github.com/chrisandreae/keyboard-firmware
There are at least two different ways to replace the controller in this keyboard.
If you replace the kinesis CPU as described in the doc folder, then this code should allow you to use QMK.
I've tested with a Teensy 2++, remember to change the CPU if you use a 32u4 instead.
The Stapelberg folder contains the docs and configuration for using the custom controller created by Michael Stapelberg.
Not yet implemented:
- Kinesis EEProm reading or writing
- Audio - this should be simple if we remove hardcoded pins from audio.h and switch to E7
The alvicstep folder contains docs and configuration for directly wiring a Teensy2++ to the existing controller board. This follows the pinouts described in https://github.com/alvicstep/tmk_keyboard, which is where the name comes from.
## Keymaps
Both hardware solutions should work with the same keymaps
## Quantum MK Firmware
For the full Quantum feature list, see [the parent readme.md](/doc/readme.md).
## Building
Download or clone the whole firmware and navigate to the keyboards/kinesis-advantage folder. Once your dev env is setup, you'll be able to type `make` to generate your .hex - you can then use the Teensy Loader to program your .hex file.
Depending on which keymap you would like to use, you will have to compile slightly differently.
### Default
To build with the default keymap, simply run `make default`.
### Other Keymaps
Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create a folder with the name of your keymap in the keymaps folder, and see keymap documentation (you can find in top readme.md) and existant keymap files.
To build the firmware binary hex file with a keymap just do `make` with a keymap like this:
```
$ make [default|jack|<name>]
```
Keymaps follow the format **__keymap.c__** and are stored in folders in the `keymaps` folder, eg `keymaps/my_keymap/`

@ -0,0 +1,3 @@
ifndef MAKEFILE_INCLUDED
include ../../../Makefile
endif

@ -0,0 +1,50 @@
#ifndef STAPELBERG_CONFIG_H
#define STAPELBERG_CONFIG_H
#include "../config.h"
/* USB Device descriptor parameter */
#define PRODUCT_ID 0x6060
#define DEVICE_VER 0x0002
/* key matrix size */
#define MATRIX_ROWS 15
#define MATRIX_COLS 7
/*
* 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 { D0, D1, D2, D3, D4, D5, D6, D7, C0, C1, C2, C3, C4, C5, C6 }
#define MATRIX_COL_PINS { B0, B1, B2, B3, B4, B5, B6 }
#define UNUSED_PINS
/* COL2ROW or ROW2COL */
#define DIODE_DIRECTION COL2ROW
/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
#define DEBOUNCING_DELAY 5
/* don't know if this should be defined at the board or top level. Assuming board
#define MOUSEKEY_DELAY 100
#define MOUSEKEY_INTERVAL 20
#define MOUSEKEY_MAX_SPEED 3
#define MOUSEKEY_TIME_TO_MAX 10
*/
#define IGNORE_MOD_TAP_INTERRUPT
/* key combination for magic key command */
#define IS_COMMAND() ( \
keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
)
#endif

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 117 KiB

@ -0,0 +1,55 @@
# kinesis_stapelberg keyboard firmware
This folder contains the firmware customization required to run QMK on the custom controller for the Kinesis Advantage created by Michael Stapelberg.
It differs from the `alvicstep keyboard in that the existing QMK Kinesis Advantage project uses the existing controller board provided by Kinesis.
The controller board hardware is described
[here](http://michael.stapelberg.de/Artikel/kinesis_custom_controller)
Mapping the pin assignments was done using the corresponding matrix description provided at this
[link](https://github.com/stapelberg/kinesis-firmware/blob/master/kb_kinesis/config.kspec)
This code makes no attempt to drive the four LEDs provided on the controller board.
## Building the Hardware
If you want to perform this customization, these parts may be helpful.
| Function | Quantity | Vendor | Part Number |
| ------------------------------------------------------ | -------- | ------- | ------------ |
| 13 pin connector for function keys and finger keywells | 4 | Digi-Key | WM14526-ND |
| 10 pin headers for thumb clusters | 4 | Digi-Key | 609-3250-ND |
| 8 pin cable for thumb clusters | 2 | Digi-Key | SAM8928-ND |
| Teensy++ 2.0 | 1 | Digi-Key | 1528-1056-ND |
| 2 pin right angle header for reset | 1 | Digi-Key | 3M9467-ND |
| Reset cables | 2 | Sparkfun | PRT-09140 |
The board and connections are shown here
![](images/controller_board.jpg)
The Teensy mounting detail can be seen here.
I used a socket for prototyping.
![](images/teensy_detail.jpg)
Since the proper mounting of the Teensy board places the reset button in a tight space, I added a 2-pin header to the reset and ground pins on the edge of the board.
Shorting these two pins together will reset the board.
I also put female to male header jumper cables on these so they could be accessed outside the enclosure.
The exterior cables can be seen here.
![](images/exterior_reset.jpg)
## Keymaps
### Default
To build with the default keymap, run `make default` while in the
`kinesis_stapelberg` working directory.
### Dvorak
This keymap contains a dvorak implementation as well as media and symbol layers.
Run `make dvorak` while in the `kinesis_stapelberg` working directory.

@ -0,0 +1,10 @@
ifndef QUANTUM_DIR
include ../../../Makefile
endif
# just silently stop, since we need to upload with teensy uploader
upload: build

@ -0,0 +1,28 @@
#include "stapelberg.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,72 @@
#ifndef KINESIS_STAPELBERG_H
#define KINESIS_STAPELBERG_H
#include "quantum.h"
// This a shortcut to help you visually see your layout.
// The first section contains all of the arguments as on the physical keyboard
// The second converts the arguments into the 2-D scanned array
#define KEYMAP( \
kC0,kD0,kE0,kC1,kD1,kE1,kC2,kD2,kE2, \
k00,k10,k20,k30,k40,k50, \
k01,k11,k21,k31,k41,k51, \
k02,k12,k22,k32,k42,k52, \
k03,k13,k23,k33,k43,k53, \
k14,k24,k34,k54, \
k56,k55, \
k35, \
k36,k46,k25, \
kC3,kD3,kE3,kC4,kD4,kE4,kC5,kE5,kD5, \
k60,k70,k80,k90,kA0,kB0, \
k61,k71,k81,k91,kA1,kB1, \
k62,k72,k82,k92,kA2,kB2, \
k63,k73,k83,k93,kA3,kB3, \
k64,k84,k94,kA4, \
k96,k85, \
k86, \
k66,k75,k65 \
) { \
{ k00, k01, k02, k03, KC_NO, KC_NO, KC_NO }, \
{ k10, k11, k12, k13, k14, KC_NO, KC_NO }, \
{ k20, k21, k22, k23, k24, k25, KC_NO }, \
{ k30, k31, k32, k33, k34, k35, k36 }, \
{ k40, k41, k42, k43, KC_NO, KC_NO, k46 }, \
{ k50, k51, k52, k53, k54, k55, k56 }, \
{ k60, k61, k62, k63, k64, k65, k66 }, \
{ k70, k71, k72, k73, KC_NO, k75, KC_NO }, \
{ k80, k81, k82, k83, k84, k85, k86 }, \
{ k90, k91, k92, k93, k94, KC_NO, k96 }, \
{ kA0, kA1, kA2, kA3, kA4, KC_NO, KC_NO }, \
{ kB0, kB1, kB2, kB3, KC_NO, KC_NO, KC_NO }, \
{ kC0, kC1, kC2, kC3, kC4, kC5, KC_NO }, \
{ kD0, kD1, kD2, kD3, kD4, kD5, KC_NO }, \
{ kE0, kE1, kE2, kE3, kE4, kE5, KC_NO } \
}
/*
This is the Stapelberg matrix as published at
https://github.com/stapelberg/kinesis-firmware/blob/master/kb_kinesis/config.kspec
Along with the pins for each row and column
PB0 PB1 PB2 PB3 PB4 PB5 PB6
kx0 kx1 kx2 kx3 kx4 kx5 kx6
PD0 k0x Row: EQL TAB CAP LSH X2 -- --
PD1 k1x Row: 1 Q A Z BQ -- --
PD2 k2x Row: 2 W S X INS END --
PD3 k3x Row: 3 E D C LFT HOM BAK
PD4 k4x Row: 4 R F V -- -- DEL
PD5 k5x Row: 5 T G B RT LAL LCT
PD6 k6x Row: 6 Y H N UP SPC PGD
PD7 k7x Row: 7 U J M -- RET --
PB0 k8x Row: 8 I K COM DWN RCT PGU
PB1 k9x Row: 9 O L PER LBR -- RAL
PB2 kAx Row: 0 P SEM SLA RBR -- --
PB3 kBx Row: MIN BSL APO RSH X1 -- --
PB4 kCx Row: ESC F3 F6 F9 F12 PAU --
PB5 kDx Row: F1 F4 F7 F10 PRT PRG --
PB6 kEx Row: F2 F5 F8 F11 SLK KEY --
*/
#endif
Loading…
Cancel
Save