refactoring layout stuff

- made short keycode macros for the USB keycodes (under "lib/...")
- refactored "keyboard/.../layout.c", to make way for multiple layouts,
  and to make it easier to read (by using short keycode macros)
  - layout.h has a computed include line now, and the code (and layout
    specific header stuff) is in a subdirectory.  the makefile should
    take care of which layout gets included and compiled
- changed kbfun_press() and kbfun_release() to be able to handle the
  modifier keys (instead of requiring a separate function for the
  modifiers)
- added a makefile variable for which keyboard gets compiled.  even
  though there's only one right now
partial-rewrite
Ben Blazak 2012-04-24 23:22:20 -07:00
parent acba260663
commit b7e5e7b735
11 changed files with 520 additions and 149 deletions

View File

@ -1,5 +1,9 @@
/* ----------------------------------------------------------------------------
* key functions: code
*
* These functions may do.. pretty much anything rational that thay like. If
* they want keycodes to be sent to the host in an aggrate report, they're
* responsible for modifying the appropriate report variables.
* ----------------------------------------------------------------------------
* Copyright (c) 2012 Ben Blazak <benblazak.dev@gmail.com>
* Released under The MIT License (MIT) (see "license.md")
@ -43,6 +47,27 @@ void kbfun_press(
uint8_t * keycode, uint8_t * current_layer,
uint8_t * row, uint8_t * col ) {
// modifier keys
switch (*keycode) {
case KEY_LeftControl: keyboard_modifier_keys |= (1<<0);
return;
case KEY_LeftShift: keyboard_modifier_keys |= (1<<1);
return;
case KEY_LeftAlt: keyboard_modifier_keys |= (1<<2);
return;
case KEY_LeftGUI: keyboard_modifier_keys |= (1<<3);
return;
case KEY_RightControl: keyboard_modifier_keys |= (1<<4);
return;
case KEY_RightShift: keyboard_modifier_keys |= (1<<5);
return;
case KEY_RightAlt: keyboard_modifier_keys |= (1<<6);
return;
case KEY_RightGUI: keyboard_modifier_keys |= (1<<7);
return;
}
// all others
for (uint8_t i=0; i<6; i++)
if (keyboard_keys[i] == 0) {
keyboard_keys[i] = *keycode;
@ -54,6 +79,27 @@ void kbfun_release(
uint8_t * keycode, uint8_t * current_layer,
uint8_t * row, uint8_t * col ) {
// modifier keys
switch (*keycode) {
case KEY_LeftControl: keyboard_modifier_keys &= ~(1<<0);
return;
case KEY_LeftShift: keyboard_modifier_keys &= ~(1<<1);
return;
case KEY_LeftAlt: keyboard_modifier_keys &= ~(1<<2);
return;
case KEY_LeftGUI: keyboard_modifier_keys &= ~(1<<3);
return;
case KEY_RightControl: keyboard_modifier_keys &= ~(1<<4);
return;
case KEY_RightShift: keyboard_modifier_keys &= ~(1<<5);
return;
case KEY_RightAlt: keyboard_modifier_keys &= ~(1<<6);
return;
case KEY_RightGUI: keyboard_modifier_keys &= ~(1<<7);
return;
}
// all others
for (uint8_t i=0; i<6; i++)
if (keyboard_keys[i] == *keycode) {
keyboard_keys[i] = 0;
@ -61,35 +107,3 @@ void kbfun_release(
}
}
void kbfun_mod_press(
uint8_t * keycode, uint8_t * current_layer,
uint8_t * row, uint8_t * col ) {
switch (*keycode) {
case KEY_LeftControl: keyboard_modifier_keys |= (1<<0); break;
case KEY_LeftShift: keyboard_modifier_keys |= (1<<1); break;
case KEY_LeftAlt: keyboard_modifier_keys |= (1<<2); break;
case KEY_LeftGUI: keyboard_modifier_keys |= (1<<3); break;
case KEY_RightControl: keyboard_modifier_keys |= (1<<4); break;
case KEY_RightShift: keyboard_modifier_keys |= (1<<5); break;
case KEY_RightAlt: keyboard_modifier_keys |= (1<<6); break;
case KEY_RightGUI: keyboard_modifier_keys |= (1<<7); break;
}
}
void kbfun_mod_release(
uint8_t * keycode, uint8_t * current_layer,
uint8_t * row, uint8_t * col ) {
switch (*keycode) {
case KEY_LeftControl: keyboard_modifier_keys &= ~(1<<0); break;
case KEY_LeftShift: keyboard_modifier_keys &= ~(1<<1); break;
case KEY_LeftAlt: keyboard_modifier_keys &= ~(1<<2); break;
case KEY_LeftGUI: keyboard_modifier_keys &= ~(1<<3); break;
case KEY_RightControl:keyboard_modifier_keys &= ~(1<<4); break;
case KEY_RightShift: keyboard_modifier_keys &= ~(1<<5); break;
case KEY_RightAlt: keyboard_modifier_keys &= ~(1<<6); break;
case KEY_RightGUI: keyboard_modifier_keys &= ~(1<<7); break;
}
}

View File

@ -20,12 +20,6 @@
void kbfun_release(
uint8_t * keycode, uint8_t * current_layer,
uint8_t * row, uint8_t * col );
void kbfun_mod_press(
uint8_t * keycode, uint8_t * current_layer,
uint8_t * row, uint8_t * col );
void kbfun_mod_release(
uint8_t * keycode, uint8_t * current_layer,
uint8_t * row, uint8_t * col );
#endif

View File

@ -1,6 +1,7 @@
/* ----------------------------------------------------------------------------
* keyboard specific exports
* use this file to include the keyboard you're compiling for
*
* Different keyboards are included by modifying a variable in the makefile.
* ----------------------------------------------------------------------------
* Copyright (c) 2012 Ben Blazak <benblazak.dev@gmail.com>
* Released under The MIT License (MIT) (see "license.md")
@ -8,5 +9,5 @@
* ------------------------------------------------------------------------- */
#include "keyboard/ergodox.h" // only supported keyboard right now
#include KEYBOARD

View File

@ -1,94 +0,0 @@
/* ----------------------------------------------------------------------------
* ergoDOX layout specific code
* ----------------------------------------------------------------------------
* Copyright (c) 2012 Ben Blazak <benblazak.dev@gmail.com>
* Released under The MIT License (MIT) (see "license.md")
* Project located at <https://github.com/benblazak/ergodox-firmware>
* ------------------------------------------------------------------------- */
#include "lib/_data-types.h"
#include "lib/_usb/keyboard-usage-page.h"
#include "key-functions.h"
#include "matrix.h"
#include "layout.h"
// error check; everything below assumes these dimensions
#if KB_LAYERS != 1 || KB_ROWS != 12 || KB_COLUMNS != 7
#error "Expecting different keyboard dimensions"
#endif
// TODO (before release): put more effort into this
uint8_t kb_layout[KB_LAYERS][KB_ROWS][KB_COLUMNS] = {
{ // layer 0: default
// right hand
/* 0 -------------------------- 1 -------------------------- 2 -------------------------- 3 -------------------------- 4 -------------------------- 5 -------------------------- 6 -------------------------- */
/* 0 */ { 0, KEY_6_Caret, KEY_7_Ampersand, KEY_8_Asterisk, KEY_9_LeftParenthesis, KEY_0_RightParenthesis, KEY_Dash_Underscore }, /* 0 */
/* 1 */ { 0, KEY_y_Y, KEY_u_U, KEY_i_I, KEY_o_O, KEY_p_P, KEY_LeftBracket_LeftBrace }, /* 1 */
/* 2 */ { 0,/*unused*/ KEY_h_H, KEY_j_J, KEY_k_K, KEY_l_L, KEY_Semicolon_Colon, KEY_SingleQuote_DoubleQuote }, /* 2 */
/* 3 */ { 0, KEY_n_N, KEY_m_M, KEY_Comma_LessThan, KEY_Period_GreaterThan, KEY_Slash_Question, KEY_RightShift }, /* 3 */
/* 4 */ { 0,/*unused*/ 0,/*unused*/ KEY_UpArrow, KEY_DownArrow, KEY_Backslash_Pipe, KEY_RightBracket_RightBrace, 0 }, /* 4 */
/* 5 */ { 0,/*unused*/ KEY_RightControl, KEY_RightAlt, KEY_PageUp, KEY_PageDown, KEY_ReturnEnter, KEY_Spacebar }, /* 5 */
/* 0 -------------------------- 1 -------------------------- 2 -------------------------- 3 -------------------------- 4 -------------------------- 5 -------------------------- 6 -------------------------- */
// left hand
/* 0 -------------------------- 1 -------------------------- 2 -------------------------- 3 -------------------------- 4 -------------------------- 5 -------------------------- 6 -------------------------- */
/* 6 */ { KEY_Equal_Plus, KEY_1_Exclamation, KEY_2_At, KEY_3_Pound, KEY_4_Dollar, KEY_5_Percent, 0 }, /* 6 */
/* 7 */ { KEY_Tab, KEY_q_Q, KEY_w_W, KEY_e_E, KEY_r_R, KEY_t_T, 0 }, /* 7 */
/* 8 */ { KEY_CapsLock, KEY_a_A, KEY_s_S, KEY_d_D, KEY_f_F, KEY_g_G, 0/*unused*/ }, /* 8 */
/* 9 */ { KEY_LeftShift, KEY_z_Z, KEY_x_X, KEY_c_C, KEY_v_V, KEY_b_B, 0 }, /* 9 */
/* A */ { 0, KEY_GraveAccent_Tilde, KEY_Backslash_Pipe, KEY_LeftArrow, KEY_RightArrow, 0,/*unused*/ 0/*unused*/ }, /* A */
/* B */ { KEY_DeleteBackspace, KEY_DeleteForward, KEY_End, KEY_Home, KEY_LeftAlt, KEY_LeftControl, 0/*unused*/ } /* B */
/* 0 -------------------------- 1 -------------------------- 2 -------------------------- 3 -------------------------- 4 -------------------------- 5 -------------------------- 6 -------------------------- */
}
};
kbfun_funptr_t kb_layout_press[KB_LAYERS][KB_ROWS][KB_COLUMNS] = {
{ // layer 0: default
// right hand
/* 0 -------------------------- 1 -------------------------- 2 -------------------------- 3 -------------------------- 4 -------------------------- 5 -------------------------- 6 -------------------------- */
/* 0 */ { NULL, &kbfun_press, &kbfun_press, &kbfun_press, &kbfun_press, &kbfun_press, &kbfun_press }, /* 0 */
/* 1 */ { NULL, &kbfun_press, &kbfun_press, &kbfun_press, &kbfun_press, &kbfun_press, &kbfun_press }, /* 1 */
/* 2 */ { NULL,/*unused*/ &kbfun_press, &kbfun_press, &kbfun_press, &kbfun_press, &kbfun_press, &kbfun_press }, /* 2 */
/* 3 */ { NULL, &kbfun_press, &kbfun_press, &kbfun_press, &kbfun_press, &kbfun_press, &kbfun_mod_press }, /* 3 */
/* 4 */ { NULL,/*unused*/ NULL,/*unused*/ &kbfun_press, &kbfun_press, &kbfun_press, &kbfun_press, NULL }, /* 4 */
/* 5 */ { NULL,/*unused*/ &kbfun_mod_press, &kbfun_mod_press, &kbfun_press, &kbfun_press, &kbfun_press, &kbfun_press }, /* 5 */
/* 0 -------------------------- 1 -------------------------- 2 -------------------------- 3 -------------------------- 4 -------------------------- 5 -------------------------- 6 -------------------------- */
// left hand
/* 0 -------------------------- 1 -------------------------- 2 -------------------------- 3 -------------------------- 4 -------------------------- 5 -------------------------- 6 -------------------------- */
/* 6 */ { &kbfun_press, &kbfun_press, &kbfun_press, &kbfun_press, &kbfun_press, &kbfun_press, NULL }, /* 6 */
/* 7 */ { &kbfun_press, &kbfun_press, &kbfun_press, &kbfun_press, &kbfun_press, &kbfun_press, NULL }, /* 7 */
/* 8 */ { &kbfun_press, &kbfun_press, &kbfun_press, &kbfun_press, &kbfun_press, &kbfun_press, NULL/*unused*/ }, /* 8 */
/* 9 */ { &kbfun_mod_press, &kbfun_press, &kbfun_press, &kbfun_press, &kbfun_press, &kbfun_press, NULL }, /* 9 */
/* A */ { NULL, &kbfun_press, &kbfun_press, &kbfun_press, &kbfun_press, NULL,/*unused*/ NULL/*unused*/ }, /* A */
/* B */ { &kbfun_press, &kbfun_press, &kbfun_press, &kbfun_press, &kbfun_mod_press, &kbfun_mod_press, NULL/*unused*/ } /* B */
/* 0 -------------------------- 1 -------------------------- 2 -------------------------- 3 -------------------------- 4 -------------------------- 5 -------------------------- 6 -------------------------- */
}
};
kbfun_funptr_t kb_layout_release[KB_LAYERS][KB_ROWS][KB_COLUMNS] = {
{ // layer 0: default
// right hand
/* 0 -------------------------- 1 -------------------------- 2 -------------------------- 3 -------------------------- 4 -------------------------- 5 -------------------------- 6 -------------------------- */
/* 0 */ { NULL, &kbfun_release, &kbfun_release, &kbfun_release, &kbfun_release, &kbfun_release, &kbfun_release }, /* 0 */
/* 1 */ { NULL, &kbfun_release, &kbfun_release, &kbfun_release, &kbfun_release, &kbfun_release, &kbfun_release }, /* 1 */
/* 2 */ { NULL,/*unused*/ &kbfun_release, &kbfun_release, &kbfun_release, &kbfun_release, &kbfun_release, &kbfun_release }, /* 2 */
/* 3 */ { NULL, &kbfun_release, &kbfun_release, &kbfun_release, &kbfun_release, &kbfun_release, &kbfun_mod_release }, /* 3 */
/* 4 */ { NULL,/*unused*/ NULL,/*unused*/ &kbfun_release, &kbfun_release, &kbfun_release, &kbfun_release, NULL }, /* 4 */
/* 5 */ { NULL,/*unused*/ &kbfun_mod_release, &kbfun_mod_release, &kbfun_release, &kbfun_release, &kbfun_release, &kbfun_release }, /* 5 */
/* 0 -------------------------- 1 -------------------------- 2 -------------------------- 3 -------------------------- 4 -------------------------- 5 -------------------------- 6 -------------------------- */
// left hand
/* 0 -------------------------- 1 -------------------------- 2 -------------------------- 3 -------------------------- 4 -------------------------- 5 -------------------------- 6 -------------------------- */
/* 6 */ { &kbfun_release, &kbfun_release, &kbfun_release, &kbfun_release, &kbfun_release, &kbfun_release, NULL }, /* 6 */
/* 7 */ { &kbfun_release, &kbfun_release, &kbfun_release, &kbfun_release, &kbfun_release, &kbfun_release, NULL }, /* 7 */
/* 8 */ { &kbfun_release, &kbfun_release, &kbfun_release, &kbfun_release, &kbfun_release, &kbfun_release, NULL/*unused*/ }, /* 8 */
/* 9 */ { &kbfun_mod_release, &kbfun_release, &kbfun_release, &kbfun_release, &kbfun_release, &kbfun_release, NULL }, /* 9 */
/* A */ { NULL, &kbfun_release, &kbfun_release, &kbfun_release, &kbfun_release, NULL,/*unused*/ NULL/*unused*/ }, /* A */
/* B */ { &kbfun_release, &kbfun_release, &kbfun_release, &kbfun_release, &kbfun_mod_release, &kbfun_mod_release, NULL/*unused*/ } /* B */
/* 0 -------------------------- 1 -------------------------- 2 -------------------------- 3 -------------------------- 4 -------------------------- 5 -------------------------- 6 -------------------------- */
}
};

View File

@ -1,5 +1,7 @@
/* ----------------------------------------------------------------------------
* ergoDOX layout specific exports
* ergoDOX layout : exports
*
* Different layouts are included by modifying a variable in the makefile.
* ----------------------------------------------------------------------------
* Copyright (c) 2012 Ben Blazak <benblazak.dev@gmail.com>
* Released under The MIT License (MIT) (see "license.md")
@ -11,11 +13,11 @@
#include "lib/_data-types.h"
#include "key-functions.h"
#include "key-functions.h" // for a pointer typedef
#include "matrix.h"
#include "matrix.h" // for number of rows and columns
#define KB_LAYERS 1 // must match what's defined in "layout.c"
#include KEYBOARD_LAYOUT // for number of layers
extern uint8_t
kb_layout [KB_LAYERS][KB_ROWS][KB_COLUMNS];

View File

@ -1,5 +1,18 @@
# Documentation : layout
Different layouts are included by modifying a variable in the makefile.
To write a new one:
* You must implement everything defined in <layout.h>. Take a look at existing
layouts.
* The number of layers must be defined in the layout *.h file.
* Use `0` for no-operation (unused) keys.
* See <matrix.md> for how the key matrix maps to hardware.
* See </src/lib/_usb/keyboard-usage-page--short-names.h> for available
keycodes.
* See </src/key-functions.c> for what functions keys can call.
## notes
* Assuming 560 bytes for everything else in RAM space, there's 2000 bytes left
@ -7,8 +20,10 @@
usage if you're getting close.
* The layout matricies could be moved to flash memory (program space, instead
of data space), but that doesn't seem necessary at the moment. It would
also be slightly slower, though that probably shouldn't be a concern.
of data space) in order to save RAM, but that doesn't seem necessary at the
moment. It would also be slightly slower, though that probably shouldn't
be a concern.
-------------------------------------------------------------------------------

View File

@ -0,0 +1,105 @@
/* ----------------------------------------------------------------------------
* ergoDOX layout : QWERTY
*
* This is an overly basic implementation. It needs to be replaced.
* ----------------------------------------------------------------------------
* Copyright (c) 2012 Ben Blazak <benblazak.dev@gmail.com>
* Released under The MIT License (MIT) (see "license.md")
* Project located at <https://github.com/benblazak/ergodox-firmware>
* ------------------------------------------------------------------------- */
#include "lib/_data-types.h"
#include "lib/_usb/keyboard-usage-page--short-names.h"
#include "key-functions.h"
#include "../matrix.h"
#include "../layout.h"
// aliases
#define NA 0 // for keys not available on the matrix
#define NOP 0 // for keys that do nothing
#define f_NA NULL // for functions not available on the matrix
#define f_NOP NULL // for functions that do nothing
// ---
#define f_press &kbfun_press
#define f_release &kbfun_release
// error check; everything below assumes these dimensions
#if KB_LAYERS != 1 || KB_ROWS != 12 || KB_COLUMNS != 7
#error "Expecting different keyboard dimensions"
#endif
uint8_t kb_layout[KB_LAYERS][KB_ROWS][KB_COLUMNS] = {
{ // layer 0: default
// right hand
/* ---- 0 ---- ---- 1 ---- ---- 2 ---- ---- 3 ---- ---- 4 ---- ---- 5 ---- ---- 6 ---- */
/* 0 */ { NOP , _6 , _7 , _8 , _9 , _0 , _dash }, /* 0 */
/* 1 */ { NOP , _Y , _U , _I , _O , _P , _bracketL }, /* 1 */
/* 2 */ { NA , _H , _J , _K , _L , _semicolon, _quote }, /* 2 */
/* 3 */ { NOP , _N , _M , _comma , _period , _slash , _shiftR }, /* 3 */
/* 4 */ { NA , NA , _arrowU , _arrowD , _backslash, _bracketR , NOP }, /* 4 */
/* 5 */ { NA , _ctrlR , _altR , _pageU , _pageD , _enter , _space }, /* 5 */
/* ---- 0 ---- ---- 1 ---- ---- 2 ---- ---- 3 ---- ---- 4 ---- ---- 5 ---- ---- 6 ---- */
// left hand
/* ---- 0 ---- ---- 1 ---- ---- 2 ---- ---- 3 ---- ---- 4 ---- ---- 5 ---- ---- 6 ---- */
/* 6 */ { _equal , _1 , _2 , _3 , _4 , _5 , NOP }, /* 6 */
/* 7 */ { _tab , _Q , _W , _E , _R , _T , NOP }, /* 7 */
/* 8 */ { _capsLock , _A , _S , _D , _F , _G , NA }, /* 8 */
/* 9 */ { _shiftL , _Z , _X , _C , _V , _B , NOP }, /* 9 */
/* A */ { NOP , _grave , _backslash, _arrowL , _arrowR , NA , NA }, /* A */
/* B */ { _bs , _del , _end , _home , _altL , _ctrlL , NA } /* B */
/* ---- 0 ---- ---- 1 ---- ---- 2 ---- ---- 3 ---- ---- 4 ---- ---- 5 ---- ---- 6 ---- */
}
};
kbfun_funptr_t kb_layout_press[KB_LAYERS][KB_ROWS][KB_COLUMNS] = {
{ // layer 0: default
// right hand
/* ---- 0 ---- ---- 1 ---- ---- 2 ---- ---- 3 ---- ---- 4 ---- ---- 5 ---- ---- 6 ---- */
/* 0 */ { f_NOP , f_press , f_press , f_press , f_press , f_press , f_press }, /* 0 */
/* 1 */ { f_NOP , f_press , f_press , f_press , f_press , f_press , f_press }, /* 1 */
/* 2 */ { f_NA , f_press , f_press , f_press , f_press , f_press , f_press }, /* 2 */
/* 3 */ { f_NOP , f_press , f_press , f_press , f_press , f_press , f_press }, /* 3 */
/* 4 */ { f_NA , f_NA , f_press , f_press , f_press , f_press , f_NOP }, /* 4 */
/* 5 */ { f_NA , f_press , f_press , f_press , f_press , f_press , f_press }, /* 5 */
/* ---- 0 ---- ---- 1 ---- ---- 2 ---- ---- 3 ---- ---- 4 ---- ---- 5 ---- ---- 6 ---- */
// left hand
/* ---- 0 ---- ---- 1 ---- ---- 2 ---- ---- 3 ---- ---- 4 ---- ---- 5 ---- ---- 6 ---- */
/* 6 */ { f_press , f_press , f_press , f_press , f_press , f_press , f_NOP }, /* 6 */
/* 7 */ { f_press , f_press , f_press , f_press , f_press , f_press , f_NOP }, /* 7 */
/* 8 */ { f_press , f_press , f_press , f_press , f_press , f_press , f_NA }, /* 8 */
/* 9 */ { f_press , f_press , f_press , f_press , f_press , f_press , f_NOP }, /* 9 */
/* A */ { f_NOP , f_press , f_press , f_press , f_press , f_NA , f_NA }, /* A */
/* B */ { f_press , f_press , f_press , f_press , f_press , f_press , f_NA } /* B */
/* ---- 0 ---- ---- 1 ---- ---- 2 ---- ---- 3 ---- ---- 4 ---- ---- 5 ---- ---- 6 ---- */
}
};
kbfun_funptr_t kb_layout_release[KB_LAYERS][KB_ROWS][KB_COLUMNS] = {
{ // layer 0: default
// right hand
/* ---- 0 ---- ---- 1 ---- ---- 2 ---- ---- 3 ---- ---- 4 ---- ---- 5 ---- ---- 6 ---- */
/* 0 */ { f_NOP , f_release , f_release , f_release , f_release , f_release , f_release }, /* 0 */
/* 1 */ { f_NOP , f_release , f_release , f_release , f_release , f_release , f_release }, /* 1 */
/* 2 */ { f_NA , f_release , f_release , f_release , f_release , f_release , f_release }, /* 2 */
/* 3 */ { f_NOP , f_release , f_release , f_release , f_release , f_release , f_release }, /* 3 */
/* 4 */ { f_NA , f_NA , f_release , f_release , f_release , f_release , f_NOP }, /* 4 */
/* 5 */ { f_NA , f_release , f_release , f_release , f_release , f_release , f_release }, /* 5 */
/* ---- 0 ---- ---- 1 ---- ---- 2 ---- ---- 3 ---- ---- 4 ---- ---- 5 ---- ---- 6 ---- */
// left hand
/* ---- 0 ---- ---- 1 ---- ---- 2 ---- ---- 3 ---- ---- 4 ---- ---- 5 ---- ---- 6 ---- */
/* 6 */ { f_release , f_release , f_release , f_release , f_release , f_release , f_NOP }, /* 6 */
/* 7 */ { f_release , f_release , f_release , f_release , f_release , f_release , f_NOP }, /* 7 */
/* 8 */ { f_release , f_release , f_release , f_release , f_release , f_release , f_NA }, /* 8 */
/* 9 */ { f_release , f_release , f_release , f_release , f_release , f_release , f_NOP }, /* 9 */
/* A */ { f_NOP , f_release , f_release , f_release , f_release , f_NA , f_NA }, /* A */
/* B */ { f_release , f_release , f_release , f_release , f_release , f_release , f_NA } /* B */
/* ---- 0 ---- ---- 1 ---- ---- 2 ---- ---- 3 ---- ---- 4 ---- ---- 5 ---- ---- 6 ---- */
}
};

View File

@ -0,0 +1,11 @@
/* ----------------------------------------------------------------------------
* ergoDOX layout : QWERTY : exports
* ----------------------------------------------------------------------------
* Copyright (c) 2012 Ben Blazak <benblazak.dev@gmail.com>
* Released under The MIT License (MIT) (see "license.md")
* Project located at <https://github.com/benblazak/ergodox-firmware>
* ------------------------------------------------------------------------- */
#define KB_LAYERS 1 // must match what's defined in "layout*.c"

View File

@ -0,0 +1,300 @@
/* ----------------------------------------------------------------------------
* USB Keyboard Key Codes : short names
*
* These are for convenience (and to help with formatting, keeping stuff from
* getting too long). See "keyboard-usage-page.h" for definitions and
* everything.
* ----------------------------------------------------------------------------
* Copyright (c) 2012 Ben Blazak <benblazak.dev@gmail.com>
* Released under The MIT License (MIT) (see "license.md")
* Project located at <https://github.com/benblazak/ergodox-firmware>
* ------------------------------------------------------------------------- */
#include "keyboard-usage-page.h"
// ----------------------------------------------------------------------------
// protocol
// ----------------------------------------------------------------------------
// error
#define _ErrRollover KEY_ErrorRollOver
#define _PostFail KEY_POSTFail
#define _ErrUndef KEY_ErrorUndefined
// ----------------------------------------------------------------------------
// main keyboard
// ----------------------------------------------------------------------------
// letters
#define _A KEY_a_A
#define _B KEY_b_B
#define _C KEY_c_C
#define _D KEY_d_D
#define _E KEY_e_E
#define _F KEY_f_F
#define _G KEY_g_G
#define _H KEY_h_H
#define _I KEY_i_I
#define _J KEY_j_J
#define _K KEY_k_K
#define _L KEY_l_L
#define _M KEY_m_M
#define _N KEY_n_N
#define _O KEY_o_O
#define _P KEY_p_P
#define _Q KEY_q_Q
#define _R KEY_r_R
#define _S KEY_s_S
#define _T KEY_t_T
#define _U KEY_u_U
#define _V KEY_v_V
#define _W KEY_w_W
#define _X KEY_x_X
#define _Y KEY_y_Y
#define _Z KEY_z_Z
// numbers
#define _0 KEY_0_RightParenthesis
#define _1 KEY_1_Exclamation
#define _2 KEY_2_At
#define _3 KEY_3_Pound
#define _4 KEY_4_Dollar
#define _5 KEY_5_Percent
#define _6 KEY_6_Caret
#define _7 KEY_7_Ampersand
#define _8 KEY_8_Asterisk
#define _9 KEY_9_LeftParenthesis
// function
#define _F1 KEY_F1
#define _F2 KEY_F2
#define _F3 KEY_F3
#define _F4 KEY_F4
#define _F5 KEY_F5
#define _F6 KEY_F6
#define _F7 KEY_F7
#define _F8 KEY_F8
#define _F9 KEY_F9
#define _F10 KEY_F10
#define _F11 KEY_F11
#define _F12 KEY_F12
#define _F13 KEY_F13
#define _F14 KEY_F14
#define _F15 KEY_F15
#define _F16 KEY_F16
#define _F17 KEY_F17
#define _F18 KEY_F18
#define _F19 KEY_F19
#define _F20 KEY_F20
#define _F21 KEY_F21
#define _F22 KEY_F22
#define _F23 KEY_F23
#define _F24 KEY_F24
// whitespace and symbols
#define _enter KEY_ReturnEnter
#define _space KEY_Spacebar
#define _tab KEY_Tab
// ---
#define _backslash KEY_Backslash_Pipe
#define _bracketL KEY_LeftBracket_LeftBrace
#define _bracketR KEY_RightBracket_RightBrace
#define _comma KEY_Comma_LessThan
#define _dash KEY_Dash_Underscore
#define _equal KEY_Equal_Plus
#define _grave KEY_GraveAccent_Tilde
#define _period KEY_Period_GreaterThan
#define _quote KEY_SingleQuote_DoubleQuote
#define _semicolon KEY_Semicolon_Colon
#define _slash KEY_Slash_Question
// ---
#define _sep_dec KEY_DecimalSeparator
#define _sep_thousands KEY_ThousandsSeparator
#define _currencyUnit KEY_CurrencyUnit
#define _currencySubunit KEY_CurrencySubunit
// international and language
#define _int1 KEY_International1
#define _int2 KEY_International2
#define _int3 KEY_International3
#define _int4 KEY_International4
#define _int5 KEY_International5
#define _int6 KEY_International6
#define _int7 KEY_International7
#define _int8 KEY_International8
#define _int9 KEY_International9
// ---
#define _lang1 KEY_LANG1
#define _lang2 KEY_LANG2
#define _lang3 KEY_LANG3
#define _lang4 KEY_LANG4
#define _lang5 KEY_LANG5
#define _lang6 KEY_LANG6
#define _lang7 KEY_LANG7
#define _lang8 KEY_LANG8
#define _lang9 KEY_LANG9
// ---
#define _backslash_nonUS KEY_NonUS_Backslash_Pipe
#define _pound_nonUS KEY_NonUS_Pound_Tilde
// text control
#define _bs KEY_DeleteBackspace
#define _del KEY_DeleteForward
#define _home KEY_Home
#define _end KEY_End
#define _pageU KEY_PageUp
#define _pageD KEY_PageDown
#define _arrowU KEY_UpArrow
#define _arrowD KEY_DownArrow
#define _arrowL KEY_LeftArrow
#define _arrowR KEY_RightArrow
#define _esc KEY_Escape
#define _insert KEY_Insert
// modifier
#define _altL KEY_LeftAlt
#define _altR KEY_RightAlt
#define _ctrlL KEY_LeftControl
#define _ctrlR KEY_RightControl
#define _guiL KEY_LeftGUI
#define _guiR KEY_RightGUI
#define _shiftL KEY_LeftShift
#define _shiftR KEY_RightShift
// lock
#define _capsLock KEY_CapsLock
#define _scrollLock KEY_ScrollLock
// (numlock is under keypad)
// --- not generally used
#define _capsLock_locking KEY_LockingCapsLock
#define _numLock_locking KEY_LockingNumLock
#define _scrollLock_locking KEY_LockingScrollLock
// special function
#define _pause KEY_Pause
#define _print KEY_PrintScreen
// ---
#define _application KEY_Application
#define _execute KEY_Execute
#define _power KEY_Power
// ---
#define _help KEY_Help
#define _menu KEY_Menu
// ---
#define _cut KEY_Cut
#define _copy KEY_Copy
#define _paste KEY_Paste
#define _find KEY_Find
#define _select KEY_Select
#define _stop KEY_Stop
#define _undo KEY_Undo
// ---
#define _mute KEY_Mute
#define _volumeU KEY_VolumeUp
#define _volumeD KEY_VolumeDown
// ---
#define _altErase KEY_AlternateErase
// ---
#define _again KEY_Again
#define _cancel KEY_Cancel
#define _clear_again KEY_Clear_Again
#define _clear KEY_Clear
#define _oper KEY_Oper
#define _out KEY_Out
#define _prior KEY_Prior
#define _return KEY_Return
#define _separator KEY_Separator
// ---
#define _crSel KEY_CrSel_Props
#define _exSel KEY_ExSel
#define _sysReq KEY_SysReq_Attention
// ----------------------------------------------------------------------------
// keypad
// ----------------------------------------------------------------------------
// numbers and hex letters
#define _1_kp KEYPAD_1_End
#define _2_kp KEYPAD_2_DownArrow
#define _3_kp KEYPAD_3_PageDown
#define _4_kp KEYPAD_4_LeftArrow
#define _5_kp KEYPAD_5
#define _6_kp KEYPAD_6_RightArrow
#define _7_kp KEYPAD_7_Home
#define _8_kp KEYPAD_8_UpArrow
#define _9_kp KEYPAD_9_PageUp
#define _0_kp KEYPAD_0_Insert
#define _A_kp KEYPAD_A
#define _B_kp KEYPAD_B
#define _C_kp KEYPAD_C
#define _D_kp KEYPAD_D
#define _E_kp KEYPAD_E
#define _F_kp KEYPAD_F
// ---
#define _00_kp KEYPAD_00
#define _000_kp KEYPAD_000
// whitespace and symbols
#define _tab_kp KEYPAD_Tab
#define _space_kp KEYPAD_Space
#define _enter_kp KEYPAD_ENTER
// ---
#define _dec_del_kp KEYPAD_Period_Delete
#define _comma_kp KEYPAD_Comma
#define _equal_kp KEYPAD_Equal
#define _equalSign_kp KEYPAD_EqualSign
#define _parenL_kp KEYPAD_LeftParenthesis
#define _parenR_kp KEYPAD_RightParenthesis
#define _braceL_kp KEYPAD_LeftBrace
#define _braceR_kp KEYPAD_RightBrace
// operations
// --- basic
#define _add_kp KEYPAD_Plus
#define _sub_kp KEYPAD_Minus
#define _mul_kp KEYPAD_Asterisk
#define _div_kp KEYPAD_Slash
#define _plusMinus_kp KEYPAD_PlusMinus
// --- logical
#define _lt_kp KEYPAD_LessThan
#define _gt_kp KEYPAD_GreaterThan
#define _xor_kp KEYPAD_XOR
#define _and_kp KEYPAD_Ampersand
#define _andand_kp KEYPAD_AmpersandAmpersand
#define _pipe_kp KEYPAD_Pipe
#define _pipepipe_kp KEYPAD_PipePipe
#define _caret_kp KEYPAD_Caret
#define _exclamation_kp KEYPAD_Exclamation
// --- other
#define _at_kp KEYPAD_At
#define _colon_kp KEYPAD_Colon
#define _percent_kp KEYPAD_Percent
#define _pound_kp KEYPAD_Pound
// radix
#define _bin_kp KEYPAD_Binary
#define _oct_kp KEYPAD_Octal
#define _dec_kp KEYPAD_Decimal
#define _hex_kp KEYPAD_Hexadecimal
// text control
#define _bs_kp KEYPAD_Backspace
#define _clear_kp KEYPAD_Clear
#define _clearEntry_kp KEYPAD_ClearEntry
// lock
#define _numLock_kp KEYPAD_NumLock_Clear
// memory control
#define _memStore_kp KEYPAD_MemoryStore
#define _memRecall_kp KEYPAD_MemoryRecall
#define _memClear_kp KEYPAD_MemoryClear
#define _memAdd_kp KEYPAD_MemoryAdd
#define _memSub_kp KEYPAD_MemorySubtract
#define _memMul_kp KEYPAD_MemoryMultiply
#define _memDiv_kp KEYPAD_MemoryDivide

View File

@ -241,7 +241,7 @@
#define KEYPAD_MemorySubtract 0xD4 // - - - -
#define KEYPAD_MemoryMultiply 0xD5 // - - - -
#define KEYPAD_MemoryDivide 0xD6 // - - - -
#define KEYPAD_PlusMinux 0xD7 // - - - -
#define KEYPAD_PlusMinus 0xD7 // - - - -
#define KEYPAD_Clear 0xD8 // - - - -
#define KEYPAD_ClearEntry 0xD9 // - - - -
#define KEYPAD_Binary 0xDA // - - - -

View File

@ -14,15 +14,29 @@
# -----------------------------------------------------------------------------
TARGET = firmware
FORMAT = ihex
TARGET = firmware
FORMAT = ihex
KEYBOARD = ergodox # see "src/keyboard" for what's available
LAYOUT = qwerty # see "src/keyboard/*/layout" for what's available
SRC = \
$(wildcard *.c) \
$(wildcard keyboard/ergodox*.c) \
$(wildcard keyboard/ergodox/*.c) \
$(wildcard lib/_teensy-2-0/*.c) \
$(wildcard lib/pjrc/usb_keyboard/*.c)
# firmware stuff
SRC = $(wildcard *.c)
# keyboard stuff
# --- remove whitespace
KEYBOARD := $(strip $(KEYBOARD))
LAYOUT := $(strip $(LAYOUT))
# --- include stuff
SRC += $(wildcard keyboard/$(KEYBOARD)*.c)
SRC += $(wildcard keyboard/$(KEYBOARD)/*.c)
SRC += $(wildcard keyboard/$(KEYBOARD)/layout/$(LAYOUT)*.c)
# library stuff
# - add more "*/*/..."s as necessary to compile everything.
# - parts the stuff under "lib" may not be necessary, depending on other
# options, but it's all included here. hopefully any unnecessary stuff gets
# compiled out. else, the makefile will have to become more complicated.
SRC += $(wildcard lib/*.c)
SRC += $(wildcard lib/*/*.c)
SRC += $(wildcard lib/*/*/*.c)
OBJ = $(SRC:%.c=%.o)
@ -33,6 +47,9 @@ CFLAGS += -DF_CPU=16000000 # processor frequency; must match initialization
# in source
CFLAGS += -I. # search for includes in the current directory
# . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
CFLAGS += -DKEYBOARD='"keyboard/$(strip $(KEYBOARD)).h"'
CFLAGS += -DKEYBOARD_LAYOUT='"layout/$(strip $(LAYOUT)).h"'
# . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
CFLAGS += -std=gnu99 # use C99 plus GCC extensions
CFLAGS += -Os # optimize for size
# . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
@ -66,6 +83,12 @@ SIZE = avr-size
.PHONY: all clean
# remove extraneous whitespace
FORMAT := $(strip $(FORMAT))
TARGET := $(strip $(TARGET))
CFLAGS := $(strip $(CFLAGS))
LDFLAGS := $(strip $(LDFLAGS))
all: $(TARGET).hex $(TARGET).eep
@echo
@echo '---------------------------------------------------------------'