From 75a92ff653735635289a204176e60aa80c33bc7f Mon Sep 17 00:00:00 2001 From: tmk Date: Thu, 21 Feb 2013 10:15:08 +0900 Subject: Fix keymap of gh60 and hhkb --- keyboard/hhkb/config.h | 2 ++ keyboard/hhkb/config_iwrap.h | 2 ++ keyboard/hhkb/keymap.c | 51 ++++++++++++++++---------------------------- 3 files changed, 22 insertions(+), 33 deletions(-) (limited to 'keyboard/hhkb') diff --git a/keyboard/hhkb/config.h b/keyboard/hhkb/config.h index 5fcec95eb..72e4d26e9 100644 --- a/keyboard/hhkb/config.h +++ b/keyboard/hhkb/config.h @@ -36,6 +36,8 @@ along with this program. If not, see . #define MATRIX_ROWS 8 #define MATRIX_COLS 8 +/* To use new keymap framework */ +#define USE_KEYMAP_V2 /* * Boot magic keys diff --git a/keyboard/hhkb/config_iwrap.h b/keyboard/hhkb/config_iwrap.h index 734d66977..d50b704d7 100644 --- a/keyboard/hhkb/config_iwrap.h +++ b/keyboard/hhkb/config_iwrap.h @@ -31,6 +31,8 @@ along with this program. If not, see . #define MATRIX_ROWS 8 #define MATRIX_COLS 8 +/* To use new keymap framework */ +#define USE_KEYMAP_V2 /* key combination for command */ #define IS_COMMAND() (keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) diff --git a/keyboard/hhkb/keymap.c b/keyboard/hhkb/keymap.c index ef21282ff..1fb65873d 100644 --- a/keyboard/hhkb/keymap.c +++ b/keyboard/hhkb/keymap.c @@ -85,7 +85,7 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KEYMAP(PWR, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \ CAPS,NO, NO, NO, NO, NO, NO, NO, PSCR,SLCK,PAUS, UP, NO, BSPC, \ LCTL,VOLD,VOLU,MUTE,NO, NO, PAST,PSLS,HOME,PGUP,LEFT,RGHT,ENT, \ - LSFT,NO, NO, NO, NO, NO, PPLS,PMNS,END, PGDN,DOWN,RSFT,FN0, \ + LSFT,NO, NO, NO, NO, NO, PPLS,PMNS,END, PGDN,DOWN,RSFT,TRNS, \ LGUI,LALT, SPC, RALT,RGUI), /* Layer 2: Vi mode (Slash) @@ -104,7 +104,7 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KEYMAP(ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \ TAB, HOME,PGDN,UP, PGUP,END, HOME,PGDN,PGUP,END, NO, NO, NO, BSPC, \ LCTL,NO, LEFT,DOWN,RGHT,NO, LEFT,DOWN,UP, RGHT,NO, NO, ENT, \ - LSFT,NO, NO, NO, NO, NO, HOME,PGDN,PGUP,END, FN0, RSFT,NO, \ + LSFT,NO, NO, NO, NO, NO, HOME,PGDN,PGUP,END, TRNS,RSFT,NO, \ LGUI,LALT, SPC, RALT,RGUI), /* Layer 3: Mouse mode (Semicolon) @@ -123,9 +123,9 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ KEYMAP(ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \ TAB, NO, NO, NO, NO, NO, WH_L,WH_D,WH_U,WH_R,NO, NO, NO, BSPC, \ - LCTL,NO, ACL0,ACL1,ACL2,NO, MS_L,MS_D,MS_U,MS_R,FN0, QUOT,ENT, \ + LCTL,NO, ACL0,ACL1,ACL2,NO, MS_L,MS_D,MS_U,MS_R,TRNS,QUOT,ENT, \ LSFT,NO, NO, NO, NO, BTN3,BTN2,BTN1,BTN4,BTN5,SLSH,RSFT,NO, \ - LGUI,LALT, BTN1, RALT,FN0), + LGUI,LALT, BTN1, RALT,TRNS), /* Layer 4: Matias half keyboard style (Space) * ,-----------------------------------------------------------. @@ -144,7 +144,7 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { BSPC,P, O, I, U, Y, T, R, E, W, Q, NO, NO, TAB, \ LCTL,SCLN,L, K, J, H, G, F, D, S, A, RCTL,RCTL, \ LSFT,SLSH,DOT, COMM,M, N, B, V, C, X, Z, RSFT,NO, \ - LGUI,LALT, FN0, RALT,RGUI), + LGUI,LALT, TRNS, RALT,RGUI), /* Layer5: another Mouse mode (Space) * ,-----------------------------------------------------------. @@ -164,7 +164,7 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { TAB, NO, NO, NO, NO, NO, WH_L,WH_D,WH_U,WH_R,NO, NO, NO, BSPC, \ LCTL,NO, ACL0,ACL1,ACL2,NO, MS_L,MS_D,MS_U,MS_R,NO, NO, ENT, \ LSFT,NO, NO, NO, NO, BTN3,BTN2,BTN1,BTN4,BTN5,NO, RSFT,NO, \ - LGUI,LALT, FN0, RALT,RGUI), + LGUI,LALT, TRNS, RALT,RGUI), }; @@ -182,26 +182,23 @@ enum function_id { */ // TODO: use [1] = KEYMAP(...) to prevent from changing index of element? static const uint16_t PROGMEM fn_actions[] = { - ACTION_LAYER_DEFAULT, // FN0 - ACTION_LAYER_SET(1), // FN1 - ACTION_LAYER_SET_TAP_KEY(2, KC_SLASH), // FN2 Layer with Slash - ACTION_LAYER_SET_TAP_KEY(3, KC_SCLN), // FN3 Layer with Semicolon + ACTION_DEFAULT_LAYER, // FN0 + ACTION_KEYMAP(1), // FN1 + ACTION_KEYMAP_TAP_KEY(2, KC_SLASH), // FN2 Layer with Slash + ACTION_KEYMAP_TAP_KEY(3, KC_SCLN), // FN3 Layer with Semicolon - ACTION_LAYER_SET(3), // FN4 -// ACTION_LAYER_SET_TOGGLE(3), // FN4 + ACTION_KEYMAP(3), // FN4 +// ACTION_KEYMAP_TOGGLE(3), // FN4 // ACTION_FUNCTION(MACRO, 0), // FN4 - ACTION_LAYER_SET_TAP_KEY(5, KC_SPC), // FN5 + ACTION_KEYMAP_TAP_KEY(5, KC_SPC), // FN5 // ACTION_LMOD_TAP_KEY(KC_LCTL, KC_BSPC), // FN6 Control with tap Backspace ACTION_LMOD_TAP_KEY(KC_LCTL, KC_ESC), // FN6 Control with tap Backspace ACTION_RMOD_TAP_KEY(KC_RCTL, KC_ENT), // FN7 Control with tap Enter ACTION_LMOD_ONESHOT(KC_LSFT), // FN8 Oneshot Shift - ACTION_LAYER_SET_TAP_TOGGLE(1), // FN9 - ACTION_LAYER_BIT_TAP_KEY(1, KC_GRV), // FN10 Layer with Grave - //ACTION_LAYER_BIT(1), // FN10 - //ACTION_LAYER_BIT_TAP_TOGGLE(1), // FN10 - ACTION_FUNCTION_TAP(LSHIFT_LPAREN), // FN11 Function: LShift with tap '(' - ACTION_FUNCTION_TAP(RSHIFT_RPAREN), // FN12 Function: RShift with tap ')' - ACTION_FUNCTION(MACRO, 1), // FN13 Macro: + [9] = ACTION_KEYMAP_TAP_TOGGLE(1), // FN9 + [11] = ACTION_FUNCTION_TAP(LSHIFT_LPAREN), // FN11 Function: LShift with tap '(' + [12] = ACTION_FUNCTION_TAP(RSHIFT_RPAREN), // FN12 Function: RShift with tap ')' + [13] = ACTION_FUNCTION(MACRO, 1), // FN13 Macro: }; @@ -230,7 +227,7 @@ static const prog_macro_t *get_macro(uint8_t id, bool pressed) /* * user defined action function */ -void keymap_call_function(keyrecord_t *record, uint8_t id, uint8_t opt) +void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { keyevent_t event = record->event; uint8_t tap_count = record->tap_count; @@ -328,15 +325,3 @@ action_t keymap_fn_to_action(uint8_t keycode) } return action; } - -/* convert key to action */ -action_t action_for_key(uint8_t layer, key_t key) -{ - uint8_t keycode = keymap_key_to_keycode(layer, key); - switch (keycode) { - case KC_FN0 ... KC_FN31: - return keymap_fn_to_action(keycode); - default: - return keymap_keycode_to_action(keycode); - } -} -- cgit v1.2.3 From 6778324de2f8cbdf4eeada7b2be05937dc833e9b Mon Sep 17 00:00:00 2001 From: tmk Date: Mon, 25 Feb 2013 15:48:34 +0900 Subject: Fix keymap MACRO of pc98 adn hhkb --- converter/pc98_usb/keymap.c | 64 ++++++++++++++++++++++++++++++++++++++++----- keyboard/hhkb/keymap.c | 37 ++++++++++++++------------ 2 files changed, 78 insertions(+), 23 deletions(-) (limited to 'keyboard/hhkb') diff --git a/converter/pc98_usb/keymap.c b/converter/pc98_usb/keymap.c index 6bc549b05..f793539df 100644 --- a/converter/pc98_usb/keymap.c +++ b/converter/pc98_usb/keymap.c @@ -64,10 +64,10 @@ along with this program. If not, see . { 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_##K51, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ - { KC_NO, KC_NO, KC_##K5A, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ + { KC_##K58, KC_##K59, KC_##K5A, KC_##K5B, KC_NO, KC_NO, KC_NO, KC_NO }, \ { KC_##K60, KC_##K61, KC_##K62, KC_##K63, KC_##K64, KC_##K65, KC_##K66, KC_##K67 }, \ { KC_##K68, KC_##K69, KC_##K6A, KC_##K6B, KC_NO, KC_NO, KC_NO, KC_NO }, \ - { KC_##K70, KC_NO, KC_NO, KC_##K73, KC_##K74, KC_NO, KC_NO, KC_NO }, \ + { KC_##K70, KC_##K71, KC_NO, KC_##K73, KC_##K74, KC_NO, KC_NO, KC_NO }, \ { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO } \ } @@ -91,11 +91,11 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { `-----------------------------------------------' */ KEYMAP( - CANCEL,COPY, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, F13, F14, - ESC, 1, 2, 3, 4, 5, NO, NO, 6, 7, 8, 9, 0, BSPC, + CANCEL,COPY, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, F13, FN6, + ESC, 1, 2, 3, 4, 5, FN4, FN5, 6, 7, 8, 9, 0, BSPC, TAB, Q, W, E, R, T, UP, Y, U, I, O, P, ENT, LCTL, A, S, D, F, G, MINS, EQL, H, J, K, L, FN2, - LSFT, Z, X, C, V, B, INS, DOWN, DEL, N, M,COMM, DOT, FN1, + LSFT, Z, X, C, V, B, GRV, BSLS, QUOT, N, M,COMM, DOT, FN1, LGUI, LALT, LCTL, LSFT, SPC, SPC, RALT ), KEYMAP( @@ -115,18 +115,70 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { LGUI, LALT, LCTL, LSFT, SPC, SPC, RALT ), }; - static const uint8_t PROGMEM overlays[][MATRIX_ROWS][MATRIX_COLS] = {}; +/* + * Macro definition + */ +enum macro_id { + LBRACKET, + RBRACKET, + DUMMY, +}; + +const prog_macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + keyevent_t event = record->event; + //uint8_t tap_count = record->tap_count; + + switch (id) { + case LBRACKET: + return (event.pressed ? + MACRO( T(LBRC), END ) : + MACRO( T(LBRC), END ) ); + case RBRACKET: + return (event.pressed ? + MACRO( T(RBRC), END ) : + MACRO( T(RBRC), END ) ); + } + return MACRO_NONE; +} + +/* + * Action function + */ +void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) +{ +/* + keyevent_t event = record->event; + uint8_t tap_count = record->tap_count; + switch (id) { + case 0xFF: + action_macro_play(get_macro(opt, event.pressed)); + break; + } +*/ +} + + +/* + * Fn actions + */ static const uint16_t PROGMEM fn_actions[] = { ACTION_KEYMAP_TAP_TOGGLE(0), // FN0 ACTION_KEYMAP_TAP_KEY(1, KC_SLASH), // FN1 ACTION_KEYMAP_TAP_KEY(2, KC_SCLN), // FN2 ACTION_KEYMAP(2), // FN3 + ACTION_MACRO(LBRACKET), // FN4 + ACTION_MACRO(RBRACKET), // FN5 + ACTION_MACRO(DUMMY), // FN6 }; + + + /* * No need to edit. */ diff --git a/keyboard/hhkb/keymap.c b/keyboard/hhkb/keymap.c index 1fb65873d..d4e009ede 100644 --- a/keyboard/hhkb/keymap.c +++ b/keyboard/hhkb/keymap.c @@ -65,9 +65,9 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ KEYMAP(ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSLS,GRV, \ TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSPC, \ - FN6, A, S, D, F, G, H, J, K, L, FN3, QUOT,FN7, \ - FN8, Z, X, C, V, B, N, M, COMM,DOT, FN2, FN12,FN9, \ - LGUI,LALT, FN5, FN13,FN4), + LCTL,A, S, D, F, G, H, J, K, L, FN3, QUOT,FN7, \ + LSFT,Z, X, C, V, B, N, M, COMM,DOT, FN2, FN12,FN9, \ + LGUI,LALT, FN5, FN14,FN4), /* Layer 1: HHKB mode (HHKB Fn) * ,-----------------------------------------------------------. @@ -173,7 +173,11 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { enum function_id { LSHIFT_LPAREN, RSHIFT_RPAREN, - MACRO = 0xff +}; + +enum macro_id { + SHIFT_D, + HELLO, }; @@ -198,28 +202,30 @@ static const uint16_t PROGMEM fn_actions[] = { [9] = ACTION_KEYMAP_TAP_TOGGLE(1), // FN9 [11] = ACTION_FUNCTION_TAP(LSHIFT_LPAREN), // FN11 Function: LShift with tap '(' [12] = ACTION_FUNCTION_TAP(RSHIFT_RPAREN), // FN12 Function: RShift with tap ')' - [13] = ACTION_FUNCTION(MACRO, 1), // FN13 Macro: + [13] = ACTION_MACRO(SHIFT_D), + [14] = ACTION_MACRO(HELLO), }; /* * Macro definition */ -#define MACRO(...) ({ static prog_macro_t _m[] PROGMEM = { __VA_ARGS__ }; _m; }) -#define MACRO_NONE 0 -static const prog_macro_t *get_macro(uint8_t id, bool pressed) +const prog_macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { + keyevent_t event = record->event; + //uint8_t tap_count = record->tap_count; + switch (id) { - case 0: - return (pressed ? + case SHIFT_D: + return (event.pressed ? MACRO( MD(LSHIFT), D(D), END ) : MACRO( U(D), MU(LSHIFT), END ) ); - case 1: - return (pressed ? - MACRO( I(255), T(H), T(E), T(L), T(L), W(255), T(O), END ) : + case HELLO: + return (event.pressed ? + MACRO( I(0), T(H), T(E), T(L), T(L), W(255), T(O), END ) : MACRO_NONE ); } - return 0; + return MACRO_NONE; } @@ -300,9 +306,6 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) } } break; - case MACRO: - action_macro_play(get_macro(opt, event.pressed)); - break; } } -- cgit v1.2.3 From a207e848b3b308406263576c1e0d066067888416 Mon Sep 17 00:00:00 2001 From: tmk Date: Tue, 26 Feb 2013 16:27:09 +0900 Subject: Add tap flags on record_t --- common/action.c | 46 ++++++++-------- common/action.h | 18 +++++-- common/action_macro.c | 1 - keyboard/hhkb/keymap.c | 143 ++++++++++++++++++++++--------------------------- 4 files changed, 104 insertions(+), 104 deletions(-) (limited to 'keyboard/hhkb') diff --git a/common/action.c b/common/action.c index fc8818030..7f3e236f0 100644 --- a/common/action.c +++ b/common/action.c @@ -206,7 +206,7 @@ void action_exec(keyevent_t event) static void process_action(keyrecord_t *record) { keyevent_t event = record->event; - uint8_t tap_count = record->tap_count; + uint8_t tap_count = record->tap.count; if (IS_NOEVENT(event)) { return; } @@ -295,7 +295,7 @@ static void process_action(keyrecord_t *record) if (waiting_buffer_has_anykey_pressed()) { debug("MODS_TAP: Tap: Cancel: add_mods\n"); // ad hoc: set 0 to cancel tap - record->tap_count = 0; + record->tap.count = 0; add_mods(mods); } else { debug("MODS_TAP: Tap: register_code\n"); @@ -697,16 +697,17 @@ static bool process_tapping(keyrecord_t *keyp) // if tapping if (IS_TAPPING_PRESSED()) { if (WITHIN_TAPPING_TERM(event)) { - if (tapping_key.tap_count == 0) { + if (tapping_key.tap.count == 0) { if (IS_TAPPING_KEY(event.key) && !event.pressed) { // first tap! debug("Tapping: First tap(0->1).\n"); - tapping_key.tap_count = 1; + tapping_key.tap.count = 1; + tapping_key.tap.interrupted = (waiting_buffer_has_anykey_pressed() ? true : false); debug_tapping_key(); process_action(&tapping_key); // enqueue - keyp->tap_count = tapping_key.tap_count; + keyp->tap = tapping_key.tap; return false; } #if TAPPING_TERM >= 500 @@ -730,19 +731,19 @@ static bool process_tapping(keyrecord_t *keyp) // tap_count > 0 else { if (IS_TAPPING_KEY(event.key) && !event.pressed) { - debug("Tapping: Tap release("); debug_dec(tapping_key.tap_count); debug(")\n"); - keyp->tap_count = tapping_key.tap_count; + debug("Tapping: Tap release("); debug_dec(tapping_key.tap.count); debug(")\n"); + keyp->tap = tapping_key.tap; process_action(keyp); tapping_key = *keyp; debug_tapping_key(); return true; } else if (is_tap_key(keyp->event.key) && event.pressed) { - if (tapping_key.tap_count > 1) { + if (tapping_key.tap.count > 1) { debug("Tapping: Start new tap with releasing last tap(>1).\n"); // unregister key process_action(&(keyrecord_t){ - .tap_count = tapping_key.tap_count, + .tap = tapping_key.tap, .event.key = tapping_key.event.key, .event.time = event.time, .event.pressed = false @@ -766,7 +767,7 @@ static bool process_tapping(keyrecord_t *keyp) } // after TAPPING_TERM else { - if (tapping_key.tap_count == 0) { + if (tapping_key.tap.count == 0) { debug("Tapping: End. Timeout. Not tap(0): "); debug_event(event); debug("\n"); process_action(&tapping_key); @@ -776,17 +777,17 @@ static bool process_tapping(keyrecord_t *keyp) } else { if (IS_TAPPING_KEY(event.key) && !event.pressed) { debug("Tapping: End. last timeout tap release(>0)."); - keyp->tap_count = tapping_key.tap_count; + keyp->tap = tapping_key.tap; process_action(keyp); tapping_key = (keyrecord_t){}; return true; } else if (is_tap_key(keyp->event.key) && event.pressed) { - if (tapping_key.tap_count > 1) { + if (tapping_key.tap.count > 1) { debug("Tapping: Start new tap with releasing last timeout tap(>1).\n"); // unregister key process_action(&(keyrecord_t){ - .tap_count = tapping_key.tap_count, + .tap = tapping_key.tap, .event.key = tapping_key.event.key, .event.time = event.time, .event.pressed = false @@ -810,10 +811,11 @@ static bool process_tapping(keyrecord_t *keyp) } } else if (IS_TAPPING_RELEASED()) { if (WITHIN_TAPPING_TERM(event)) { - if (tapping_key.tap_count > 0 && IS_TAPPING_KEY(event.key) && event.pressed) { + if (tapping_key.tap.count > 0 && IS_TAPPING_KEY(event.key) && event.pressed) { // sequential tap. - keyp->tap_count = tapping_key.tap_count + 1; - debug("Tapping: Tap press("); debug_dec(keyp->tap_count); debug(")\n"); + keyp->tap = tapping_key.tap; + keyp->tap.count += 1; + debug("Tapping: Tap press("); debug_dec(keyp->tap.count); debug(")\n"); process_action(keyp); tapping_key = *keyp; debug_tapping_key(); @@ -858,16 +860,16 @@ static bool process_tapping(keyrecord_t *keyp) static void waiting_buffer_scan_tap(void) { // tapping already is settled - if (tapping_key.tap_count > 0) return; - // invalid state: tapping_key released && tap_count == 0 + if (tapping_key.tap.count > 0) return; + // invalid state: tapping_key released && tap.count == 0 if (!tapping_key.event.pressed) return; for (uint8_t i = waiting_buffer_tail; i != waiting_buffer_head; i = (i + 1) % WAITING_BUFFER_SIZE) { if (IS_TAPPING_KEY(waiting_buffer[i].event.key) && !waiting_buffer[i].event.pressed && WITHIN_TAPPING_TERM(waiting_buffer[i].event)) { - tapping_key.tap_count = 1; - waiting_buffer[i].tap_count = 1; + tapping_key.tap.count = 1; + waiting_buffer[i].tap.count = 1; process_action(&tapping_key); debug("waiting_buffer_scan_tap: found at ["); debug_dec(i); debug("]\n"); @@ -987,6 +989,7 @@ bool is_tap_key(key_t key) default: return false; } + case ACT_MACRO: case ACT_FUNCTION: if (action.func.opt & FUNC_TAP) { return true; } return false; @@ -1006,7 +1009,8 @@ static void debug_event(keyevent_t event) } static void debug_record(keyrecord_t record) { - debug_event(record.event); debug(":"); debug_dec(record.tap_count); + debug_event(record.event); debug(":"); debug_dec(record.tap.count); + if (record.tap.interrupted) debug("-"); } static void debug_action(action_t action) { diff --git a/common/action.h b/common/action.h index 9dea4b0aa..39e0ae328 100644 --- a/common/action.h +++ b/common/action.h @@ -23,9 +23,19 @@ along with this program. If not, see . /* Struct to record event and tap count */ +typedef union { + struct { + bool interrupted :1; + bool reserved2 :1; + bool reserved1 :1; + bool reserved0 :1; + uint8_t count :4; + }; +} tap_t; + typedef struct { keyevent_t event; - uint8_t tap_count; + tap_t tap; } keyrecord_t; /* Action struct. @@ -377,6 +387,7 @@ enum layer_params { */ /* Macro */ #define ACTION_MACRO(id) ACTION(ACT_MACRO, (id)) +#define ACTION_MACRO_TAP(id) ACTION(ACT_MACRO, FUNC_TAP<<8 | (id)) #define ACTION_MACRO_OPT(id, opt) ACTION(ACT_MACRO, (opt)<<8 | (id)) /* Command */ @@ -386,7 +397,8 @@ enum layer_params { enum function_opts { FUNC_TAP = 0x8, /* indciates function is tappable */ }; -#define ACTION_FUNCTION(id, opt) ACTION(ACT_FUNCTION, (opt)<<8 | id) -#define ACTION_FUNCTION_TAP(id) ACTION(ACT_FUNCTION, FUNC_TAP<<8 | id) +#define ACTION_FUNCTION(id) ACTION(ACT_FUNCTION, (id)) +#define ACTION_FUNCTION_TAP(id) ACTION(ACT_FUNCTION, FUNC_TAP<<8 | (id)) +#define ACTION_FUNCTION_OPT(id, opt) ACTION(ACT_FUNCTION, (opt)<<8 | (id)) #endif /* ACTION_H */ diff --git a/common/action_macro.c b/common/action_macro.c index 72859c0dd..ca7ffa822 100644 --- a/common/action_macro.c +++ b/common/action_macro.c @@ -41,7 +41,6 @@ void action_macro_play(const prog_macro_t *macro_p) case MODS_DOWN: MACRO_READ(); debug("MODS_DOWN("); debug_hex(macro); debug(")\n"); - debug("MODS_UP("); debug_hex(macro); debug(")\n"); add_mods(macro); break; case MODS_UP: diff --git a/keyboard/hhkb/keymap.c b/keyboard/hhkb/keymap.c index d4e009ede..0d07c79cf 100644 --- a/keyboard/hhkb/keymap.c +++ b/keyboard/hhkb/keymap.c @@ -56,18 +56,18 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |-----------------------------------------------------------| * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]|Backs| * |-----------------------------------------------------------| - * |Fn6 | A| S| D| F| G| H| J| K| L|Fn3| '|Return | + * |Contro| A| S| D| F| G| H| J| K| L|Fn3| '|Fn4 | * |-----------------------------------------------------------| - * |Fn8 | Z| X| C| V| B| N| M| ,| .|Fn2|Fn12 |Fn1| + * |Fn5 | Z| X| C| V| B| N| M| ,| .|Fn2|Shift |Fn1| * `-----------------------------------------------------------' - * |Gui|Alt | Fn5 |Alt |Fn4| + * |Gui|Alt | Fn6 |Alt |Fn7| * `-------------------------------------------' */ KEYMAP(ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSLS,GRV, \ TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSPC, \ - LCTL,A, S, D, F, G, H, J, K, L, FN3, QUOT,FN7, \ - LSFT,Z, X, C, V, B, N, M, COMM,DOT, FN2, FN12,FN9, \ - LGUI,LALT, FN5, FN14,FN4), + LCTL,A, S, D, F, G, H, J, K, L, FN3, QUOT,FN4, \ + FN5,Z, X, C, V, B, N, M, COMM,DOT, FN2, RSFT,FN1, \ + LGUI,LALT, FN6, RALT,FN7), /* Layer 1: HHKB mode (HHKB Fn) * ,-----------------------------------------------------------. @@ -77,7 +77,7 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |-----------------------------------------------------------| * |Contro|VoD|VoU|Mut| | | *| /|Hom|PgU|Lef|Rig|Enter | * |-----------------------------------------------------------| - * |Shift | | | | | | +| -|End|PgD|Dow|Shift |Fn0| + * |Shift | | | | | | +| -|End|PgD|Dow|Shift | | * `-----------------------------------------------------------' * |Gui|Alt | Space |Alt |Gui| * `-------------------------------------------' @@ -127,7 +127,7 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { LSFT,NO, NO, NO, NO, BTN3,BTN2,BTN1,BTN4,BTN5,SLSH,RSFT,NO, \ LGUI,LALT, BTN1, RALT,TRNS), - /* Layer 4: Matias half keyboard style (Space) + /* Layer 4: Matias half-qwerty keyboard style (Space) * ,-----------------------------------------------------------. * | -| 0| 9| 8| 7| 6| 5| 4| 3| 2| 1| | | |Esc| * |-----------------------------------------------------------| @@ -176,7 +176,8 @@ enum function_id { }; enum macro_id { - SHIFT_D, + LSHIFT_PAREN, + RSHIFT_PAREN, HELLO, }; @@ -184,26 +185,26 @@ enum macro_id { /* * Fn action definition */ -// TODO: use [1] = KEYMAP(...) to prevent from changing index of element? static const uint16_t PROGMEM fn_actions[] = { - ACTION_DEFAULT_LAYER, // FN0 - ACTION_KEYMAP(1), // FN1 - ACTION_KEYMAP_TAP_KEY(2, KC_SLASH), // FN2 Layer with Slash - ACTION_KEYMAP_TAP_KEY(3, KC_SCLN), // FN3 Layer with Semicolon - - ACTION_KEYMAP(3), // FN4 -// ACTION_KEYMAP_TOGGLE(3), // FN4 -// ACTION_FUNCTION(MACRO, 0), // FN4 - ACTION_KEYMAP_TAP_KEY(5, KC_SPC), // FN5 -// ACTION_LMOD_TAP_KEY(KC_LCTL, KC_BSPC), // FN6 Control with tap Backspace - ACTION_LMOD_TAP_KEY(KC_LCTL, KC_ESC), // FN6 Control with tap Backspace - ACTION_RMOD_TAP_KEY(KC_RCTL, KC_ENT), // FN7 Control with tap Enter - ACTION_LMOD_ONESHOT(KC_LSFT), // FN8 Oneshot Shift - [9] = ACTION_KEYMAP_TAP_TOGGLE(1), // FN9 - [11] = ACTION_FUNCTION_TAP(LSHIFT_LPAREN), // FN11 Function: LShift with tap '(' - [12] = ACTION_FUNCTION_TAP(RSHIFT_RPAREN), // FN12 Function: RShift with tap ')' - [13] = ACTION_MACRO(SHIFT_D), - [14] = ACTION_MACRO(HELLO), + [0] = ACTION_DEFAULT_LAYER, // Default layer(not used) +// [1] = ACTION_KEYMAP(1), // HHKB layer + [1] = ACTION_KEYMAP_TAP_TOGGLE(1), // HHKB layer(toggle with 5 taps) + [2] = ACTION_KEYMAP_TAP_KEY(2, KC_SLASH), // Cursor layer with Slash* + [3] = ACTION_KEYMAP_TAP_KEY(3, KC_SCLN), // Mousekey layer with Semicolon* + [4] = ACTION_RMOD_TAP_KEY(KC_RCTL, KC_ENT), // RControl with tap Enter* + [5] = ACTION_LMOD_ONESHOT(KC_LSFT), // Oneshot Shift* +// [6] = ACTION_KEYMAP_TAP_KEY(4, KC_SPC), // Half-qwerty layer with Space + [6] = ACTION_KEYMAP_TAP_KEY(5, KC_SPC), // Mousekey layer with Space +// [7] = ACTION_KEYMAP(3), // Mousekey layer + [7] = ACTION_KEYMAP_TOGGLE(3), // Mousekey layer(toggle) + +// [8] = ACTION_LMOD_TAP_KEY(KC_LCTL, KC_BSPC), // LControl with tap Backspace +// [9] = ACTION_LMOD_TAP_KEY(KC_LCTL, KC_ESC), // LControl with tap Esc +// [11] = ACTION_FUNCTION_TAP(LSHIFT_LPAREN), // Function: LShift with tap '(' +// [12] = ACTION_FUNCTION_TAP(RSHIFT_RPAREN), // Function: RShift with tap ')' +// [13] = ACTION_MACRO_TAP(LSHIFT_PAREN), // Macro: LShift with tap '(' +// [14] = ACTION_MACRO_TAP(RSHIFT_PAREN), // Macro: RShift with tap ')' +// [15] = ACTION_MACRO(HELLO), // Macro: say hello }; @@ -213,13 +214,25 @@ static const uint16_t PROGMEM fn_actions[] = { const prog_macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { keyevent_t event = record->event; - //uint8_t tap_count = record->tap_count; + tap_t tap = record->tap; switch (id) { - case SHIFT_D: - return (event.pressed ? - MACRO( MD(LSHIFT), D(D), END ) : - MACRO( U(D), MU(LSHIFT), END ) ); + case LSHIFT_PAREN: + if (tap.count > 0 && !tap.interrupted) { + return (event.pressed ? + MACRO( MD(LSHIFT), D(9), U(9), MU(LSHIFT), END ) : MACRO_NONE); + } else { + return (event.pressed ? + MACRO( MD(LSHIFT), END ) : MACRO( MU(LSHIFT), END ) ); + } + case RSHIFT_PAREN: + if (tap.count > 0 && !tap.interrupted) { + return (event.pressed ? + MACRO( MD(RSHIFT), D(0), U(0), MU(RSHIFT), END ) : MACRO_NONE); + } else { + return (event.pressed ? + MACRO( MD(RSHIFT), END ) : MACRO( MU(RSHIFT), END ) ); + } case HELLO: return (event.pressed ? MACRO( I(0), T(H), T(E), T(L), T(L), W(255), T(O), END ) : @@ -236,74 +249,46 @@ const prog_macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t op void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { keyevent_t event = record->event; - uint8_t tap_count = record->tap_count; - - debug("action_call_function: "); - if (event.pressed) debug("pressed"); else debug("released"); - debug(" id: "); debug_hex(id); - debug(" tap_count: "); debug_dec(tap_count); - debug("\n"); + tap_t tap = record->tap; switch (id) { case LSHIFT_LPAREN: // LShft + tap '(' + // NOTE: cant use register_code to avoid conflicting with magic key bind if (event.pressed) { - if (tap_count == 0) { + if (tap.count == 0 || tap.interrupted) { add_mods(MOD_BIT(KC_LSHIFT)); } else { - if (waiting_buffer_has_anykey_pressed()) { - // ad hoc: set 0 to cancel tap - record->tap_count = 0; - add_mods(MOD_BIT(KC_LSHIFT)); - } else { - // NOTE to avoid conflicting command key bind(LShift+RShift) - //register_code(KC_LSHIFT); - //register_code(KC_9); - host_add_mods(MOD_BIT(KC_LSHIFT)); - host_add_key(KC_9); - host_send_keyboard_report(); - } - } - } else { - if (tap_count == 0) { - del_mods(MOD_BIT(KC_LSHIFT)); - } else { - //unregister_code(KC_9); - //unregister_code(KC_LSHIFT); + host_add_mods(MOD_BIT(KC_LSHIFT)); + host_add_key(KC_9); + host_send_keyboard_report(); host_del_mods(MOD_BIT(KC_LSHIFT)); host_del_key(KC_9); host_send_keyboard_report(); } + } else { + if (tap.count == 0 || tap.interrupted) { + del_mods(MOD_BIT(KC_LSHIFT)); + } } break; case RSHIFT_RPAREN: // RShift + tap ')' if (event.pressed) { - if (tap_count == 0) { + if (tap.count == 0 || tap.interrupted) { add_mods(MOD_BIT(KC_RSHIFT)); } else { - if (waiting_buffer_has_anykey_pressed()) { - // ad hoc: set 0 to cancel tap - record->tap_count = 0; - add_mods(MOD_BIT(KC_RSHIFT)); - } else { - //register_code(KC_RSHIFT); - //register_code(KC_0); - host_add_mods(MOD_BIT(KC_RSHIFT)); - host_add_key(KC_0); - host_send_keyboard_report(); - } - } - } else { - if (tap_count == 0) { - del_mods(MOD_BIT(KC_RSHIFT)); - } else { - //unregister_code(KC_0); - //unregister_code(KC_RSHIFT); + host_add_mods(MOD_BIT(KC_RSHIFT)); + host_add_key(KC_0); + host_send_keyboard_report(); host_del_mods(MOD_BIT(KC_RSHIFT)); host_del_key(KC_0); host_send_keyboard_report(); } + } else { + if (tap.count == 0 || tap.interrupted) { + del_mods(MOD_BIT(KC_RSHIFT)); + } } break; } -- cgit v1.2.3 From 5808317b694004c43a6e0f76e9715415cce19a25 Mon Sep 17 00:00:00 2001 From: tmk Date: Tue, 5 Mar 2013 15:41:21 +0900 Subject: Fix keymap for new framework --- README.md | 2 +- common/keymap.c | 18 +- converter/m0110_usb/Makefile.lufa | 91 +++++++ converter/m0110_usb/README.md | 7 +- converter/m0110_usb/config.h | 1 + converter/m0110_usb/keymap.c | 9 +- converter/pc98_usb/keymap.c | 2 +- keyboard/IIgs/Makefile | 95 ++++++++ keyboard/IIgs/README | 45 ++++ keyboard/IIgs/config.h | 68 ++++++ keyboard/IIgs/doc/PIN_BYPASS.jpg | Bin 0 -> 329437 bytes keyboard/IIgs/doc/Teensy++_Mod.jpg | Bin 0 -> 74137 bytes keyboard/IIgs/hid_listen.mac | Bin 0 -> 13524 bytes keyboard/IIgs/keymap.c | 142 +++++++++++ keyboard/IIgs/led.c | 24 ++ keyboard/IIgs/matrix.c | 363 ++++++++++++++++++++++++++++ keyboard/IIgs_Standard/Makefile | 95 -------- keyboard/IIgs_Standard/README | 45 ---- keyboard/IIgs_Standard/config.h | 68 ------ keyboard/IIgs_Standard/doc/PIN_BYPASS.jpg | Bin 329437 -> 0 bytes keyboard/IIgs_Standard/doc/Teensy++_Mod.jpg | Bin 74137 -> 0 bytes keyboard/IIgs_Standard/hid_listen.mac | Bin 13524 -> 0 bytes keyboard/IIgs_Standard/keymap.c | 142 ----------- keyboard/IIgs_Standard/led.c | 24 -- keyboard/IIgs_Standard/matrix.c | 363 ---------------------------- keyboard/hhkb/keymap.c | 6 +- protocol/vusb/vusb.c | 4 + 27 files changed, 854 insertions(+), 760 deletions(-) create mode 100644 converter/m0110_usb/Makefile.lufa create mode 100644 keyboard/IIgs/Makefile create mode 100644 keyboard/IIgs/README create mode 100644 keyboard/IIgs/config.h create mode 100644 keyboard/IIgs/doc/PIN_BYPASS.jpg create mode 100644 keyboard/IIgs/doc/Teensy++_Mod.jpg create mode 100755 keyboard/IIgs/hid_listen.mac create mode 100644 keyboard/IIgs/keymap.c create mode 100644 keyboard/IIgs/led.c create mode 100644 keyboard/IIgs/matrix.c delete mode 100644 keyboard/IIgs_Standard/Makefile delete mode 100644 keyboard/IIgs_Standard/README delete mode 100644 keyboard/IIgs_Standard/config.h delete mode 100644 keyboard/IIgs_Standard/doc/PIN_BYPASS.jpg delete mode 100644 keyboard/IIgs_Standard/doc/Teensy++_Mod.jpg delete mode 100755 keyboard/IIgs_Standard/hid_listen.mac delete mode 100644 keyboard/IIgs_Standard/keymap.c delete mode 100644 keyboard/IIgs_Standard/led.c delete mode 100644 keyboard/IIgs_Standard/matrix.c (limited to 'keyboard/hhkb') diff --git a/README.md b/README.md index b85e03ddb..e9dad457d 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,7 @@ You can find some keyboard specific projects under `converter` and `keyboard` di * [hhkb](keyboard/hhkb/) - [Happy Hacking Keyboard professional][GH_hhkb] * [macway](keyboard/macway/) - [Compact keyboard mod][GH_macway] * [hbkb](keyboard/hbkb/) - [Happy Buckling sprint keyboard(IBM Model M mod)][GH_hbkb] -* [IIgs_Standard](keyboard/IIgs_Standard/) - Apple [IIGS] keyboard mod(by JeffreySung) +* [IIgs_Standard](keyboard/IIgs/) - Apple [IIGS] keyboard mod(by JeffreySung) * [hid_liber](keyboard/hid_liber/) - [HID liberation controller][HID_liber](by alaricljs) * [phantom](keyboard/phantom/) - [Phantom keyboard][PHANTOM] (by Tranquilite) * [gh60](keyboard/gh60/) - [GH60 keyboard][GH60] diff --git a/common/keymap.c b/common/keymap.c index f72be5779..aa8d944a7 100644 --- a/common/keymap.c +++ b/common/keymap.c @@ -38,12 +38,6 @@ action_t action_for_key(uint8_t layer, key_t key) return keycode_to_action(keycode); } } - -__attribute__ ((weak)) -const prog_macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { return MACRO_NONE; } - -__attribute__ ((weak)) -void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) {} #else /* * legacy keymap support @@ -71,13 +65,17 @@ action_t action_for_key(uint8_t layer, key_t key) return keycode_to_action(keycode); } } -/* not used for legacy keymap */ -void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) -{ -} #endif +__attribute__ ((weak)) +const prog_macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { return MACRO_NONE; } + +__attribute__ ((weak)) +void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) {} + + + /* translates keycode to action */ static action_t keycode_to_action(uint8_t keycode) diff --git a/converter/m0110_usb/Makefile.lufa b/converter/m0110_usb/Makefile.lufa new file mode 100644 index 000000000..028bdf933 --- /dev/null +++ b/converter/m0110_usb/Makefile.lufa @@ -0,0 +1,91 @@ +# Target file name (without extension). +TARGET = m0110_lufa + +# Directory common source filess exist +TOP_DIR = ../.. + +# Directory keyboard dependent files exist +TARGET_DIR = . + +# keyboard dependent files +SRC = keymap.c \ + matrix.c \ + led.c \ + m0110.c + +CONFIG_H = config.h + + +# MCU name, you MUST set this to match the board you are using +# type "make clean" after changing this, so all files will be rebuilt +#MCU = at90usb162 # Teensy 1.0 +MCU = atmega32u4 # Teensy 2.0 +#MCU = at90usb646 # Teensy++ 1.0 +#MCU = at90usb1286 # Teensy++ 2.0 + + +# Processor frequency. +# Normally the first thing your program should do is set the clock prescaler, +# so your program will run at the correct speed. You should also set this +# variable to same clock speed. The _delay_ms() macro uses this, and many +# examples use this variable to calculate timings. Do not add a "UL" here. +F_CPU = 16000000 + + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Build Options +# *Comment out* to disable the options. +# +MOUSEKEY_ENABLE = yes # Mouse keys +#PS2_MOUSE_ENABLE = yes # PS/2 mouse(TrackPoint) support +EXTRAKEY_ENABLE = yes # Audio control and System control +CONSOLE_ENABLE = yes # Console for debug +#NKRO_ENABLE = yes # USB Nkey Rollover + + +# Boot Section Size in bytes +# Teensy halfKay 512 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +OPT_DEFS += -DBOOT_SIZE=4096 + + + +#---------------- Programming Options -------------------------- +PROGRAM_CMD = teensy_loader_cli -mmcu=$(MCU) -w -v $(TARGET).hex + + +# Search Path +VPATH += $(TARGET_DIR) +VPATH += $(TOP_DIR) + + +include $(TOP_DIR)/protocol/lufa.mk +include $(TOP_DIR)/protocol.mk +include $(TOP_DIR)/common.mk +include $(TOP_DIR)/rules.mk + +hasu: EXTRAFLAGS += -DHASU +hasu: all diff --git a/converter/m0110_usb/README.md b/converter/m0110_usb/README.md index 206f43425..80503e875 100644 --- a/converter/m0110_usb/README.md +++ b/converter/m0110_usb/README.md @@ -53,7 +53,8 @@ You can edit *Makefile* and *config.h* to change compile options and pin configu $ git clone git://github.com/tmk/tmk_keyboard.git (or download source) $ cd m0110_usb - $ make + $ make -f Makefile.lufa clean + $ make -f Makefile.lufa and program your Teensy with [PJRC Teensy loader](http://www.pjrc.com/teensy/loader.html). @@ -74,7 +75,7 @@ You can change keymaps by editing *keymap.c*. |---------------------------------------------------------| |---------------| |Shift | Z| X| C| V| B| N| M| ,| ,| /|Shift | | 1| 2| 3| | `---------------------------------------------------------' |-----------|Ent| - |Alt|Gui | Space |Ctl |Alt| | 0| .| | + |Ctl|Alt | Space |Gui |Ctl| | 0| .| | `-----------------------------------------------' `---------------' #### *HHKB/WASD Layer(WASD/IJKL)* ,---------------------------------------------------------. ,---------------. @@ -86,7 +87,7 @@ You can change keymaps by editing *keymap.c*. |---------------------------------------------------------| |---------------| |Shift |End| |PgD| | | |PgD| |End| |Shift | | 1| 2| 3| | `---------------------------------------------------------' |-----------|Ent| - |Alt|Gui | Space |Ctl |Alt| | 0| .| | + |Ctl|Alt | Space |Gui |Ctl| | 0| .| | `-----------------------------------------------' `---------------' ### M0110A diff --git a/converter/m0110_usb/config.h b/converter/m0110_usb/config.h index be00259e6..d43f28383 100644 --- a/converter/m0110_usb/config.h +++ b/converter/m0110_usb/config.h @@ -24,6 +24,7 @@ along with this program. If not, see . #define VENDOR_ID 0xFEED #define PRODUCT_ID 0x0110 +#define DEVICE_VER 0x0100 #define MANUFACTURER t.m.k. #define PRODUCT M0110 keyboard converter #define DESCRIPTION convert M0110 keyboard to USB diff --git a/converter/m0110_usb/keymap.c b/converter/m0110_usb/keymap.c index 191bf3a15..7a3bc3585 100644 --- a/converter/m0110_usb/keymap.c +++ b/converter/m0110_usb/keymap.c @@ -19,7 +19,6 @@ along with this program. If not, see . #include #include #include -#include "usb_keyboard.h" #include "keycode.h" #include "print.h" #include "debug.h" @@ -148,7 +147,7 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |---------------------------------------------------------| |---------------| * |Shift | Z| X| C| V| B| N| M| ,| ,| /|Shft|Up | | 1| 2| 3| | * |---------------------------------------------------------| |-----------|Ent| - * |Alt |Gui | Space |Ctl| \|Lft|Rgt|Dn | | 0| .| | + * |Ctl |Alt | Space |Gui| \|Lft|Rgt|Dn | | 0| .| | * `---------------------------------------------------------' `---------------' */ KEYMAP( @@ -156,7 +155,7 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC, P7, P8, P9, PMNS, FN0, A, S, D, F, G, H, J, K, L, SCLN,QUOT, ENT, P4, P5, P6, PPLS, LSFT,Z, X, C, V, B, N, M, COMM,DOT, SLSH, UP, P1, P2, P3, PENT, - LALT,LGUI, SPC, LCTL,BSLS,LEFT,RGHT,DOWN, P0, PDOT + LCTL,LALT, SPC, LGUI,BSLS,LEFT,RGHT,DOWN, P0, PDOT ), /* Cursor Layer(WASD, IJKL) * ,---------------------------------------------------------. ,---------------. @@ -168,7 +167,7 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |---------------------------------------------------------| |---------------| * |Shift |End| |PgD| | | |PgD| |End| |Shif|PgU| | 1| 2| 3| | * |---------------------------------------------------------| |-----------|Ent| - * |Alt |Gui | Space |Gui |Ins|Hom|End|PgD| | 0| .| | + * |Ctl |Alt | Space |Gui |Ins|Hom|End|PgD| | 0| .| | * `---------------------------------------------------------' `---------------' */ KEYMAP( @@ -176,7 +175,7 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { CAPS,HOME,UP, PGUP,NO, NO, NO, PGUP,UP, HOME,PSCR,SLCK,PAUS, P7, P8, P9, PMNS, FN0, LEFT,DOWN,RGHT,NO, NO, NO, LEFT,DOWN,RGHT,NO, NO, ENT, P4, P5, P6, PPLS, LSFT,END, NO, PGDN,NO, NO, NO, PGDN,NO, END, NO, PGUP, P1, P2, P3, PENT, - LALT,LGUI, SPC, LCTL,INS, HOME,END, PGDN, P0, PDOT + LCTL,LALT, SPC, LGUI,INS, HOME,END, PGDN, P0, PDOT ), }; diff --git a/converter/pc98_usb/keymap.c b/converter/pc98_usb/keymap.c index f793539df..279b2b60c 100644 --- a/converter/pc98_usb/keymap.c +++ b/converter/pc98_usb/keymap.c @@ -168,7 +168,7 @@ static const uint16_t PROGMEM fn_actions[] = { ACTION_KEYMAP_TAP_TOGGLE(0), // FN0 ACTION_KEYMAP_TAP_KEY(1, KC_SLASH), // FN1 ACTION_KEYMAP_TAP_KEY(2, KC_SCLN), // FN2 - ACTION_KEYMAP(2), // FN3 + ACTION_KEYMAP_MOMENTARY(2), // FN3 ACTION_MACRO(LBRACKET), // FN4 ACTION_MACRO(RBRACKET), // FN5 ACTION_MACRO(DUMMY), // FN6 diff --git a/keyboard/IIgs/Makefile b/keyboard/IIgs/Makefile new file mode 100644 index 000000000..c18e9720c --- /dev/null +++ b/keyboard/IIgs/Makefile @@ -0,0 +1,95 @@ +#---------------------------------------------------------------------------- +# On command line: +# +# make all = Make software. +# +# make clean = Clean out built project files. +# +# make coff = Convert ELF to AVR COFF. +# +# make extcoff = Convert ELF to AVR Extended COFF. +# +# make program = Download the hex file to the device. +# Please customize your programmer settings(PROGRAM_CMD) +# +# make teensy = Download the hex file to the device, using teensy_loader_cli. +# (must have teensy_loader_cli installed). +# +# make dfu = Download the hex file to the device, using dfu-programmer (must +# have dfu-programmer installed). +# +# make flip = Download the hex file to the device, using Atmel FLIP (must +# have Atmel FLIP installed). +# +# make dfu-ee = Download the eeprom file to the device, using dfu-programmer +# (must have dfu-programmer installed). +# +# make flip-ee = Download the eeprom file to the device, using Atmel FLIP +# (must have Atmel FLIP installed). +# +# make debug = Start either simulavr or avarice as specified for debugging, +# with avr-gdb or avr-insight as the front end for debugging. +# +# make filename.s = Just compile filename.c into the assembler code only. +# +# make filename.i = Create a preprocessed source file for use in submitting +# bug reports to the GCC project. +# +# To rebuild project do "make clean" then "make all". +#---------------------------------------------------------------------------- + +# Target file name (without extension). +TARGET = IIgs_Standard + +# Directory common source filess exist +TOP_DIR = ../.. + +# Directory keyboard dependent files exist +TARGET_DIR = . + +# keyboard dependent files +SRC = keymap.c \ + matrix.c \ + led.c + +CONFIG_H = config.h + + +# MCU name, you MUST set this to match the board you are using +# type "make clean" after changing this, so all files will be rebuilt +#MCU = at90usb162 # Teensy 1.0 +#MCU = atmega32u4 # Teensy 2.0 +#MCU = at90usb646 # Teensy++ 1.0 +MCU = at90usb1286 # Teensy++ 2.0 + + +# Processor frequency. +# Normally the first thing your program should do is set the clock prescaler, +# so your program will run at the correct speed. You should also set this +# variable to same clock speed. The _delay_ms() macro uses this, and many +# examples use this variable to calculate timings. Do not add a "UL" here. +F_CPU = 16000000 + + +# Build Options +# comment out to disable the options. +# +MOUSEKEY_ENABLE = no # Mouse keys +#PS2_MOUSE_ENABLE = yes # PS/2 mouse(TrackPoint) support +EXTRAKEY_ENABLE = yes # Audio control and System control +#NKRO_ENABLE = yes # USB Nkey Rollover + + + +#---------------- Programming Options -------------------------- +PROGRAM_CMD = teensy_loader_cli -mmcu=$(MCU) -w -v $(TARGET).hex + + + +# Search Path +VPATH += $(TARGET_DIR) +VPATH += $(TOP_DIR) + +include $(TOP_DIR)/protocol/pjrc.mk +include $(TOP_DIR)/common.mk +include $(TOP_DIR)/rules.mk diff --git a/keyboard/IIgs/README b/keyboard/IIgs/README new file mode 100644 index 000000000..4f9cad1ca --- /dev/null +++ b/keyboard/IIgs/README @@ -0,0 +1,45 @@ +Replacable USB Controller for Apple IIgs/Standard(M0116) +JeffreySung(nattyman@gmail.com) + +=============================== + +Feature +------- +- Replaceable keyboard controller for Apple IIgs(A9M0330)/Standard(M0116) +- Teensy++ 2.0 required +- Some signal bypass required +- ADB keyboard doesn't use matrix for modifier keys. With virtual row for modifier keys, + these keys are merged into key matrix using virtual row. + +History +======= +- 2012.09.17 First Release +- 2012.09.17 CapsLock support +- 2012.09.19 Power button added +Build +===== +0. Just Type "Make" and return. + +Hardware +======== +PJRC Teensy +----------- +0. The following ports should not be connected to board. + From top view of Teensy++, from GND and counter clock wise. + -7,26(in keyboard PCB, these pins are VDD,GND) + -30,31(in Teensy++, these pins are Ref,GND respectively) + -5,6(D2,D3 for bluetooth in future) +1. Bypass #31 pin(from board) to E4(Teensy) +2. Bypass #30 pin(from board) to F2(Teensy) +3. Bypass #6 pin(from board) to A0(Teensy) +4. Refer doc directory + +To Do +===== +0. When DEBOUNCE defined, there is a errors. +1. Layer Change by toggling Clear Key +2. Eject Key add. (following files should be modified.) + common/keycode.h + common/keyboard.c +3. Use bluetooth +EOF diff --git a/keyboard/IIgs/config.h b/keyboard/IIgs/config.h new file mode 100644 index 000000000..11acf87c0 --- /dev/null +++ b/keyboard/IIgs/config.h @@ -0,0 +1,68 @@ +/* +Copyright 2011 Jun Wako + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#ifndef CONFIG_H +#define CONFIG_H + +/* controller configuration */ +#include "controller_teensy.h" + + +/* USB Device descriptor parameter */ +/* for Apple +#define VENDOR_ID 0x05AC +#define PRODUCT_ID 0xBEE0 +*/ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0xBEE0 +#define DEVICE_VER 0x0202 +#define MANUFACTURER t.m.k. +#define PRODUCT Apple Desktop Bus Keyboard + + +/* message strings */ +#define DESCRIPTION Apple M0116/A9M0660 keyboard firmware + + +/* matrix size */ +#define MATRIX_ROWS 11 // last row is virtual for modifier +#define MATRIX_COLS 8 +/* define if matrix has ghost */ +#define MATRIX_HAS_GHOST +/* Set 0 if need no debouncing */ +#define DEBOUNCE 5 + + +/* key combination for command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_LCTRL) | MOD_BIT(KC_LALT) | MOD_BIT(KC_LGUI)) || \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + + +/* layer switching */ +#define LAYER_SWITCH_DELAY 100 +#define LAYER_SEND_FN_TERM 300 + + +/* mouse keys */ +#ifdef MOUSEKEY_ENABLE +# define MOUSEKEY_DELAY_TIME 192 +#endif + + +#endif diff --git a/keyboard/IIgs/doc/PIN_BYPASS.jpg b/keyboard/IIgs/doc/PIN_BYPASS.jpg new file mode 100644 index 000000000..2998f0c3f Binary files /dev/null and b/keyboard/IIgs/doc/PIN_BYPASS.jpg differ diff --git a/keyboard/IIgs/doc/Teensy++_Mod.jpg b/keyboard/IIgs/doc/Teensy++_Mod.jpg new file mode 100644 index 000000000..146c1ab93 Binary files /dev/null and b/keyboard/IIgs/doc/Teensy++_Mod.jpg differ diff --git a/keyboard/IIgs/hid_listen.mac b/keyboard/IIgs/hid_listen.mac new file mode 100755 index 000000000..8758fdf88 Binary files /dev/null and b/keyboard/IIgs/hid_listen.mac differ diff --git a/keyboard/IIgs/keymap.c b/keyboard/IIgs/keymap.c new file mode 100644 index 000000000..cd33e223a --- /dev/null +++ b/keyboard/IIgs/keymap.c @@ -0,0 +1,142 @@ +/* +Copyright 2012 Jeffrey Sung + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +/* + * Keymap for Apple IIgs/Standard Keyboard + */ +#include +#include +#include +#include "keycode.h" +#include "print.h" +#include "debug.h" +#include "util.h" +#include "keymap.h" + + +// Convert physical keyboard layout to matrix array. +// This is a macro to define keymap easily in keyboard layout form. +#define KEYMAP( R10C5, \ + R3C7, R3C6, R3C5, R3C4, R3C3, R3C2, R3C1, R8C1, R8C0, R3C0, R0C0, R0C1, R0C2, R0C3, R4C4, R4C5, R4C6, R4C7, \ + R9C7, R9C6, R9C5, R9C4, R9C3, R9C2, R9C1, R9C0, R1C0, R1C1, R1C2, R1C3, R1C4, R2C4, R2C5, R2C6, R2C3, \ + R10C0,R7C7, R7C6, R7C5, R7C4, R7C3, R7C2, R7C1, R7C0, R0C4, R1C6, R1C7, R1C5, R2C0, R2C1, R2C2, R2C7, \ + R10C1,R6C7, R6C6, R6C5, R6C4, R6C3, R6C2, R6C1, R6C0, R0C5, R0C6, R4C0, R4C1, R4C2, \ + R10C4,R10C2,R10C3,R5C4, R5C7, R5C5, R5C6, R5C0, R5C2, R0C7, R5C1, R5C3, R4C3 \ +) { \ + { R0C0, R0C1, R0C2, R0C3, R0C4, R0C5, R0C6, R0C7 }, \ + { R1C0, R1C1, R1C2, R1C3, R1C4, R1C5, R1C6, R1C7 }, \ + { R2C0, R2C1, R2C2, R2C3, R2C4, R2C5, R2C6, R2C7 }, \ + { R3C0, R3C1, R3C2, R3C3, R3C4, R3C5, R3C6, R3C7 }, \ + { R4C0, R4C1, R4C2, R4C3, R4C4, R4C5, R4C6, R4C7 }, \ + { R5C0, R5C1, R5C2, R5C3, R5C4, R5C5, R5C6, R5C7 }, \ + { R6C0, R6C1, R6C2, R6C3, R6C4, R6C5, R6C6, R6C7 }, \ + { R7C0, R7C1, R7C2, R7C3, R7C4, R7C5, R7C6, R7C7 }, \ + { R8C0, R8C1, KC_NO, KC_NO, KC_NO,KC_NO, KC_NO, KC_NO }, \ + { R9C0, R9C1, R9C2, R9C3, R9C4, R9C5, R9C6, R9C7 }, \ + { R10C0,R10C1, R10C2, R10C3, R10C4,R10C5, KC_NO, KC_NO} \ +} + +#define KEYCODE(layer, row, col) (pgm_read_byte(&keymaps[(layer)][(row)][(col)])) + + +// Assign Fn key(0-7) to a layer to which switch with the Fn key pressed. +static const uint8_t PROGMEM fn_layer[] = { + 0, // Fn0 + 1, // Fn1 + 2, // Fn2 + 3, // Fn3 + 4, // Fn4 + 0, // Fn5 + 3, // Fn6 + 3 // Fn7 +}; + +// 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[] = { + KC_NO, // Fn0 + KC_NO, // Fn1 + KC_SLSH, // Fn2 + KC_SCLN, // Fn3 + KC_SPC, // Fn4 + KC_NO, // Fn5 + KC_NO, // Fn6 + KC_NO // Fn7 +}; + +static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* Layer 0: Default Layer + * ,-----------------------------------------------------------. ,---------------, + * | POWER | | | + * |-----------------------------------------------------------| |---------------| + * |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backsp | |FN0| = | / | * | + * |-----------------------------------------------------------| |---------------| + * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| | | 7 | 8 | 9 | + | + * |-----------------------------------------------------' | |---------------| + * |Contro| A| S| D| F| G| H| J| K| L|Fn3| '|Return | | 4 | 5 | 6 | - | + * |-----------------------------------------------------------| |---------------| + * |Shift | Z| X| C| V| B| N| M| ,| .| / |Shift | | 1 | 2 | 3 | E | + * |-----------------------------------------------------------| |-----------| N | + * |CAPS|Alt |Gui |` |SPC |BSLS |LFT|RGT|DN|UP| | 0 | . | T | + * `-----------------------------------------------------------' |---------------' + */ + KEYMAP( KC_PWR, + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,KC_EQL, KC_BSPC, KC_FN1, KC_PEQL, KC_PSLS, KC_PAST, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC,KC_RBRC, KC_P7, KC_P8, KC_P9, KC_PPLS, \ + KC_LCTL,KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,KC_ENT, KC_P4, KC_P5, KC_P6, KC_PMNS, \ + KC_LSFT,KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, KC_P1, KC_P2, KC_P3, \ + KC_CAPS,KC_LALT,KC_LGUI,KC_GRV, KC_SPC, KC_BSLS,KC_LEFT,KC_RGHT,KC_DOWN,KC_UP, KC_P0, KC_PDOT, KC_PENT), + + + /* Layer 1: Tenkey use Layer + * ,-----------------------------------------------------------. ,---------------, + * | POWER | | | + * |-----------------------------------------------------------| |---------------| + * |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backsp | |NLK| = | / | * | + * |-----------------------------------------------------------| |---------------| + * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| | |INS| 8 |PGU|V+ | + * |-----------------------------------------------------' | |---------------| + * |Contro| A| S| D| F| G| H| J| K| L|Fn3| '|Return | |DEL|UP |PGD|V- | + * |-----------------------------------------------------------| |---------------| + * |Shift | Z| X| C| V| B| N| M| ,| .| / |Shift | |LFT|DN |RGT| E | + * |-----------------------------------------------------------| |-----------| N | + * |CAPS|Alt |Gui |` |SPC |BSLS |LFT|RGT|DN|UP| | 0 | . | T | + * `-----------------------------------------------------------' `---------------' + */ + KEYMAP( KC_PWR, \ + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,KC_EQL, KC_BSPC, KC_FN1, KC_PEQL, KC_PSLS, KC_MUTE, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC,KC_RBRC, KC_INS, KC_P8, KC_PGUP, KC_VOLU, \ + KC_LCTL,KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,KC_ENT, KC_DEL, KC_UP, KC_PGDN, KC_VOLD, \ + KC_LSFT,KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, KC_LEFT, KC_DOWN, KC_RIGHT, \ + KC_CAPS,KC_LALT,KC_LGUI,KC_GRV, KC_SPC, KC_BSLS,KC_LEFT,KC_RGHT,KC_DOWN,KC_UP, KC_P0, KC_PDOT, KC_PENT), +}; + + +uint8_t keymap_get_keycode(uint8_t layer, uint8_t row, uint8_t col) +{ + return KEYCODE(layer, row, col); +} + +uint8_t keymap_fn_layer(uint8_t index) +{ + return pgm_read_byte(&fn_layer[index]); +} + +uint8_t keymap_fn_keycode(uint8_t index) +{ + return pgm_read_byte(&fn_keycode[index]); +} diff --git a/keyboard/IIgs/led.c b/keyboard/IIgs/led.c new file mode 100644 index 000000000..f76545f0b --- /dev/null +++ b/keyboard/IIgs/led.c @@ -0,0 +1,24 @@ +/* +Copyright 2011 Jun Wako + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#include "stdint.h" +#include "led.h" + + +void led_set(uint8_t usb_led) +{ +} diff --git a/keyboard/IIgs/matrix.c b/keyboard/IIgs/matrix.c new file mode 100644 index 000000000..6ca55b7ea --- /dev/null +++ b/keyboard/IIgs/matrix.c @@ -0,0 +1,363 @@ +/* +Copyright 2011 Jun Wako + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +/* + * scan matrix + */ +#include +#include +#include +#include +#include "print.h" +#include "debug.h" +#include "util.h" +#include "matrix.h" +#include "led.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 + + +#ifndef DEBOUNCE +# define DEBOUNCE 0 +#endif +static uint8_t debouncing = DEBOUNCE; + +// 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(uint8_t row); +static void unselect_rows(void); +static void select_row(uint8_t row); + + +inline +uint8_t matrix_rows(void) +{ + return MATRIX_ROWS; +} + +inline +uint8_t matrix_cols(void) +{ + return MATRIX_COLS; +} + +void matrix_init(void) +{ + // initialize row and col + unselect_rows(); + // Input with pull-up(DDR:0, PORT:1) + // Column C1 ~ C7 (PortC0-6) + // Column C0(Port E1) + DDRC &= ~0b01111111; + PORTC |= 0b01111111; + DDRE &= ~0b00000010; + PORTE |= 0b00000010; + //DDRB &= ~0b00000100; + //PORTB |= 0b00000100; + // modifier B3/4,F4/5,E4 always input + // A0 + //DDRA |= 0b00000001; + //PORTA &= 0b00000001; + //DDRB |= 0b00011000; + //PORTB &= 0b00011000; + //DDRF |= ~0b00110000; + //PORTF &= 0b00110000; + //DDRB &= ~0b00011000; + //PORTB |= 0b00011000; + //DDRF &= ~0b00110000; + //PORTF |= 0b00110000; + //DDRE &= ~0b00010000; + //PORTE |= 0b00010000; + + // initialize matrix state: all keys off + 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; +} + +uint8_t matrix_scan(void) +{ + if (!debouncing) { + uint8_t *tmp = matrix_prev; + matrix_prev = matrix; + matrix = tmp; + } + + for (uint8_t i = 0; i < MATRIX_ROWS; i++) { + unselect_rows(); + select_row(i); + _delay_us(30); // without this wait read unstable value. + if ( i == ( MATRIX_ROWS - 1 ) ) { // CHECK CAPS LOCK + if (host_keyboard_leds() & (1<");debug_hex(matrix[row]);debug("\n"); +// } +// } +// } + return (matrix[row] & (1<mods except E4(CAPSLOCK) + uint8_t tmp; + if ( row == 10 ) { + tmp = 0xC0; + tmp |= (PINB >> 3 ) & 0b00000011; // LEFT CTRL is 0bit in modifier (HID Spec) + // LEFT SHIFT is 1bit in modifier (HID Spec) + tmp |= (PINF >> 3 ) & 0b00000100; // LEFT ALT is 2bit in modifier (HID Spec) + tmp |= (PINF >> 1 ) & 0b00001000; // LEFT GUI is 3bit in modifier (HID Spec) + tmp |= (PINA << 4 ) & 0b00010000; // CAPSLOCK + tmp |= (PINB << 3 ) & 0b00100000; // POWER + } else { + tmp = 0x00; + tmp = (PINE >> 1)&0b00000001; + tmp |= PINC << 1 ; + } + return tmp; +} + +inline +static void unselect_rows(void) +{ + // Hi-Z(DDR:0, PORT:0) to unselect + // DDR : 1, output 0, input + DDRB &= ~0b00000011; // PB: 1,0 + PORTB &= ~0b00000011; + DDRD &= ~0b00010000; // PD: 4 + PORTD &= ~0b00010000; + DDRE &= ~0b11000000; // PE: 7,6 + PORTE &= ~0b11000000; + DDRF &= ~0b11000111; // PF: 7,6,2,1,0 + PORTF &= ~0b11000111; + // to unselect virtual row(modifier), set port to output with low + DDRA |= 0b00000001; // PA: 0 for CAPSLOCK + PORTA &= ~0b00000001; + DDRB |= 0b00011100; // PB: 3,4 for modifier(row10) + PORTB &= ~0b00011100; // PB: 2 for power + DDRF |= 0b00110000; // PF: 4,5 for modifier + PORTF &= ~0b00110000; +} + +inline +static void select_row(uint8_t row) +{ + // Output low(DDR:1, PORT:0) to select + // with row enable, column could send low to AVR when pressed + // row: 0 1 2 3 4 5 6 7 8 9 + // pin: PB1, PB0, PE7, PE6, PD4, PF2, PF0, PF1, PF6 PF7 + switch (row) { + case 0: + DDRB |= (1<<1); + PORTB &= ~(1<<1); + break; + case 1: + DDRB |= (1<<0); + PORTB &= ~(1<<0); + break; + case 2: + DDRE |= (1<<7); + PORTE &= ~(1<<7); + break; + case 3: + DDRE |= (1<<6); + PORTE &= ~(1<<6); + break; + case 4: + DDRD |= (1<<4); + PORTD &= ~(1<<4); + break; + case 5: + DDRF |= (1<<2); + PORTF &= ~(1<<2); + break; + case 6: + DDRF |= (1<<0); + PORTF &= ~(1<<0); + break; + case 7: + DDRF |= (1<<1); + PORTF &= ~(1<<1); + break; + case 8: + DDRF |= (1<<6); + PORTF &= ~(1<<6); + break; + case 9: + DDRF |= (1<<7); + PORTF &= ~(1<<7); + break; + case 10: + // modifier has no row enable + // to select virtual row, set port as input + DDRA &= ~0b00000001; + PORTA |= 0b00000001; + DDRB &= ~0b00011100; + PORTB |= 0b00011100; + DDRF &= ~0b00110000; + PORTF |= 0b00110000; + break; + + } +} diff --git a/keyboard/IIgs_Standard/Makefile b/keyboard/IIgs_Standard/Makefile deleted file mode 100644 index c18e9720c..000000000 --- a/keyboard/IIgs_Standard/Makefile +++ /dev/null @@ -1,95 +0,0 @@ -#---------------------------------------------------------------------------- -# On command line: -# -# make all = Make software. -# -# make clean = Clean out built project files. -# -# make coff = Convert ELF to AVR COFF. -# -# make extcoff = Convert ELF to AVR Extended COFF. -# -# make program = Download the hex file to the device. -# Please customize your programmer settings(PROGRAM_CMD) -# -# make teensy = Download the hex file to the device, using teensy_loader_cli. -# (must have teensy_loader_cli installed). -# -# make dfu = Download the hex file to the device, using dfu-programmer (must -# have dfu-programmer installed). -# -# make flip = Download the hex file to the device, using Atmel FLIP (must -# have Atmel FLIP installed). -# -# make dfu-ee = Download the eeprom file to the device, using dfu-programmer -# (must have dfu-programmer installed). -# -# make flip-ee = Download the eeprom file to the device, using Atmel FLIP -# (must have Atmel FLIP installed). -# -# make debug = Start either simulavr or avarice as specified for debugging, -# with avr-gdb or avr-insight as the front end for debugging. -# -# make filename.s = Just compile filename.c into the assembler code only. -# -# make filename.i = Create a preprocessed source file for use in submitting -# bug reports to the GCC project. -# -# To rebuild project do "make clean" then "make all". -#---------------------------------------------------------------------------- - -# Target file name (without extension). -TARGET = IIgs_Standard - -# Directory common source filess exist -TOP_DIR = ../.. - -# Directory keyboard dependent files exist -TARGET_DIR = . - -# keyboard dependent files -SRC = keymap.c \ - matrix.c \ - led.c - -CONFIG_H = config.h - - -# MCU name, you MUST set this to match the board you are using -# type "make clean" after changing this, so all files will be rebuilt -#MCU = at90usb162 # Teensy 1.0 -#MCU = atmega32u4 # Teensy 2.0 -#MCU = at90usb646 # Teensy++ 1.0 -MCU = at90usb1286 # Teensy++ 2.0 - - -# Processor frequency. -# Normally the first thing your program should do is set the clock prescaler, -# so your program will run at the correct speed. You should also set this -# variable to same clock speed. The _delay_ms() macro uses this, and many -# examples use this variable to calculate timings. Do not add a "UL" here. -F_CPU = 16000000 - - -# Build Options -# comment out to disable the options. -# -MOUSEKEY_ENABLE = no # Mouse keys -#PS2_MOUSE_ENABLE = yes # PS/2 mouse(TrackPoint) support -EXTRAKEY_ENABLE = yes # Audio control and System control -#NKRO_ENABLE = yes # USB Nkey Rollover - - - -#---------------- Programming Options -------------------------- -PROGRAM_CMD = teensy_loader_cli -mmcu=$(MCU) -w -v $(TARGET).hex - - - -# Search Path -VPATH += $(TARGET_DIR) -VPATH += $(TOP_DIR) - -include $(TOP_DIR)/protocol/pjrc.mk -include $(TOP_DIR)/common.mk -include $(TOP_DIR)/rules.mk diff --git a/keyboard/IIgs_Standard/README b/keyboard/IIgs_Standard/README deleted file mode 100644 index 4f9cad1ca..000000000 --- a/keyboard/IIgs_Standard/README +++ /dev/null @@ -1,45 +0,0 @@ -Replacable USB Controller for Apple IIgs/Standard(M0116) -JeffreySung(nattyman@gmail.com) - -=============================== - -Feature -------- -- Replaceable keyboard controller for Apple IIgs(A9M0330)/Standard(M0116) -- Teensy++ 2.0 required -- Some signal bypass required -- ADB keyboard doesn't use matrix for modifier keys. With virtual row for modifier keys, - these keys are merged into key matrix using virtual row. - -History -======= -- 2012.09.17 First Release -- 2012.09.17 CapsLock support -- 2012.09.19 Power button added -Build -===== -0. Just Type "Make" and return. - -Hardware -======== -PJRC Teensy ------------ -0. The following ports should not be connected to board. - From top view of Teensy++, from GND and counter clock wise. - -7,26(in keyboard PCB, these pins are VDD,GND) - -30,31(in Teensy++, these pins are Ref,GND respectively) - -5,6(D2,D3 for bluetooth in future) -1. Bypass #31 pin(from board) to E4(Teensy) -2. Bypass #30 pin(from board) to F2(Teensy) -3. Bypass #6 pin(from board) to A0(Teensy) -4. Refer doc directory - -To Do -===== -0. When DEBOUNCE defined, there is a errors. -1. Layer Change by toggling Clear Key -2. Eject Key add. (following files should be modified.) - common/keycode.h - common/keyboard.c -3. Use bluetooth -EOF diff --git a/keyboard/IIgs_Standard/config.h b/keyboard/IIgs_Standard/config.h deleted file mode 100644 index 11acf87c0..000000000 --- a/keyboard/IIgs_Standard/config.h +++ /dev/null @@ -1,68 +0,0 @@ -/* -Copyright 2011 Jun Wako - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ - -#ifndef CONFIG_H -#define CONFIG_H - -/* controller configuration */ -#include "controller_teensy.h" - - -/* USB Device descriptor parameter */ -/* for Apple -#define VENDOR_ID 0x05AC -#define PRODUCT_ID 0xBEE0 -*/ -#define VENDOR_ID 0xFEED -#define PRODUCT_ID 0xBEE0 -#define DEVICE_VER 0x0202 -#define MANUFACTURER t.m.k. -#define PRODUCT Apple Desktop Bus Keyboard - - -/* message strings */ -#define DESCRIPTION Apple M0116/A9M0660 keyboard firmware - - -/* matrix size */ -#define MATRIX_ROWS 11 // last row is virtual for modifier -#define MATRIX_COLS 8 -/* define if matrix has ghost */ -#define MATRIX_HAS_GHOST -/* Set 0 if need no debouncing */ -#define DEBOUNCE 5 - - -/* key combination for command */ -#define IS_COMMAND() ( \ - keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_LCTRL) | MOD_BIT(KC_LALT) | MOD_BIT(KC_LGUI)) || \ - keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ -) - - -/* layer switching */ -#define LAYER_SWITCH_DELAY 100 -#define LAYER_SEND_FN_TERM 300 - - -/* mouse keys */ -#ifdef MOUSEKEY_ENABLE -# define MOUSEKEY_DELAY_TIME 192 -#endif - - -#endif diff --git a/keyboard/IIgs_Standard/doc/PIN_BYPASS.jpg b/keyboard/IIgs_Standard/doc/PIN_BYPASS.jpg deleted file mode 100644 index 2998f0c3f..000000000 Binary files a/keyboard/IIgs_Standard/doc/PIN_BYPASS.jpg and /dev/null differ diff --git a/keyboard/IIgs_Standard/doc/Teensy++_Mod.jpg b/keyboard/IIgs_Standard/doc/Teensy++_Mod.jpg deleted file mode 100644 index 146c1ab93..000000000 Binary files a/keyboard/IIgs_Standard/doc/Teensy++_Mod.jpg and /dev/null differ diff --git a/keyboard/IIgs_Standard/hid_listen.mac b/keyboard/IIgs_Standard/hid_listen.mac deleted file mode 100755 index 8758fdf88..000000000 Binary files a/keyboard/IIgs_Standard/hid_listen.mac and /dev/null differ diff --git a/keyboard/IIgs_Standard/keymap.c b/keyboard/IIgs_Standard/keymap.c deleted file mode 100644 index cd33e223a..000000000 --- a/keyboard/IIgs_Standard/keymap.c +++ /dev/null @@ -1,142 +0,0 @@ -/* -Copyright 2012 Jeffrey Sung - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ - -/* - * Keymap for Apple IIgs/Standard Keyboard - */ -#include -#include -#include -#include "keycode.h" -#include "print.h" -#include "debug.h" -#include "util.h" -#include "keymap.h" - - -// Convert physical keyboard layout to matrix array. -// This is a macro to define keymap easily in keyboard layout form. -#define KEYMAP( R10C5, \ - R3C7, R3C6, R3C5, R3C4, R3C3, R3C2, R3C1, R8C1, R8C0, R3C0, R0C0, R0C1, R0C2, R0C3, R4C4, R4C5, R4C6, R4C7, \ - R9C7, R9C6, R9C5, R9C4, R9C3, R9C2, R9C1, R9C0, R1C0, R1C1, R1C2, R1C3, R1C4, R2C4, R2C5, R2C6, R2C3, \ - R10C0,R7C7, R7C6, R7C5, R7C4, R7C3, R7C2, R7C1, R7C0, R0C4, R1C6, R1C7, R1C5, R2C0, R2C1, R2C2, R2C7, \ - R10C1,R6C7, R6C6, R6C5, R6C4, R6C3, R6C2, R6C1, R6C0, R0C5, R0C6, R4C0, R4C1, R4C2, \ - R10C4,R10C2,R10C3,R5C4, R5C7, R5C5, R5C6, R5C0, R5C2, R0C7, R5C1, R5C3, R4C3 \ -) { \ - { R0C0, R0C1, R0C2, R0C3, R0C4, R0C5, R0C6, R0C7 }, \ - { R1C0, R1C1, R1C2, R1C3, R1C4, R1C5, R1C6, R1C7 }, \ - { R2C0, R2C1, R2C2, R2C3, R2C4, R2C5, R2C6, R2C7 }, \ - { R3C0, R3C1, R3C2, R3C3, R3C4, R3C5, R3C6, R3C7 }, \ - { R4C0, R4C1, R4C2, R4C3, R4C4, R4C5, R4C6, R4C7 }, \ - { R5C0, R5C1, R5C2, R5C3, R5C4, R5C5, R5C6, R5C7 }, \ - { R6C0, R6C1, R6C2, R6C3, R6C4, R6C5, R6C6, R6C7 }, \ - { R7C0, R7C1, R7C2, R7C3, R7C4, R7C5, R7C6, R7C7 }, \ - { R8C0, R8C1, KC_NO, KC_NO, KC_NO,KC_NO, KC_NO, KC_NO }, \ - { R9C0, R9C1, R9C2, R9C3, R9C4, R9C5, R9C6, R9C7 }, \ - { R10C0,R10C1, R10C2, R10C3, R10C4,R10C5, KC_NO, KC_NO} \ -} - -#define KEYCODE(layer, row, col) (pgm_read_byte(&keymaps[(layer)][(row)][(col)])) - - -// Assign Fn key(0-7) to a layer to which switch with the Fn key pressed. -static const uint8_t PROGMEM fn_layer[] = { - 0, // Fn0 - 1, // Fn1 - 2, // Fn2 - 3, // Fn3 - 4, // Fn4 - 0, // Fn5 - 3, // Fn6 - 3 // Fn7 -}; - -// 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[] = { - KC_NO, // Fn0 - KC_NO, // Fn1 - KC_SLSH, // Fn2 - KC_SCLN, // Fn3 - KC_SPC, // Fn4 - KC_NO, // Fn5 - KC_NO, // Fn6 - KC_NO // Fn7 -}; - -static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - /* Layer 0: Default Layer - * ,-----------------------------------------------------------. ,---------------, - * | POWER | | | - * |-----------------------------------------------------------| |---------------| - * |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backsp | |FN0| = | / | * | - * |-----------------------------------------------------------| |---------------| - * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| | | 7 | 8 | 9 | + | - * |-----------------------------------------------------' | |---------------| - * |Contro| A| S| D| F| G| H| J| K| L|Fn3| '|Return | | 4 | 5 | 6 | - | - * |-----------------------------------------------------------| |---------------| - * |Shift | Z| X| C| V| B| N| M| ,| .| / |Shift | | 1 | 2 | 3 | E | - * |-----------------------------------------------------------| |-----------| N | - * |CAPS|Alt |Gui |` |SPC |BSLS |LFT|RGT|DN|UP| | 0 | . | T | - * `-----------------------------------------------------------' |---------------' - */ - KEYMAP( KC_PWR, - KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,KC_EQL, KC_BSPC, KC_FN1, KC_PEQL, KC_PSLS, KC_PAST, \ - KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC,KC_RBRC, KC_P7, KC_P8, KC_P9, KC_PPLS, \ - KC_LCTL,KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,KC_ENT, KC_P4, KC_P5, KC_P6, KC_PMNS, \ - KC_LSFT,KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, KC_P1, KC_P2, KC_P3, \ - KC_CAPS,KC_LALT,KC_LGUI,KC_GRV, KC_SPC, KC_BSLS,KC_LEFT,KC_RGHT,KC_DOWN,KC_UP, KC_P0, KC_PDOT, KC_PENT), - - - /* Layer 1: Tenkey use Layer - * ,-----------------------------------------------------------. ,---------------, - * | POWER | | | - * |-----------------------------------------------------------| |---------------| - * |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backsp | |NLK| = | / | * | - * |-----------------------------------------------------------| |---------------| - * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| | |INS| 8 |PGU|V+ | - * |-----------------------------------------------------' | |---------------| - * |Contro| A| S| D| F| G| H| J| K| L|Fn3| '|Return | |DEL|UP |PGD|V- | - * |-----------------------------------------------------------| |---------------| - * |Shift | Z| X| C| V| B| N| M| ,| .| / |Shift | |LFT|DN |RGT| E | - * |-----------------------------------------------------------| |-----------| N | - * |CAPS|Alt |Gui |` |SPC |BSLS |LFT|RGT|DN|UP| | 0 | . | T | - * `-----------------------------------------------------------' `---------------' - */ - KEYMAP( KC_PWR, \ - KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,KC_EQL, KC_BSPC, KC_FN1, KC_PEQL, KC_PSLS, KC_MUTE, \ - KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC,KC_RBRC, KC_INS, KC_P8, KC_PGUP, KC_VOLU, \ - KC_LCTL,KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,KC_ENT, KC_DEL, KC_UP, KC_PGDN, KC_VOLD, \ - KC_LSFT,KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, KC_LEFT, KC_DOWN, KC_RIGHT, \ - KC_CAPS,KC_LALT,KC_LGUI,KC_GRV, KC_SPC, KC_BSLS,KC_LEFT,KC_RGHT,KC_DOWN,KC_UP, KC_P0, KC_PDOT, KC_PENT), -}; - - -uint8_t keymap_get_keycode(uint8_t layer, uint8_t row, uint8_t col) -{ - return KEYCODE(layer, row, col); -} - -uint8_t keymap_fn_layer(uint8_t index) -{ - return pgm_read_byte(&fn_layer[index]); -} - -uint8_t keymap_fn_keycode(uint8_t index) -{ - return pgm_read_byte(&fn_keycode[index]); -} diff --git a/keyboard/IIgs_Standard/led.c b/keyboard/IIgs_Standard/led.c deleted file mode 100644 index f76545f0b..000000000 --- a/keyboard/IIgs_Standard/led.c +++ /dev/null @@ -1,24 +0,0 @@ -/* -Copyright 2011 Jun Wako - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ - -#include "stdint.h" -#include "led.h" - - -void led_set(uint8_t usb_led) -{ -} diff --git a/keyboard/IIgs_Standard/matrix.c b/keyboard/IIgs_Standard/matrix.c deleted file mode 100644 index 6ca55b7ea..000000000 --- a/keyboard/IIgs_Standard/matrix.c +++ /dev/null @@ -1,363 +0,0 @@ -/* -Copyright 2011 Jun Wako - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ - -/* - * scan matrix - */ -#include -#include -#include -#include -#include "print.h" -#include "debug.h" -#include "util.h" -#include "matrix.h" -#include "led.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 - - -#ifndef DEBOUNCE -# define DEBOUNCE 0 -#endif -static uint8_t debouncing = DEBOUNCE; - -// 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(uint8_t row); -static void unselect_rows(void); -static void select_row(uint8_t row); - - -inline -uint8_t matrix_rows(void) -{ - return MATRIX_ROWS; -} - -inline -uint8_t matrix_cols(void) -{ - return MATRIX_COLS; -} - -void matrix_init(void) -{ - // initialize row and col - unselect_rows(); - // Input with pull-up(DDR:0, PORT:1) - // Column C1 ~ C7 (PortC0-6) - // Column C0(Port E1) - DDRC &= ~0b01111111; - PORTC |= 0b01111111; - DDRE &= ~0b00000010; - PORTE |= 0b00000010; - //DDRB &= ~0b00000100; - //PORTB |= 0b00000100; - // modifier B3/4,F4/5,E4 always input - // A0 - //DDRA |= 0b00000001; - //PORTA &= 0b00000001; - //DDRB |= 0b00011000; - //PORTB &= 0b00011000; - //DDRF |= ~0b00110000; - //PORTF &= 0b00110000; - //DDRB &= ~0b00011000; - //PORTB |= 0b00011000; - //DDRF &= ~0b00110000; - //PORTF |= 0b00110000; - //DDRE &= ~0b00010000; - //PORTE |= 0b00010000; - - // initialize matrix state: all keys off - 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; -} - -uint8_t matrix_scan(void) -{ - if (!debouncing) { - uint8_t *tmp = matrix_prev; - matrix_prev = matrix; - matrix = tmp; - } - - for (uint8_t i = 0; i < MATRIX_ROWS; i++) { - unselect_rows(); - select_row(i); - _delay_us(30); // without this wait read unstable value. - if ( i == ( MATRIX_ROWS - 1 ) ) { // CHECK CAPS LOCK - if (host_keyboard_leds() & (1<");debug_hex(matrix[row]);debug("\n"); -// } -// } -// } - return (matrix[row] & (1<mods except E4(CAPSLOCK) - uint8_t tmp; - if ( row == 10 ) { - tmp = 0xC0; - tmp |= (PINB >> 3 ) & 0b00000011; // LEFT CTRL is 0bit in modifier (HID Spec) - // LEFT SHIFT is 1bit in modifier (HID Spec) - tmp |= (PINF >> 3 ) & 0b00000100; // LEFT ALT is 2bit in modifier (HID Spec) - tmp |= (PINF >> 1 ) & 0b00001000; // LEFT GUI is 3bit in modifier (HID Spec) - tmp |= (PINA << 4 ) & 0b00010000; // CAPSLOCK - tmp |= (PINB << 3 ) & 0b00100000; // POWER - } else { - tmp = 0x00; - tmp = (PINE >> 1)&0b00000001; - tmp |= PINC << 1 ; - } - return tmp; -} - -inline -static void unselect_rows(void) -{ - // Hi-Z(DDR:0, PORT:0) to unselect - // DDR : 1, output 0, input - DDRB &= ~0b00000011; // PB: 1,0 - PORTB &= ~0b00000011; - DDRD &= ~0b00010000; // PD: 4 - PORTD &= ~0b00010000; - DDRE &= ~0b11000000; // PE: 7,6 - PORTE &= ~0b11000000; - DDRF &= ~0b11000111; // PF: 7,6,2,1,0 - PORTF &= ~0b11000111; - // to unselect virtual row(modifier), set port to output with low - DDRA |= 0b00000001; // PA: 0 for CAPSLOCK - PORTA &= ~0b00000001; - DDRB |= 0b00011100; // PB: 3,4 for modifier(row10) - PORTB &= ~0b00011100; // PB: 2 for power - DDRF |= 0b00110000; // PF: 4,5 for modifier - PORTF &= ~0b00110000; -} - -inline -static void select_row(uint8_t row) -{ - // Output low(DDR:1, PORT:0) to select - // with row enable, column could send low to AVR when pressed - // row: 0 1 2 3 4 5 6 7 8 9 - // pin: PB1, PB0, PE7, PE6, PD4, PF2, PF0, PF1, PF6 PF7 - switch (row) { - case 0: - DDRB |= (1<<1); - PORTB &= ~(1<<1); - break; - case 1: - DDRB |= (1<<0); - PORTB &= ~(1<<0); - break; - case 2: - DDRE |= (1<<7); - PORTE &= ~(1<<7); - break; - case 3: - DDRE |= (1<<6); - PORTE &= ~(1<<6); - break; - case 4: - DDRD |= (1<<4); - PORTD &= ~(1<<4); - break; - case 5: - DDRF |= (1<<2); - PORTF &= ~(1<<2); - break; - case 6: - DDRF |= (1<<0); - PORTF &= ~(1<<0); - break; - case 7: - DDRF |= (1<<1); - PORTF &= ~(1<<1); - break; - case 8: - DDRF |= (1<<6); - PORTF &= ~(1<<6); - break; - case 9: - DDRF |= (1<<7); - PORTF &= ~(1<<7); - break; - case 10: - // modifier has no row enable - // to select virtual row, set port as input - DDRA &= ~0b00000001; - PORTA |= 0b00000001; - DDRB &= ~0b00011100; - PORTB |= 0b00011100; - DDRF &= ~0b00110000; - PORTF |= 0b00110000; - break; - - } -} diff --git a/keyboard/hhkb/keymap.c b/keyboard/hhkb/keymap.c index 0d07c79cf..094d33af1 100644 --- a/keyboard/hhkb/keymap.c +++ b/keyboard/hhkb/keymap.c @@ -82,7 +82,7 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |Gui|Alt | Space |Alt |Gui| * `-------------------------------------------' */ - KEYMAP(PWR, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \ + KEYMAP(GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \ CAPS,NO, NO, NO, NO, NO, NO, NO, PSCR,SLCK,PAUS, UP, NO, BSPC, \ LCTL,VOLD,VOLU,MUTE,NO, NO, PAST,PSLS,HOME,PGUP,LEFT,RGHT,ENT, \ LSFT,NO, NO, NO, NO, NO, PPLS,PMNS,END, PGDN,DOWN,RSFT,TRNS, \ @@ -101,7 +101,7 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |Gui|Alt | Space |Alt |Gui| * `-------------------------------------------' */ - KEYMAP(ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \ + KEYMAP(GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \ TAB, HOME,PGDN,UP, PGUP,END, HOME,PGDN,PGUP,END, NO, NO, NO, BSPC, \ LCTL,NO, LEFT,DOWN,RGHT,NO, LEFT,DOWN,UP, RGHT,NO, NO, ENT, \ LSFT,NO, NO, NO, NO, NO, HOME,PGDN,PGUP,END, TRNS,RSFT,NO, \ @@ -121,7 +121,7 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `--------------------------------------------' * Mc: Mouse Cursor / Mb: Mouse Button / Mw: Mouse Wheel */ - KEYMAP(ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \ + KEYMAP(GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \ TAB, NO, NO, NO, NO, NO, WH_L,WH_D,WH_U,WH_R,NO, NO, NO, BSPC, \ LCTL,NO, ACL0,ACL1,ACL2,NO, MS_L,MS_D,MS_U,MS_R,TRNS,QUOT,ENT, \ LSFT,NO, NO, NO, NO, BTN3,BTN2,BTN1,BTN4,BTN5,SLSH,RSFT,NO, \ diff --git a/protocol/vusb/vusb.c b/protocol/vusb/vusb.c index 1d5f4a852..328885a9b 100644 --- a/protocol/vusb/vusb.c +++ b/protocol/vusb/vusb.c @@ -88,6 +88,10 @@ static void send_keyboard(report_keyboard_t *report) } else { debug("kbuf: full\n"); } + + // NOTE: send key strokes of Macro + usbPoll(); + vusb_transfer_keyboard(); } -- cgit v1.2.3