From fd49c69d1a173b9d273b2b53eb6a22eda920223a Mon Sep 17 00:00:00 2001 From: tmk Date: Thu, 6 Jan 2011 15:18:55 +0900 Subject: 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. --- hhkb/config.h | 8 +++-- hhkb/keymap.c | 37 +++++++++++++------- hhkb/matrix.c | 106 ++++++++++++++++++++++++++++++++++++++++++++++------------ 3 files changed, 115 insertions(+), 36 deletions(-) (limited to 'hhkb') diff --git a/hhkb/config.h b/hhkb/config.h index 7722ed46a..cc86e55ca 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 4273835e9..e18bb8628 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 dd4440d9e..15633d53d 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<