diff --git a/references.md b/references.md index 765d555..c6b899c 100644 --- a/references.md +++ b/references.md @@ -116,6 +116,10 @@ (http://www.nongnu.org/avr-libc/user-manual/modules.html) One of my main references. +* [AVR : Data in Program Space] + (http://www.nongnu.org/avr-libc/user-manual/pgmspace.html) + How to use ''. + * [avr-libc/include/avr/iom32u4.h] (http://svn.savannah.nongnu.org/viewvc/trunk/avr-libc/include/avr/iom32u4.h?revision=2288&root=avr-libc&view=markup) List of registers and associated bit numbers for the ATmega32U4 @@ -125,7 +129,7 @@ by Chris Kuethe Goes over a bunch of stuff pretty generally. Useful to me because it was talking about exactly what I was trying to do (e.g. program the thing - directly instead of messing around with gratuitous libraries) + directly instead of messing around with gratuitous libraries). * [Optimisations of AVR programs using avr-gcc] (http://www.tty1.net/blog/2008-04-29-avr-gcc-optimisations_en.html) diff --git a/src/keyboard/ergodox/layout.h b/src/keyboard/ergodox/layout.h index a875b0e..8df9877 100644 --- a/src/keyboard/ergodox/layout.h +++ b/src/keyboard/ergodox/layout.h @@ -33,7 +33,7 @@ #undef _inc - // default layout 'get' functions + // default layout 'get' macros // // these are for when the matrices are stored solely in RAM. they're // here so layouts can redefine them if they with and use RAM, Flash, diff --git a/src/keyboard/ergodox/layout/qwerty.c b/src/keyboard/ergodox/layout/qwerty.c index 0da753f..e5744d9 100644 --- a/src/keyboard/ergodox/layout/qwerty.c +++ b/src/keyboard/ergodox/layout/qwerty.c @@ -9,6 +9,7 @@ * ------------------------------------------------------------------------- */ +#include #include "lib/data-types.h" #include "lib/usb/keyboard-usage-page--short-names.h" #include "lib/key-functions.h" @@ -24,7 +25,7 @@ #endif -uint8_t _kb_layout[KB_LAYERS][KB_ROWS][KB_COLUMNS] = { +uint8_t PROGMEM _kb_layout[KB_LAYERS][KB_ROWS][KB_COLUMNS] = { { /* layer 0: default */ /* right hand */ /* ---- 0 ---- ---- 1 ---- ---- 2 ---- ---- 3 ---- ---- 4 ---- ---- 5 ---- ---- 6 ---- */ @@ -47,11 +48,11 @@ uint8_t _kb_layout[KB_LAYERS][KB_ROWS][KB_COLUMNS] = { } }; -kbfun_funptr_t _kb_layout_press[KB_LAYERS][KB_ROWS][KB_COLUMNS] = { +kbfun_funptr_t PROGMEM _kb_layout_press[KB_LAYERS][KB_ROWS][KB_COLUMNS] = { /* layer 0: default */ DEFAULT_LAYER_PRESS }; -kbfun_funptr_t _kb_layout_release[KB_LAYERS][KB_ROWS][KB_COLUMNS] = { +kbfun_funptr_t PROGMEM _kb_layout_release[KB_LAYERS][KB_ROWS][KB_COLUMNS] = { /* layer 0: default */ DEFAULT_LAYER_RELEASE }; diff --git a/src/keyboard/ergodox/layout/qwerty.h b/src/keyboard/ergodox/layout/qwerty.h index b66c5df..b03c891 100644 --- a/src/keyboard/ergodox/layout/qwerty.h +++ b/src/keyboard/ergodox/layout/qwerty.h @@ -9,10 +9,28 @@ * ------------------------------------------------------------------------- */ +#include + + #define KB_LAYERS 1 // must match what's defined in the layout '.c' file -extern uint8_t _kb_layout [KB_LAYERS][KB_ROWS][KB_COLUMNS]; -extern kbfun_funptr_t _kb_layout_press [KB_LAYERS][KB_ROWS][KB_COLUMNS]; -extern kbfun_funptr_t _kb_layout_release [KB_LAYERS][KB_ROWS][KB_COLUMNS]; +// override the defaults so we can use program space +#define kb_layout_get(layer,row,column) \ + ( (uint8_t) (pgm_read_byte(&( \ + _kb_layout[layer][row][column] ))) ) + +#define kb_layout_press_get(layer,row,column) \ + ( (kbfun_funptr_t) (pgm_read_word(&( \ + _kb_layout_press[layer][row][column] ))) ) + +#define kb_layout_release_get(layer,row,column) \ + ( (kbfun_funptr_t) (pgm_read_word(&( \ + _kb_layout_release[layer][row][column] ))) ) + + +extern uint8_t PROGMEM _kb_layout[KB_LAYERS][KB_ROWS][KB_COLUMNS]; +extern kbfun_funptr_t PROGMEM _kb_layout_press[KB_LAYERS][KB_ROWS][KB_COLUMNS]; +extern kbfun_funptr_t PROGMEM + _kb_layout_release[KB_LAYERS][KB_ROWS][KB_COLUMNS]; diff --git a/src/lib/key-functions.c b/src/lib/key-functions.c index 38ed6e8..49ca2be 100644 --- a/src/lib/key-functions.c +++ b/src/lib/key-functions.c @@ -45,15 +45,15 @@ static uint8_t _dec_current_layer(uint8_t * current_layer) { // ---------------------------------------------------------------------------- void kbfun_press( - uint8_t * keycode, uint8_t * current_layer, - uint8_t * row, uint8_t * col ) { + uint8_t keycode, uint8_t * current_layer, + uint8_t * row, uint8_t * col ) { // no-op - if (*keycode == 0) + if (keycode == 0) return; // modifier keys - switch (*keycode) { + switch (keycode) { case KEY_LeftControl: keyboard_modifier_keys |= (1<<0); return; case KEY_LeftShift: keyboard_modifier_keys |= (1<<1); @@ -75,21 +75,21 @@ void kbfun_press( // all others for (uint8_t i=0; i<6; i++) if (keyboard_keys[i] == 0) { - keyboard_keys[i] = *keycode; + keyboard_keys[i] = keycode; break; } } void kbfun_release( - uint8_t * keycode, uint8_t * current_layer, - uint8_t * row, uint8_t * col ) { + uint8_t keycode, uint8_t * current_layer, + uint8_t * row, uint8_t * col ) { // no-op - if (*keycode == 0) + if (keycode == 0) return; // modifier keys - switch (*keycode) { + switch (keycode) { case KEY_LeftControl: keyboard_modifier_keys &= ~(1<<0); return; case KEY_LeftShift: keyboard_modifier_keys &= ~(1<<1); @@ -110,7 +110,7 @@ void kbfun_release( // all others for (uint8_t i=0; i<6; i++) - if (keyboard_keys[i] == *keycode) { + if (keyboard_keys[i] == keycode) { keyboard_keys[i] = 0; break; } diff --git a/src/lib/key-functions.h b/src/lib/key-functions.h index 166c323..9437251 100644 --- a/src/lib/key-functions.h +++ b/src/lib/key-functions.h @@ -12,14 +12,16 @@ #include "lib/data-types.h" - typedef void (*kbfun_funptr_t)(uint8_t*, uint8_t*, uint8_t*, uint8_t*); + typedef void (*kbfun_funptr_t)( + uint8_t, uint8_t *, + uint8_t *, uint8_t * ); void kbfun_press( - uint8_t * keycode, uint8_t * current_layer, - uint8_t * row, uint8_t * col ); + uint8_t keycode, uint8_t * current_layer, + uint8_t * row, uint8_t * col ); void kbfun_release( - uint8_t * keycode, uint8_t * current_layer, - uint8_t * row, uint8_t * col ); + uint8_t keycode, uint8_t * current_layer, + uint8_t * row, uint8_t * col ); #endif diff --git a/src/main.c b/src/main.c index fe53bb8..6191b1e 100644 --- a/src/main.c +++ b/src/main.c @@ -65,7 +65,7 @@ int main(void) { kb_layout_press_get(current_layer, row, col); if (press_function) { (*press_function)( - &kb_layout_get(current_layer, row, col), + kb_layout_get(current_layer, row, col), ¤t_layer, &row, &col ); } } else { @@ -73,7 +73,7 @@ int main(void) { kb_layout_release_get(current_layer, row, col); if (release_function) { (*release_function)( - &kb_layout_get(current_layer, row, col), + kb_layout_get(current_layer, row, col), ¤t_layer, &row, &col ); } }