Keyboard firmwares for Atmel AVR and Cortex-M
Du kannst nicht mehr als 25 Themen auswählen Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

vor 13 Jahren
vor 13 Jahren
vor 13 Jahren
vor 13 Jahren
vor 13 Jahren
vor 13 Jahren
vor 13 Jahren
vor 13 Jahren
vor 13 Jahren
vor 13 Jahren
vor 13 Jahren
vor 13 Jahren
vor 13 Jahren
vor 13 Jahren
vor 13 Jahren
vor 13 Jahren
vor 13 Jahren
vor 13 Jahren
vor 13 Jahren
vor 13 Jahren
vor 13 Jahren
vor 13 Jahren
vor 13 Jahren
vor 13 Jahren
vor 13 Jahren
vor 13 Jahren
vor 13 Jahren
vor 13 Jahren
vor 13 Jahren
vor 13 Jahren
vor 13 Jahren
vor 13 Jahren
vor 13 Jahren
vor 13 Jahren
vor 13 Jahren
vor 13 Jahren
vor 13 Jahren
vor 13 Jahren
vor 13 Jahren
vor 13 Jahren
vor 13 Jahren
vor 13 Jahren
vor 13 Jahren
vor 13 Jahren
vor 13 Jahren
vor 13 Jahren
vor 13 Jahren
vor 13 Jahren
vor 13 Jahren
vor 13 Jahren
vor 13 Jahren
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. /*
  2. * keymap for HHKB pro
  3. */
  4. #include <stdbool.h>
  5. #include <avr/pgmspace.h>
  6. #include "usb_keyboard.h"
  7. #include "matrix.h"
  8. #include "keymap.h"
  9. #include "print.h"
  10. #define FN_KEYCODE(fn) (pgm_read_byte(&fn_keycode[(fn)]))
  11. #define FN_LAYER(fn) (pgm_read_byte(&fn_layer[(fn)]))
  12. #define KEYMAPS(layer, row, col) (pgm_read_byte(&keymaps[(layer)][(row)][(col)]))
  13. static int current_layer = 0;
  14. static bool layer_used = false;
  15. static int onbit(uint8_t bits);
  16. /*
  17. * Layer0(Default Layer)
  18. * ,-----------------------------------------------------------.
  19. * |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| \| `|
  20. * |-----------------------------------------------------------|
  21. * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]|Backs|
  22. * |-----------------------------------------------------------|
  23. * |Contro| A| S| D| F| G| H| J| K| L| ;| '|Return |
  24. * |-----------------------------------------------------------|
  25. * |Shift | Z| X| C| V| B| N| M| ,| .| /|Fn2 |Fn1|
  26. * `-----------------------------------------------------------'
  27. * |Gui|Alt |Space |Fn3 |Gui|
  28. * `-------------------------------------------'
  29. *
  30. * Layer1(Fn) HHKB mode
  31. * ,-----------------------------------------------------------.
  32. * |Pow| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del|
  33. * |-----------------------------------------------------------|
  34. * |Caps | | | | | | | |Psc|Slk|Pus|Up | |Backs|
  35. * |-----------------------------------------------------------|
  36. * |Contro|VoD|VoU|Mut| | | *| /|Hom|PgU|Lef|Rig|Enter |
  37. * |-----------------------------------------------------------|
  38. * |Shift | | | | | | +| -|End|PgD|Dow|Shift |xxx|
  39. * `-----------------------------------------------------------'
  40. * |Gui |Alt |Space |Alt |Gui|
  41. * `--------------------------------------------'
  42. *
  43. * Layer3(RALT) vi mode
  44. * ,-----------------------------------------------------------.
  45. * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del|
  46. * |-----------------------------------------------------------|
  47. * |Tab | | | | | |Hom|PgD|PgUlEnd| | | |Backs|
  48. * |-----------------------------------------------------------|
  49. * |Contro| | | | | |Lef|Dow|Up |Rig| | |Return |
  50. * |-----------------------------------------------------------|
  51. * |Shift | | | | | |McL|McD|McU|McR|Mb1|Mb2 | |
  52. * `-----------------------------------------------------------'
  53. * |Gui|Alt |Sapce |xxxxx|Mb3|
  54. * `-------------------------------------------'
  55. *
  56. * Layer4(semicolon) mouse mode
  57. * ,-----------------------------------------------------------.
  58. * |Esc| | | | | | | | | | | | | | |
  59. * |-----------------------------------------------------------|
  60. * |Tab | | | | | |MwL|MwD|MwU|MwR| | | |Backs|
  61. * |-----------------------------------------------------------|
  62. * |Contro| | | | | |McL|McD|McU|McR|xxx| |Return |
  63. * |-----------------------------------------------------------|
  64. * |Shift | | | | | | |Mb1|Mb2|Mb3| |Shift | |
  65. * `-----------------------------------------------------------'
  66. * |Gui |Alt |Mb1 |Alt |Gui|
  67. * `--------------------------------------------'
  68. *
  69. * Mc: Mouse Cursor / Mb: Mouse Button / Mw: Mouse Wheel
  70. */
  71. /* keycode to sent when Fn key released without using layer keys. */
  72. static const uint8_t PROGMEM fn_keycode[] = {
  73. KB_NO, // FN_0
  74. KB_NO, // FN_1
  75. KB_RALT, // FN_2
  76. KB_SCOLON, // FN_3
  77. KB_NO, // FN_4
  78. KB_NO, // FN_5
  79. KB_NO, // FN_6
  80. KB_NO, // FN_7
  81. };
  82. /* layer to change into while Fn key pressed */
  83. static const int PROGMEM fn_layer[] = { 0, 1, 2, 3, 0, 0, 0, 0 };
  84. static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  85. /* plain keymap
  86. {
  87. { KB_2, KB_Q, KB_W, KB_S, KB_A, KB_Z, KB_X, KB_C },
  88. { KB_3, KB_4, KB_R, KB_E, KB_D, KB_F, KB_V, KB_B },
  89. { KB_5, KB_6, KB_Y, KB_T, KB_G, KB_H, KB_N, KB_NO },
  90. { KB_1, KB_ESCAPE, KB_TAB, KB_LCTRL, KB_LSHIFT, KB_LGUI, KB_LALT, KB_SPACE },
  91. { KB_7, KB_8, KB_U, KB_I, KB_K, KB_J, KB_M, KB_NO },
  92. { KB_BSLASH, KB_GRAVE, KB_BSPACE, KB_ENTER, FN_1, KB_RSHIFT, KB_RGUI, KB_RALT },
  93. { KB_9, KB_0, KB_O, KB_P, KB_SCOLON, KB_L, KB_COMMA, KB_NO },
  94. { KB_MINUS, KB_EQUAL, KB_RBRACKET,KB_LBRACKET,KB_QUOTE, KB_SLASH, KB_DOT, KB_NO },
  95. },
  96. */
  97. // 0: default
  98. {
  99. { KB_2, KB_Q, KB_W, KB_S, KB_A, KB_Z, KB_X, KB_C },
  100. { KB_3, KB_4, KB_R, KB_E, KB_D, KB_F, KB_V, KB_B },
  101. { KB_5, KB_6, KB_Y, KB_T, KB_G, KB_H, KB_N, KB_NO },
  102. { KB_1, KB_ESCAPE, KB_TAB, KB_LCTRL, KB_LSHIFT, KB_LGUI, KB_LALT, KB_SPACE },
  103. { KB_7, KB_8, KB_U, KB_I, KB_K, KB_J, KB_M, KB_NO },
  104. { KB_BSLASH, KB_GRAVE, KB_BSPACE, KB_ENTER, FN_1, KB_RSHIFT, KB_RGUI, FN_2 },
  105. { KB_9, KB_0, KB_O, KB_P, FN_3, KB_L, KB_COMMA, KB_NO },
  106. { KB_MINUS, KB_EQUAL, KB_RBRACKET,KB_LBRACKET,KB_QUOTE, KB_SLASH, KB_DOT, KB_NO },
  107. },
  108. // 1: FN_1 HHKB mode(Fn)
  109. {
  110. { KB_F2, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO },
  111. { KB_F3, KB_F4, KB_NO, KB_NO, KB_MUTE, KB_F20, KB_NO, KB_NO },
  112. { KB_F5, KB_F6, KB_NO, KB_NO, KB_NO, KP_ASTERISK,KP_PLUS, KB_NO },
  113. { KB_F1, KB_POWER, KB_CAPSLOCK,KB_LCTRL, KB_LSHIFT, KB_LGUI, KB_LALT, KB_SPACE },
  114. { KB_F7, KB_F8, KB_NO, KB_PSCREEN, KB_HOME, KP_SLASH, KB_MINUS, KB_NO },
  115. { KB_INSERT, KB_DELETE, KB_BSPACE, KP_ENTER, KB_NO, KB_RSHIFT, KB_RGUI, KB_RALT },
  116. { KB_F9, KB_F10, KB_SCKLOCK, KB_BREAK, KB_LEFT, KB_PGUP, KB_END, KB_NO },
  117. { KB_F11, KB_F12, KB_NO, KB_UP, KB_RIGHT, KB_DOWN, KB_PGDOWN, KB_NO },
  118. },
  119. // 2: FN_2 vi mode(RALT)
  120. {
  121. { KB_F2, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO },
  122. { KB_F3, KB_F4, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO },
  123. { KB_F5, KB_F6, KB_HOME, KB_NO, KB_NO, KB_LEFT, MS_LEFT, KB_NO },
  124. { KB_F1, KB_ESCAPE, KB_TAB, KB_LCTRL, KB_LSHIFT, KB_LGUI, KB_LALT, KB_SPACE },
  125. { KB_F7, KB_F8, KB_PGDOWN, KB_PGUP, KB_UP, KB_DOWN, MS_DOWN, KB_NO },
  126. { KB_INSERT, KB_DELETE, KB_BSPACE, KB_ENTER, KB_NO, MS_BTN2, MS_BTN3, KB_NO },
  127. { KB_F9, KB_F10, KB_END, KB_NO, KB_NO, KB_RIGHT, MS_UP, KB_NO },
  128. { KB_F11, KB_F12, MS_WH_UP, MS_WH_DOWN, KB_NO, MS_BTN1, MS_RIGHT, KB_NO },
  129. },
  130. // 3: FN_3 vi mouse mode(SCOLON)
  131. {
  132. { KB_F2, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO },
  133. { KB_F3, KB_F4, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO },
  134. { KB_F5, KB_F6, MS_WH_LEFT, KB_NO, KB_NO, MS_LEFT, KB_NO, KB_NO },
  135. { KB_F1, KB_ESCAPE, KB_TAB, KB_LCTRL, KB_LSHIFT, KB_LGUI, KB_LALT, MS_BTN1 },
  136. { KB_F7, KB_F8, MS_WH_DOWN, MS_WH_UP, MS_UP, MS_DOWN, MS_BTN1, KB_NO },
  137. { KB_NO, KB_NO, KB_BSPACE, KB_ENTER, KB_NO, KB_RSHIFT, KB_RGUI, KB_RALT },
  138. { KB_F9, KB_F10, MS_WH_RIGHT,KB_NO, KB_NO, MS_RIGHT, MS_BTN2, KB_NO },
  139. { KB_F11, KB_F12, KB_NO, KB_NO, KB_NO, KB_NO, MS_BTN3, KB_NO },
  140. },
  141. };
  142. uint8_t keymap_get_keycode(int row, int col)
  143. {
  144. return keymap_get_keycodel(current_layer, row, col);
  145. }
  146. uint8_t keymap_get_keycodel(int layer, int row, int col)
  147. {
  148. uint8_t code = KEYMAPS(layer, row, col);
  149. // normal key or mouse key
  150. if ((KB_A <= code && code <= KP_HEXADECIMAL) ||
  151. (MS_UP <= code && code <= MS_WH_RIGHT))
  152. layer_used = true;
  153. return code;
  154. }
  155. inline
  156. int keymap_get_layer(void) {
  157. return current_layer;
  158. }
  159. inline
  160. int keymap_set_layer(int layer) {
  161. current_layer = layer;
  162. return current_layer;
  163. }
  164. void keymap_fn_proc(int fn_bits) {
  165. // layer switching
  166. static int last_bits = 0;
  167. static uint8_t last_mod = 0;
  168. if (usb_keyboard_has_key() || fn_bits == last_bits) {
  169. // do nothing during press other than Fn key
  170. return;
  171. } else if (fn_bits == 0) {
  172. // send key when Fn key is released without using the layer
  173. if (!layer_used) {
  174. uint8_t code = FN_KEYCODE(onbit(last_bits));
  175. if (code != KB_NO) {
  176. if (KB_LCTRL <= code && code <= KB_RGUI) {
  177. keyboard_modifier_keys = last_mod | 1<<(code & 0x07);
  178. } else {
  179. keyboard_keys[0] = code;
  180. keyboard_modifier_keys = last_mod;
  181. }
  182. usb_keyboard_send();
  183. usb_keyboard_print();
  184. usb_keyboard_clear();
  185. }
  186. }
  187. last_bits = 0;
  188. last_mod = 0;
  189. layer_used = false;
  190. keymap_set_layer(0); // default layer
  191. print("layer default: "); phex(current_layer); print("\n");
  192. } else if ((fn_bits & (fn_bits - 1)) == 0) {
  193. // switch layer when just one Fn Key is pressed
  194. last_bits = fn_bits;
  195. last_mod = keyboard_modifier_keys;
  196. layer_used = false;
  197. keymap_set_layer(FN_LAYER(onbit(fn_bits)));
  198. print("layer: "); phex(current_layer); print("\n");
  199. print("last_bits: "); phex(last_bits); print("\n");
  200. print("last_mod: "); phex(last_mod); print("\n");
  201. }
  202. }
  203. static int onbit(uint8_t bits) {
  204. int n = 0;
  205. if (bits >> 4) { bits >>= 4; n += 4;}
  206. if (bits >> 2) { bits >>= 2; n += 2;}
  207. if (bits >> 1) { bits >>= 1; n += 1;}
  208. return n;
  209. }