diff options
52 files changed, 2123 insertions, 660 deletions
diff --git a/.gitmodules b/.gitmodules index 3e34a635c..17a20decb 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,6 @@  [submodule "protocol/usb_hid/USB_Host_Shield_2.0"]  	path = protocol/usb_hid/USB_Host_Shield_2.0  	url = git@github.com:tmk/USB_Host_Shield_2.0.git +[submodule "protocol/lufa/LUFA-git"] +	path = protocol/lufa/LUFA-git +	url = https://github.com/abcminiuser/lufa.git diff --git a/common/command.c b/common/command.c index 872880eae..2c65f0da7 100644 --- a/common/command.c +++ b/common/command.c @@ -302,13 +302,13 @@ static bool command_common(uint8_t code)          case KC_S:              print("\n\n----- Status -----\n");              print_val_hex8(host_keyboard_leds()); +            print_val_hex8(keyboard_protocol); +            print_val_hex8(keyboard_idle);  #ifdef PROTOCOL_PJRC              print_val_hex8(UDCON);              print_val_hex8(UDIEN);              print_val_hex8(UDINT);              print_val_hex8(usb_keyboard_leds); -            print_val_hex8(usb_keyboard_protocol); -            print_val_hex8(usb_keyboard_idle_config);              print_val_hex8(usb_keyboard_idle_count);  #endif diff --git a/common/host.c b/common/host.c index 1eafef75c..2e56971bd 100644 --- a/common/host.c +++ b/common/host.c @@ -24,7 +24,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.  #ifdef NKRO_ENABLE -bool keyboard_nkro = false; +bool keyboard_nkro = true;  #endif  static host_driver_t *driver; diff --git a/common/host.h b/common/host.h index 8ff262985..a56e6c3b0 100644 --- a/common/host.h +++ b/common/host.h @@ -32,6 +32,9 @@ extern "C" {  extern bool keyboard_nkro;  #endif +uint8_t keyboard_idle; +uint8_t keyboard_protocol; +  /* host driver */  void host_set_driver(host_driver_t *driver); diff --git a/converter/adb_usb/Makefile b/converter/adb_usb/Makefile index 211416742..73cae8ab3 100644 --- a/converter/adb_usb/Makefile +++ b/converter/adb_usb/Makefile @@ -48,11 +48,17 @@ TOP_DIR = ../..  TARGET_DIR = .  # project specific files -SRC =	keymap.c \ +SRC =	keymap_common.c \  	matrix.c \  	led.c \  	adb.c +ifdef KEYMAP +    SRC := keymap_$(KEYMAP).c $(SRC) +else +    SRC := keymap_ansi.c $(SRC) +endif +  CONFIG_H = config.h diff --git a/converter/adb_usb/Makefile.pjrc b/converter/adb_usb/Makefile.pjrc index c3a5d8f55..2eb41b34b 100644 --- a/converter/adb_usb/Makefile.pjrc +++ b/converter/adb_usb/Makefile.pjrc @@ -8,11 +8,17 @@ TOP_DIR = ../..  TARGET_DIR = .  # keyboard dependent files -SRC =	keymap.c \ +SRC =	keymap_common.c \  	matrix.c \  	led.c \  	adb.c +ifdef KEYMAP +    SRC := keymap_$(KEYMAP).c $(SRC) +else +    SRC := keymap_ansi.c $(SRC) +endif +  CONFIG_H = config.h diff --git a/converter/adb_usb/README.md b/converter/adb_usb/README.md index d9efbfab2..defc477e2 100644 --- a/converter/adb_usb/README.md +++ b/converter/adb_usb/README.md @@ -7,17 +7,29 @@ But binary size is about 10KB or more it doesn't fit into 8K flash like ATMega8U  Discuss: http://geekhack.org/showwiki.php?title=Island:14290 -Build ------ -0. Connect ADB keyboard to Teensy by 3 lines(Vcc, GND, Data). By default Data line uses port D0. +Wiring +------ +0. Connect ADB keyboard to Teensy by 3 lines(Vcc, GND, Data). By default Data line uses port PD0.     This converter uses AVR's internal pull-up, but it seems to be too weak, in particular when you want to use a long or coiled cable.     The external pull-up resistor(1K-10K Ohm) on Data is strongly recommended. -1. Define following macros for ADB connection in config.h if you use other than port D0. +1. Define following macros for ADB connection in config.h if you use other than port PD0.     ADB_PORT, ADB_PIN, ADB_DDR, ADB_DATA_BIT  2. make  3. program Teensy +Build +----- +Just make + +    $ make clean +    $ make + +If your keyboard is ISO layout + +    $ make KEYMAP=iso + +  LOCKING CAPSLOCK  ----------------  Many of old ADB keyboards have mechanical push-lock switch for Capslock key and this converter supports the locking Capslock key by default. See README in top directory for more detail about this feature. @@ -48,7 +60,7 @@ effort at this time.       * |-----------------------------------------------------------|     ,---.     |---------------|       * |Shift   |  Z|  X|  C|  V|  B|  N|  M|  ,|  ,|  /|Shift     |     |Up |     |  1|  2|  3|   |       * |-----------------------------------------------------------| ,-----------. |-----------|Ent| -     * |Ctrl |Gui |Alt |         Space           |     |    |      | |Lef|Dow|Rig| |      0|  .|   | +     * |Ctrl |Alt |Gui |         Space             |Gui |Alt |Ctrl | |Lef|Dow|Rig| |      0|  .|   |       * `-----------------------------------------------------------' `-----------' `---------------'       */      KEYMAP( @@ -68,11 +80,17 @@ To get help press `h` holding Magic key. Magic key is `Power key`.  Notes  ----- -Many ADB keyboards has no discrimination between right modifier and left one, +Not-extended ADB keyboards have no discrimination between right modifier and left one,  you will always see left control even if you press right control key. -Apple Extended Keyboard and Apple Extended Keyboard II are the examples. -Though ADB protocol itself has the ability of distinction between right and left. -And most ADB keyboard has no NKRO functionality, though ADB protocol itself has that.  -See protocol/adb.c for more info. +Apple Extended Keyboard and Apple Extended Keyboard II can discriminate both side +modifiers except for GUI key(Windows/Command). + +And most ADB keyboard has no diodes in its matrix so they are not NKRO, +though ADB protocol itself supports it. See protocol/adb.c for more info. + +If keyobard has ISO layout you need to use ISO keymap with `make KEYMAP=iso`. With ANSI +keymap you will suffer from swapped keys problem. + +https://github.com/tmk/tmk_keyboard/issues/35  EOF diff --git a/converter/adb_usb/keymap_ansi.c b/converter/adb_usb/keymap_ansi.c new file mode 100644 index 000000000..0d0bae99b --- /dev/null +++ b/converter/adb_usb/keymap_ansi.c @@ -0,0 +1,16 @@ +#include "keymap_common.h" + + +const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +    KEYMAP_EXT_ANSI( +    ESC, F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F9,  F10, F11, F12,           PSCR,SLCK,PAUS,                   PWR, +    GRV, 1,   2,   3,   4,   5,   6,   7,   8,   9,   0,   MINS,EQL, BSPC,     INS, HOME,PGUP,    NLCK,PEQL,PSLS,PAST, +    TAB, Q,   W,   E,   R,   T,   Y,   U,   I,   O,   P,   LBRC,RBRC,BSLS,     DEL, END, PGDN,    P7,  P8,  P9,  PMNS, +    LCAP,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,          RSFT,          UP,           P1,  P2,  P3, +    LCTL,LALT,LGUI,          SPC,                               RALT,RCTL,     LEFT,DOWN,RGHT,    P0,       PDOT,PENT +    ), +}; + +const uint16_t PROGMEM fn_actions[] = { +}; diff --git a/converter/adb_usb/keymap_common.c b/converter/adb_usb/keymap_common.c new file mode 100644 index 000000000..241d2e33b --- /dev/null +++ b/converter/adb_usb/keymap_common.c @@ -0,0 +1,30 @@ +/* +Copyright 2011,2012,2013 Jun Wako <wakojun@gmail.com> + +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 <http://www.gnu.org/licenses/>. +*/ +#include "keymap_common.h" + + +/* translates key to keycode */ +uint8_t keymap_key_to_keycode(uint8_t layer, key_t key) +{ +    return pgm_read_byte(&keymaps[(layer)][(key.row)][(key.col)]); +} + +/* translates Fn keycode to action */ +action_t keymap_fn_to_action(uint8_t keycode) +{ +    return (action_t){ .code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]) }; +} diff --git a/converter/adb_usb/keymap.c b/converter/adb_usb/keymap_common.h index d53c9c750..bdca38e12 100644 --- a/converter/adb_usb/keymap.c +++ b/converter/adb_usb/keymap_common.h @@ -1,5 +1,5 @@  /* -Copyright 2011 Jun Wako <wakojun@gmail.com> +Copyright 2011,2012,2013 Jun Wako <wakojun@gmail.com>  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 @@ -14,111 +14,113 @@ 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 <http://www.gnu.org/licenses/>.  */ +#ifndef KEYMAP_COMMON_H +#define KEYMAP_COMMON_H -/* - * Keymap for ADB keyboard - */  #include <stdint.h>  #include <stdbool.h>  #include <avr/pgmspace.h>  #include "keycode.h" +#include "action.h" +#include "action_macro.h" +#include "report.h"  #include "print.h"  #include "debug.h" -#include "util.h"  #include "keymap.h" -#define KEYCODE(layer, row, col) (pgm_read_byte(&keymaps[(layer)][(row)][(col)])) +extern const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; +extern const uint16_t fn_actions[]; -#define KEYMAP_ALL( \ + +/* M0115 Apple Extended Keyboard ANSI + * ,---.   ,---------------. ,---------------. ,---------------. ,-----------.             ,---. + * |Esc|   |F1 |F2 |F3 |F4 | |F5 |F6 |F7 |F8 | |F9 |F10|F11|F12| |PrS|ScL|Pau|             |Pwr| + * `---'   `---------------' `---------------' `---------------' `-----------'             `---' + * ,-----------------------------------------------------------. ,-----------. ,---------------. + * |  `|  1|  2|  3|  4|  5|  6|  7|  8|  9|  0|  -|  =|Backspa| |Ins|Hom|PgU| |NmL|  =|  /|  *| + * |-----------------------------------------------------------| |-----------| |---------------| + * |Tab  |  Q|  W|  E|  R|  T|  Y|  U|  I|  O|  P|  [|  ]|    \| |Del|End|PgD| |  7|  8|  9|  -| + * |-----------------------------------------------------------| `-----------' |---------------| + * |CapsLo|  A|  S|  D|  F|  G|  H|  J|  K|  L|  ;|  '|Return  |               |  4|  5|  6|  +| + * |-----------------------------------------------------------|     ,---.     |---------------| + * |Shift   |  Z|  X|  C|  V|  B|  N|  M|  ,|  ,|  /|Shift     |     |Up |     |  1|  2|  3|   | + * |-----------------------------------------------------------| ,-----------. |-----------|Ent| + * |Ctrl |Opt |Cmd |         Space           |     |Opt |Ctrl  | |Lef|Dow|Rig| |      0|  .|   | + * `-----------------------------------------------------------' `-----------' `---------------' + */ +#define KEYMAP_EXT_ANSI( \      K35,  K7A,K78,K63,K76, K60,K61,K62,K64, K65,K6D,K67,K6F, K69,K6B,K71,              K7F, \      K32,K12,K13,K14,K15,K17,K16,K1A,K1C,K19,K1D,K1B,K18,K33, K72,K73,K74,  K47,K51,K4B,K43, \      K30,K0C,K0D,K0E,K0F,K11,K10,K20,K22,K1F,K23,K21,K1E,K2A, K75,K77,K79,  K59,K5B,K5C,K4E, \      K39,K00,K01,K02,K03,K05,K04,K26,K28,K25,K29,K27,    K24,               K56,K57,K58,K45, \      K38,K06,K07,K08,K09,K0B,K2D,K2E,K2B,K2F,K2C,        K7B,     K3E,      K53,K54,K55,     \ -    K36,K3A,K37,        K31,                        K7C,K7D, K3B,K3D,K3C,  K52,    K41,K4C, \ -    /* for ISO/JIS keyboard */      \ -    K0A, /* NON-US \ and |  0x64 */ \ -    K34, /* Keypad ENTER    0x58 */ \ -    K40, /* F17             0x6C */ \ -    K44, /* F18?            0x6d */ \ -    K4F, /* F18             0x6d */ \ -    K50, /* F19             0x6e */ \ -    K5A, /* F20             0x6f */ \ -    K5D, /* INTL3(Yen)      0x89 */ \ -    K5E, /* INTL1(Ro)       0x87 */ \ -    K5F, /* Keypad Comma    0x85 */ \ -    K66, /* LANG2(Eisu)     0x91 */ \ -    K68, /* LANG1(Kana)     0x90 */ \ -    K6A, /* F16             0x6B */ \ -    K6E  /* Application     0x65 */ \ +    K36,K3A,K37,        K31,                        K7C,K7D, K3B,K3D,K3C,  K52,    K41,K4C  \  ) { \      { KC_##K00, KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07 }, \ -    { KC_##K08, KC_##K09, KC_##K0A, KC_##K0B, KC_##K0C, KC_##K0D, KC_##K0E, KC_##K0F }, \ +    { KC_##K08, KC_##K09, KC_NUBS,  KC_##K0B, KC_##K0C, KC_##K0D, KC_##K0E, KC_##K0F }, \      { KC_##K10, KC_##K11, KC_##K12, KC_##K13, KC_##K14, KC_##K15, KC_##K16, KC_##K17 }, \      { KC_##K18, KC_##K19, KC_##K1A, KC_##K1B, KC_##K1C, KC_##K1D, KC_##K1E, KC_##K1F }, \      { KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26, KC_##K27 }, \      { KC_##K28, KC_##K29, KC_##K2A, KC_##K2B, KC_##K2C, KC_##K2D, KC_##K2E, KC_##K2F }, \ -    { KC_##K30, KC_##K31, KC_##K32, KC_##K33, KC_##K34, KC_##K35, KC_##K36, KC_##K37 }, \ +    { KC_##K30, KC_##K31, KC_##K32, KC_##K33, KC_PENT,  KC_##K35, KC_##K36, KC_##K37 }, \      { KC_##K38, KC_##K39, KC_##K3A, KC_##K3B, KC_##K3C, KC_##K3D, KC_##K3E, KC_NO    }, \ -    { KC_##K40, KC_##K41, KC_NO,    KC_##K43, KC_##K44, KC_##K45, KC_NO,    KC_##K47 }, \ -    { KC_NO,    KC_NO,    KC_NO,    KC_##K4B, KC_##K4C, KC_NO,    KC_##K4E, KC_##K4F }, \ -    { KC_##K50, KC_##K51, KC_##K52, KC_##K53, KC_##K54, KC_##K55, KC_##K56, KC_##K57 }, \ -    { KC_##K58, KC_##K59, KC_##K5A, KC_##K5B, KC_##K5C, KC_##K5D, KC_##K5E, KC_##K5F }, \ -    { 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_##K6D, KC_##K6E, KC_##K6F }, \ +    { KC_F17,   KC_##K41, KC_NO,    KC_##K43, KC_F18,   KC_##K45, KC_NO,    KC_##K47 }, \ +    { KC_NO,    KC_NO,    KC_NO,    KC_##K4B, KC_##K4C, KC_NO,    KC_##K4E, KC_F18   }, \ +    { KC_F19,   KC_##K51, KC_##K52, KC_##K53, KC_##K54, KC_##K55, KC_##K56, KC_##K57 }, \ +    { KC_##K58, KC_##K59, KC_F20,   KC_##K5B, KC_##K5C, KC_INT3,  KC_INT1,  KC_PCMM  }, \ +    { KC_##K60, KC_##K61, KC_##K62, KC_##K63, KC_##K64, KC_##K65, KC_LANG2, KC_##K67 }, \ +    { KC_LANG1, KC_##K69, KC_F16,   KC_##K6B, KC_NO,    KC_##K6D, KC_APP,   KC_##K6F }, \      { KC_NO,    KC_##K71, KC_##K72, KC_##K73, KC_##K74, KC_##K75, KC_##K76, KC_##K77 }, \      { KC_##K78, KC_##K79, KC_##K7A, KC_##K7B, KC_##K7C, KC_##K7D, KC_NO,    KC_##K7F }  \  } -/* Apple Extended Keyboard US +/* M0115 Apple Extended Keyboard ISO   * ,---.   ,---------------. ,---------------. ,---------------. ,-----------.             ,---.   * |Esc|   |F1 |F2 |F3 |F4 | |F5 |F6 |F7 |F8 | |F9 |F10|F11|F12| |PrS|ScL|Pau|             |Pwr|   * `---'   `---------------' `---------------' `---------------' `-----------'             `---'   * ,-----------------------------------------------------------. ,-----------. ,---------------.   * |  `|  1|  2|  3|  4|  5|  6|  7|  8|  9|  0|  -|  =|Backspa| |Ins|Hom|PgU| |NmL|  =|  /|  *|   * |-----------------------------------------------------------| |-----------| |---------------| - * |Tab  |  Q|  W|  E|  R|  T|  Y|  U|  I|  O|  P|  [|  ]|    \| |Del|End|PgD| |  7|  8|  9|  -| - * |-----------------------------------------------------------| `-----------' |---------------| - * |CapsLo|  A|  S|  D|  F|  G|  H|  J|  K|  L|  ;|  '|Return  |               |  4|  5|  6|  +| + * |Tab  |  Q|  W|  E|  R|  T|  Y|  U|  I|  O|  P|  [|  ]|Retur| |Del|End|PgD| |  7|  8|  9|  -| + * |------------------------------------------------------`    | `-----------' |---------------| + * |CapsLo|  A|  S|  D|  F|  G|  H|  J|  K|  L|  ;|  '|  #|    |               |  4|  5|  6|  +|   * |-----------------------------------------------------------|     ,---.     |---------------| - * |Shift   |  Z|  X|  C|  V|  B|  N|  M|  ,|  ,|  /|Shift     |     |Up |     |  1|  2|  3|   | + * |Shif|  \|  Z|  X|  C|  V|  B|  N|  M|  ,|  ,|  /|Shift     |     |Up |     |  1|  2|  3|   |   * |-----------------------------------------------------------| ,-----------. |-----------|Ent|   * |Ctrl |Opt |Cmd |         Space           |     |Opt |Ctrl  | |Lef|Dow|Rig| |      0|  .|   |   * `-----------------------------------------------------------' `-----------' `---------------'   */ -#define KEYMAP_EXTENDED_US( \ +#define KEYMAP_EXT_ISO( \      K35,  K7A,K78,K63,K76, K60,K61,K62,K64, K65,K6D,K67,K6F, K69,K6B,K71,              K7F, \      K32,K12,K13,K14,K15,K17,K16,K1A,K1C,K19,K1D,K1B,K18,K33, K72,K73,K74,  K47,K51,K4B,K43, \ -    K30,K0C,K0D,K0E,K0F,K11,K10,K20,K22,K1F,K23,K21,K1E,K2A, K75,K77,K79,  K59,K5B,K5C,K4E, \ -    K39,K00,K01,K02,K03,K05,K04,K26,K28,K25,K29,K27,    K24,               K56,K57,K58,K45, \ -    K38,K06,K07,K08,K09,K0B,K2D,K2E,K2B,K2F,K2C,        K7B,     K3E,      K53,K54,K55,     \ +    K30,K0C,K0D,K0E,K0F,K11,K10,K20,K22,K1F,K23,K21,K1E,K24, K75,K77,K79,  K59,K5B,K5C,K4E, \ +    K39,K00,K01,K02,K03,K05,K04,K26,K28,K25,K29,K27,K2A,                   K56,K57,K58,K45, \ +    K38,K0A,K06,K07,K08,K09,K0B,K2D,K2E,K2B,K2F,K2C,    K7B,     K3E,      K53,K54,K55,     \      K36,K3A,K37,        K31,                        K7C,K7D, K3B,K3D,K3C,  K52,    K41,K4C  \ -) KEYMAP_ALL( \ -    K35,  K7A,K78,K63,K76, K60,K61,K62,K64, K65,K6D,K67,K6F, K69,K6B,K71,              K7F, \ -    K32,K12,K13,K14,K15,K17,K16,K1A,K1C,K19,K1D,K1B,K18,K33, K72,K73,K74,  K47,K51,K4B,K43, \ -    K30,K0C,K0D,K0E,K0F,K11,K10,K20,K22,K1F,K23,K21,K1E,K2A, K75,K77,K79,  K59,K5B,K5C,K4E, \ -    K39,K00,K01,K02,K03,K05,K04,K26,K28,K25,K29,K27,    K24,               K56,K57,K58,K45, \ -    K38,K06,K07,K08,K09,K0B,K2D,K2E,K2B,K2F,K2C,        K7B,     K3E,      K53,K54,K55,     \ -    K36,K3A,K37,        K31,                        K7C,K7D, K3B,K3D,K3C,  K52,    K41,K4C, \ -    /* for ISO/JIS keyboard */               \ -    NONUS_BSLASH, /* NON-US \ and |  0x64 */ \ -    KP_ENTER,     /* Keypad ENTER    0x58 */ \ -    F17,          /* F17             0x6C */ \ -    F18,          /* F18?            0x6d */ \ -    F18,          /* F18             0x6d */ \ -    F19,          /* F19             0x6e */ \ -    F20,          /* F20             0x6f */ \ -    INT3,         /* INTL3(Yen)      0x89 */ \ -    INT1,         /* INTL1(Ro)       0x87 */ \ -    KP_COMMA,     /* Keypad Comma    0x85 */ \ -    LANG2,        /* LANG2(Eisu)     0x91 */ \ -    LANG1,        /* LANG1(Kana)     0x90 */ \ -    F16,          /* F16             0x6B */ \ -    APPLICATION   /* Application     0x65 */ \ -) - -/* M0116 +) { \ +    { KC_##K00, KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07 }, \ +    { KC_##K08, KC_##K09, KC_##K0A, KC_##K0B, KC_##K0C, KC_##K0D, KC_##K0E, KC_##K0F }, \ +    { KC_##K10, KC_##K11, KC_##K12, KC_##K13, KC_##K14, KC_##K15, KC_##K16, KC_##K17 }, \ +    { KC_##K18, KC_##K19, KC_##K1A, KC_##K1B, KC_##K1C, KC_##K1D, KC_##K1E, KC_##K1F }, \ +    { KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26, KC_##K27 }, \ +    { KC_##K28, KC_##K29, KC_##K2A, KC_##K2B, KC_##K2C, KC_##K2D, KC_##K2E, KC_##K2F }, \ +    { KC_##K30, KC_##K31, KC_##K32, KC_##K33, KC_PENT,  KC_##K35, KC_##K36, KC_##K37 }, \ +    { KC_##K38, KC_##K39, KC_##K3A, KC_##K3B, KC_##K3C, KC_##K3D, KC_##K3E, KC_NO    }, \ +    { KC_F17,   KC_##K41, KC_NO,    KC_##K43, KC_F18,   KC_##K45, KC_NO,    KC_##K47 }, \ +    { KC_NO,    KC_NO,    KC_NO,    KC_##K4B, KC_##K4C, KC_NO,    KC_##K4E, KC_F18   }, \ +    { KC_F19,   KC_##K51, KC_##K52, KC_##K53, KC_##K54, KC_##K55, KC_##K56, KC_##K57 }, \ +    { KC_##K58, KC_##K59, KC_F20,   KC_##K5B, KC_##K5C, KC_INT3,  KC_INT1,  KC_PCMM  }, \ +    { KC_##K60, KC_##K61, KC_##K62, KC_##K63, KC_##K64, KC_##K65, KC_LANG2, KC_##K67 }, \ +    { KC_LANG1, KC_##K69, KC_F16,   KC_##K6B, KC_NO,    KC_##K6D, KC_APP,   KC_##K6F }, \ +    { KC_NO,    KC_##K71, KC_##K72, KC_##K73, KC_##K74, KC_##K75, KC_##K76, KC_##K77 }, \ +    { KC_##K78, KC_##K79, KC_##K7A, KC_##K7B, KC_##K7C, KC_##K7D, KC_NO,    KC_##K7F }  \ +} + + + + +/* M0116 Apple Standard Keyboard ANSI  *                     +-------+  *                     | power |  *                     +-------+ @@ -134,7 +136,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.  * |cap|opt|comnd| ` |                   | \ |lef|rig|dwn|up | |   0   | . |   |  * +---------------------------------------------------------+ +-------+---+---+  */ -#define KEYMAP_M0116( \ +#define KEYMAP_M0116_ANSI( \                             K7F,                                              \     K35,K12,K13,K14,K15,K17,K16,K1A,K1C,K19,K1D,K1B,K18,K33, K47,K51,K4B,K43, \     K30,K0C,K0D,K0E,K0F,K11,K10,K20,K22,K1F,K23,K21,K1E,     K59,K5B,K5C,K45, \ @@ -160,55 +162,51 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.    { KC_NO   , KC_NO,    KC_NO   , KC_##K7B, KC_NO,    KC_NO,    KC_NO,    KC_##K7F }  \  } +#endif -// 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 -    0,              // Fn1 -    0,              // Fn2 -    0,              // Fn3 -    0,              // Fn4 -    0,              // Fn5 -    0,              // Fn6 -    0               // 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_NO,          // Fn2 -    KC_NO,          // Fn3 -    KC_NO,          // Fn4 -    KC_NO,          // Fn5 -    KC_NO,          // Fn6 -    KC_NO           // Fn7 -}; - -static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -    KEYMAP_EXTENDED_US( -    ESC, F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F9,  F10, F11, F12,           PSCR,SLCK,PAUS,                   PWR, -    GRV, 1,   2,   3,   4,   5,   6,   7,   8,   9,   0,   MINS,EQL, BSPC,     INS, HOME,PGUP,    NLCK,PEQL,PSLS,PAST, -    TAB, Q,   W,   E,   R,   T,   Y,   U,   I,   O,   P,   LBRC,RBRC,BSLS,     DEL, END, PGDN,    P7,  P8,  P9,  PMNS, -    LCAP,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,          RSFT,          UP,           P1,  P2,  P3, -    LCTL,LGUI,LALT,          SPC,                               RGUI,RCTL,     LEFT,DOWN,RGHT,    P0,       PDOT,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]); -} +/* +ADB ANSI/ISO Keymapping Note +============================ +ANSI +,-----------    ----------. +| *a|  1|  2     =|Backspa| +|-----------    ----------| +|Tab  |  Q|     |  ]|   *c| +|-----------    ----------| +|CapsLo|  A|    '|Return  | +|-----------    ----------| +|Shift   |      Shift     | +`-----------    ----------' + +ISO +,-----------    ----------. +| *a|  1|  2     =|Backspa| +|-----------    ----------| +|Tab  |  Q|     |  ]|Retur| +|-----------    -----`    | +|CapsLo|  A|    '| *c|    | +|-----------    ----------| +|Shif| *b|      Shift     | +`-----------    ----------' + +ADB Keyboard scan code: +        ADB scan code   USB usage +        -------------   --------- +Key     ANSI    ISO     ANSI    ISO +--------------------------------------------- +*a      0x32    0x0A    0x35    0x35 +*b      ----    0x32    ----    0x64 +*c      0x2A    0x2A    0x31    0x31(or 0x32) + + +TMK ADB-USB mapping: +ADB     USB(ANSI)   USB(ISO) +--------------------------------- +0x32    0x35        0x64 +0x0A    ----        0x35 +0x2A    0x31        0x31(or 0x32) + +Note that mappings of ADB code 0x32 are diffrent between ANSI and ISO keyboard. +https://github.com/tmk/tmk_keyboard/issues/35 + */ diff --git a/converter/adb_usb/keymap_hasu.c b/converter/adb_usb/keymap_hasu.c new file mode 100644 index 000000000..f2e59b3e9 --- /dev/null +++ b/converter/adb_usb/keymap_hasu.c @@ -0,0 +1,58 @@ +#include "keymap_common.h" + + +const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +    /* Default Layer: plain keymap +     * ,---.   ,---------------. ,---------------. ,---------------. ,-----------.             ,---. +     * |Esc|   |F1 |F2 |F3 |F4 | |F5 |F6 |F7 |F8 | |F9 |F10|F11|F12| |PrS|ScL|Pau|             |   | +     * `---'   `---------------' `---------------' `---------------' `-----------'             `---' +     * ,-----------------------------------------------------------. ,-----------. ,---------------. +     * |  `|  1|  2|  3|  4|  5|  6|  7|  8|  9|  0|  -|  =|Backspa| |Ins|Hom|PgU| |NmL|  =|  /|  *| +     * |-----------------------------------------------------------| |-----------| |---------------| +     * |Tab  |  Q|  W|  E|  R|  T|  Y|  U|  I|  O|  P|  [|  ]|  Fn0| |Del|End|PgD| |  7|  8|  9|  -| +     * |-----------------------------------------------------------| `-----------' |---------------| +     * |CapsLo|  A|  S|  D|  F|  G|  H|  J|  K|  L|  ;|  '|Return  |               |  4|  5|  6|  +| +     * |-----------------------------------------------------------|     ,---.     |---------------| +     * |Shift   |  Z|  X|  C|  V|  B|  N|  M|  ,|  ,|  /|Shift     |     |Up |     |  1|  2|  3|   | +     * |-----------------------------------------------------------| ,-----------. |-----------|Ent| +     * |Ctrl |Gui |Alt |         Space             |Alt |Gui |Ctrl | |Lef|Dow|Rig| |      0|  .|   | +     * `-----------------------------------------------------------' `-----------' `---------------' +     */ +    KEYMAP_EXT_ANSI( +    ESC, F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F9,  F10, F11, F12,           PSCR,SLCK,BRK,                    NO, +    GRV, 1,   2,   3,   4,   5,   6,   7,   8,   9,   0,   MINS,EQL, BSPC,     INS, HOME,PGUP,    NLCK,EQL, PSLS,PAST, +    TAB, Q,   W,   E,   R,   T,   Y,   U,   I,   O,   P,   LBRC,RBRC,FN0,      DEL, END, PGDN,    P7,  P8,  P9,  PMNS, +    CAPS,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,          RSFT,          UP,           P1,  P2,  P3, +    LCTL,LGUI,LALT,          SPC,                               RGUI,RCTL,     LEFT,DOWN,RGHT,    P0,       PDOT,PENT +    ), + +    /* Default Layer: plain keymap +     * ,---.   ,---------------. ,---------------. ,---------------. ,-----------.             ,---. +     * |`  |   |F1 |F2 |F3 |F4 | |F5 |F6 |F7 |F8 | |F9 |F10|F11|F12| |PrS|ScL|Pau|             |   | +     * `---'   `---------------' `---------------' `---------------' `-----------'             `---' +     * ,-----------------------------------------------------------. ,-----------. ,---------------. +     * |Esc|F1 |F2 |F3 |F4 |F5 |F6 |F7 |F8 |F9 |F10|F11|F12|Delete | |Ins|Hom|PgU| |NmL|Mb1|Mb2|Mb3| +     * |-----------------------------------------------------------| |-----------| |---------------| +     * |Tab  |  Q|  W|  E|  R|  T|  Y|  U|PrS|ScL|Pau|Up |Ins|  Fn0| |Del|End|PgD| |MwD|McU|MwU|MwD| +     * |-----------------------------------------------------------| `-----------' |---------------| +     * |CapsLo|VoD|VoU|Mut|  F|  G|  H|  J|Hom|PgU|Lef|Rig|Return  |               |McL|McD|McR|MwU| +     * |-----------------------------------------------------------|     ,---.     |---------------| +     * |Shift   |  Z|  X|  C|  V|  B|  N|  M|End|PgD|Dow|Shift     |     |PgU|     |MwL|McD|MwR|   | +     * |-----------------------------------------------------------| ,-----------. |-----------|Mb3| +     * |Ctrl |Gui |Alt |         Space             |Alt |Gui |Ctrl | |Hom|PgD|End| |    Mb1|Mb2|   | +     * `-----------------------------------------------------------' `-----------' `---------------' +     */ +    KEYMAP_EXT_ANSI( +    GRV, F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F9,  F10, F11, F12,           PSCR,SLCK,BRK,                    NO,  +    ESC, F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F9,  F10, F11, F12, DEL,      INS, HOME,PGUP,    NLCK,BTN1,BTN2,BTN3, +    TAB, Q,   W,   E,   R,   T,   Y,   U,   PSCR,SLCK,PAUS,UP,  INS, FN0,      DEL, END, PGDN,    WH_D,MS_U,WH_U,WH_D, +    CAPS,VOLD,VOLU,MUTE,F,   G,   H,   J,   HOME,PGUP,LEFT,RGHT,     ENT,                         MS_L,MS_D,MS_R,WH_U, +    LSFT,Z,   X,   C,   V,   B,   N,   M,   END, PGDN,DOWN,          RSFT,          PGUP,         WH_L,MS_D,WH_R, +    LCTL,LGUI,LALT,          SPC,                               RGUI,RCTL,     HOME,PGDN,END,     BTN1,     BTN2,BTN3 +    ), +}; + +const uint16_t PROGMEM fn_actions[] = { +    [0] = ACTION_LAYER_TAP_KEY(1, KC_BSLS), +}; diff --git a/converter/adb_usb/keymap_iso.c b/converter/adb_usb/keymap_iso.c new file mode 100644 index 000000000..451d3d2c3 --- /dev/null +++ b/converter/adb_usb/keymap_iso.c @@ -0,0 +1,16 @@ +#include "keymap_common.h" + + +const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +    KEYMAP_EXT_ISO( +    ESC, F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F9,  F10, F11, F12,           PSCR,SLCK,PAUS,                   PWR, +    GRV, 1,   2,   3,   4,   5,   6,   7,   8,   9,   0,   MINS,EQL, BSPC,     INS, HOME,PGUP,    NLCK,PEQL,PSLS,PAST, +    TAB, Q,   W,   E,   R,   T,   Y,   U,   I,   O,   P,   LBRC,RBRC,ENT,      DEL, END, PGDN,    P7,  P8,  P9,  PMNS, +    LCAP,A,   S,   D,   F,   G,   H,   J,   K,   L,   SCLN,QUOT,NUHS,                             P4,  P5,  P6,  PPLS, +    LSFT,NUBS,Z,   X,   C,   V,   B,   N,   M,   COMM,DOT, SLSH,     RSFT,          UP,           P1,  P2,  P3, +    LCTL,LALT,LGUI,          SPC,                               RALT,RCTL,     LEFT,DOWN,RGHT,    P0,       PDOT,PENT +    ), +}; + +const uint16_t PROGMEM fn_actions[] = { +}; diff --git a/converter/m0110_usb/Makefile b/converter/m0110_usb/Makefile index 7791527e4..ac54945e7 100644 --- a/converter/m0110_usb/Makefile +++ b/converter/m0110_usb/Makefile @@ -10,13 +10,14 @@ TARGET_DIR = .  # keyboard dependent files  SRC =	matrix.c \  	led.c \ +	keymap_common.c \  	m0110.c  # To use own keymap file run make like: make keymap=hasu -ifdef keymap -    SRC += keymap_$(keymap).c +ifdef KEYMAP +    SRC += keymap_$(KEYMAP).c  else -    SRC += keymap.c +    SRC += keymap_plain.c  endif  CONFIG_H = config.h @@ -71,14 +72,14 @@ OPT_DEFS += -DBOOTLOADER_SIZE=4096  # Build Options  #   *Comment out* to disable the options.  # -BOOTMAGIC_ENABLE = yes	# Virtual DIP switch configuration(+1000) +#BOOTMAGIC_ENABLE = yes	# Virtual DIP switch configuration(+1000)  MOUSEKEY_ENABLE = yes	# Mouse keys(+4700)  EXTRAKEY_ENABLE = yes	# Audio control and System control(+450)  CONSOLE_ENABLE = yes	# Console for debug(+400)  COMMAND_ENABLE = yes    # Commands for debug and configuration  #SLEEP_LED_ENABLE = yes  # Breathing sleep LED during USB suspend  #NKRO_ENABLE = yes	# USB Nkey Rollover - not yet supported in LUFA -KEYMAP_SECTION_ENABLE = yes	# fixed address keymap for keymap editor +#KEYMAP_SECTION_ENABLE = yes	# fixed address keymap for keymap editor diff --git a/converter/m0110_usb/README.md b/converter/m0110_usb/README.md index 1c344f1ac..7de36d5de 100644 --- a/converter/m0110_usb/README.md +++ b/converter/m0110_usb/README.md @@ -2,6 +2,8 @@ M0110/M0110A to USB keyboard converter  ======================================  This firmware converts the protocol of Apple Macintosh keyboard **M0110**, **M0110A** and **M0120** into USB. Target of this project is USB AVR controller **ATmega32U4**. Using this converter you can revive these retro keyboards with modern computer. +Read README of top directory too. +  Pictures of **M0110 + M0120** and **M0110A**.   @@ -17,6 +19,7 @@ Update  ------  - 2013/08: Change port for signals `PF` to `PD`  - 2013/09: Change port again, it uses inversely `PD0` for data and `PD1` for clock line now. +- 2014/06: Change keymaps @@ -54,76 +57,22 @@ To compile firmware you need AVR GCC. You can edit *Makefile* and *config.h* to      $ git clone git://github.com/tmk/tmk_keyboard.git (or download source)      $ cd m0110_usb -    $ make -f Makefile clean -    $ make -f Makefile +    $ make clean +    $ make + +To select keymap use `KEYMAP` option. -and program your Teensy with [PJRC Teensy loader](http://www.pjrc.com/teensy/loader.html). +    $ make clean +    $ make KEYMAP={plain|spacefn|hasu}  Keymap  ------ -You can change keymaps by editing *keymap.c*. - -### M0110 & M0120 -#### *Default Layer* -    ,---------------------------------------------------------.     ,---------------. -    |  `|  1|  2|  3|  4|  5|  6|  7|  8|  9|  0|  -|  =|Backs|     |Clr|  -|Lft|Rgt| -    |---------------------------------------------------------|     |---------------| -    |Tab  |  Q|  W|  E|  R|  T|  Y|  U|  I|  O|  P|  [|  ]|  \|     |  7|  8|  9| Up| -    |---------------------------------------------------------|     |---------------| -    |Caps  |  A|  S|  D|  F|  G|  H|  J|  K|  L|  ;|  '|Enter |     |  4|  5|  6| Dn| -    |---------------------------------------------------------|     |---------------| -    |Shift   |  Z|  X|  C|  V|  B|  N|  M|  ,|  ,|  /|Shift   |     |  1|  2|  3|   | -    `---------------------------------------------------------'     |-----------|Ent| -         |Ctl|Gui |         Space               |Alt |Ctl|          |      0|  .|   | -         `-----------------------------------------------'          `---------------' - -- `Space` and  `Enter` also work as `Fn` layer switch key when holding down. - -#### *Function Layer(WASD/HHKB)* -    ,---------------------------------------------------------.     ,---------------. -    |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Delet|     |Nlk|  -|Lft|Rgt| -    |---------------------------------------------------------|     |---------------| -    |Caps |Hom| Up|PgU|   |   |   |   |Psc|Slk|Pau|Up |Ins|  \|     |  7|  8|  9| Up| -    |---------------------------------------------------------|     |---------------| -    |Caps  |Lef|Dow|Rig|   |   |   |   |Hom|PgU|Lef|Rig|Enter |     |  4|  5|  6| Dn| -    |---------------------------------------------------------|     |---------------| -    |Shift   |End|   |PgD|   |   |   |   |End|PgD|Dow|Shift   |     |  1|  2|  3|   | -    `---------------------------------------------------------'     |-----------|Ent| -         |Ctl|Gui |         Space               |Alt |Ctl|          |      0|  .|   | -         `-----------------------------------------------'          `---------------' - - -### M0110A -#### *Default Layer* -    ,---------------------------------------------------------. ,---------------. -    |  `|  1|  2|  3|  4|  5|  6|  7|  8|  9|  0|  -|  =|Backs| |Clr|  =|  /|  *| -    |---------------------------------------------------------| |---------------| -    |Tab  |  Q|  W|  E|  R|  T|  Y|  U|  I|  O|  P|  [|  ]|   | |  7|  8|  9|  -| -    |-----------------------------------------------------'   | |---------------| -    |Caps  |  A|  S|  D|  F|  G|  H|  J|  K|  L|  ;|  '|Enter | |  4|  5|  6|  +| -    |---------------------------------------------------------| |---------------| -    |Shift   |  Z|  X|  C|  V|  B|  N|  M|  ,|  ,|  /|Shft| Up| |  1|  2|  3|   | -    |---------------------------------------------------------| |-----------|Ent| -    |Ctrl |Gui    |         Space             |  \|Lft|Rgt|Dwn| |      0|  .|   | -    `---------------------------------------------------------' `---------------' - -- `Space` and  `Enter` also work as `Fn` layer switch key when holding down. -- `Backslash(\)` also works as `Alt` when holding down. - -#### *Function Layer(WASD/HHKB)* -    ,---------------------------------------------------------. ,---------------. -    |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Delet| |Nlk|  =|  /|  *| -    |---------------------------------------------------------| |---------------| -    |Caps |Hom| Up|PgU|   |   |   |   |Psc|Slk|Pau|Up |Ins|   | |  7|  8|  9|  -| -    |-----------------------------------------------------'   | |---------------| -    |Caps  |Lef|Dow|Rig|   |   |   |   |Hom|PgU|Lef|Rig|Enter | |  4|  5|  6|  +| -    |---------------------------------------------------------| |---------------| -    |Shift   |End|   |PgD|   |   |   |   |End|PgD|Dow|Shif|PgU| |  1|  2|  3|   | -    |---------------------------------------------------------| |-----------|Ent| -    |Ctrl |Gui    |         Space             |  \|Hom|End|PgD| |      0|  .|   | -    `---------------------------------------------------------' `---------------' +To create your own keymap copy existent keymap file to `keymap_name.c` and edit it. You can build it like this. + +    $ make clean +    $ make KEYMAP=name diff --git a/converter/m0110_usb/keymap_common.c b/converter/m0110_usb/keymap_common.c new file mode 100644 index 000000000..bad18c91a --- /dev/null +++ b/converter/m0110_usb/keymap_common.c @@ -0,0 +1,37 @@ +/* +Copyright 2011,2012,2014 Jun Wako <wakojun@gmail.com> + +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 <http://www.gnu.org/licenses/>. +*/ +#include <stdint.h> +#include <avr/pgmspace.h> +#include "action.h" +#include "keycode.h" +#include "keymap.h" +#include "keymap_common.h" + + +/* translates key to keycode */ +uint8_t keymap_key_to_keycode(uint8_t layer, key_t key) +{ +    return pgm_read_byte(&keymaps[(layer)][(key.row)][(key.col)]); +} + +/* translates Fn index to action */ +action_t keymap_fn_to_action(uint8_t keycode) +{ +    action_t action; +    action.code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]); +    return action; +} diff --git a/converter/m0110_usb/keymap_common.h b/converter/m0110_usb/keymap_common.h new file mode 100644 index 000000000..e1d47342e --- /dev/null +++ b/converter/m0110_usb/keymap_common.h @@ -0,0 +1,107 @@ +/* +Copyright 2011,2012,2014 Jun Wako <wakojun@gmail.com> + +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 <http://www.gnu.org/licenses/>. +*/ +#include <stdint.h> +#include <avr/pgmspace.h> +#include "keycode.h" +#include "keymap.h" + + +extern const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; +extern const uint16_t fn_actions[]; + + +/*  + * The keymap works with both M0110 and M0110A keyboards. As you can see, the M0110A is a superset + * of the M0110 keyboard, with only one exception: 'Enter' in M0110 does not exist + * on the M0110A, but since it generates a unique scan code which is not used for some other key in + * the M0110A, they are totally interchangeable.  In fact, the M0110A is functionally (almost) + * identical to the combination of the M0110 along with the M0120 keypad. The only difference + * (which is causing some problems as you will read below) is that the M0110+M0120 don't have + * dedicated arrow keys, while the M0110A does. However, the M0120 did have arrow keys, which + * doubled as the [comma], [/], [*] and [+] keys, when used with the [Shift] key. The M0110A has + * substituted the [comma] key with the [=] key, however its scancode is the same. + * + * Physical layout: + * M0110A + * ,---------------------------------------------------------. ,---------------. + * |  `|  1|  2|  3|  4|  5|  6|  7|  8|  9|  0|  -|  =|Bcksp| |Clr|  =|  /|  *| + * |---------------------------------------------------------| |---------------| + * |Tab  |  Q|  W|  E|  R|  T|  Y|  U|  I|  O|  P|  [|  ]|   | |  7|  8|  9|  -| + * |-----------------------------------------------------'   | |---------------| + * |Caps  |  A|  S|  D|  F|  G|  H|  J|  K|  L|  ;|  '|Return| |  4|  5|  6|  +| + * |---------------------------------------------------------| |---------------| + * |Shift   |  Z|  X|  C|  V|  B|  N|  M|  ,|  ,|  /|Shft|Up | |  1|  2|  3|   | + * |---------------------------------------------------------' |-----------|Ent| + * |Opt  |Mac    |           Space           |  \|Lft|Rgt|Dn | |      0|  .|   | + * `---------------------------------------------------------' `---------------' + * + * M0110                                                       M0120 + * ,---------------------------------------------------------. ,---------------. + * |  `|  1|  2|  3|  4|  5|  6|  7|  8|  9|  0|  -|  =|Backs| |Clr|  -|  +|  *| + * |---------------------------------------------------------| |---------------| + * |Tab  |  Q|  W|  E|  R|  T|  Y|  U|  I|  O|  P|  [|  ]|  \| |  7|  8|  9|  /| + * |---------------------------------------------------------| |---------------| + * |Caps  |  A|  S|  D|  F|  G|  H|  J|  K|  L|  ;|  '|Return| |  4|  5|  6|  ,| + * |---------------------------------------------------------| |---------------| + * |Shift   |  Z|  X|  C|  V|  B|  N|  M|  ,|  ,|  /|Shift   | |  1|  2|  3|   | + * `---------------------------------------------------------' |-----------|Ent| + *      |Opt|Mac |         Space               |Ent |Opt|      |      0|  .|   | + *      `-----------------------------------------------'      `---------------' + * With Shift keys on M0120 work as curosor.(-:Left *:Right /:Up ,:Down) + * + * NOTE: \ is located differently. + * NOTE: Enter on M0110 is different from Enter on keypad(M0120 and M0110A). + * NOTE: Left Shift and right Shift are logically same key. + * NOTE: Left Option and right Option are logically same key. + */ + +/* Keymap definition Macro + * ,---------------------------------------------------------. ,---------------. + * |  `|  1|  2|  3|  4|  5|  6|  7|  8|  9|  0|  -|  =|Backs| |Clr|  =|  /|  *| + * |---------------------------------------------------------| |---------------| + * |Tab  |  Q|  W|  E|  R|  T|  Y|  U|  I|  O|  P|  [|  ]|   | |  7|  8|  9|  -| + * |-----------------------------------------------------'   | |---------------| + * |Caps  |  A|  S|  D|  F|  G|  H|  J|  K|  L|  ;|  '|Return| |  4|  5|  6|  +| + * |---------------------------------------------------------| |---------------| + * |Shift   |  Z|  X|  C|  V|  B|  N|  M|  ,|  ,|  /|Shft|Up | |  1|  2|  3|   | + * |---------------------------------------------------------| |-----------|Ent| + * |Opt  |Mac    |         Space         |Ent|  \|Lft|Rgt|Dn | |      0|  .|   | + * `---------------------------------------------------------' `---------------' + * NOTE: Ent between Space and \ means Enter on M0110. + */ +#define KEYMAP( \ +    K32,K12,K13,K14,K15,K17,K16,K1A,K1C,K19,K1D,K1B,K18,K33,  K47,K68,K6D,K62, \ +    K30,K0C,K0D,K0E,K0F,K11,K10,K20,K22,K1F,K23,K21,K1E,      K59,K5B,K5C,K4E, \ +    K39,K00,K01,K02,K03,K05,K04,K26,K28,K25,K29,K27,    K24,  K56,K57,K58,K66, \ +    K38,K06,K07,K08,K09,K0B,K2D,K2E,K2B,K2F,K2C,        K4D,  K53,K54,K55,K4C, \ +    K3A,K37,            K31,            K34,K2A,K46,K42,K48,  K52,    K41      \ +) { \ +    { KC_##K00, KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07 }, \ +    { KC_##K08, KC_##K09, KC_NO,    KC_##K0B, KC_##K0C, KC_##K0D, KC_##K0E, KC_##K0F }, \ +    { KC_##K10, KC_##K11, KC_##K12, KC_##K13, KC_##K14, KC_##K15, KC_##K16, KC_##K17 }, \ +    { KC_##K18, KC_##K19, KC_##K1A, KC_##K1B, KC_##K1C, KC_##K1D, KC_##K1E, KC_##K1F }, \ +    { KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26, KC_##K27 }, \ +    { KC_##K28, KC_##K29, KC_##K2A, KC_##K2B, KC_##K2C, KC_##K2D, KC_##K2E, KC_##K2F }, \ +    { KC_##K30, KC_##K31, KC_##K32, KC_##K33, KC_##K34, KC_NO,    KC_NO,    KC_##K37 }, \ +    { KC_##K38, KC_##K39, KC_##K3A, KC_NO,    KC_NO,    KC_NO,    KC_NO,    KC_NO    }, \ +    { KC_NO,    KC_##K41, KC_##K42, KC_NO,    KC_NO,    KC_NO,    KC_##K46, KC_##K47 }, \ +    { KC_##K48, KC_NO,    KC_NO,    KC_NO,    KC_##K4C, KC_##K4D, KC_##K4E, KC_NO    }, \ +    { KC_NO,    KC_NO,    KC_##K52, KC_##K53, KC_##K54, KC_##K55, KC_##K56, KC_##K57 }, \ +    { KC_##K58, KC_##K59, KC_NO,    KC_##K5B, KC_##K5C, KC_NO,    KC_NO,    KC_NO    }, \ +    { KC_NO,    KC_NO,    KC_##K62, KC_NO,    KC_NO,    KC_NO,    KC_##K66, KC_NO    }, \ +    { KC_##K68, KC_NO,    KC_NO,    KC_NO,    KC_NO,    KC_##K6D, KC_NO,    KC_NO    }, \ +} diff --git a/converter/m0110_usb/keymap_for_editor.c b/converter/m0110_usb/keymap_for_editor.c new file mode 100644 index 000000000..d20f298f8 --- /dev/null +++ b/converter/m0110_usb/keymap_for_editor.c @@ -0,0 +1,118 @@ +/* +Copyright 2014 Jun Wako <wakojun@gmail.com> + +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 <http://www.gnu.org/licenses/>. +*/ +#include <stdint.h> +#include "keycode.h" +#include "keymap_common.h" + + +#ifdef KEYMAP_SECTION_ENABLE +const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] __attribute__ ((section (".keymap.keymaps"))) = { +#else +const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = { +#endif +    /* Default: +     * ,---------------------------------------------------------. ,---------------. +     * |  `|  1|  2|  3|  4|  5|  6|  7|  8|  9|  0|  -|  =|Backs| |Clr|  =|  /|  *| +     * |---------------------------------------------------------| |---------------| +     * |Tab  |  Q|  W|  E|  R|  T|  Y|  U|  I|  O|  P|  [|  ]|   | |  7|  8|  9|  -| +     * |-----------------------------------------------------'   | |---------------| +     * |Caps  |  A|  S|  D|  F|  G|  H|  J|  K|  L|  ;|  '|Enter | |  4|  5|  6|  +| +     * |---------------------------------------------------------| |---------------| +     * |Shift   |  Z|  X|  C|  V|  B|  N|  M|  ,|  ,|  /|Shft|Up | |  1|  2|  3|   | +     * |---------------------------------------------------------| |-----------|Ent| +     * |Ctl  |Gui    |         Space         |Alt|  \|Lft|Rgt|Dn | |      0|  .|   | +     * `---------------------------------------------------------' `---------------' +     */ +    [0] = KEYMAP( +    GRV, 1,   2,   3,   4,   5,   6,   7,   8,   9,   0,   MINS,EQL, BSPC,    CLR, EQL, PSLS,PAST, +    TAB, Q,   W,   E,   R,   T,   Y,   U,   I,   O,   P,   LBRC,RBRC,         P7,  P8,  P9,  PMNS, +    LCAP,A,   S,   D,   F,   G,   H,   J,   K,   L,   SCLN,QUOT,     FN15,    P4,  P5,  P6,  PPLS, +    LSFT,Z,   X,   C,   V,   B,   N,   M,   COMM,DOT, SLSH,          UP,      P1,  P2,  P3,  PENT, +    LCTL,LGUI,               FN16,               LALT,FN31,LEFT,RGHT,DOWN,    P0,       PDOT +    ), +    /* Cursor Layer(WASD, IJKL) +     * ,---------------------------------------------------------. ,---------------. +     * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Delet| |Nlk|  =|  /|  *| +     * |---------------------------------------------------------| |---------------| +     * |Caps |Hom| Up|PgU|   |   |   |   |Psc|Slk|Pau|Up |Ins|   | |  7|  8|  9|  -| +     * |-----------------------------------------------------'   | |---------------| +     * |Caps  |Lef|Dow|Rig|   |   |   |   |Hom|PgU|Lef|Rig|Enter | |  4|  5|  6|  +| +     * |---------------------------------------------------------| |---------------| +     * |Shift   |End|   |PgD|   |   |   |   |End|PgD|Dow|Shif|PgU| |  1|  2|  3|   | +     * |---------------------------------------------------------| |-----------|Ent| +     * |Ctl  |Gui    |         Space        |Alt |  \|Hom|End|PgD| |      0|  .|   | +     * `---------------------------------------------------------' `---------------' +     */ +    [3] = KEYMAP( +    ESC, F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F9,  F10, F11, F12, DEL,     NLCK,EQL, PSLS,PAST, +    CAPS,HOME,UP,  PGUP,NO,  NO,  NO,  NO,  PSCR,SLCK,PAUS,UP,  INS,          P7,  P8,  P9,  PMNS, +    LCAP,LEFT,DOWN,RGHT,NO,  NO,  NO,  NO,  HOME,PGUP,LEFT,RGHT,     FN15,    P4,  P5,  P6,  PPLS, +    LSFT,END, NO,  PGDN,NO,  NO,  NO,  NO,  END, PGDN,DOWN,          PGUP,    P1,  P2,  P3,  PENT, +    LCTL,LGUI,               FN16,               LALT,FN31,HOME,END, PGDN,    P0,       PDOT +    ), +    [4] = KEYMAP( +    ESC, F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F9,  F10, F11, F12, DEL,     NLCK,EQL, PSLS,PAST, +    CAPS,HOME,UP,  PGUP,NO,  NO,  NO,  NO,  PSCR,SLCK,PAUS,UP,  INS,          P7,  P8,  P9,  PMNS, +    LCAP,LEFT,DOWN,RGHT,NO,  NO,  NO,  NO,  HOME,PGUP,LEFT,RGHT,     FN15,    P4,  P5,  P6,  PPLS, +    LSFT,END, NO,  PGDN,NO,  NO,  NO,  NO,  END, PGDN,DOWN,          PGUP,    P1,  P2,  P3,  PENT, +    LCTL,LGUI,               FN16,               LALT,FN31,HOME,END, PGDN,    P0,       PDOT +    ), +    [7] = {}, +}; + + +/* + * Fn action definition + */ +#ifdef KEYMAP_SECTION_ENABLE +const uint16_t fn_actions[] __attribute__ ((section (".keymap.fn_actions"))) = { +#else +const uint16_t fn_actions[] PROGMEM = { +#endif +    [0]  = ACTION_LAYER_MOMENTARY(1), +    [1]  = ACTION_LAYER_MOMENTARY(2), +    [2]  = ACTION_LAYER_MOMENTARY(3), +    [3]  = ACTION_LAYER_MOMENTARY(4), +    [4]  = ACTION_LAYER_MOMENTARY(5), +    [5]  = ACTION_LAYER_MOMENTARY(6), +    [6]  = ACTION_LAYER_MOMENTARY(7), +    [7]  = ACTION_LAYER_TOGGLE(1), +    [8]  = ACTION_LAYER_TOGGLE(2), +    [9]  = ACTION_LAYER_TOGGLE(3), +    [10] = ACTION_LAYER_TAP_TOGGLE(1), +    [11] = ACTION_LAYER_TAP_TOGGLE(2), +    [12] = ACTION_LAYER_TAP_TOGGLE(3), +    [13] = ACTION_LAYER_TAP_KEY(1, KC_F), +    [14] = ACTION_LAYER_TAP_KEY(2, KC_J), +    [15] = ACTION_LAYER_TAP_KEY(3, KC_ENTER), +    [16] = ACTION_LAYER_TAP_KEY(4, KC_SPACE), +    [17] = ACTION_LAYER_TAP_KEY(5, KC_SCOLON), +    [18] = ACTION_LAYER_TAP_KEY(6, KC_QUOTE), +    [19] = ACTION_LAYER_TAP_KEY(7, KC_SLASH), +    [20] = ACTION_MODS_TAP_KEY(MOD_LSFT, KC_SPACE), +    [21] = ACTION_MODS_TAP_KEY(MOD_LCTL, KC_SPACE), +    [22] = ACTION_MODS_TAP_KEY(MOD_RCTL, KC_QUOTE), +    [23] = ACTION_MODS_TAP_KEY(MOD_RCTL, KC_ENTER), +    [24] = ACTION_MODS_TAP_KEY(MOD_LCTL, KC_ESC), +    [25] = ACTION_MODS_TAP_KEY(MOD_LCTL, KC_BSPACE), +    [26] = ACTION_MODS_ONESHOT(MOD_LCTL), +    [27] = ACTION_MODS_TAP_KEY(MOD_LSFT, KC_ESC), +    [28] = ACTION_MODS_TAP_KEY(MOD_LSFT, KC_BSPACE), +    [29] = ACTION_MODS_ONESHOT(MOD_LSFT), +    [30] = ACTION_MODS_TAP_KEY(MOD_RSFT, KC_GRAVE), +    [31] = ACTION_MODS_TAP_KEY(MOD_RALT, KC_BSLASH), +}; diff --git a/converter/m0110_usb/keymap_hasu.c b/converter/m0110_usb/keymap_hasu.c index 3608dac9e..11f1a4f39 100644 --- a/converter/m0110_usb/keymap_hasu.c +++ b/converter/m0110_usb/keymap_hasu.c @@ -1,5 +1,5 @@  /* -Copyright 2011,2012 Jun Wako <wakojun@gmail.com> +Copyright 2014 Jun Wako <wakojun@gmail.com>  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 @@ -14,188 +14,74 @@ 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 <http://www.gnu.org/licenses/>.  */ -/* M0110A Support was contributed by skagon@github */ -  #include <stdint.h> -#include <stdbool.h> -#include <avr/pgmspace.h>  #include "keycode.h" -#include "print.h" -#include "debug.h" -#include "util.h" -#include "keymap.h" - - -/*  - * The keymap works with both M0110 and M0110A keyboards. As you can see, the M0110A is a superset - * of the M0110 keyboard, with only one exception: 'Enter' in M0110 does not exist - * on the M0110A, but since it generates a unique scan code which is not used for some other key in - * the M0110A, they are totally interchangeable.  In fact, the M0110A is functionally (almost) - * identical to the combination of the M0110 along with the M0120 keypad. The only difference - * (which is causing some problems as you will read below) is that the M0110+M0120 don't have - * dedicated arrow keys, while the M0110A does. However, the M0120 did have arrow keys, which - * doubled as the [comma], [/], [*] and [+] keys, when used with the [Shift] key. The M0110A has - * substituted the [comma] key with the [=] key, however its scancode is the same. - * - * Physical layout: - * M0110A - * ,---------------------------------------------------------. ,---------------. - * |  `|  1|  2|  3|  4|  5|  6|  7|  8|  9|  0|  -|  =|Bcksp| |Clr|  =|  /|  *| - * |---------------------------------------------------------| |---------------| - * |Tab  |  Q|  W|  E|  R|  T|  Y|  U|  I|  O|  P|  [|  ]|   | |  7|  8|  9|  -| - * |-----------------------------------------------------'   | |---------------| - * |Caps  |  A|  S|  D|  F|  G|  H|  J|  K|  L|  ;|  '|Return| |  4|  5|  6|  +| - * |---------------------------------------------------------| |---------------| - * |Shift   |  Z|  X|  C|  V|  B|  N|  M|  ,|  ,|  /|Shft|Up | |  1|  2|  3|   | - * |---------------------------------------------------------' |-----------|Ent| - * |Opt  |Mac    |           Space           |  \|Lft|Rgt|Dn | |      0|  .|   | - * `---------------------------------------------------------' `---------------' - * - * M0110                                                       M0120 - * ,---------------------------------------------------------. ,---------------. - * |  `|  1|  2|  3|  4|  5|  6|  7|  8|  9|  0|  -|  =|Backs| |Clr|  -|  +|  *| - * |---------------------------------------------------------| |---------------| - * |Tab  |  Q|  W|  E|  R|  T|  Y|  U|  I|  O|  P|  [|  ]|  \| |  7|  8|  9|  /| - * |---------------------------------------------------------| |---------------| - * |Caps  |  A|  S|  D|  F|  G|  H|  J|  K|  L|  ;|  '|Return| |  4|  5|  6|  ,| - * |---------------------------------------------------------| |---------------| - * |Shift   |  Z|  X|  C|  V|  B|  N|  M|  ,|  ,|  /|Shift   | |  1|  2|  3|   | - * `---------------------------------------------------------' |-----------|Ent| - *      |Opt|Mac |         Space               |Ent |Opt|      |      0|  .|   | - *      `-----------------------------------------------'      `---------------' - * With Shift keys on M0120 work as curosor.(-:Left *:Right /:Up ,:Down) - * - * NOTE: \ is located differently. - * NOTE: Enter on M0110 is different from Enter on keypad(M0120 and M0110A). - * NOTE: Left Shift and right Shift are logically same key. - * NOTE: Left Option and right Option are logically same key. - */ - -/* Keymap definition Macro - * ,---------------------------------------------------------. ,---------------. - * |  `|  1|  2|  3|  4|  5|  6|  7|  8|  9|  0|  -|  =|Backs| |Clr|  =|  /|  *| - * |---------------------------------------------------------| |---------------| - * |Tab  |  Q|  W|  E|  R|  T|  Y|  U|  I|  O|  P|  [|  ]|   | |  7|  8|  9|  -| - * |-----------------------------------------------------'   | |---------------| - * |Caps  |  A|  S|  D|  F|  G|  H|  J|  K|  L|  ;|  '|Return| |  4|  5|  6|  +| - * |---------------------------------------------------------| |---------------| - * |Shift   |  Z|  X|  C|  V|  B|  N|  M|  ,|  ,|  /|Shft|Up | |  1|  2|  3|   | - * |---------------------------------------------------------| |-----------|Ent| - * |Opt  |Mac    |         Space         |Ent|  \|Lft|Rgt|Dn | |      0|  .|   | - * `---------------------------------------------------------' `---------------' - * NOTE: Ent between Space and \ means Enter on M0110. - */ -#define KEYMAP( \ -    K32,K12,K13,K14,K15,K17,K16,K1A,K1C,K19,K1D,K1B,K18,K33,  K47,K68,K6D,K62, \ -    K30,K0C,K0D,K0E,K0F,K11,K10,K20,K22,K1F,K23,K21,K1E,      K59,K5B,K5C,K4E, \ -    K39,K00,K01,K02,K03,K05,K04,K26,K28,K25,K29,K27,    K24,  K56,K57,K58,K66, \ -    K38,K06,K07,K08,K09,K0B,K2D,K2E,K2B,K2F,K2C,        K4D,  K53,K54,K55,K4C, \ -    K3A,K37,            K31,            K34,K2A,K46,K42,K48,  K52,    K41      \ -) { \ -    { KC_##K00, KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07 }, \ -    { KC_##K08, KC_##K09, KC_NO,    KC_##K0B, KC_##K0C, KC_##K0D, KC_##K0E, KC_##K0F }, \ -    { KC_##K10, KC_##K11, KC_##K12, KC_##K13, KC_##K14, KC_##K15, KC_##K16, KC_##K17 }, \ -    { KC_##K18, KC_##K19, KC_##K1A, KC_##K1B, KC_##K1C, KC_##K1D, KC_##K1E, KC_##K1F }, \ -    { KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26, KC_##K27 }, \ -    { KC_##K28, KC_##K29, KC_##K2A, KC_##K2B, KC_##K2C, KC_##K2D, KC_##K2E, KC_##K2F }, \ -    { KC_##K30, KC_##K31, KC_##K32, KC_##K33, KC_##K34, KC_NO,    KC_NO,    KC_##K37 }, \ -    { KC_##K38, KC_##K39, KC_##K3A, KC_NO,    KC_NO,    KC_NO,    KC_NO,    KC_NO    }, \ -    { KC_NO,    KC_##K41, KC_##K42, KC_NO,    KC_NO,    KC_NO,    KC_##K46, KC_##K47 }, \ -    { KC_##K48, KC_NO,    KC_NO,    KC_NO,    KC_##K4C, KC_##K4D, KC_##K4E, KC_NO    }, \ -    { KC_NO,    KC_NO,    KC_##K52, KC_##K53, KC_##K54, KC_##K55, KC_##K56, KC_##K57 }, \ -    { KC_##K58, KC_##K59, KC_NO,    KC_##K5B, KC_##K5C, KC_NO,    KC_NO,    KC_NO    }, \ -    { KC_NO,    KC_NO,    KC_##K62, KC_NO,    KC_NO,    KC_NO,    KC_##K66, KC_NO    }, \ -    { KC_##K68, KC_NO,    KC_NO,    KC_NO,    KC_NO,    KC_##K6D, 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[] = { -    1,              // Fn0 -    2,              // Fn1 -    3,              // Fn2 -    1,              // Fn3 -    2,              // Fn4 -    0,              // Fn5 -    0,              // Fn6 -    0               // Fn7 -}; +#include "keymap_common.h" -// 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_ENTER,       // Fn0 -    KC_SCOLON,      // Fn1 -    KC_SLASH,       // Fn2 -    KC_UP,          // Fn3 -    KC_NO,          // Fn4 -    KC_NO,          // Fn5 -    KC_NO,          // Fn6 -    KC_NO           // Fn7 -}; -static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {      /* Default: -     * M0110                                                       M0120 -     * ,---------------------------------------------------------. ,---------------. -     * |  `|  1|  2|  3|  4|  5|  6|  7|  8|  9|  0|  -|  =|Backs| |Gui|  -|  +|  *| -     * |---------------------------------------------------------| |---------------| -     * |Tab  |  Q|  W|  E|  R|  T|  Y|  U|  I|  O|  P|  [|  ]|  \| |  7|  8|  9|  /| -     * |---------------------------------------------------------| |---------------| -     * |Ctrl  |  A|  S|  D|  F|  G|  H|  J|  K|  L| Fn|  '|Return| |  4|  5|  6|  ,| -     * |---------------------------------------------------------| |---------------| -     * |Shift   |  Z|  X|  C|  V|  B|  N|  M|  ,|  ,| Fn|Shift   | |  1|  2|  3|   | -     * `---------------------------------------------------------' |-----------|Ent| -     *      |Fn |alt |         Space               |Gui |Fn |      |      0|  .|   | -     *      `-----------------------------------------------'      `---------------' +     * M0110 +     * ,---------------------------------------------------------. +     * |  `|  1|  2|  3|  4|  5|  6|  7|  8|  9|  0|  -|  =|Backs| +     * |---------------------------------------------------------| +     * |Tab  |  Q|  W|  E|  R|  T|  Y|  U|  I|  O|  P|  [|  ]|  \| +     * |---------------------------------------------------------| +     * |Ctrl  |  A|  S|  D|  F|  G|  H|  J|  K|  L| Fn|  '|Return| +     * |---------------------------------------------------------| +     * |Shift   |  Z|  X|  C|  V|  B|  N|  M|  ,|  ,| Fn|Shift   | +     * `---------------------------------------------------------' +     *      |Fn |alt |           Fn                |Gui |Fn | +     *      `-----------------------------------------------'       */ -    KEYMAP( +    [0] = KEYMAP(      ESC, 1,   2,   3,   4,   5,   6,   7,   8,   9,   0,   MINS,EQL, BSPC,    NLCK,EQL, PSLS,PAST,      TAB, Q,   W,   E,   R,   T,   Y,   U,   I,   O,   P,   LBRC,RBRC,         P7,  P8,  P9,  PMNS, -    LCTL,A,   S,   D,   F,   G,   H,   J,   K,   L,   FN1, QUOT,     FN0,     P4,  P5,  P6,  PPLS, -    LSFT,Z,   X,   C,   V,   B,   N,   M,   COMM,DOT, FN2,           FN3,     P1,  P2,  P3,  PENT, -    FN4, LALT,               SPC,                LGUI,BSLS,LGUI,RCTL,RCTL,    LGUI,     PDOT +    LCTL,A,   S,   D,   F,   G,   H,   J,   K,   L,   FN3, QUOT,     ENT,     P4,  P5,  P6,  PPLS, +    LSFT,Z,   X,   C,   V,   B,   N,   M,   COMM,DOT, FN1,           UP,      P1,  P2,  P3,  PENT, +    FN0, LALT,               FN2,                LGUI,BSLS,LEFT,RGHT,DOWN,    P0,       PDOT      ), -    // HHKB & WASD -    KEYMAP( +    // IJKL cursor +    [1] = KEYMAP(      GRV, F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F9,  F10, F11, F12, DEL,     NLCK,EQL, PSLS,PAST, -    CAPS,NO,  NO,  NO,  NO,  NO,  NO,  NO,  PSCR,SLCK,PAUS,UP,  NO,           P7,  P8,  P9,  PMNS, -    LCTL,VOLD,VOLU,MUTE,NO,  NO,  NO,  NO,  HOME,PGUP,LEFT,RGHT,     FN0,     P4,  P5,  P6,  PPLS, -    LSFT,NO,  NO,  NO,  NO,  NO,  NO,  NO,  END, PGDN,DOWN,          FN3,     P1,  P2,  P3,  PENT, -    LCTL,LALT,               SPC,                LGUI,INS, LGUI,RCTL,RCTL,    P0,       PDOT +    CAPS,NO,  NO,  NO,  NO,  NO,  HOME,PGDN,UP,  PGUP,END, NO,  NO,           P7,  P8,  P9,  PMNS, +    LCTL,VOLD,VOLU,MUTE,NO,  NO,  HOME,LEFT,DOWN,RGHT,END, NO,       ENT,     P4,  P5,  P6,  PPLS, +    LSFT,NO,  NO,  NO,  NO,  NO,  HOME,PGDN,PGUP,END, NO,            PGUP,    P1,  P2,  P3,  PENT, +    TRNS,LALT,               SPC,                LGUI,BSLS,HOME,END, PGDN,    P0,       PDOT      ), -    // vi mousekeys -    KEYMAP( +    // HJKL cursor +    [2] = KEYMAP(      GRV, F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F9,  F10, F11, F12, DEL,     NLCK,EQL, PSLS,PAST, -    CAPS,NO,  NO,  NO,  NO,  NO,  WH_L,WH_D,WH_U,WH_R,PSCR,SLCK,PAUS,         P7,  P8,  P9,  PMNS, -    LCTL,VOLD,VOLU,MUTE,NO,  NO,  MS_L,MS_D,MS_U,MS_R,FN1, NO,       ENT,     P4,  P5,  P6,  PPLS, -    LSFT,NO,  NO,  NO,  NO,  BTN3,BTN2,BTN1,NO,  NO,  NO,            NO,      P1,  P2,  P3,  PENT, -    FN4, LALT,               BTN1,               LGUI,NO,  LGUI,RCTL,RCTL,    P0,       PDOT +    CAPS,NO,  NO,  NO,  NO,  NO,  HOME,PGDN,UP,  PGUP,END, NO,  NO,           P7,  P8,  P9,  PMNS, +    LCTL,VOLD,VOLU,MUTE,NO,  NO,  LEFT,DOWN,UP,  RGHT,NO,  NO,       ENT,     P4,  P5,  P6,  PPLS, +    LSFT,NO,  NO,  NO,  NO,  NO,  HOME,PGDN,PGUP,END, TRNS,          PGUP,    P1,  P2,  P3,  PENT, +    TRNS,LALT,               SPC,                LGUI,BSLS,HOME,END, PGDN,    P0,       PDOT      ), -    // vi cusorkeys -    KEYMAP( +    // Mousekey +    [3] = KEYMAP(      GRV, F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F9,  F10, F11, F12, DEL,     NLCK,EQL, PSLS,PAST, -    CAPS,NO,  NO,  NO,  NO,  NO,  HOME,PGDN,PGUP,END, PSCR,SLCK,PAUS,         P7,  P8,  P9,  PMNS, -    LCTL,NO,  NO,  NO,  NO,  NO,  LEFT,DOWN,UP,  RGHT,NO,  NO,       ENT,     P4,  P5,  P6,  PPLS, -    LSFT,NO,  NO,  NO,  NO,  NO,  HOME,PGDN,PGUP,END, FN2,           NO,      P1,  P2,  P3,  PENT, -    LCTL,LALT,               SPC,                LGUI,INS, LGUI,RCTL,RCTL,    P0,       PDOT +    CAPS,Q,   W,   E,   R,   T,   WH_L,WH_D,MS_U,WH_U,WH_R,WBAK,WFWD,         P7,  P8,  P9,  PMNS, +    LCTL,VOLD,VOLU,MUTE,NO,  NO,  BTN2,MS_L,MS_D,MS_R,BTN1,NO,       ENT,     P4,  P5,  P6,  PPLS, +    LSFT,Z,   X,   C,   V,   B,   BTN2,BTN1,BTN4,BTN5,NO,            PGUP,    P1,  P2,  P3,  PENT, +    NO,  LALT,               TRNS,               LGUI,BSLS,HOME,END, PGDN,    P0,       PDOT +    ), +    // Mousekey +    [4] = KEYMAP( +    GRV, F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F9,  F10, F11, F12, DEL,     NLCK,EQL, PSLS,PAST, +    CAPS,Q,   W,   E,   R,   T,   WH_L,WH_D,MS_U,WH_U,WH_R,WBAK,WFWD,         P7,  P8,  P9,  PMNS, +    LCTL,VOLD,VOLU,MUTE,NO,  NO,  BTN2,MS_L,MS_D,MS_R,TRNS,NO,       ENT,     P4,  P5,  P6,  PPLS, +    LSFT,Z,   X,   C,   V,   B,   BTN2,BTN1,BTN4,BTN5,NO,            PGUP,    P1,  P2,  P3,  PENT, +    NO,  LALT,               BTN1,               LGUI,BSLS,HOME,END, PGDN,    P0,       PDOT      ),  }; -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]); -} +/* + * Fn action definition + */ +const uint16_t fn_actions[] PROGMEM = { +    [0]  = ACTION_LAYER_MOMENTARY(1), +    [1]  = ACTION_LAYER_TAP_KEY(2, KC_SLASH), +    [2]  = ACTION_LAYER_TAP_KEY(3, KC_SPACE), +    [3]  = ACTION_LAYER_TAP_KEY(4, KC_SCOLON), +}; diff --git a/converter/m0110_usb/keymap_plain.c b/converter/m0110_usb/keymap_plain.c new file mode 100644 index 000000000..f262dca22 --- /dev/null +++ b/converter/m0110_usb/keymap_plain.c @@ -0,0 +1,64 @@ +/* +Copyright 2014 Jun Wako <wakojun@gmail.com> + +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 <http://www.gnu.org/licenses/>. +*/ +#include <stdint.h> +#include "keycode.h" +#include "keymap_common.h" + + +const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +    /* Default: +     * M0110                                                       M0120 +     * ,---------------------------------------------------------. ,---------------. +     * |  `|  1|  2|  3|  4|  5|  6|  7|  8|  9|  0|  -|  =|Backs| |Nlk|  -|  +|  *| +     * |---------------------------------------------------------| |---------------| +     * |Tab  |  Q|  W|  E|  R|  T|  Y|  U|  I|  O|  P|  [|  ]|  \| |  7|  8|  9|  /| +     * |---------------------------------------------------------| |---------------| +     * |Ctrl  |  A|  S|  D|  F|  G|  H|  J|  K|  L|  ;|  '|Return| |  4|  5|  6|  ,| +     * |---------------------------------------------------------| |---------------| +     * |Shift   |  Z|  X|  C|  V|  B|  N|  M|  ,|  ,|  /|Shift   | |  1|  2|  3|   | +     * `---------------------------------------------------------' |-----------|Ent| +     *      |Opt|Mac |         Space               |Mac |Opt|      |      0|  .|   | +     *      `-----------------------------------------------'      `---------------' +     *  M0110A +     * ,---------------------------------------------------------. ,---------------. +     * |  `|  1|  2|  3|  4|  5|  6|  7|  8|  9|  0|  -|  =|Bcksp| |Nlk|  =|  /|  *| +     * |---------------------------------------------------------| |---------------| +     * |Tab  |  Q|  W|  E|  R|  T|  Y|  U|  I|  O|  P|  [|  ]|   | |  7|  8|  9|  -| +     * |-----------------------------------------------------'   | |---------------| +     * |Caps  |  A|  S|  D|  F|  G|  H|  J|  K|  L|  ;|  '|Return| |  4|  5|  6|  +| +     * |---------------------------------------------------------| |---------------| +     * |Shift   |  Z|  X|  C|  V|  B|  N|  M|  ,|  ,|  /|Shft|Up | |  1|  2|  3|   | +     * |---------------------------------------------------------' |-----------|Ent| +     * |Opt  |Mac    |           Space           |  \|Lft|Rgt|Dn | |      0|  .|   | +     * `---------------------------------------------------------' `---------------' +     */ +    [0] = KEYMAP( +    GRV, 1,   2,   3,   4,   5,   6,   7,   8,   9,   0,   MINS,EQL, BSPC,    NLCK,PEQL,PSLS,PAST, +    TAB, Q,   W,   E,   R,   T,   Y,   U,   I,   O,   P,   LBRC,RBRC,         P7,  P8,  P9,  PMNS, +    LCAP,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,                RGUI,BSLS,LEFT,RGHT,DOWN,    P0,       PDOT +    ), +}; + +/* + * Fn action definition + */ +const uint16_t fn_actions[] PROGMEM = { +}; + + diff --git a/converter/m0110_usb/keymap_spacefn.c b/converter/m0110_usb/keymap_spacefn.c new file mode 100644 index 000000000..5017861a3 --- /dev/null +++ b/converter/m0110_usb/keymap_spacefn.c @@ -0,0 +1,71 @@ +/* +Copyright 2014 Jun Wako <wakojun@gmail.com> + +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 <http://www.gnu.org/licenses/>. +*/ +#include <stdint.h> +#include "keycode.h" +#include "keymap_common.h" + + +const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +    /* Default: +     * M0110                                                       M0120 +     * ,---------------------------------------------------------. ,---------------. +     * |  `|  1|  2|  3|  4|  5|  6|  7|  8|  9|  0|  -|  =|Backs| |Nlk|  -|  +|  *| +     * |---------------------------------------------------------| |---------------| +     * |Tab  |  Q|  W|  E|  R|  T|  Y|  U|  I|  O|  P|  [|  ]|  \| |  7|  8|  9|  /| +     * |---------------------------------------------------------| |---------------| +     * |Ctrl  |  A|  S|  D|  F|  G|  H|  J|  K|  L|  ;|  '|Return| |  4|  5|  6|  ,| +     * |---------------------------------------------------------| |---------------| +     * |Shift   |  Z|  X|  C|  V|  B|  N|  M|  ,|  ,|  /|Shift   | |  1|  2|  3|   | +     * `---------------------------------------------------------' |-----------|Ent| +     *      |Opt|Mac |         Space               |Mac |Opt|      |      0|  .|   | +     *      `-----------------------------------------------'      `---------------' +     *  M0110A +     * ,---------------------------------------------------------. ,---------------. +     * |  `|  1|  2|  3|  4|  5|  6|  7|  8|  9|  0|  -|  =|Bcksp| |Nlk|  =|  /|  *| +     * |---------------------------------------------------------| |---------------| +     * |Tab  |  Q|  W|  E|  R|  T|  Y|  U|  I|  O|  P|  [|  ]|   | |  7|  8|  9|  -| +     * |-----------------------------------------------------'   | |---------------| +     * |Caps  |  A|  S|  D|  F|  G|  H|  J|  K|  L|  ;|  '|Return| |  4|  5|  6|  +| +     * |---------------------------------------------------------| |---------------| +     * |Shift   |  Z|  X|  C|  V|  B|  N|  M|  ,|  ,|  /|Shft|Up | |  1|  2|  3|   | +     * |---------------------------------------------------------' |-----------|Ent| +     * |Opt  |Mac    |           Space           |  \|Lft|Rgt|Dn | |      0|  .|   | +     * `---------------------------------------------------------' `---------------' +     */ +    [0] = KEYMAP( +    GRV, 1,   2,   3,   4,   5,   6,   7,   8,   9,   0,   MINS,EQL, BSPC,    NLCK,PEQL,PSLS,PAST, +    TAB, Q,   W,   E,   R,   T,   Y,   U,   I,   O,   P,   LBRC,RBRC,         P7,  P8,  P9,  PMNS, +    LCTL,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,               FN0,                RGUI,BSLS,LEFT,RGHT,DOWN,    P0,       PDOT +    ), +    [1] = KEYMAP( +    ESC, F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F9,  F10, F11, F12, DEL,     NLCK,EQL, PSLS,PAST, +    TRNS,TRNS,TRNS,ESC, TRNS,TRNS,TRNS,HOME,UP,  END, PSCR,SLCK,PAUS,         P7,  P8,  P9,  PMNS, +    LCTL,TRNS,TRNS,TRNS,TRNS,TRNS,PGUP,LEFT,DOWN,RGHT,TRNS,TRNS,     TRNS,    P4,  P5,  P6,  PPLS, +    TRNS,TRNS,TRNS,TRNS,TRNS,SPC, PGDN,GRV, FN1, TRNS,APP,           PGUP,    P1,  P2,  P3,  PENT, +    TRNS,TRNS,               TRNS,               TRNS,INS, HOME,END, PGDN,    P0,       PDOT +    ), +}; + +/* + * Fn action definition + */ +const uint16_t fn_actions[] PROGMEM = { +    [0] = ACTION_LAYER_TAP_KEY(1, KC_SPACE), +    [1] = ACTION_MODS_KEY(MOD_LSFT, KC_GRV),    // tilde +}; diff --git a/converter/pc98_usb/README b/converter/pc98_usb/README index a010dee2e..c9bdf3d84 100644 --- a/converter/pc98_usb/README +++ b/converter/pc98_usb/README @@ -20,7 +20,7 @@ Wiring: You can change this with editing config.h.      Pin mini DIN        MCU      ---------------------------------- -    1  ~RST             PD1 +    1  ~RST(TXD)        PD3      2   GND             GND      3  ~RDY             PD4      4   RXD             PD2 @@ -37,9 +37,6 @@ Protocol  Signal: Asynchronous, Positive logic, 19200baud, Least bit first  Frame format: 1-Start bit(Lo), 8-Data bits, Odd-Parity, 1-Stop bit -This converter uses software method for testing purpose. AVR UART engine will work better. - -  Build Firmware diff --git a/converter/ps2_usb/Makefile b/converter/ps2_usb/Makefile index db0912ebd..1dd23c157 100644 --- a/converter/ps2_usb/Makefile +++ b/converter/ps2_usb/Makefile @@ -1,3 +1,6 @@ +#  +# Makefile for Teensy +#  # Target file name (without extension).  TARGET = ps2_usb_lufa @@ -59,7 +62,7 @@ ARCH = AVR8  F_USB = $(F_CPU)  # Interrupt driven control endpoint task(+60) -OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT +#OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT  # Boot Section Size in *bytes* @@ -68,7 +71,7 @@ OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT  #   Atmel DFU loader 4096  #   LUFA bootloader  4096  #   USBaspLoader     2048 -OPT_DEFS += -DBOOTLOADER_SIZE=4096 +OPT_DEFS += -DBOOTLOADER_SIZE=512  # Build Options diff --git a/converter/ps2_usb/Makefile.jis b/converter/ps2_usb/Makefile.jis deleted file mode 100644 index 4e091e8e2..000000000 --- a/converter/ps2_usb/Makefile.jis +++ /dev/null @@ -1,75 +0,0 @@ -# Target file name (without extension). -TARGET = ps2_usb_jis - -# Directory common source filess exist -TOP_DIR = ../.. - -# Directory keyboard dependent files exist -TARGET_DIR = . - - -# 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 = yes	# Mouse keys -EXTRAKEY_ENABLE = yes	# Audio control and System control -NKRO_ENABLE = yes	# USB Nkey Rollover - -#PS2_USE_USART = yes	# uses hardware USART engine for PS/2 signal receive(recomened) -#PS2_USE_INT = yes	# uses external interrupt for falling edge of PS/2 clock pin -PS2_USE_BUSYWAIT = yes	# uses primitive reference code - - -# keyboard dependent files -SRC =   keymap_jis.c \ -	matrix.c \ -	led.c - - -ifdef PS2_USE_USART -    SRC += protocol/ps2_usart.c -    OPT_DEFS += -DPS2_USE_USART -endif -ifdef PS2_USE_INT -    SRC += protocol/ps2.c -    OPT_DEFS += -DPS2_USE_INT -endif -ifdef PS2_USE_BUSYWAIT -    SRC += protocol/ps2.c -    OPT_DEFS += -DPS2_USE_BUSYWAIT -endif - - -#CONFIG_H = config_pjrc_usart.h -CONFIG_H = config.h - - -#---------------- 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)/protocol.mk -include $(TOP_DIR)/common.mk -include $(TOP_DIR)/rules.mk diff --git a/converter/ps2_usb/Makefile.tmk_rev1 b/converter/ps2_usb/Makefile.tmk_rev1 new file mode 100644 index 000000000..59c44f75f --- /dev/null +++ b/converter/ps2_usb/Makefile.tmk_rev1 @@ -0,0 +1,98 @@ +#  +# Makefile for TMK keyboard converter rev2 +#     https://github.com/tmk/keyboard_converter#pcb-rev1 +# +# Target file name (without extension). +TARGET = ps2_usb_tmk_rev1 + +# Directory common source filess exist +TOP_DIR = ../.. + +# Directory keyboard dependent files exist +TARGET_DIR = . + +# project specific files +SRC =	keymap_common.c \ +	matrix.c \ +	led.c + +ifdef KEYMAP +    SRC := keymap_$(KEYMAP).c $(SRC) +else +    SRC := keymap_plain.c $(SRC) +endif + +CONFIG_H = config_tmk_rev1.h + + +# MCU name +MCU = atmega32u4 + +# Processor frequency. +#     This will define a symbol, F_CPU, in all source code files equal to the +#     processor frequency in Hz. You can then use this symbol in your source code to +#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done +#     automatically to create a 32-bit value in your source code. +# +#     This will be an integer division of F_USB below, as it is sourced by +#     F_USB after it has run through any CPU prescalers. Note that this value +#     does not *change* the processor frequency - it should merely be updated to +#     reflect the processor speed set externally so that the code can use accurate +#     software delays. +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) + + +# Boot Section Size in *bytes* +#   Teensy halfKay   512 +#   Teensy++ halfKay 1024 +#   Atmel DFU loader 4096 +#   LUFA bootloader  4096 +#   USBaspLoader     2048 +OPT_DEFS += -DBOOTLOADER_SIZE=4096 + + +# Build Options +#   comment out to disable the options. +# +#BOOTMAGIC_ENABLE = yes	# Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes	# Mouse keys(+4700) +EXTRAKEY_ENABLE = yes	# Audio control and System control(+450) +CONSOLE_ENABLE = yes	# Console for debug(+400) +COMMAND_ENABLE = yes    # Commands for debug and configuration +#NKRO_ENABLE = yes	# USB Nkey Rollover - not yet supported in LUFA + + +# PS/2 Options +# +PS2_USE_USART = yes	# uses hardware USART engine for PS/2 signal receive(recomened) +#PS2_USE_BUSYWAIT = yes	# uses primitive reference code + + +# Search Path +VPATH += $(TARGET_DIR) +VPATH += $(TOP_DIR) + +include $(TOP_DIR)/protocol.mk +include $(TOP_DIR)/protocol/lufa.mk +include $(TOP_DIR)/common.mk +include $(TOP_DIR)/rules.mk diff --git a/converter/ps2_usb/Makefile.tmk_rev2 b/converter/ps2_usb/Makefile.tmk_rev2 new file mode 100644 index 000000000..bad958c36 --- /dev/null +++ b/converter/ps2_usb/Makefile.tmk_rev2 @@ -0,0 +1,98 @@ +#  +# Makefile for TMK keyboard converter rev2 +#     https://github.com/tmk/keyboard_converter#pcb-rev2 +# +# Target file name (without extension). +TARGET = ps2_usb_tmk_rev2 + +# Directory common source filess exist +TOP_DIR = ../.. + +# Directory keyboard dependent files exist +TARGET_DIR = . + +# project specific files +SRC =	keymap_common.c \ +	matrix.c \ +	led.c + +ifdef KEYMAP +    SRC := keymap_$(KEYMAP).c $(SRC) +else +    SRC := keymap_plain.c $(SRC) +endif + +CONFIG_H = config_tmk_rev2.h + + +# MCU name +MCU = atmega32u2 + +# Processor frequency. +#     This will define a symbol, F_CPU, in all source code files equal to the +#     processor frequency in Hz. You can then use this symbol in your source code to +#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done +#     automatically to create a 32-bit value in your source code. +# +#     This will be an integer division of F_USB below, as it is sourced by +#     F_USB after it has run through any CPU prescalers. Note that this value +#     does not *change* the processor frequency - it should merely be updated to +#     reflect the processor speed set externally so that the code can use accurate +#     software delays. +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) + + +# Boot Section Size in *bytes* +#   Teensy halfKay   512 +#   Teensy++ halfKay 1024 +#   Atmel DFU loader 4096 +#   LUFA bootloader  4096 +#   USBaspLoader     2048 +OPT_DEFS += -DBOOTLOADER_SIZE=4096 + + +# Build Options +#   comment out to disable the options. +# +#BOOTMAGIC_ENABLE = yes	# Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes	# Mouse keys(+4700) +EXTRAKEY_ENABLE = yes	# Audio control and System control(+450) +CONSOLE_ENABLE = yes	# Console for debug(+400) +COMMAND_ENABLE = yes    # Commands for debug and configuration +#NKRO_ENABLE = yes	# USB Nkey Rollover - not yet supported in LUFA + + +# PS/2 Options +# +PS2_USE_INT = yes	# uses external interrupt for falling edge of PS/2 clock pin +#PS2_USE_BUSYWAIT = yes	# uses primitive reference code + + +# Search Path +VPATH += $(TARGET_DIR) +VPATH += $(TOP_DIR) + +include $(TOP_DIR)/protocol.mk +include $(TOP_DIR)/protocol/lufa.mk +include $(TOP_DIR)/common.mk +include $(TOP_DIR)/rules.mk diff --git a/converter/ps2_usb/README.md b/converter/ps2_usb/README.md index 8f06fdd00..586394b23 100644 --- a/converter/ps2_usb/README.md +++ b/converter/ps2_usb/README.md @@ -1,50 +1,59 @@  PS/2 to USB keyboard converter  ============================== -This firmware converts PS/2 keyboard protocol to USB and supports only Scan Code Set 2. - - -PS/2 signal handling implementations ------------------------------------- -Following three methods are used to implement PS/2 signal handling. - -### Simple and stupid busy-wait(ps2_busywait.c) -    This is expected to implemented with portable C code for reference. -### Interrupt driven(ps2_interrupt.c) -    Uses pin interrupt to detect falling edge of clock line. -### USART hardware module(ps2_usart.c) -    Uses AVR USART engine to receive PS/2 signal. - -To select method edit Makefile. +This firmware converts PS/2 keyboard protocol to USB.(It supports Scan Code Set 2.)  Connect Wires  -------------  In case of Teensy2.0(ATMega32U4): -1. Connect Vcc and GND. -2. Connect Clock and Data line.  -    - Busywait:    Clock is on PD5 and Data on PD2. -    - Interrupt:   Clock is on PD1 and Data on PD2. -    - USART:       Clock is on PD5 and Data on PD2. -3. Optionally you need pull-up register. 1K-10K Ohm is OK. +1. Connect **Vcc** and **GND**. +2. Connect **Clock** and **Data** line.  +    - **Interrupt**:   **Clock** is on `PD1` and **Data** on `PD0`.(Recommended. Soarer's converter compatible) +    - **Busywait**:    **Clock** is on `PD1` and **Data** on `PD0`. +    - **USART**:       **Clock** is on `PD5` and **Data** on `PD2`. +3. Optionally you need pull-up resistor. 1K-10K Ohm is OK.  To change pin configuration edit config.h.  Build Firmware  -------------- -Just run `make`: +For **PJRC Teensy** just run `make`: +    $ make clean      $ make  To select keymap: +    $ make clean      $ make KEYMAP=[plain|jis|spacefn|...] +After that you will find HEX file `ps2_usb_lufa.hex` in current directory. + + +- For **TMK converter Rev.1** use `make -f Makefile.tmk_rev1` instead of `make` and HEX file is `ps2_usb_tmk_rev1.hex`. + +- For **TMK converter Rev.2** use `make -f Makefile.tmk_rev2` instead of `make` and HEX file is `ps2_usb_tmk_rev2.hex`. +  Keymap  ------ -Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create file named `keymap_<name>.c` and see keymap document(you can find in top README.md) and existent keymap files. +Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create file named `keymap_<name>.c` and see keymap document(you can find in README.md of top directory) and existent keymap files. + + +PS/2 signal handling implementations +------------------------------------ +Following three methods can be used to implement PS/2 signal handling. + +### Simple and stupid busy-wait(ps2_busywait.c) +    This is expected to implemented with portable C code for reference. +### Interrupt driven(ps2_interrupt.c) +    Uses pin interrupt to detect falling edge of clock line. +### USART hardware module(ps2_usart.c) +    Uses AVR USART engine to receive PS/2 signal. + +To select method edit Makefile.  V-USB Support diff --git a/converter/ps2_usb/config_tmk_rev1.h b/converter/ps2_usb/config_tmk_rev1.h new file mode 100644 index 000000000..75dc97df3 --- /dev/null +++ b/converter/ps2_usb/config_tmk_rev1.h @@ -0,0 +1,147 @@ +/* +Copyright 2012 Jun Wako <wakojun@gmail.com> + +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 <http://www.gnu.org/licenses/>. +*/ + +#ifndef CONFIG_H +#define CONFIG_H + +#include <avr/interrupt.h> + +#define VENDOR_ID       0xFEED +#define PRODUCT_ID      0x6512 +#define DEVICE_VER      0x0001 +#define MANUFACTURER    t.m.k. +#define PRODUCT         PS/2 keyboard converter +#define DESCRIPTION     convert PS/2 keyboard to USB + + +/* matrix size */ +#define MATRIX_ROWS 32  // keycode bit: 3-0 +#define MATRIX_COLS 8   // keycode bit: 6-4 + + +/* key combination for command */ +#define IS_COMMAND() ( \ +    keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) || \ +    keyboard_report->mods == (MOD_BIT(KC_LCTRL) | MOD_BIT(KC_RSHIFT)) \ +) + + +//#define NO_SUSPEND_POWER_DOWN + + +/* + * PS/2 Busywait + */ +#ifdef PS2_USE_BUSYWAIT +#define PS2_CLOCK_PORT  PORTD +#define PS2_CLOCK_PIN   PIND +#define PS2_CLOCK_DDR   DDRD +#define PS2_CLOCK_BIT   5 +#define PS2_DATA_PORT   PORTD +#define PS2_DATA_PIN    PIND +#define PS2_DATA_DDR    DDRD +#define PS2_DATA_BIT    2 +#endif + +/* + * PS/2 USART + */ +#ifdef PS2_USE_USART +#if defined(__AVR_ATmega16U4__) || defined(__AVR_ATmega32U4__) +/* XCK for clock line and RXD for data line */ +#define PS2_CLOCK_PORT  PORTD +#define PS2_CLOCK_PIN   PIND +#define PS2_CLOCK_DDR   DDRD +#define PS2_CLOCK_BIT   5 +#define PS2_DATA_PORT   PORTD +#define PS2_DATA_PIN    PIND +#define PS2_DATA_DDR    DDRD +#define PS2_DATA_BIT    2 +/* synchronous, odd parity, 1-bit stop, 8-bit data, sample at falling edge */ +/* set DDR of CLOCK as input to be slave */ +#define PS2_USART_INIT() do {   \ +    PS2_CLOCK_DDR &= ~(1<<PS2_CLOCK_BIT);   \ +    PS2_DATA_DDR &= ~(1<<PS2_DATA_BIT);     \ +    UCSR1C = ((1 << UMSEL10) |  \ +              (3 << UPM10)   |  \ +              (0 << USBS1)   |  \ +              (3 << UCSZ10)  |  \ +              (0 << UCPOL1));   \ +    UCSR1A = 0;                 \ +    UBRR1H = 0;                 \ +    UBRR1L = 0;                 \ +} while (0) +#define PS2_USART_RX_INT_ON() do {  \ +    UCSR1B = ((1 << RXCIE1) |       \ +              (1 << RXEN1));        \ +} while (0) +#define PS2_USART_RX_POLL_ON() do { \ +    UCSR1B = (1 << RXEN1);          \ +} while (0) +#define PS2_USART_OFF() do {    \ +    UCSR1C = 0;                 \ +    UCSR1B &= ~((1 << RXEN1) |  \ +                (1 << TXEN1));  \ +} while (0) +#define PS2_USART_RX_READY      (UCSR1A & (1<<RXC1)) +#define PS2_USART_RX_DATA       UDR1 +#define PS2_USART_ERROR         (UCSR1A & ((1<<FE1) | (1<<DOR1) | (1<<UPE1))) +#define PS2_USART_RX_VECT       USART1_RX_vect +#elif defined(__AVR_ATmega168__) || defined(__AVR_ATmega168P__) || defined(__AVR_ATmega328P__) +/* XCK for clock line and RXD for data line */ +#define PS2_CLOCK_PORT  PORTD +#define PS2_CLOCK_PIN   PIND +#define PS2_CLOCK_DDR   DDRD +#define PS2_CLOCK_BIT   4 +#define PS2_DATA_PORT   PORTD +#define PS2_DATA_PIN    PIND +#define PS2_DATA_DDR    DDRD +#define PS2_DATA_BIT    0 +/* synchronous, odd parity, 1-bit stop, 8-bit data, sample at falling edge */ +/* set DDR of CLOCK as input to be slave */ +#define PS2_USART_INIT() do {   \ +    PS2_CLOCK_DDR &= ~(1<<PS2_CLOCK_BIT);   \ +    PS2_DATA_DDR &= ~(1<<PS2_DATA_BIT);     \ +    UCSR0C = ((1 << UMSEL00) |  \ +              (3 << UPM00)   |  \ +              (0 << USBS0)   |  \ +              (3 << UCSZ00)  |  \ +              (0 << UCPOL0));   \ +    UCSR0A = 0;                 \ +    UBRR0H = 0;                 \ +    UBRR0L = 0;                 \ +} while (0) +#define PS2_USART_RX_INT_ON() do {  \ +    UCSR0B = ((1 << RXCIE0) |       \ +              (1 << RXEN0));        \ +} while (0) +#define PS2_USART_RX_POLL_ON() do { \ +    UCSR0B = (1 << RXEN0);          \ +} while (0) +#define PS2_USART_OFF() do {    \ +    UCSR0C = 0;                 \ +    UCSR0B &= ~((1 << RXEN0) |  \ +                (1 << TXEN0));  \ +} while (0) +#define PS2_USART_RX_READY      (UCSR0A & (1<<RXC0)) +#define PS2_USART_RX_DATA       UDR0 +#define PS2_USART_ERROR         (UCSR0A & ((1<<FE0) | (1<<DOR0) | (1<<UPE0))) +#define PS2_USART_RX_VECT       USART_RX_vect +#endif +#endif + +#endif diff --git a/converter/ps2_usb/config_tmk_rev2.h b/converter/ps2_usb/config_tmk_rev2.h new file mode 100644 index 000000000..2e91838e2 --- /dev/null +++ b/converter/ps2_usb/config_tmk_rev2.h @@ -0,0 +1,85 @@ +/* +Copyright 2012 Jun Wako <wakojun@gmail.com> + +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 <http://www.gnu.org/licenses/>. +*/ + +#ifndef CONFIG_H +#define CONFIG_H + +#include <avr/interrupt.h> + +#define VENDOR_ID       0xFEED +#define PRODUCT_ID      0x6512 +#define DEVICE_VER      0x0001 +#define MANUFACTURER    t.m.k. +#define PRODUCT         PS/2 keyboard converter +#define DESCRIPTION     convert PS/2 keyboard to USB + + +/* matrix size */ +#define MATRIX_ROWS 32  // keycode bit: 3-0 +#define MATRIX_COLS 8   // keycode bit: 6-4 + + +/* key combination for command */ +#define IS_COMMAND() ( \ +    keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + + +//#define NO_SUSPEND_POWER_DOWN + + +/* + * PS/2 Busywait + */ +#ifdef PS2_USE_BUSYWAIT +#define PS2_CLOCK_PORT  PORTD +#define PS2_CLOCK_PIN   PIND +#define PS2_CLOCK_DDR   DDRD +#define PS2_CLOCK_BIT   1 +#define PS2_DATA_PORT   PORTD +#define PS2_DATA_PIN    PIND +#define PS2_DATA_DDR    DDRD +#define PS2_DATA_BIT    0 +#endif + +/* + * PS/2 Pin interrupt + */ +#ifdef PS2_USE_INT +/* uses INT1 for clock line(ATMega32U4) */ +#define PS2_CLOCK_PORT  PORTD +#define PS2_CLOCK_PIN   PIND +#define PS2_CLOCK_DDR   DDRD +#define PS2_CLOCK_BIT   1 +#define PS2_DATA_PORT   PORTD +#define PS2_DATA_PIN    PIND +#define PS2_DATA_DDR    DDRD +#define PS2_DATA_BIT    0 +#define PS2_INT_INIT()  do {    \ +    EICRA |= ((1<<ISC11) |      \ +              (0<<ISC10));      \ +} while (0) +#define PS2_INT_ON()  do {      \ +    EIMSK |= (1<<INT1);         \ +} while (0) +#define PS2_INT_OFF() do {      \ +    EIMSK &= ~(1<<INT1);        \ +} while (0) +#define PS2_INT_VECT    INT1_vect +#endif + +#endif diff --git a/converter/ps2_usb/keymap_spacefn.c b/converter/ps2_usb/keymap_spacefn.c index 7f537bfeb..bffd2bc60 100644 --- a/converter/ps2_usb/keymap_spacefn.c +++ b/converter/ps2_usb/keymap_spacefn.c @@ -35,11 +35,11 @@ const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {       * ,-----------------------------------------------------------.       * |`  | F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Delete |       * |-----------------------------------------------------------| -     * |     |   |   |   |   |   |   |Hom|Up |End|Psc|Slk|Pau|Ins  | +     * |     |   |   |Esc|   |   |   |Hom|Up |End|Psc|Slk|Pau|Ins  |       * |-----------------------------------------------------------|       * |      |   |   |   |   |   |PgU|Lef|Dow|Rig|   |   |        |       * |-----------------------------------------------------------| -     * |        |   |   |   |   |Spc|PgD|`  |~  |   |   |          | +     * |        |   |   |   |   |Spc|PgD|`  |~  |   |Men|          |       * |-----------------------------------------------------------|       * |    |    |    |                        |    |    |    |    |       * `-----------------------------------------------------------' @@ -49,7 +49,7 @@ const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {      GRV, F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F9,  F10, F11, F12, DEL,      INS, HOME,PGUP,    NLCK,PSLS,PAST,PMNS,      TRNS,TRNS,TRNS,ESC, TRNS,TRNS,TRNS,HOME,UP,  END, PSCR,SLCK,PAUS,INS,      DEL, END, PGDN,    P7,  P8,  P9,      TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,PGUP,LEFT,DOWN,RGHT,TRNS,TRNS,     TRNS,                        P4,  P5,  P6,  PPLS, -    TRNS,TRNS,TRNS,TRNS,TRNS,SPC, PGDN,GRV, FN1, TRNS,TRNS,          TRNS,          UP,           P1,  P2,  P3, +    TRNS,TRNS,TRNS,TRNS,TRNS,SPC, PGDN,GRV, FN1, TRNS,APP,           TRNS,          UP,           P1,  P2,  P3,      TRNS,TRNS,TRNS,          TRNS,                    TRNS,TRNS,TRNS,TRNS,     LEFT,DOWN,RGHT,    P0,       PDOT,PENT      ),  }; diff --git a/converter/sun_usb/Makefile b/converter/sun_usb/Makefile index 73a83e93f..35c4bb123 100644 --- a/converter/sun_usb/Makefile +++ b/converter/sun_usb/Makefile @@ -20,9 +20,10 @@ 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 = atmega32u4       # Teensy 2.0  #MCU = at90usb646       # Teensy++ 1.0  #MCU = at90usb1286      # Teensy++ 2.0 +MCU = atmega32u2  # Processor frequency. diff --git a/converter/sun_usb/matrix.c b/converter/sun_usb/matrix.c index a61e3a2d3..988622bc3 100644 --- a/converter/sun_usb/matrix.c +++ b/converter/sun_usb/matrix.c @@ -63,6 +63,8 @@ uint8_t matrix_cols(void)  void matrix_init(void)  { +    DDRD |= (1<<6); +    PORTD |= (1<<6);      debug_enable = true;      serial_init(); diff --git a/keyboard/hhkb/Makefile b/keyboard/hhkb/Makefile index 89d05ba15..030283d7a 100644 --- a/keyboard/hhkb/Makefile +++ b/keyboard/hhkb/Makefile @@ -56,7 +56,7 @@ SRC +=	keymap_common.c \  ifdef KEYMAP      SRC := keymap_$(KEYMAP).c $(SRC)  else -    SRC := keymap_hasu.c $(SRC) +    SRC := keymap_hhkb.c $(SRC)  endif  CONFIG_H = config.h @@ -102,7 +102,7 @@ ARCH = AVR8  F_USB = $(F_CPU)  # Interrupt driven control endpoint task -OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT +#OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT  # Boot Section Size in *bytes* diff --git a/keyboard/hhkb/Makefile.nodebug b/keyboard/hhkb/Makefile.nodebug index f63083f6a..578ba70c4 100644 --- a/keyboard/hhkb/Makefile.nodebug +++ b/keyboard/hhkb/Makefile.nodebug @@ -102,7 +102,7 @@ ARCH = AVR8  F_USB = $(F_CPU)  # Interrupt driven control endpoint task -OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT +#OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT  # Boot Section Size in *bytes* @@ -122,8 +122,8 @@ MOUSEKEY_ENABLE = yes		# Mouse keys  EXTRAKEY_ENABLE = yes		# Audio control and System control  #CONSOLE_ENABLE = yes		# Console for debug  COMMAND_ENABLE = yes    	# Commands for debug and configuration -#NKRO_ENABLE = yes		# USB Nkey Rollover -#KEYMAP_SECTION_ENABLE = yes	# fixed address keymap for keymap editor +NKRO_ENABLE = yes		# USB Nkey Rollover +KEYMAP_SECTION_ENABLE = yes	# fixed address keymap for keymap editor  # Search Path diff --git a/keyboard/hhkb/keymap_hasu.c b/keyboard/hhkb/keymap_hasu.c index 0297d3b74..e3d951bea 100644 --- a/keyboard/hhkb/keymap_hasu.c +++ b/keyboard/hhkb/keymap_hasu.c @@ -15,20 +15,21 @@ const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = {       * |-----------------------------------------------------------|       * |Tab  |  Q|  W|  E|  R|  T|  Y|  U|  I|  O|  P|  [|  ]|Backs|       * |-----------------------------------------------------------| -     * |Contro|  A|  S|  D|  F|  G|  H|  J|  K|  L|Fn3|  '|Fn4     | +     * |Contro|  A|  S|  D|  F|  G|  H|  J|  K|  L|Fn3|  '|Fn6     |       * |-----------------------------------------------------------| -     * |Fn5     |  Z|  X|  C|  V|  B|  N|  M|  ,|  .|Fn2|Shift |Fn1| +     * |Fn7     |  Z|  X|  C|  V|  B|  N|  M|  ,|  .|Fn2|Shift |Fn1|       * `-----------------------------------------------------------' -     *       |Gui|Alt  |         Fn6           |Alt  |Fn7| +     *       |Gui|Alt  |         Fn4           |Fn5  |Gui|       *       `-------------------------------------------'       */ +    [0] = \      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,FN4, \ -           FN5, Z,   X,   C,   V,   B,   N,   M,   COMM,DOT, FN2, RSFT,FN1, \ -                LGUI,LALT,          FN6,                RALT,RGUI), +           LCTL,A,   S,   D,   F,   G,   H,   J,   K,   L,   FN3, QUOT,FN6, \ +           FN7, Z,   X,   C,   V,   B,   N,   M,   COMM,DOT, FN2, RSFT,FN1, \ +                LGUI,LALT,          FN4,                FN5, RGUI), -    /* Layer 1: HHKB mode (HHKB Fn) +    /* Layer 1: HHKB mode[HHKB Fn]       * ,-----------------------------------------------------------.       * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del|       * |-----------------------------------------------------------| @@ -41,13 +42,14 @@ const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = {       *       |Gui|Alt  |         Space         |Alt  |Gui|       *       `-------------------------------------------'       */  +    [1] = \      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,  FN9, PAST,PSLS,HOME,PGUP,LEFT,RGHT,ENT, \ +           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, \                  LGUI,LALT,          SPC,                RALT,RGUI), -    /* Layer 2: Vi mode (Slash) +    /* Layer 2: Vi mode[Slash]       * ,-----------------------------------------------------------.       * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del|       * |-----------------------------------------------------------| @@ -60,13 +62,57 @@ const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = {       *       |Gui|Alt  |          Space        |Alt  |Gui|       *       `-------------------------------------------'       */ +    [2] = \      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, \                  LGUI,LALT,          SPC,                RALT,RGUI), -    /* Layer 3: Mouse mode (Semicolon) +    /* Layer 3: Mouse mode(IJKL)[Semicolon] +     * ,-----------------------------------------------------------. +     * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del| +     * |-----------------------------------------------------------| +     * |Tab  |   |   |   |   |   |MwL|MwD|McU|MwU|MwR|Wbk|Wfr|Alt-T| +     * |-----------------------------------------------------------| +     * |Contro|   |   |   |   |   |Mb2|McL|McD|McR|Fn |   |Return  | +     * |-----------------------------------------------------------| +     * |Shift   |   |   |   |   |Mb3|Mb2|Mb1|Mb4|Mb5|   |Shift |   | +     * `-----------------------------------------------------------' +     *      |Gui |Alt  |          Mb1          |Fn   |Fn | +     *      `--------------------------------------------' +     * Mc: Mouse Cursor / Mb: Mouse Button / Mw: Mouse Wheel8 +     */ +    [3] = \ +    KEYMAP(GRV, F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F9,  F10, F11, F12, INS, DEL, \ +           FN8, NO,  NO,  NO,  NO,  NO,  WH_L,WH_D,MS_U,WH_U,WH_R,WBAK,WFWD,FN8, \ +           LCTL,ACL0,ACL1,ACL2,ACL2,NO,  NO,  MS_L,MS_D,MS_R,TRNS,NO,  ENT, \ +           LSFT,NO,  NO,  NO,  NO,  BTN3,BTN2,BTN1,BTN4,BTN5,NO,  RSFT,NO, \ +                LGUI,LALT,          BTN1,               TRNS,TRNS), + +    /* Layer 5: Mouse mode(IJKL)[Space] +     * ,-----------------------------------------------------------. +     * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del| +     * |-----------------------------------------------------------| +     * |Tab  |   |   |   |   |   |MwL|MwD|McU|MwU|MwR|Wbk|Wfr|Alt-T| +     * |-----------------------------------------------------------| +     * |Contro|   |   |   |   |   |Mb2|McL|McD|McR|Mb1|   |Return  | +     * |-----------------------------------------------------------| +     * |Shift   |   |   |   |   |Mb3|Mb2|Mb1|Mb4|Mb5|   |Shift |   | +     * `-----------------------------------------------------------' +     *      |Gui |Alt  |          Mb1          |Fn   |Fn | +     *      `--------------------------------------------' +     * Mc: Mouse Cursor / Mb: Mouse Button / Mw: Mouse Wheel8 +     */ +    [4] = \ +    KEYMAP(GRV, F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F9,  F10, F11, F12, INS, DEL, \ +           FN8, NO,  NO,  NO,  NO,  NO,  WH_L,WH_D,MS_U,WH_U,WH_R,WBAK,WFWD,FN8, \ +           LCTL,VOLD,VOLU,MUTE,NO,  NO,  NO,  MS_L,MS_D,MS_R,BTN1,NO,  ENT, \ +           LSFT,NO,  NO,  NO,  NO,  BTN3,BTN2,BTN1,BTN4,BTN5,NO,  RSFT,NO, \ +                LGUI,LALT,          TRNS,               TRNS,TRNS), + +#if 0 +    /* Layer 3: Mouse mode(HJKL)[Semicolon]       * ,-----------------------------------------------------------.       * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del|       * |-----------------------------------------------------------| @@ -86,7 +132,28 @@ const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = {             LSFT,NO,  NO,  NO,  NO,  BTN3,BTN2,BTN1,BTN4,BTN5,SLSH,RSFT,NO, \                  LGUI,LALT,          BTN1,               RALT,TRNS), -    /* Layer 4: Matias half-qwerty keyboard style (Space) +    /* Layer4: Mouse mode(HJKL)[Space] +     * ,-----------------------------------------------------------. +     * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del| +     * |-----------------------------------------------------------| +     * |Tab  |   |   |   |   |   |MwL|MwD|MwU|MwR|   |Wbk|Wfr|Alt-T| +     * |-----------------------------------------------------------| +     * |Contro|   |   |   |   |   |McL|McD|McU|McR|Fn0|   |Return  | +     * |-----------------------------------------------------------| +     * |Shift   |   |   |   |   |Mb3|Mb2|Mb1|Mb4|Mb5|   |Shift |   | +     * `-----------------------------------------------------------' +     *      |Gui |Alt  |          Fn0          |Alt  |Fn0| +     *      `--------------------------------------------' +     * Mc: Mouse Cursor / Mb: Mouse Button / Mw: Mouse Wheel  +     */ +    KEYMAP(GRV, F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F9,  F10, F11, F12, INS, DEL, \ +           FN8, NO,  NO,  NO,  NO,  NO,  WH_L,WH_D,WH_U,WH_R,NO,  WBAK,WFWD,FN8, \ +           LCTL,NO,  ACL0,ACL1,ACL2,NO,  MS_L,MS_D,MS_U,MS_R,BTN1,NO,  ENT, \ +           LSFT,NO,  NO,  NO,  NO,  BTN3,BTN2,BTN1,BTN4,BTN5,NO,  RSFT,NO, \ +                LGUI,LALT,          TRNS,               RALT,RGUI), +#endif +#if 0 +    /* Layer x: Matias half-qwerty keyboard style[Space]       * ,-----------------------------------------------------------.       * |  -|  0|  9|  8|  7|  6|  5|  4|  3|  2|  1|   |   |   |Esc|       * |-----------------------------------------------------------| @@ -104,26 +171,7 @@ const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = {             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,          TRNS,               RALT,RGUI), - -    /* Layer5: another Mouse mode (Space) -     * ,-----------------------------------------------------------. -     * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del| -     * |-----------------------------------------------------------| -     * |Tab  |   |   |   |   |   |MwL|MwD|MwU|MwR|   |Wbk|Wfr|Close| -     * |-----------------------------------------------------------| -     * |Contro|   |   |   |   |   |McL|McD|McU|McR|Fn0|   |Return  | -     * |-----------------------------------------------------------| -     * |Shift   |   |   |   |   |Mb3|Mb2|Mb1|Mb4|Mb5|   |Shift |   | -     * `-----------------------------------------------------------' -     *      |Gui |Alt  |          Fn0          |Alt  |Fn0| -     *      `--------------------------------------------' -     * 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, \ -           TAB, NO,  NO,  NO,  NO,  NO,  WH_L,WH_D,WH_U,WH_R,WSTP,WBAK,WFWD,FN8, \ -           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,          TRNS,               RALT,RGUI), +#endif  }; @@ -131,14 +179,12 @@ const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = {  /* id for user defined functions */  enum function_id {      LSHIFT_LPAREN, -    RSHIFT_RPAREN,  };  enum macro_id { -    LSHIFT_PAREN, -    RSHIFT_PAREN,      HELLO,      VOLUP, +    ALT_TAB,  }; @@ -154,21 +200,17 @@ const uint16_t fn_actions[] PROGMEM = {      [1] = ACTION_LAYER_TAP_TOGGLE(1),                 // HHKB layer(toggle with 5 taps)      [2] = ACTION_LAYER_TAP_KEY(2, KC_SLASH),          // Cursor layer with Slash*      [3] = ACTION_LAYER_TAP_KEY(3, KC_SCLN),           // Mousekey layer with Semicolon* -    [4] = ACTION_MODS_TAP_KEY(MOD_RCTL, KC_ENT),      // RControl with tap Enter* -    [5] = ACTION_MODS_ONESHOT(MOD_LSFT),              // Oneshot Shift* -    [6] = ACTION_LAYER_TAP_KEY(5, KC_SPC),            // Mousekey layer with Space -    [7] = ACTION_LAYER_TOGGLE(3),                     // Mousekey layer(toggle) -    [8] = ACTION_MODS_KEY(MOD_LCTL, KC_W),            // Close Tab -    [9] = ACTION_MODS_KEY(MOD_LSFT, KC_4),            // Shift stuck test +    [4] = ACTION_LAYER_TAP_KEY(4, KC_SPC),            // Mousekey layer with Space +    [5] = ACTION_LAYER_MOMENTARY(4),                  // Mousekey layer(IJKL) +    [6] = ACTION_MODS_TAP_KEY(MOD_RCTL, KC_ENT),      // RControl with tap Enter +    [7] = ACTION_MODS_ONESHOT(MOD_LSFT),              // Oneshot Shift +    [8] = ACTION_MACRO(ALT_TAB),                      // Application switching -//  [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 -//  [9] = ACTION_MACRO(VOLUP),                         // Macro: media key +//  [x] = ACTION_LMOD_TAP_KEY(KC_LCTL, KC_BSPC),        // LControl with tap Backspace +//  [x] = ACTION_LMOD_TAP_KEY(KC_LCTL, KC_ESC),         // LControl with tap Esc +//  [x] = ACTION_FUNCTION_TAP(LSHIFT_LPAREN),           // Function: LShift with tap '(' +//  [x] = ACTION_MACRO(HELLO),                          // Macro: say hello +//  [x] = ACTION_MACRO(VOLUP),                          // Macro: media key  }; @@ -177,34 +219,19 @@ const uint16_t fn_actions[] PROGMEM = {   */  const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)  { -    keyevent_t event = record->event; -    tap_t tap = record->tap; -      switch (id) { -        case LSHIFT_PAREN: -            if (tap.count > 0 && !tap.interrupted) { -                return (event.pressed ? -                        MACRO( D(LSHIFT), D(9), U(9), U(LSHIFT), END ) : MACRO_NONE); -            } else { -                return (event.pressed ? -                        MACRO( D(LSHIFT), END ) : MACRO( U(LSHIFT), END ) ); -            } -        case RSHIFT_PAREN: -            if (tap.count > 0 && !tap.interrupted) { -                return (event.pressed ? -                        MACRO( D(RSHIFT), D(0), U(0), U(RSHIFT), END ) : MACRO_NONE); -            } else { -                return (event.pressed ? -                        MACRO( D(RSHIFT), END ) : MACRO( U(RSHIFT), END ) ); -            }          case HELLO: -            return (event.pressed ? +            return (record->event.pressed ?                      MACRO( I(0), T(H), T(E), T(L), T(L), W(255), T(O), END ) :                      MACRO_NONE );          case VOLUP: -            return (event.pressed ? +            return (record->event.pressed ?                      MACRO( D(VOLU), U(VOLU), END ) :                      MACRO_NONE ); +        case ALT_TAB: +            return (record->event.pressed ? +                    MACRO( D(LALT), D(TAB), END ) : +                    MACRO( U(TAB), END ));      }      return MACRO_NONE;  } @@ -216,48 +243,36 @@ const macro_t *action_get_macro(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; -    tap_t tap = record->tap; +    if (record->event.pressed) dprint("P"); else dprint("R"); +    dprintf("%d", record->tap.count); +    if (record->tap.interrupted) dprint("i"); +    dprint("\n");      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 || tap.interrupted) { -                    //add_mods(MOD_BIT(KC_LSHIFT)); -                    layer_on(1); +            // Shift parentheses example: LShft + tap '(' +            // http://stevelosh.com/blog/2012/10/a-modern-space-cadet/#shift-parentheses +            // http://geekhack.org/index.php?topic=41989.msg1304899#msg1304899 +            if (record->event.pressed) { +                if (record->tap.count > 0 && !record->tap.interrupted) { +                    if (record->tap.interrupted) { +                        dprint("tap interrupted\n"); +                        register_mods(MOD_BIT(KC_LSHIFT)); +                    }                  } else { -                    add_mods(MOD_BIT(KC_LSHIFT)); -                    add_key(KC_9); -                    send_keyboard_report(); -                    del_mods(MOD_BIT(KC_LSHIFT)); -                    del_key(KC_9); -                    send_keyboard_report(); +                    register_mods(MOD_BIT(KC_LSHIFT));                  }              } else { -                if (tap.count == 0 || tap.interrupted) { -                    //del_mods(MOD_BIT(KC_LSHIFT)); -                    layer_off(1); -                } -            } -            break; -        case RSHIFT_RPAREN: -            // RShift + tap ')' -            if (event.pressed) { -                if (tap.count == 0 || tap.interrupted) { -                    add_mods(MOD_BIT(KC_RSHIFT)); -                } else { -                    add_mods(MOD_BIT(KC_RSHIFT)); -                    add_key(KC_0); +                if (record->tap.count > 0 && !(record->tap.interrupted)) { +                    add_weak_mods(MOD_BIT(KC_LSHIFT));                      send_keyboard_report(); -                    del_mods(MOD_BIT(KC_RSHIFT)); -                    del_key(KC_0); +                    register_code(KC_9); +                    unregister_code(KC_9); +                    del_weak_mods(MOD_BIT(KC_LSHIFT));                      send_keyboard_report(); -                } -            } else { -                if (tap.count == 0 || tap.interrupted) { -                    del_mods(MOD_BIT(KC_RSHIFT)); +                    record->tap.count = 0;  // ad hoc: cancel tap +                } else { +                    unregister_mods(MOD_BIT(KC_LSHIFT));                  }              }              break; diff --git a/keyboard/hhkb/keymap_spacefn.c b/keyboard/hhkb/keymap_spacefn.c index b77e9edb9..deff920ae 100644 --- a/keyboard/hhkb/keymap_spacefn.c +++ b/keyboard/hhkb/keymap_spacefn.c @@ -58,12 +58,53 @@ const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {       *       `-------------------------------------------'       */      KEYMAP(GRV, F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F9,  F10, F11, F12, TRNS,DEL,   \ -           TRNS,TRNS,TRNS,ESC, TRNS,TRNS,TRNS,HOME,UP,  END, PSCR,SLCK,PAUS,INS,        \ +           TRNS,TRNS,TRNS,ESC, TRNS,TRNS,TRNS,HOME,FN3, END, PSCR,SLCK,PAUS,INS,        \             TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,PGUP,LEFT,DOWN,RGHT,TRNS,TRNS,TRNS,            \             TRNS,TRNS,TRNS,TRNS,TRNS,SPC, PGDN,GRV, FN2, TRNS,TRNS,TRNS,NO,              \                  TRNS,TRNS,          TRNS,               TRNS,TRNS),  }; + +/* + * user defined action function + */ +enum function_id { +    CTRL_SPACE_I,       // Ctrl + Up(SpaceFN) -> PgUp +}; + +void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) +{ +#   define MODS_CTRL_MASK   (MOD_BIT(KC_LCTRL)|MOD_BIT(KC_RCTRL)) +    static uint8_t ctrl_space_i_prev_ctrl; + +    switch (id) { +        // Ctrl + Up(SpaceFN) -> PgUp +        case CTRL_SPACE_I: +            ctrl_space_i_prev_ctrl = get_mods()&MODS_CTRL_MASK; +            if (record->event.pressed) { +                if (ctrl_space_i_prev_ctrl) { +                    del_mods(ctrl_space_i_prev_ctrl);   // remove Ctrl +                    add_key(KC_PGUP); +                    send_keyboard_report(); // send PgUp without Ctrl +                    add_mods(ctrl_space_i_prev_ctrl);   // return Ctrl but not sent +                } else { +                    add_key(KC_UP); +                    send_keyboard_report(); +                } +            } else { +                if (ctrl_space_i_prev_ctrl) { +                    del_key(KC_PGUP); +                    send_keyboard_report(); +                } else { +                    del_key(KC_UP); +                    send_keyboard_report(); +                } +            } +            break; +    } +} + +  /*   * Fn action definition   */ @@ -71,5 +112,5 @@ const uint16_t PROGMEM fn_actions[] = {      [0] = ACTION_LAYER_MOMENTARY(1),      [1] = ACTION_LAYER_TAP_KEY(2, KC_SPACE),      [2] = ACTION_MODS_KEY(MOD_LSFT, KC_GRV),    // tilde +    [3] = ACTION_FUNCTION(CTRL_SPACE_I),        // Ctrl + Up(SpaceFN) -> PgUp  }; - diff --git a/keyboard/kitten_paw/Makefile.lufa b/keyboard/kitten_paw/Makefile.lufa new file mode 100644 index 000000000..4a643ea79 --- /dev/null +++ b/keyboard/kitten_paw/Makefile.lufa @@ -0,0 +1,117 @@ +#---------------------------------------------------------------------------- +# 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 = kittenpaw_lufa + +# Directory common source filess exist +TOP_DIR = ../.. + +# Directory keyboard dependent files exist +TARGET_DIR = . + +# List C source files here. (C dependencies are automatically generated.) +SRC =	keymap.c \ +	matrix.c \ +	led.c + +CONFIG_H = config.h + +# MCU name +MCU = atmega32u2 + +# Processor frequency. +#     This will define a symbol, F_CPU, in all source code files equal to the +#     processor frequency in Hz. You can then use this symbol in your source code to +#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done +#     automatically to create a 32-bit value in your source code. +# +#     This will be an integer division of F_USB below, as it is sourced by +#     F_USB after it has run through any CPU prescalers. Note that this value +#     does not *change* the processor frequency - it should merely be updated to +#     reflect the processor speed set externally so that the code can use accurate +#     software delays. +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) + + +# Build Options +#   comment out to disable the options. +# +#BOOTMAGIC_ENABLE = yes	# Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes	# Mouse keys(+4700) +EXTRAKEY_ENABLE = yes	# Audio control and System control(+450) +#CONSOLE_ENABLE = yes	# Console for debug(+400) +COMMAND_ENABLE = yes    # Commands for debug and configuration +#SLEEP_LED_ENABLE = yes  # Breathing sleep LED during USB suspend +#NKRO_ENABLE = yes	# USB Nkey Rollover - not yet supported in LUFA + + +# Boot Section Size in bytes +#   Teensy halfKay   512 +#   Atmel DFU loader 4096 +#   LUFA bootloader  4096 +OPT_DEFS += -DBOOTLOADER_SIZE=4096 + +# Search Path +VPATH += $(TARGET_DIR) +VPATH += $(TOP_DIR) + +include $(TOP_DIR)/protocol/lufa.mk +include $(TOP_DIR)/common.mk +include $(TOP_DIR)/rules.mk diff --git a/keyboard/kitten_paw/README.md b/keyboard/kitten_paw/README.md new file mode 100644 index 000000000..1cc8c1016 --- /dev/null +++ b/keyboard/kitten_paw/README.md @@ -0,0 +1,20 @@ +Kitten Paw controller firmware +====================== +Custom controller for the Costar Majestouch keyboard designed by bpiphany. + +*Note that this is not the official firmware* + +Build +----- +Move to this directory then just run `make` like: + +    $ make -f Makefile.lufa + +At the moment only the LUFA stack is supported. + + +Bootloader +--------- +To enter bootloader by hardware use a magnet above the controller before connecting the usb cable. + +It is still possible to use Boot Magic and Command (LSFT+RSFT+PAUS) to access the bootloader though. diff --git a/keyboard/kitten_paw/config.h b/keyboard/kitten_paw/config.h new file mode 100644 index 000000000..a29ca313e --- /dev/null +++ b/keyboard/kitten_paw/config.h @@ -0,0 +1,43 @@ +/* +Copyright 2014 Ralf Schmitt <ralf@bunkertor.net> + +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 <http://www.gnu.org/licenses/>. +*/ + +#ifndef CONFIG_H +#define CONFIG_H + +/* USB Device descriptor parameter */ +#define VENDOR_ID       0xFEED +#define PRODUCT_ID      0x6050 +#define DEVICE_VER      0x0104 +#define MANUFACTURER    Costar +#define PRODUCT         Majestouch + +/* message strings */ +#define DESCRIPTION     t.m.k. keyboard firmware for Majestouch + +/* matrix size */ +#define MATRIX_ROWS 8 +#define MATRIX_COLS 18 + +/* 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_RSHIFT)) \ +) + +#endif diff --git a/keyboard/kitten_paw/keymap.c b/keyboard/kitten_paw/keymap.c new file mode 100644 index 000000000..23db421f9 --- /dev/null +++ b/keyboard/kitten_paw/keymap.c @@ -0,0 +1,102 @@ +/* +Copyright 2014 Ralf Schmitt <ralf@bunkertor.net> + +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 <http://www.gnu.org/licenses/>. +*/ + +#include <stdint.h> +#include <stdbool.h> +#include <avr/pgmspace.h> +#include "keycode.h" +#include "action.h" +#include "action_macro.h" +#include "report.h" +#include "host.h" +#include "debug.h" +#include "keymap.h" + +/* + Matrix col/row mapping + + ,----.    ,-------------------. ,-------------------. ,-------------------. ,--------------. + |06/6|    |07/4|08/4|08/2|08/6| |15/5|11/6|12/2|12/4| |14/4|14/5|14/6|14/0| |13/5|13/7|15/7| + `----'    `-------------------' `-------------------' `-------------------' `--------------' + ,-------------------------------------------------------------------------. ,--------------. ,-------------------. + |06/4|06/5|07/5|08/5|09/5|09/4|10/4|10/5|11/5|12/5|05/5|05/4|11/4|    14/2| |17/4|02/4|04/4| |16/1|17/1|04/1|04/0| + |-------------------------------------------------------------------------| |--------------| |-------------------| + |06/2  |06/7|07/7|08/7|09/7|09/2|10/2|10/7|11/7|12/7|05/7|05/2|11/2|  14/3| |16/4|02/5|04/5| |16/7|17/7|04/7|    | + |-------------------------------------------------------------------------| '--------------' |-------------- 02/7| + |02/7   |06/3|07/3|08/3|09/3|09/6|10/6|10/3|11/3|12/3|05/3|05/6|      14/1|                  |16/2|17/2|04/2|    | + |-------------------------------------------------------------------------|      ,----.      |-------------------| + |01/2     |06/1|07/1|08/1|09/1|09/0|10/0|10/1|11/1|12/1|05/0|         01/3|      |02/6|      |16/3|17/3|04/3|    | + |-------------------------------------------------------------------------| ,--------------. |-------------- 02/3| + |15/4|03/2|13/6|                 16/6                  |13/0|0/3|12/0|15/1| |02/0|16/0|17/0| | 17/6    |04/6|    | + `-------------------------------------------------------------------------' `--------------' `-------------------' +*/ + +#define KEYMAP( \ +    KG6,      KH4, KI4, KI2, KI6, KP5, KL6, KM2, KM4, KO4, KO5, KO6, KO0,   KN5, KN7, KP7,                       \ +    KG4, KG5, KH5, KI5, KJ5, KJ4, KK4, KK5, KL5, KM5, KF5, KF4, KL4, KO2,   KR4, KC4, KE4,   KQ1, KR1, KE1, KE0, \ +    KG2, KG7, KH7, KI7, KJ7, KJ2, KK2, KK7, KL7, KM7, KF7, KF2, KL2, KO3,   KQ4, KC5, KE5,   KQ7, KR7, KE7, KC7, \ +    KH2, KG3, KH3, KI3, KJ3, KJ6, KK6, KK3, KL3, KM3, KF3, KF6,      KO1,                    KQ2, KR2, KE2,      \ +    KB2, KH6, KG1, KH1, KI1, KJ1, KJ0, KK0, KK1, KL1, KM1, KF0,      KB3,        KC6,        KQ3, KR3, KE3, KC3, \ +    KP4, KD2, KN6,                KQ6,                KN0, KA3, KM0, KP1,   KC0, KQ0, KR0,   KR6,      KE6       \ +) { \ +/*            0         1         2         3         4         5         6         7   */  \ +/* A  0 */ {KC_NO,    KC_NO,    KC_NO,    KC_##KA3, KC_NO,    KC_NO,    KC_NO,    KC_NO   },\ +/* B  1 */ {KC_NO,    KC_NO,    KC_##KB2, KC_##KB3, KC_NO,    KC_NO,    KC_NO,    KC_NO   },\ +/* C  2 */ {KC_##KC0, KC_NO,    KC_NO,    KC_##KC3, KC_##KC4, KC_##KC5, KC_##KC6, KC_##KC7},\ +/* D  3 */ {KC_NO,    KC_NO,    KC_##KD2, KC_NO,    KC_NO,    KC_NO,    KC_NO,    KC_NO   },\ +/* E  4 */ {KC_##KE0, KC_##KE1, KC_##KE2, KC_##KE3, KC_##KE4, KC_##KE5, KC_##KE6, KC_##KE7},\ +/* F  5 */ {KC_##KF0, KC_NO,    KC_##KF2, KC_##KF3, KC_##KF4, KC_##KF5, KC_##KF6, KC_##KF7},\ +/* G  6 */ {KC_NO,    KC_##KG1, KC_##KG2, KC_##KG3, KC_##KG4, KC_##KG5, KC_##KG6, KC_##KG7},\ +/* H  7 */ {KC_NO,    KC_##KH1, KC_##KH2, KC_##KH3, KC_##KH4, KC_##KH5, KC_##KH6, KC_##KH7},\ +/* I  8 */ {KC_NO,    KC_##KI1, KC_##KI2, KC_##KI3, KC_##KI4, KC_##KI5, KC_##KI6, KC_##KI7},\ +/* J  9 */ {KC_##KJ0, KC_##KJ1, KC_##KJ2, KC_##KJ3, KC_##KJ4, KC_##KJ5, KC_##KJ6, KC_##KJ7},\ +/* K 10 */ {KC_##KK0, KC_##KK1, KC_##KK2, KC_##KK3, KC_##KK4, KC_##KK5, KC_##KK6, KC_##KK7},\ +/* L 11 */ {KC_NO,    KC_##KL1, KC_##KL2, KC_##KL3, KC_##KL4, KC_##KL5, KC_##KL6, KC_##KL7},\ +/* M 12 */ {KC_##KM0, KC_##KM1, KC_##KM2, KC_##KM3, KC_##KM4, KC_##KM5, KC_NO,    KC_##KM7},\ +/* N 13 */ {KC_##KN0, KC_NO,    KC_NO,    KC_NO,    KC_NO,    KC_##KN5, KC_##KN6, KC_##KN7},\ +/* O 14 */ {KC_##KO0, KC_##KO1, KC_##KO2, KC_##KO3, KC_##KO4, KC_##KO5, KC_##KO6, KC_NO   },\ +/* P 15 */ {KC_NO,    KC_##KP1, KC_NO,    KC_NO,    KC_##KP4, KC_##KP5, KC_NO,    KC_##KP7},\ +/* Q 16 */ {KC_##KQ0, KC_##KQ1, KC_##KQ2, KC_##KQ3, KC_##KQ4, KC_NO,    KC_##KQ6, KC_##KQ7},\ +/* R 17 */ {KC_##KR0, KC_##KR1, KC_##KR2, KC_##KR3, KC_##KR4, KC_NO,    KC_##KR6, KC_##KR7} \ +} + +#include "keymap_ansi.h" + +#define KEYMAPS_SIZE    (sizeof(keymaps) / sizeof(keymaps[0])) +#define FN_ACTIONS_SIZE (sizeof(fn_actions) / sizeof(fn_actions[0])) + +/* translates key to keycode */ +uint8_t keymap_key_to_keycode(uint8_t layer, key_t key) +{ +    if (layer < KEYMAPS_SIZE) { +        return pgm_read_byte(&keymaps[(layer)][(key.col)][(key.row)]); +    } else { +        return pgm_read_byte(&keymaps[0][(key.col)][(key.row)]); +    } +} + +/* translates Fn keycode to action */ +action_t keymap_fn_to_action(uint8_t keycode) +{ +    action_t action; +    if (FN_INDEX(keycode) < FN_ACTIONS_SIZE) { +        action.code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]); +    } else { +        action.code = ACTION_NO; +    } +    return action; +} diff --git a/keyboard/kitten_paw/keymap_ansi.h b/keyboard/kitten_paw/keymap_ansi.h new file mode 100644 index 000000000..ed1088baa --- /dev/null +++ b/keyboard/kitten_paw/keymap_ansi.h @@ -0,0 +1,23 @@ + +static const uint8_t PROGMEM keymaps[][MATRIX_COLS][MATRIX_ROWS] = { +    /* Layer 0: Standard ANSI layer */ +    KEYMAP(\ +         ESC, F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F9,  F10, F11,  F12,        PSCR,SLCK,PAUS,                         \ +         GRV, 1,   2,   3,   4,   5,   6,   7,   8,   9,   0,   MINS, EQL,BSPC,   INS, HOME,PGUP,    NLCK,PSLS,PAST,PMNS, \ +         TAB, Q,   W,   E,   R,   T,   Y,   U,   I,   O,   P,   LBRC,RBRC,BSLS,   DEL, END, PGDN,    P7,  P8,  P9,  PPLS, \ +         CAPS,A,   S,   D,   F,   G,   H,   J,   K,   L,   SCLN,QUOT,      ENT,                      P4,  P5,  P6,        \ +         LSFT,NUBS,Z,   X,   C,   V,   B,   N,   M,   COMM,DOT, SLSH,     RSFT,        UP,           P1,  P2,  P3,  PENT, \ +         LCTL,LGUI,LALT,               SPC,                RALT,RGUI, FN0,RCTL,   LEFT,DOWN,RGHT,    P0,  PDOT),          \ +    /* Layer 1: Function layer */ +    KEYMAP(\ +         CALC,MYCM,WSCH,WHOM,MAIL,VOLD,VOLU,MSEL,MSTP,MPLY,MPRV,MNXT,TRNS,        WAKE, PWR,SLEP,                         \ +         TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,   TRNS,TRNS,TRNS,    TRNS,TRNS,TRNS,TRNS, \ +         TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,   TRNS,TRNS,TRNS,    TRNS,TRNS,TRNS,TRNS, \ +         TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,     TRNS,                      TRNS,TRNS,TRNS,      \ +         TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,     TRNS,        TRNS,         TRNS,TRNS,TRNS,TRNS, \ +         TRNS,TRNS,TRNS,               TRNS,               TRNS,TRNS,TRNS,TRNS,   TRNS,TRNS,TRNS,    TRNS,TRNS) +}; + +static const uint16_t PROGMEM fn_actions[] = { +    [0] = ACTION_LAYER_MOMENTARY(1) +}; diff --git a/keyboard/kitten_paw/led.c b/keyboard/kitten_paw/led.c new file mode 100644 index 000000000..da5dbd7ae --- /dev/null +++ b/keyboard/kitten_paw/led.c @@ -0,0 +1,60 @@ +/* +Copyright 2014 Ralf Schmitt <ralf@bunkertor.net> + +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 <http://www.gnu.org/licenses/>. +*/ + +#include <avr/io.h> +#include "stdint.h" +#include "led.h" + +/* LED pin configuration + * + * Scroll Lock  PB7 + * CAPS         PC6 + * NUMLOCK      PC5 + * + */ +void led_set(uint8_t usb_led) +{ +    DDRB |= (1<<7); +    DDRC |= (1<<5) | (1<<6); + +    if (usb_led & (1<<USB_LED_CAPS_LOCK)) +    { +        PORTC &= ~(1<<6); +    } +    else +    { +        PORTC |= (1<<6); +    } + +    if (usb_led & (1<<USB_LED_NUM_LOCK)) +    { +        PORTC &= ~(1<<5); +    } +    else +    { +        PORTC |= (1<<5); +    } + +    if (usb_led & (1<<USB_LED_SCROLL_LOCK)) +    { +        PORTB &= ~(1<<7); +    } +    else +    { +        PORTB |= (1<<7); +    } +} diff --git a/keyboard/kitten_paw/matrix.c b/keyboard/kitten_paw/matrix.c new file mode 100644 index 000000000..08d64c5f4 --- /dev/null +++ b/keyboard/kitten_paw/matrix.c @@ -0,0 +1,239 @@ +/* +Copyright 2014 Ralf Schmitt <ralf@bunkertor.net> + +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 <http://www.gnu.org/licenses/>. +*/ + +#include <stdint.h> +#include <stdbool.h> +#include <avr/io.h> +#include <util/delay.h> +#include "print.h" +#include "debug.h" +#include "util.h" +#include "matrix.h" + +#ifndef DEBOUNCE +#   define DEBOUNCE 0 +#endif +static uint8_t debouncing = DEBOUNCE; + +static matrix_row_t matrix[MATRIX_ROWS]; +static matrix_row_t matrix_debouncing[MATRIX_ROWS]; + +static uint8_t read_rows(void); +static void init_rows(void); +static void unselect_cols(void); +static void select_col(uint8_t col); + +inline uint8_t matrix_rows(void) +{ +    return MATRIX_ROWS; +} + +inline uint8_t matrix_cols(void) +{ +    return MATRIX_COLS; +} + +void matrix_init(void) +{ +    unselect_cols(); +    init_rows(); +    for (uint8_t i=0; i < MATRIX_ROWS; i++)  { +        matrix[i] = 0; +        matrix_debouncing[i] = 0; +    } +} + +uint8_t matrix_scan(void) +{ +    for (uint8_t col = 0; col < MATRIX_COLS; col++) { +        select_col(col); +        _delay_us(3); +        uint8_t rows = read_rows(); +        for (uint8_t row = 0; row < MATRIX_ROWS; row++) { +            bool prev_bit = matrix_debouncing[row] & ((matrix_row_t)1<<col); +            bool curr_bit = rows & (1<<row); +            if (prev_bit != curr_bit) { +                matrix_debouncing[row] ^= ((matrix_row_t)1<<col); +                debouncing = DEBOUNCE; +            } +        } +        unselect_cols(); +    } + +    if (debouncing) { +        if (--debouncing) { +            _delay_ms(1); +        } else { +            for (uint8_t i = 0; i < MATRIX_ROWS; i++) { +                matrix[i] = matrix_debouncing[i]; +            } +        } +    } + +    return 1; +} + +bool matrix_is_modified(void) +{ +    if (debouncing) return false; +    return true; +} + +inline bool matrix_is_on(uint8_t row, uint8_t col) +{ +    return (matrix[row] & ((matrix_row_t)1<<col)); +} + +inline matrix_row_t matrix_get_row(uint8_t row) +{ +    return matrix[row]; +} + +void matrix_print(void) +{ +    print("\nr/c 0123456789ABCDEF\n"); +    for (uint8_t row = 0; row < MATRIX_ROWS; row++) { +        xprintf("%02X: %032lb\n", row, bitrev32(matrix_get_row(row))); +    } +} + +uint8_t matrix_key_count(void) +{ +    uint8_t count = 0; +    for (uint8_t i = 0; i < MATRIX_ROWS; i++) { +        count += bitpop32(matrix[i]); +    } +    return count; +} + +/* Row pin configuration + * + * row: 0    1    2    3    4    5    6    7 + * pin: PC2  PB1  PB2  PB3  PC7  PB4  PB5  PB6 + * + */ +static void init_rows(void) +{ +    DDRC &= ~0b10000100; +    DDRB &= ~0b01111110; +    PORTC |= 0b10000100; +    PORTB |= 0b01111110; +} + +static uint8_t read_rows(void) +{ +    return (PINC&(1<<2) ? 0 : (1<<0)) | +           (PINB&(1<<1) ? 0 : (1<<1)) | +           (PINB&(1<<2) ? 0 : (1<<2)) | +           (PINB&(1<<3) ? 0 : (1<<3)) | +           (PINC&(1<<7) ? 0 : (1<<4)) | +           (PINB&(1<<4) ? 0 : (1<<5)) | +           (PINB&(1<<5) ? 0 : (1<<6)) | +           (PINB&(1<<6) ? 0 : (1<<7)); +} + +/*  These columns uses two 74HC42 4 to 10 bit demultiplexers (low active). + * + *   COL PD1 PD0 PD2 PD6 PD5 PD4 + *   12   1   1   0   0   0   0 + *   11   1   1   0   0   0   1 + *   10   1   1   0   0   1   0 + *    9   1   1   0   0   1   1 + *    8   1   1   0   1   0   0 + *    7   1   1   0   1   0   1 + *    6   1   1   0   1   1   0 + *    5   1   1   0   1   1   1 + *    4   1   1   1   0   0   0 + *    3   1   1   1   0   0   1 + + *   COL PD2 PD6 PD1 PD0 PD5 PD4 + *    2   1   1   0   0   0   0 + *    1   1   1   0   0   0   1 + *    0   1   1   0   0   1   0 + *   17   1   1   0   0   1   1 + *   16   1   1   0   1   0   0 + *        1   1   0   1   0   1 + *        1   1   0   1   1   0 + *   15   1   1   0   1   1   1 + *   14   1   1   1   0   0   0 + *   13   1   1   1   0   0   1 + */ +static void unselect_cols(void) +{ +    DDRD |= 0b01110111; +    PORTD &= ~0b01110111; +} + +static void select_col(uint8_t col) +{ +    switch (col) { +        case 0: +            PORTD |= (1<<5) | (1<<6) | (1<<2); +            break; +        case 1: +            PORTD |= (1<<4) | (1<<6) | (1<<2); +            break; +        case 2: +            PORTD |= (1<<6) | (1<<2); +            break; +        case 3: +            PORTD |= (1<<4) | (1<<2) | (1<<0) | (1<<1); +            break; +        case 4: +            PORTD |= (1<<2) | (1<<0) | (1<<1); +            break; +        case 5: +            PORTD |= (1<<4) | (1<<5) | (1<<6) | (1<<0) | (1<<1); +            break; +        case 6: +            PORTD |= (1<<5) | (1<<6) | (1<<0) | (1<<1); +            break; +        case 7: +            PORTD |= (1<<4) | (1<<6) | (1<<0) | (1<<1); +            break; +        case 8: +            PORTD |= (1<<6) | (1<<0) | (1<<1); +            break; +        case 9: +            PORTD |= (1<<4) | (1<<5) | (1<<0) | (1<<1); +            break; +        case 10: +            PORTD |= (1<<5) | (1<<0) | (1<<1); +            break; +        case 11: +            PORTD |= (1<<4) | (1<<0) | (1<<1); +            break; +        case 12: +            PORTD |= (1<<0) | (1<<1); +            break; +        case 13: +            PORTD |= (1<<4) | (1<<1) | (1<<6) | (1<<2); +            break; +        case 14: +            PORTD |= (1<<1) | (1<<6) | (1<<2); +            break; +        case 15: +            PORTD |= (1<<4) | (1<<5) | (1<<0) | (1<<6) | (1<<2); +            break; +        case 16: +            PORTD |= (1<<0) | (1<<6) | (1<<2); +            break; +        case 17: +            PORTD |= (1<<4) | (1<<5) | (1<<6) | (1<<2); +            break; +    } +} diff --git a/protocol/lufa.mk b/protocol/lufa.mk index 3489f19c2..ac70ac039 100644 --- a/protocol/lufa.mk +++ b/protocol/lufa.mk @@ -1,7 +1,12 @@  LUFA_DIR = protocol/lufa  # Path to the LUFA library -LUFA_PATH ?= protocol/lufa/LUFA-120730 +ifeq (, $(wildcard $(TOP_DIR)/$(LUFA_DIR)/LUFA-git/LUFA/Version.h)) +    LUFA_PATH ?= $(LUFA_DIR)/LUFA-120730 +else +    LUFA_PATH ?= $(LUFA_DIR)/LUFA-git +endif +  # Create the LUFA source path variables by including the LUFA makefile  ifneq (, $(wildcard $(TOP_DIR)/$(LUFA_PATH)/LUFA/Build/lufa_sources.mk)) @@ -30,9 +35,12 @@ VPATH += $(TOP_DIR)/$(LUFA_PATH)  #endif  # LUFA library compile-time options and predefined tokens -LUFA_OPTS  = -D USB_DEVICE_ONLY -LUFA_OPTS += -D USE_FLASH_DESCRIPTORS -LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)" +LUFA_OPTS  = -DUSB_DEVICE_ONLY +LUFA_OPTS += -DUSE_FLASH_DESCRIPTORS +LUFA_OPTS += -DUSE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)" +#LUFA_OPTS += -DINTERRUPT_CONTROL_ENDPOINT +LUFA_OPTS += -DFIXED_CONTROL_ENDPOINT_SIZE=8  +LUFA_OPTS += -DFIXED_NUM_CONFIGURATIONS=1  OPT_DEFS += -DF_USB=$(F_USB)UL  OPT_DEFS += -DARCH=ARCH_$(ARCH) diff --git a/protocol/lufa/LUFA-git b/protocol/lufa/LUFA-git new file mode 160000 +Subproject b6c18b2a7c544653efbe12a1d4e8ba65e7d83c3 diff --git a/protocol/lufa/descriptor.c b/protocol/lufa/descriptor.c index a46ba3ec6..c13a81bda 100644 --- a/protocol/lufa/descriptor.c +++ b/protocol/lufa/descriptor.c @@ -230,12 +230,12 @@ const USB_Descriptor_Device_t PROGMEM DeviceDescriptor =  {      .Header                 = {.Size = sizeof(USB_Descriptor_Device_t), .Type = DTYPE_Device}, -    .USBSpecification       = VERSION_BCD(01.10), +    .USBSpecification       = VERSION_BCD(1,1,0),      .Class                  = USB_CSCP_NoDeviceClass,      .SubClass               = USB_CSCP_NoDeviceSubclass,      .Protocol               = USB_CSCP_NoDeviceProtocol, -    .Endpoint0Size          = 8, +    .Endpoint0Size          = FIXED_CONTROL_ENDPOINT_SIZE,      /* specified in config.h */      .VendorID               = VENDOR_ID, @@ -246,7 +246,7 @@ const USB_Descriptor_Device_t PROGMEM DeviceDescriptor =      .ProductStrIndex        = 0x02,      .SerialNumStrIndex      = NO_DESCRIPTOR, -    .NumberOfConfigurations = 1 +    .NumberOfConfigurations = FIXED_NUM_CONFIGURATIONS  };  /******************************************************************************* @@ -292,7 +292,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =          {              .Header                 = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID}, -            .HIDSpec                = VERSION_BCD(01.11), +            .HIDSpec                = VERSION_BCD(1,1,1),              .CountryCode            = 0x00,              .TotalReportDescriptors = 1,              .HIDReportType          = HID_DTYPE_Report, @@ -306,7 +306,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =              .EndpointAddress        = (ENDPOINT_DIR_IN | KEYBOARD_IN_EPNUM),              .Attributes             = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),              .EndpointSize           = KEYBOARD_EPSIZE, -            .PollingIntervalMS      = 0x01 +            .PollingIntervalMS      = 0x0A          },      /* @@ -333,7 +333,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =          {              .Header                 = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID}, -            .HIDSpec                = VERSION_BCD(01.11), +            .HIDSpec                = VERSION_BCD(1,1,1),              .CountryCode            = 0x00,              .TotalReportDescriptors = 1,              .HIDReportType          = HID_DTYPE_Report, @@ -347,7 +347,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =              .EndpointAddress        = (ENDPOINT_DIR_IN | MOUSE_IN_EPNUM),              .Attributes             = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),              .EndpointSize           = MOUSE_EPSIZE, -            .PollingIntervalMS      = 0x01 +            .PollingIntervalMS      = 0x0A          },  #endif @@ -375,7 +375,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =          {              .Header                 = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID}, -            .HIDSpec                = VERSION_BCD(01.11), +            .HIDSpec                = VERSION_BCD(1,1,1),              .CountryCode            = 0x00,              .TotalReportDescriptors = 1,              .HIDReportType          = HID_DTYPE_Report, @@ -389,7 +389,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =              .EndpointAddress        = (ENDPOINT_DIR_IN | EXTRAKEY_IN_EPNUM),              .Attributes             = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),              .EndpointSize           = EXTRAKEY_EPSIZE, -            .PollingIntervalMS      = 0x01 +            .PollingIntervalMS      = 0x0A          },  #endif @@ -417,7 +417,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =          {              .Header                 = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID}, -            .HIDSpec                = VERSION_BCD(01.11), +            .HIDSpec                = VERSION_BCD(1,1,1),              .CountryCode            = 0x00,              .TotalReportDescriptors = 1,              .HIDReportType          = HID_DTYPE_Report, @@ -469,7 +469,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =          {              .Header                 = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID}, -            .HIDSpec                = VERSION_BCD(01.11), +            .HIDSpec                = VERSION_BCD(1,1,1),              .CountryCode            = 0x00,              .TotalReportDescriptors = 1,              .HIDReportType          = HID_DTYPE_Report, diff --git a/protocol/lufa/descriptor.h b/protocol/lufa/descriptor.h index 9ee1c04d7..42af07917 100644 --- a/protocol/lufa/descriptor.h +++ b/protocol/lufa/descriptor.h @@ -137,13 +137,17 @@ typedef struct  #ifdef CONSOLE_ENABLE  #   define CONSOLE_IN_EPNUM         (EXTRAKEY_IN_EPNUM + 1) -#   define CONSOLE_OUT_EPNUM        (EXTRAKEY_IN_EPNUM + 2) +#   define CONSOLE_OUT_EPNUM        (EXTRAKEY_IN_EPNUM + 1) +//#   define CONSOLE_OUT_EPNUM        (EXTRAKEY_IN_EPNUM + 2)  #else  #   define CONSOLE_OUT_EPNUM        EXTRAKEY_IN_EPNUM  #endif  #ifdef NKRO_ENABLE  #   define NKRO_IN_EPNUM            (CONSOLE_OUT_EPNUM + 1) +#   if defined(__AVR_ATmega32U2__) && NKRO_IN_EPNUM > 4 +#       error "Endpoints are not available enough to support all functions. Remove some in Makefile.(MOUSEKEY, EXTRAKEY, CONSOLE, NKRO)" +#   endif  #endif @@ -159,4 +163,14 @@ uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue,                                      const void** const DescriptorAddress)                                      ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(3); + +/* new API */ +#if LUFA_VERSION_INTEGER < 0x140302 +    #undef VERSION_BCD +    #define VERSION_BCD(Major, Minor, Revision) \ +                                              CPU_TO_LE16( ((Major & 0xFF) << 8) | \ +                                                           ((Minor & 0x0F) << 4) | \ +                                                           (Revision & 0x0F) ) +#endif +  #endif diff --git a/protocol/lufa/lufa.c b/protocol/lufa/lufa.c index eca51c878..d60aecc3f 100644 --- a/protocol/lufa/lufa.c +++ b/protocol/lufa/lufa.c @@ -52,8 +52,8 @@  #include "descriptor.h"  #include "lufa.h" -static uint8_t idle_duration = 0; -static uint8_t protocol_report = 1; +uint8_t keyboard_idle = 0; +uint8_t keyboard_protocol = 1;  static uint8_t keyboard_led_stats = 0;  static report_keyboard_t keyboard_report_sent; @@ -184,15 +184,6 @@ void EVENT_USB_Device_StartOfFrame(void)  /** Event handler for the USB_ConfigurationChanged event.   * This is fired when the host sets the current configuration of the USB device after enumeration.   */ -#if LUFA_VERSION_INTEGER < 0x120730 -    /* old API 120219 */ -    #define ENDPOINT_CONFIG(epnum, eptype, epdir, epsize, epbank)    Endpoint_ConfigureEndpoint(epnum, eptype, epdir, epsize, epbank) -#else -    /* new API >= 120730 */ -    #define ENDPOINT_BANK_SINGLE 1 -    #define ENDPOINT_BANK_DOUBLE 2 -    #define ENDPOINT_CONFIG(epnum, eptype, epdir, epsize, epbank)    Endpoint_ConfigureEndpoint((epdir) | (epnum) , eptype, epsize, epbank) -#endif  void EVENT_USB_Device_ConfigurationChanged(void)  {      bool ConfigSuccess = true; @@ -217,9 +208,11 @@ void EVENT_USB_Device_ConfigurationChanged(void)      /* Setup Console HID Report Endpoints */      ConfigSuccess &= ENDPOINT_CONFIG(CONSOLE_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN,                                       CONSOLE_EPSIZE, ENDPOINT_BANK_DOUBLE); +#if 0      ConfigSuccess &= ENDPOINT_CONFIG(CONSOLE_OUT_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_OUT,                                       CONSOLE_EPSIZE, ENDPOINT_BANK_SINGLE);  #endif +#endif  #ifdef NKRO_ENABLE      /* Setup NKRO HID Report Endpoints */ @@ -279,6 +272,7 @@ void EVENT_USB_Device_ControlRequest(void)                  // Interface                  switch (USB_ControlRequest.wIndex) {                  case KEYBOARD_INTERFACE: +                case NKRO_INTERFACE:                      Endpoint_ClearSETUP();                      while (!(Endpoint_IsOUTReceived())) { @@ -299,21 +293,29 @@ void EVENT_USB_Device_ControlRequest(void)          case HID_REQ_GetProtocol:              if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))              { -                Endpoint_ClearSETUP(); -                while (!(Endpoint_IsINReady())); -                Endpoint_Write_8(protocol_report); -                Endpoint_ClearIN(); -                Endpoint_ClearStatusStage(); +                if (USB_ControlRequest.wIndex == KEYBOARD_INTERFACE) { +                    Endpoint_ClearSETUP(); +                    while (!(Endpoint_IsINReady())); +                    Endpoint_Write_8(keyboard_protocol); +                    Endpoint_ClearIN(); +                    Endpoint_ClearStatusStage(); +                }              }              break;          case HID_REQ_SetProtocol:              if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))              { -                Endpoint_ClearSETUP(); -                Endpoint_ClearStatusStage(); +                if (USB_ControlRequest.wIndex == KEYBOARD_INTERFACE) { +                    Endpoint_ClearSETUP(); +                    Endpoint_ClearStatusStage(); -                protocol_report = ((USB_ControlRequest.wValue & 0xFF) != 0x00); +                    keyboard_protocol = ((USB_ControlRequest.wValue & 0xFF) != 0x00); +#ifdef NKRO_ENABLE +                    keyboard_nkro = !!keyboard_protocol; +#endif +                    clear_keyboard(); +                }              }              break; @@ -323,7 +325,7 @@ void EVENT_USB_Device_ControlRequest(void)                  Endpoint_ClearSETUP();                  Endpoint_ClearStatusStage(); -                idle_duration = ((USB_ControlRequest.wValue & 0xFF00) >> 8); +                keyboard_idle = ((USB_ControlRequest.wValue & 0xFF00) >> 8);              }              break; @@ -332,7 +334,7 @@ void EVENT_USB_Device_ControlRequest(void)              {                  Endpoint_ClearSETUP();                  while (!(Endpoint_IsINReady())); -                Endpoint_Write_8(idle_duration); +                Endpoint_Write_8(keyboard_idle);                  Endpoint_ClearIN();                  Endpoint_ClearStatusStage();              } @@ -351,7 +353,7 @@ static uint8_t keyboard_leds(void)  static void send_keyboard(report_keyboard_t *report)  { -    uint8_t timeout = 0; +    uint8_t timeout = 255;      if (USB_DeviceState != DEVICE_STATE_Configured)          return; @@ -359,26 +361,27 @@ static void send_keyboard(report_keyboard_t *report)      /* Select the Keyboard Report Endpoint */  #ifdef NKRO_ENABLE      if (keyboard_nkro) { +        /* Report protocol - NKRO */          Endpoint_SelectEndpoint(NKRO_IN_EPNUM); -    } -    else -#endif -    { -        Endpoint_SelectEndpoint(KEYBOARD_IN_EPNUM); -    } -    /* Check if Keyboard Endpoint Ready for Read/Write */ -    while (--timeout && !Endpoint_IsReadWriteAllowed()) ; +        /* Check if write ready for a polling interval around 1ms */ +        while (timeout-- && !Endpoint_IsReadWriteAllowed()) _delay_us(4); +        if (!Endpoint_IsReadWriteAllowed()) return; -    /* Write Keyboard Report Data */ -#ifdef NKRO_ENABLE -    if (keyboard_nkro) { +        /* Write Keyboard Report Data */          Endpoint_Write_Stream_LE(report, NKRO_EPSIZE, NULL);      }      else  #endif      { -        /* boot mode */ +        /* Boot protocol */ +        Endpoint_SelectEndpoint(KEYBOARD_IN_EPNUM); + +        /* Check if write ready for a polling interval around 10ms */ +        while (timeout-- && !Endpoint_IsReadWriteAllowed()) _delay_us(40); +        if (!Endpoint_IsReadWriteAllowed()) return; + +        /* Write Keyboard Report Data */          Endpoint_Write_Stream_LE(report, KEYBOARD_EPSIZE, NULL);      } @@ -391,7 +394,7 @@ static void send_keyboard(report_keyboard_t *report)  static void send_mouse(report_mouse_t *report)  {  #ifdef MOUSE_ENABLE -    uint8_t timeout = 0; +    uint8_t timeout = 255;      if (USB_DeviceState != DEVICE_STATE_Configured)          return; @@ -399,8 +402,9 @@ static void send_mouse(report_mouse_t *report)      /* Select the Mouse Report Endpoint */      Endpoint_SelectEndpoint(MOUSE_IN_EPNUM); -    /* Check if Mouse Endpoint Ready for Read/Write */ -    while (--timeout && !Endpoint_IsReadWriteAllowed()) ; +    /* Check if write ready for a polling interval around 10ms */ +    while (timeout-- && !Endpoint_IsReadWriteAllowed()) _delay_us(40); +    if (!Endpoint_IsReadWriteAllowed()) return;      /* Write Mouse Report Data */      Endpoint_Write_Stream_LE(report, sizeof(report_mouse_t), NULL); @@ -412,7 +416,7 @@ static void send_mouse(report_mouse_t *report)  static void send_system(uint16_t data)  { -    uint8_t timeout = 0; +    uint8_t timeout = 255;      if (USB_DeviceState != DEVICE_STATE_Configured)          return; @@ -422,14 +426,18 @@ static void send_system(uint16_t data)          .usage = data      };      Endpoint_SelectEndpoint(EXTRAKEY_IN_EPNUM); -    while (--timeout && !Endpoint_IsReadWriteAllowed()) ; + +    /* Check if write ready for a polling interval around 10ms */ +    while (timeout-- && !Endpoint_IsReadWriteAllowed()) _delay_us(40); +    if (!Endpoint_IsReadWriteAllowed()) return; +      Endpoint_Write_Stream_LE(&r, sizeof(report_extra_t), NULL);      Endpoint_ClearIN();  }  static void send_consumer(uint16_t data)  { -    uint8_t timeout = 0; +    uint8_t timeout = 255;      if (USB_DeviceState != DEVICE_STATE_Configured)          return; @@ -439,7 +447,11 @@ static void send_consumer(uint16_t data)          .usage = data      };      Endpoint_SelectEndpoint(EXTRAKEY_IN_EPNUM); -    while (--timeout && !Endpoint_IsReadWriteAllowed()) ; + +    /* Check if write ready for a polling interval around 10ms */ +    while (timeout-- && !Endpoint_IsReadWriteAllowed()) _delay_us(40); +    if (!Endpoint_IsReadWriteAllowed()) return; +      Endpoint_Write_Stream_LE(&r, sizeof(report_extra_t), NULL);      Endpoint_ClearIN();  } diff --git a/protocol/lufa/lufa.h b/protocol/lufa/lufa.h index bcee060d6..195123c0f 100644 --- a/protocol/lufa/lufa.h +++ b/protocol/lufa/lufa.h @@ -66,4 +66,15 @@ typedef struct {      uint16_t usage;  } __attribute__ ((packed)) report_extra_t; + +#if LUFA_VERSION_INTEGER < 0x120730 +    /* old API 120219 */ +    #define ENDPOINT_CONFIG(epnum, eptype, epdir, epsize, epbank)    Endpoint_ConfigureEndpoint(epnum, eptype, epdir, epsize, epbank) +#else +    /* new API >= 120730 */ +    #define ENDPOINT_BANK_SINGLE 1 +    #define ENDPOINT_BANK_DOUBLE 2 +    #define ENDPOINT_CONFIG(epnum, eptype, epdir, epsize, epbank)    Endpoint_ConfigureEndpoint((epdir) | (epnum) , eptype, epsize, epbank) +#endif +  #endif diff --git a/protocol/pjrc/usb.c b/protocol/pjrc/usb.c index 393b36f78..1e6ba8719 100644 --- a/protocol/pjrc/usb.c +++ b/protocol/pjrc/usb.c @@ -38,6 +38,7 @@  #include "sleep_led.h"  #endif  #include "suspend.h" +#include "action.h"  #include "action_util.h" @@ -628,6 +629,7 @@ uint8_t usb_configured(void)  void usb_remote_wakeup(void)  {      UDCON |= (1<<RMWKUP); +    while (UDCON & (1<<RMWKUP));  } @@ -692,20 +694,20 @@ ISR(USB_GEN_vect)  		}                  /* TODO: should keep IDLE rate on each keyboard interface */  #ifdef NKRO_ENABLE -		if (!keyboard_nkro && usb_keyboard_idle_config && (++div4 & 3) == 0) { +		if (!keyboard_nkro && keyboard_idle && (++div4 & 3) == 0) {  #else -		if (usb_keyboard_idle_config && (++div4 & 3) == 0) { +		if (keyboard_idle && (++div4 & 3) == 0) {  #endif  			UENUM = KBD_ENDPOINT;  			if (UEINTX & (1<<RWAL)) {  				usb_keyboard_idle_count++; -				if (usb_keyboard_idle_count == usb_keyboard_idle_config) { +				if (usb_keyboard_idle_count == keyboard_idle) {  					usb_keyboard_idle_count = 0;                                          /* TODO: fix keyboard_report inconsistency */  /* To avoid Mac SET_IDLE behaviour.  					UEDATX = keyboard_report_prev->mods;  					UEDATX = 0; -                                        uint8_t keys = usb_keyboard_protocol ? KBD_REPORT_KEYS : 6; +                                        uint8_t keys = keyboard_protocol ? KBD_REPORT_KEYS : 6;  					for (uint8_t i=0; i<keys; i++) {  						UEDATX = keyboard_report_prev->keys[i];  					} @@ -901,13 +903,13 @@ ISR(USB_COM_vect)  				}  				if (bRequest == HID_GET_IDLE) {  					usb_wait_in_ready(); -					UEDATX = usb_keyboard_idle_config; +					UEDATX = keyboard_idle;  					usb_send_in();  					return;  				}  				if (bRequest == HID_GET_PROTOCOL) {  					usb_wait_in_ready(); -					UEDATX = usb_keyboard_protocol; +					UEDATX = keyboard_protocol;  					usb_send_in();  					return;  				} @@ -921,14 +923,18 @@ ISR(USB_COM_vect)  					return;  				}  				if (bRequest == HID_SET_IDLE) { -					usb_keyboard_idle_config = (wValue >> 8); +					keyboard_idle = (wValue >> 8);  					usb_keyboard_idle_count = 0;  					//usb_wait_in_ready();  					usb_send_in();  					return;  				}  				if (bRequest == HID_SET_PROTOCOL) { -					usb_keyboard_protocol = wValue; +					keyboard_protocol = wValue; +#ifdef NKRO_ENABLE +                                        keyboard_nkro = !!keyboard_protocol; +#endif +                                        clear_keyboard();  					//usb_wait_in_ready();  					usb_send_in();  					return; diff --git a/protocol/pjrc/usb_keyboard.c b/protocol/pjrc/usb_keyboard.c index de798fcc2..d16833187 100644 --- a/protocol/pjrc/usb_keyboard.c +++ b/protocol/pjrc/usb_keyboard.c @@ -34,12 +34,12 @@  // protocol setting from the host.  We use exactly the same report  // either way, so this variable only stores the setting since we  // are required to be able to report which setting is in use. -uint8_t usb_keyboard_protocol=1; +uint8_t keyboard_protocol=1;  // the idle configuration, how often we send the report to the  // host (ms * 4) even when it hasn't changed  // Windows and Linux set 0 while OS X sets 6(24ms) by SET_IDLE request. -uint8_t usb_keyboard_idle_config=125; +uint8_t keyobard_idle=125;  // count until idle timeout  uint8_t usb_keyboard_idle_count=0; @@ -61,10 +61,7 @@ int8_t usb_keyboard_send_report(report_keyboard_t *report)      else  #endif      { -        if (usb_keyboard_protocol) -            result = send_report(report, KBD_ENDPOINT, 0, KBD_SIZE); -        else -            result = send_report(report, KBD_ENDPOINT, 0, 6); +        result = send_report(report, KBD_ENDPOINT, 0, KBD_SIZE);      }      if (result) return result; diff --git a/protocol/pjrc/usb_keyboard.h b/protocol/pjrc/usb_keyboard.h index c362ca3b8..9b798e9a8 100644 --- a/protocol/pjrc/usb_keyboard.h +++ b/protocol/pjrc/usb_keyboard.h @@ -30,8 +30,6 @@  #include "host.h" -extern uint8_t usb_keyboard_protocol; -extern uint8_t usb_keyboard_idle_config;  extern uint8_t usb_keyboard_idle_count;  extern volatile uint8_t usb_keyboard_leds; diff --git a/protocol/ps2_mouse.c b/protocol/ps2_mouse.c index 4702f12c4..c3e8b3c1c 100644 --- a/protocol/ps2_mouse.c +++ b/protocol/ps2_mouse.c @@ -82,9 +82,14 @@ void ps2_mouse_task(void)          mouse_report.x = ps2_host_recv_response();          mouse_report.y = ps2_host_recv_response();      } else { -        if (!debug_mouse) print("ps2_mouse: fail to get mouse packet\n"); +        if (debug_mouse) print("ps2_mouse: fail to get mouse packet\n");          return;      } +        xprintf("%ud ", timer_read()); +        print("ps2_mouse raw: ["); +        phex(mouse_report.buttons); print("|"); +        print_hex8((uint8_t)mouse_report.x); print(" "); +        print_hex8((uint8_t)mouse_report.y); print("]\n");      /* if mouse moves or buttons state changes */      if (mouse_report.x || mouse_report.y ||  | 
