diff options
| author | tmk <nobody@nowhere> | 2011-01-06 15:18:55 +0900 | 
|---|---|---|
| committer | tmk <nobody@nowhere> | 2011-01-06 15:33:08 +0900 | 
| commit | fd49c69d1a173b9d273b2b53eb6a22eda920223a (patch) | |
| tree | 46c6a012a5ecba881fbd78ad7ccb9051e493340e | |
| parent | 590235d4bc92d1de4c17b96ae54f4daee8c3db2a (diff) | |
added config option: MATRIX_HAS_GHOST and fixed some on matrix.c
ADD: Build option: MATRIX_HAS_GHOST to enable ghost blocking logic.
FIX: choose matrix buffer type(uint8_t/uint16_t) automatically
     depending on column size in matrix.c.
FIX: use uint8_t insted of int in matrix.c.
| -rw-r--r-- | hhkb/config.h | 8 | ||||
| -rw-r--r-- | hhkb/keymap.c | 37 | ||||
| -rw-r--r-- | hhkb/matrix.c | 106 | ||||
| -rw-r--r-- | macway/config.h | 8 | ||||
| -rw-r--r-- | macway/keymap.c | 36 | ||||
| -rw-r--r-- | macway/matrix.c | 75 | ||||
| -rw-r--r-- | matrix_skel.h | 16 | 
7 files changed, 212 insertions, 74 deletions
| diff --git a/hhkb/config.h b/hhkb/config.h index 7722ed46a8..cc86e55cad 100644 --- a/hhkb/config.h +++ b/hhkb/config.h @@ -1,18 +1,20 @@  #ifndef CONFIG_H  #define CONFIG_H +/* controller configuration */ +#include "controller_teensy.h" +  #define VENDOR_ID       0xFEED  #define PRODUCT_ID      0xCAFE  #define MANUFACTURER    t.m.k.  #define PRODUCT         HHKB mod  #define DESCRIPTION     t.m.k. keyboard firmware for HHKB mod -/* controller */ -#include "controller_teensy.h" -  /* matrix size */  #define MATRIX_ROWS 8  #define MATRIX_COLS 8 +/* define if matrix has ghost */ +//#define MATRIX_HAS_GHOST  /* USB NKey Rollover */  #ifdef USB_NKRO_ENABLE diff --git a/hhkb/keymap.c b/hhkb/keymap.c index 4273835e98..e18bb86286 100644 --- a/hhkb/keymap.c +++ b/hhkb/keymap.c @@ -12,6 +12,8 @@  #include "keymap_skel.h" +// Convert physical keyboard layout to matrix array. +// This is a macro to define keymap easily in keyboard layout form.  #define KEYMAP( \      R3C1, R3C0, R0C0, R1C0, R1C1, R2C0, R2C1, R4C0, R4C1, R6C0, R6C1, R7C0, R7C1, R5C0, R5C1, \      R3C2, R0C1, R0C2, R1C3, R1C2, R2C3, R2C2, R4C2, R4C3, R6C2, R6C3, R7C3, R7C2, R5C2, \ @@ -33,19 +35,29 @@  #define KEYCODE(layer, row, col) (pgm_read_byte(&keymaps[(layer)][(row)][(col)])) -/* layer to change into while Fn key pressed */  -static const int PROGMEM fn_layer[] = { 0, 1, 2, 3, 4, 0, 0, 1 }; +// Assign Fn key(0-7) to a layer to which switch with the Fn key pressed. +static const uint8_t PROGMEM fn_layer[] = { +    0,              // FN_0 +    1,              // FN_1 +    2,              // FN_2 +    3,              // FN_3 +    4,              // FN_4 +    0,              // FN_5 +    0,              // FN_6 +    1               // FN_7 +}; -/* keycode to sent when Fn key released without using layer keys. */ +// Assign Fn key(0-7) to a keycode sent when release Fn key without use of the layer. +// See layer.c for details.  static const uint8_t PROGMEM fn_keycode[] = { -    KB_NO,          // FN_0 [NOT USED] -    KB_NO,          // FN_1 layer 1 -    KB_SLSH,        // FN_2 layer 2 -    KB_SCLN,        // FN_3 layer 3 -    KB_SPC,         // FN_4 layer 4 -    KB_NO,          // FN_5 [NOT USED] -    KB_NO,          // FN_6 [NOT USED] -    KB_NO           // FN_7 layer 1 +    KB_NO,          // FN_0 +    KB_NO,          // FN_1 +    KB_SLSH,        // FN_2 +    KB_SCLN,        // FN_3 +    KB_SPC,         // FN_4 +    KB_NO,          // FN_5 +    KB_NO,          // FN_6 +    KB_NO           // FN_7  };  static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { @@ -152,7 +164,7 @@ uint8_t keymap_get_keycode(uint8_t layer, uint8_t row, uint8_t col)      return KEYCODE(layer, row, col);  } -int keymap_fn_layer(uint8_t fn_bits) +uint8_t keymap_fn_layer(uint8_t fn_bits)  {      return pgm_read_byte(&fn_layer[biton(fn_bits)]);  } @@ -162,6 +174,7 @@ uint8_t keymap_fn_keycode(uint8_t fn_bits)      return pgm_read_byte(&fn_keycode[(biton(fn_bits))]);  } +// define a condition to enter special function mode  bool keymap_is_special_mode(uint8_t fn_bits)  {      return (usb_keyboard_mods == (BIT_LCTRL | BIT_LSHIFT | BIT_LALT | BIT_LGUI)); diff --git a/hhkb/matrix.c b/hhkb/matrix.c index dd4440d9e3..15633d53da 100644 --- a/hhkb/matrix.c +++ b/hhkb/matrix.c @@ -9,6 +9,33 @@  #include "util.h"  #include "matrix_skel.h" + +#if (MATRIX_COLS > 16) +#   error "MATRIX_COLS must not exceed 16" +#endif +#if (MATRIX_ROWS > 255) +#   error "MATRIX_ROWS must not exceed 255" +#endif + + +// matrix state buffer(1:on, 0:off) +#if (MATRIX_COLS <= 8) +static uint8_t *matrix; +static uint8_t *matrix_prev; +static uint8_t _matrix0[MATRIX_ROWS]; +static uint8_t _matrix1[MATRIX_ROWS]; +#else +static uint16_t *matrix; +static uint16_t *matrix_prev; +static uint16_t _matrix0[MATRIX_ROWS]; +static uint16_t _matrix1[MATRIX_ROWS]; +#endif + +#ifdef MATRIX_HAS_GHOST +static bool matrix_has_ghost_in_row(uint8_t row); +#endif + +  // matrix is active low. (key on: 0/key off: 1)  //  // HHKB has no ghost and no bounce. @@ -28,26 +55,19 @@  #define KEY_PREV_ON             (PORTE |= (1<<7))  #define KEY_PREV_OFF            (PORTE &= ~(1<<7)) -// matrix state buffer -static uint8_t *matrix; -static uint8_t *matrix_prev; -static uint8_t _matrix0[MATRIX_ROWS]; -static uint8_t _matrix1[MATRIX_ROWS]; -  inline -int matrix_rows(void) +uint8_t matrix_rows(void)  {      return MATRIX_ROWS;  }  inline -int matrix_cols(void) +uint8_t matrix_cols(void)  {      return MATRIX_COLS;  } -// this must be called once before matrix_scan.  void matrix_init(void)  {      // row & col output(PB0-6) @@ -59,13 +79,13 @@ void matrix_init(void)      PORTE = 0x40;      // initialize matrix state: all keys off -    for (int i=0; i < MATRIX_ROWS; i++) _matrix0[i] = 0x00; -    for (int i=0; i < MATRIX_ROWS; i++) _matrix1[i] = 0x00; +    for (uint8_t i=0; i < MATRIX_ROWS; i++) _matrix0[i] = 0x00; +    for (uint8_t i=0; i < MATRIX_ROWS; i++) _matrix1[i] = 0x00;      matrix = _matrix0;      matrix_prev = _matrix1;  } -int matrix_scan(void) +uint8_t matrix_scan(void)  {      uint8_t *tmp; @@ -73,8 +93,8 @@ int matrix_scan(void)      matrix_prev = matrix;      matrix = tmp; -    for (int row = 0; row < MATRIX_ROWS; row++) { -        for (int col = 0; col < MATRIX_COLS; col++) { +    for (uint8_t row = 0; row < MATRIX_ROWS; row++) { +        for (uint8_t col = 0; col < MATRIX_COLS; col++) {              KEY_SELELCT(row, col);              _delay_us(40);  // from logic analyzer chart              if (matrix_prev[row] & (1<<col)) { @@ -98,7 +118,7 @@ int matrix_scan(void)  bool matrix_is_modified(void)  { -    for (int i = 0; i < MATRIX_ROWS; i++) { +    for (uint8_t i = 0; i < MATRIX_ROWS; i++) {          if (matrix[i] != matrix_prev[i])              return true;      } @@ -108,36 +128,80 @@ bool matrix_is_modified(void)  inline  bool matrix_has_ghost(void)  { +#ifdef MATRIX_HAS_GHOST +    for (uint8_t i = 0; i < MATRIX_ROWS; i++) { +        if (matrix_has_ghost_in_row(i)) +            return true; +    } +#endif      return false;  }  inline -bool matrix_is_on(int row, int col) +bool matrix_is_on(uint8_t row, uint8_t col)  {      return (matrix[row] & (1<<col));  }  inline -uint16_t matrix_get_row(int row) +#if (MATRIX_COLS <= 8) +uint8_t matrix_get_row(uint8_t row) +#else +uint16_t matrix_get_row(uint8_t row) +#endif  {      return matrix[row];  }  void matrix_print(void)  { +#if (MATRIX_COLS <= 8)      print("\nr/c 01234567\n"); -    for (int row = 0; row < matrix_rows(); row++) { +#else +    print("\nr/c 0123456789ABCDEF\n"); +#endif +    for (uint8_t row = 0; row < matrix_rows(); row++) {          phex(row); print(": "); +#if (MATRIX_COLS <= 8)          pbin_reverse(matrix_get_row(row)); +#else +        pbin_reverse16(matrix_get_row(row)); +#endif +#ifdef MATRIX_HAS_GHOST +        if (matrix_has_ghost_in_row(row)) { +            print(" <ghost"); +        } +#endif          print("\n");      }  } -int matrix_key_count(void) +uint8_t matrix_key_count(void)  { -    int count = 0; -    for (int i = 0; i < MATRIX_ROWS; i++) { +    uint8_t count = 0; +    for (uint8_t i = 0; i < MATRIX_ROWS; i++) { +#if (MATRIX_COLS <= 8)          count += bitpop(matrix[i]); +#else +        count += bitpop16(matrix[i]); +#endif      }      return count;  } + +#ifdef MATRIX_HAS_GHOST +inline +static bool matrix_has_ghost_in_row(uint8_t row) +{ +    // no ghost exists in case less than 2 keys on +    if (((matrix[row] - 1) & matrix[row]) == 0) +        return false; + +    // ghost exists in case same state as other row +    for (uint8_t i=0; i < MATRIX_ROWS; i++) { +        if (i != row && (matrix[i] & matrix[row]) == matrix[row]) +            return true; +    } +    return false; +} +#endif diff --git a/macway/config.h b/macway/config.h index 41bdc33de0..1403ef1274 100644 --- a/macway/config.h +++ b/macway/config.h @@ -1,18 +1,20 @@  #ifndef CONFIG_H  #define CONFIG_H +/* controller configuration */ +#include "controller_teensy.h" +  #define VENDOR_ID       0xFEED  #define PRODUCT_ID      0xBEE0  #define MANUFACTURER    t.m.k.  #define PRODUCT         Macway mod  #define DESCRIPTION     t.m.k. keyboard firmware for Macway mod -/* controller */ -#include "controller_teensy.h" -  /* matrix size */  #define MATRIX_ROWS 9  #define MATRIX_COLS 8 +/* define if matrix has ghost */ +#define MATRIX_HAS_GHOST  /* USB NKey Rollover */  #ifdef USB_NKRO_ENABLE diff --git a/macway/keymap.c b/macway/keymap.c index 0e71e3f76e..118036e94b 100644 --- a/macway/keymap.c +++ b/macway/keymap.c @@ -4,7 +4,6 @@  #include <stdint.h>  #include <stdbool.h>  #include <avr/pgmspace.h> -#include <avr/interrupt.h>  #include "usb_keyboard.h"  #include "usb_keycodes.h"  #include "print.h" @@ -13,6 +12,8 @@  #include "keymap_skel.h" +// Convert physical keyboard layout to matrix array. +// This is a macro to define keymap easily in keyboard layout form.  #define KEYMAP( \      R1C1, R1C0, R2C0, R3C0, R4C0, R4C1, R5C1, R5C0, R6C0, R7C0, R8C0, R8C1, R6C1, R0C2, \      R1C2, R1C3, R2C3, R3C3, R4C3, R4C2, R5C2, R5C3, R6C3, R7C3, R8C3, R8C2, R6C2, \ @@ -34,17 +35,29 @@  #define KEYCODE(layer, row, col) (pgm_read_byte(&keymaps[(layer)][(row)][(col)])) -static const uint8_t PROGMEM fn_layer[] = { 0, 1, 2, 3, 4, 0, 2, 3 }; +// Assign Fn key(0-7) to a layer to which switch with the Fn key pressed. +static const uint8_t PROGMEM fn_layer[] = { +    0,              // FN_0 +    1,              // FN_1 +    2,              // FN_2 +    3,              // FN_3 +    4,              // FN_4 +    0,              // FN_5 +    2,              // FN_6 +    3               // FN_7 +}; +// Assign Fn key(0-7) to a keycode sent when release Fn key without use of the layer. +// See layer.c for details.  static const uint8_t PROGMEM fn_keycode[] = { -    KB_NO,          // FN_0 [NOT USED] -    KB_NO,          // FN_1 layer 1 -    KB_SLSH,        // FN_2 layer 2 -    KB_SCLN,        // FN_3 layer 3 -    KB_SPC,         // FN_4 layer 4 -    KB_NO,          // FN_5 [NOT USED] -    KB_NO,          // FN_6 layer 2 -    KB_NO           // FN_7 layer 3 +    KB_NO,          // FN_0 +    KB_NO,          // FN_1 +    KB_SLSH,        // FN_2 +    KB_SCLN,        // FN_3 +    KB_SPC,         // FN_4 +    KB_NO,          // FN_5 +    KB_NO,          // FN_6 +    KB_NO           // FN_7  };  static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { @@ -155,7 +168,7 @@ uint8_t keymap_get_keycode(uint8_t layer, uint8_t row, uint8_t col)      return KEYCODE(layer, row, col);  } -int keymap_fn_layer(uint8_t fn_bits) +uint8_t keymap_fn_layer(uint8_t fn_bits)  {      return pgm_read_byte(&fn_layer[biton(fn_bits)]);  } @@ -165,6 +178,7 @@ uint8_t keymap_fn_keycode(uint8_t fn_bits)      return pgm_read_byte(&fn_keycode[(biton(fn_bits))]);  } +// define a condition to enter special function mode  bool keymap_is_special_mode(uint8_t fn_bits)  {      //return (usb_keyboard_mods == (BIT_LCTRL | BIT_LSHIFT | BIT_LALT | BIT_LGUI)); diff --git a/macway/matrix.c b/macway/matrix.c index 7c2a421059..f8c0640fd7 100644 --- a/macway/matrix.c +++ b/macway/matrix.c @@ -10,31 +10,47 @@  #include "matrix_skel.h" -// matrix state buffer (key on: 1/key off: 0) +#if (MATRIX_COLS > 16) +#   error "MATRIX_COLS must not exceed 16" +#endif +#if (MATRIX_ROWS > 255) +#   error "MATRIX_ROWS must not exceed 255" +#endif + + +// matrix state buffer(1:on, 0:off) +#if (MATRIX_COLS <= 8)  static uint8_t *matrix;  static uint8_t *matrix_prev;  static uint8_t _matrix0[MATRIX_ROWS];  static uint8_t _matrix1[MATRIX_ROWS]; - +#else +static uint16_t *matrix; +static uint16_t *matrix_prev; +static uint16_t _matrix0[MATRIX_ROWS]; +static uint16_t _matrix1[MATRIX_ROWS]; +#endif + +#ifdef MATRIX_HAS_GHOST  static bool matrix_has_ghost_in_row(uint8_t row); +#endif  static uint8_t read_col(void);  static void unselect_rows(void);  static void select_row(uint8_t row);  inline -int matrix_rows(void) +uint8_t matrix_rows(void)  {      return MATRIX_ROWS;  }  inline -int matrix_cols(void) +uint8_t matrix_cols(void)  {      return MATRIX_COLS;  } -// this must be called once before matrix_scan.  void matrix_init(void)  {      // initialize row and col @@ -44,13 +60,13 @@ void matrix_init(void)      PORTB = 0xFF;      // initialize matrix state: all keys off -    for (int i=0; i < MATRIX_ROWS; i++) _matrix0[i] = 0x00; -    for (int i=0; i < MATRIX_ROWS; i++) _matrix1[i] = 0x00; +    for (uint8_t i=0; i < MATRIX_ROWS; i++) _matrix0[i] = 0x00; +    for (uint8_t i=0; i < MATRIX_ROWS; i++) _matrix1[i] = 0x00;      matrix = _matrix0;      matrix_prev = _matrix1;  } -int matrix_scan(void) +uint8_t matrix_scan(void)  {      uint8_t *tmp; @@ -58,7 +74,7 @@ int matrix_scan(void)      matrix_prev = matrix;      matrix = tmp; -    for (int i = 0; i < MATRIX_ROWS; i++) { +    for (uint8_t i = 0; i < MATRIX_ROWS; i++) {          unselect_rows();          select_row(i);          _delay_us(30);  // without this wait read unstable value. @@ -70,30 +86,37 @@ int matrix_scan(void)  bool matrix_is_modified(void)  { -    for (int i = 0; i < MATRIX_ROWS; i++) { +    for (uint8_t i = 0; i < MATRIX_ROWS; i++) {          if (matrix[i] != matrix_prev[i])              return true;      }      return false;  } +inline  bool matrix_has_ghost(void)  { -    for (int i = 0; i < MATRIX_ROWS; i++) { +#ifdef MATRIX_HAS_GHOST +    for (uint8_t i = 0; i < MATRIX_ROWS; i++) {          if (matrix_has_ghost_in_row(i))              return true;      } +#endif      return false;  }  inline -bool matrix_is_on(int row, int col) +bool matrix_is_on(uint8_t row, uint8_t col)  {      return (matrix[row] & (1<<col));  }  inline -uint16_t matrix_get_row(int row) +#if (MATRIX_COLS <= 8) +uint8_t matrix_get_row(uint8_t row) +#else +uint16_t matrix_get_row(uint8_t row) +#endif  {      return matrix[row];  } @@ -101,25 +124,37 @@ uint16_t matrix_get_row(int row)  void matrix_print(void)  {      print("\nr/c 01234567\n"); -    for (int row = 0; row < matrix_rows(); row++) { +    for (uint8_t row = 0; row < matrix_rows(); row++) {          phex(row); print(": "); +#if (MATRIX_COLS <= 8)          pbin_reverse(matrix_get_row(row)); +#else +        pbin_reverse16(matrix_get_row(row)); +#endif +#ifdef MATRIX_HAS_GHOST          if (matrix_has_ghost_in_row(row)) {              print(" <ghost");          } +#endif          print("\n");      }  } -int matrix_key_count(void) +uint8_t matrix_key_count(void)  { -    int count = 0; -    for (int i = 0; i < MATRIX_ROWS; i++) { +    uint8_t count = 0; +    for (uint8_t i = 0; i < MATRIX_ROWS; i++) { +#if (MATRIX_COLS <= 8)          count += bitpop(matrix[i]); +#else +        count += bitpop16(matrix[i]); +#endif      }      return count;  } +#ifdef MATRIX_HAS_GHOST +inline  static bool matrix_has_ghost_in_row(uint8_t row)  {      // no ghost exists in case less than 2 keys on @@ -127,18 +162,21 @@ static bool matrix_has_ghost_in_row(uint8_t row)          return false;      // ghost exists in case same state as other row -    for (int i=0; i < MATRIX_ROWS; i++) { +    for (uint8_t i=0; i < MATRIX_ROWS; i++) {          if (i != row && (matrix[i] & matrix[row]) == matrix[row])              return true;      }      return false;  } +#endif +inline  static uint8_t read_col(void)  {      return PINB;  } +inline  static void unselect_rows(void)  {      // Hi-Z(DDR:0, PORT:0) to unselect @@ -150,6 +188,7 @@ static void unselect_rows(void)      PORTF &= ~0b11000000;  } +inline  static void select_row(uint8_t row)  {      // Output low(DDR:1, PORT:0) to select diff --git a/matrix_skel.h b/matrix_skel.h index 59c4eca11a..2379ce44ab 100644 --- a/matrix_skel.h +++ b/matrix_skel.h @@ -4,23 +4,27 @@  #include <stdbool.h>  /* number of matrix rows */ -int  matrix_rows(void); +uint8_t matrix_rows(void);  /* number of matrix columns */ -int  matrix_cols(void); +uint8_t matrix_cols(void);  /* intialize matrix for scaning. should be called once. */  void matrix_init(void);  /* scan all key states on matrix */ -int  matrix_scan(void); +uint8_t matrix_scan(void);  /* whether modified from previous scan. used after matrix_scan. */  bool matrix_is_modified(void);  /* whether ghosting occur on matrix. */  bool matrix_has_ghost(void);  /* whether a swtich is on */ -bool matrix_is_on(int row, int col); +bool matrix_is_on(uint8_t row, uint8_t col);  /* matrix state on row */ -uint16_t matrix_get_row(int row); +#if (MATRIX_COLS <= 8) +uint8_t matrix_get_row(uint8_t row); +#else +uint16_t matrix_get_row(uint8_t row); +#endif  /* count keys pressed */ -int matrix_key_count(void); +uint8_t matrix_key_count(void);  /* print matrix for debug */  void matrix_print(void); | 
