Keyboard firmwares for Atmel AVR and Cortex-M
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479
  1. /*
  2. Copyright 2011 Jun Wako <[email protected]>
  3. This program is free software: you can redistribute it and/or modify
  4. it under the terms of the GNU General Public License as published by
  5. the Free Software Foundation, either version 2 of the License, or
  6. (at your option) any later version.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. GNU General Public License for more details.
  11. You should have received a copy of the GNU General Public License
  12. along with this program. If not, see <http://www.gnu.org/licenses/>.
  13. */
  14. #include "keyboard.h"
  15. #include "matrix.h"
  16. #include "keymap.h"
  17. #include "host.h"
  18. #include "led.h"
  19. #include "usb_keycodes.h"
  20. #include "timer.h"
  21. #include "print.h"
  22. #include "debug.h"
  23. #include "command.h"
  24. #include "util.h"
  25. #ifdef MOUSEKEY_ENABLE
  26. #include "mousekey.h"
  27. #endif
  28. #ifdef EXTRAKEY_ENABLE
  29. #include <util/delay.h>
  30. #endif
  31. #define LAYER_DELAY 250
  32. typedef enum keykind {
  33. NONE,
  34. FN_DOWN, FN_UP,
  35. FNK_DOWN, FNK_UP,
  36. KEY_DOWN, KEY_UP,
  37. MOD_DOWN, MOD_UP,
  38. MOUSEKEY_DOWN, MOUSEKEY_UP,
  39. DELAY
  40. } keykind_t;
  41. typedef enum { IDLE, DELAYING, WAITING, PRESSING } kbdstate_t;
  42. uint8_t current_layer = 0;
  43. uint8_t default_layer = 0;
  44. /* keyboard internal states */
  45. static kbdstate_t kbdstate = IDLE;
  46. static uint8_t fn_state_bits = 0;
  47. static keyrecord_t delayed_fn;
  48. static keyrecord_t waiting_key;
  49. static const char *state_str(kbdstate_t state)
  50. {
  51. if (state == IDLE) return PSTR("IDLE");
  52. if (state == DELAYING) return PSTR("DELAYING");
  53. if (state == WAITING) return PSTR("WAITING");
  54. if (state == PRESSING) return PSTR("PRESSING");
  55. return PSTR("UNKNOWN");
  56. }
  57. static inline keykind_t get_keykind(uint8_t code, bool pressed)
  58. {
  59. if IS_KEY(code) return (pressed ? KEY_DOWN : KEY_UP);
  60. if IS_MOD(code) return (pressed ? MOD_DOWN : MOD_UP);
  61. if IS_FN(code) {
  62. if (keymap_fn_keycode(FN_INDEX(code)))
  63. return (pressed ? FNK_DOWN : FNK_UP);
  64. else
  65. return (pressed ? FN_DOWN : FN_UP);
  66. }
  67. if IS_MOUSEKEY(code) return (pressed ? MOUSEKEY_DOWN : MOUSEKEY_UP);
  68. return NONE;
  69. }
  70. static void layer_switch_on(uint8_t code)
  71. {
  72. if (!IS_FN(code)) return;
  73. fn_state_bits |= FN_BIT(code);
  74. if (current_layer != keymap_fn_layer(FN_INDEX(code))) {
  75. //TODO: clear all key execpt Mod key
  76. debug("Layer Switch(on): "); debug_hex(current_layer);
  77. current_layer = keymap_fn_layer(FN_INDEX(code));
  78. debug(" -> "); debug_hex(current_layer); debug("\n");
  79. }
  80. }
  81. static void layer_switch_off(uint8_t code)
  82. {
  83. if (!IS_FN(code)) return;
  84. fn_state_bits &= ~FN_BIT(code);
  85. if (current_layer != keymap_fn_layer(biton(fn_state_bits))) {
  86. //TODO: clear all key execpt Mod key
  87. debug("Layer Switch(off): "); debug_hex(current_layer);
  88. current_layer = keymap_fn_layer(biton(fn_state_bits));
  89. debug(" -> "); debug_hex(current_layer); debug("\n");
  90. }
  91. }
  92. static inline uint8_t get_keycode(key_t key)
  93. {
  94. return keymap_get_keycode(current_layer, key.row, key.col);
  95. }
  96. // whether any key except modifier is down or not
  97. static inline bool is_anykey_down(void)
  98. {
  99. for (int r = 0; r < MATRIX_ROWS; r++) {
  100. matrix_row_t matrix_row = matrix_get_row(r);
  101. for (int c = 0; c < MATRIX_COLS; c++) {
  102. if (matrix_row && (1<<c)) {
  103. if (IS_KEY(get_keycode((key_t){ .row = r, .col = c }))) {
  104. return true;
  105. }
  106. }
  107. }
  108. }
  109. return false;
  110. }
  111. static void register_code(uint8_t code)
  112. {
  113. if IS_KEY(code) {
  114. host_add_key(code);
  115. host_send_keyboard_report();
  116. }
  117. else if IS_MOD(code) {
  118. host_add_mod_bit(MOD_BIT(code));
  119. host_send_keyboard_report();
  120. }
  121. else if IS_MOUSEKEY(code) {
  122. mousekey_on(code);
  123. mousekey_send();
  124. }
  125. }
  126. static void unregister_code(uint8_t code)
  127. {
  128. if IS_KEY(code) {
  129. host_del_key(code);
  130. host_send_keyboard_report();
  131. }
  132. else if IS_MOD(code) {
  133. host_del_mod_bit(MOD_BIT(code));
  134. host_send_keyboard_report();
  135. }
  136. else if IS_MOUSEKEY(code) {
  137. mousekey_off(code);
  138. mousekey_send();
  139. }
  140. }
  141. /*
  142. *
  143. * Event/State|IDLE DELAYING[f] WAITING[f,k] PRESSING
  144. * -----------+------------------------------------------------------------------
  145. * Fn Down |IDLE(L+) WAITING(Sk) WAITING(Sk) -
  146. * Up |IDLE(L-) IDLE(L-) IDLE(L-) IDLE(L-)
  147. * Fnk Down |DELAYING(Sf) WAITING(Sk) WAINTING(Sk) PRESSING(Rf)
  148. * Up |IDLE(L-) IDLE(Rf,Uf) IDLE(Rf,Ps,Uf)*3 PRESSING(Uf)
  149. * Key Down |PRESSING(Rk) WAITING(Sk) WAITING(Sk) PRESSING(Rk)
  150. * Up |IDLE(Uk) DELAYING(Uk) IDLE(L+,Ps,Uk) IDLE(Uk)*4
  151. * Delay |- IDLE(L+) IDLE(L+,Ps) -
  152. * |
  153. * No key Down|IDLE(Ld) IDLE(Ld) IDLE(Ld) IDLE(Ld)
  154. *
  155. * *2: register Fnk if any key is pressing
  156. * *3: when Fnk == Stored Fnk, if not ignore.
  157. * *4: when no registered key any more
  158. *
  159. * States:
  160. * IDLE:
  161. * DELAYING: delay layer switch after pressing Fn with alt keycode
  162. * WAITING: key is pressed during DELAYING
  163. *
  164. * Events:
  165. * Fn: Fn key without alternative keycode
  166. * Fnk: Fn key with alternative keycode
  167. * -: ignore
  168. *
  169. * Actions:
  170. * Rk: register key
  171. * Uk: unregister key
  172. * Rf: register stored Fn(alt keycode)
  173. * Uf: unregister stored Fn(alt keycode)
  174. * Rs: register stored key
  175. * Us: unregister stored key
  176. * Sk: store key
  177. * Sf: store Fn
  178. * Ps: play stored key(Interpret stored key and transit state)
  179. * L+: Switch to new layer(*retain* Modifiers only)
  180. * L-: Switch back to last layer(*clear* stored key/Fn, *unregister* all Modifier/key)
  181. * Ld: Switch back to default layer(*clear* stored key/Fn, *unregister* all Modifier/key)
  182. */
  183. #define NEXT(state) do { \
  184. debug("NEXT: "); print_P(state_str(kbdstate)); \
  185. kbdstate = state; \
  186. debug(" -> "); print_P(state_str(kbdstate)); debug("\n"); \
  187. } while (0)
  188. static inline void process_key(keyevent_t event)
  189. {
  190. /* TODO: ring buffer
  191. static keyrecord_t waiting_keys[5];
  192. static uint8_t waiting_keys_head = 0;
  193. static uint8_t waiting_keys_tail = 0;
  194. */
  195. uint8_t code = get_keycode(event.key);
  196. keykind_t kind = get_keykind(code, event.pressed);
  197. uint8_t tmp_mods;
  198. //debug("kbdstate: "); debug_hex(kbdstate);
  199. debug("state: "); print_P(state_str(kbdstate));
  200. debug(" kind: "); debug_hex(kind);
  201. debug(" code: "); debug_hex(code);
  202. if (event.pressed) { debug("d"); } else { debug("u"); }
  203. debug("\n");
  204. switch (kbdstate) {
  205. case IDLE:
  206. switch (kind) {
  207. case FN_DOWN:
  208. layer_switch_on(code);
  209. break;
  210. case FN_UP:
  211. layer_switch_off(code);
  212. break;
  213. case FNK_DOWN:
  214. // store event
  215. delayed_fn = (keyrecord_t) { .event = event, .code = code, .mods = keyboard_report->mods, .time = timer_read() };
  216. NEXT(DELAYING);
  217. break;
  218. case FNK_UP:
  219. layer_switch_off(code);
  220. break;
  221. case KEY_DOWN:
  222. case MOUSEKEY_DOWN:
  223. register_code(code);
  224. NEXT(PRESSING);
  225. break;
  226. case MOD_DOWN:
  227. register_code(code);
  228. break;
  229. case KEY_UP:
  230. case MOUSEKEY_UP:
  231. case MOD_UP:
  232. unregister_code(code);
  233. break;
  234. default:
  235. break;
  236. }
  237. break;
  238. case PRESSING:
  239. switch (kind) {
  240. case FN_DOWN:
  241. // ignored when any key is pressed
  242. break;
  243. case FN_UP:
  244. layer_switch_off(code);
  245. NEXT(IDLE);
  246. break;
  247. case FNK_DOWN:
  248. register_code(keymap_fn_keycode(FN_INDEX(code)));
  249. break;
  250. case FNK_UP:
  251. unregister_code(keymap_fn_keycode(FN_INDEX(code)));
  252. break;
  253. case KEY_DOWN:
  254. case MOD_DOWN:
  255. case MOUSEKEY_DOWN:
  256. register_code(code);
  257. break;
  258. case KEY_UP:
  259. case MOD_UP:
  260. case MOUSEKEY_UP:
  261. unregister_code(code);
  262. // no key registered? mousekey, mediakey, systemkey
  263. if (!host_has_anykey())
  264. NEXT(IDLE);
  265. break;
  266. default:
  267. break;
  268. }
  269. break;
  270. case DELAYING:
  271. switch (kind) {
  272. case FN_DOWN:
  273. case FNK_DOWN:
  274. case KEY_DOWN:
  275. case MOUSEKEY_DOWN:
  276. waiting_key = (keyrecord_t) { .event = event, .code = code, .mods = keyboard_report->mods, .time = timer_read() };
  277. NEXT(WAITING);
  278. break;
  279. case MOD_DOWN:
  280. register_code(code);
  281. break;
  282. case FN_UP:
  283. layer_switch_off(code);
  284. NEXT(IDLE);
  285. break;
  286. case FNK_UP:
  287. if (code == delayed_fn.code) {
  288. // type Fn with alt keycode
  289. // restore the mod status at the time of pressing Fn key
  290. tmp_mods = keyboard_report->mods;
  291. host_set_mods(delayed_fn.mods);
  292. register_code(keymap_fn_keycode(FN_INDEX(delayed_fn.code)));
  293. unregister_code(keymap_fn_keycode(FN_INDEX(delayed_fn.code)));
  294. host_set_mods(tmp_mods);
  295. NEXT(IDLE);
  296. } else {
  297. layer_switch_off(code);
  298. NEXT(IDLE);
  299. }
  300. break;
  301. case KEY_UP:
  302. case MOUSEKEY_UP:
  303. unregister_code(code);
  304. NEXT(IDLE);
  305. break;
  306. case MOD_UP:
  307. unregister_code(code);
  308. break;
  309. default:
  310. break;
  311. }
  312. break;
  313. case WAITING:
  314. switch (kind) {
  315. case FN_DOWN:
  316. case FNK_DOWN:
  317. case KEY_DOWN:
  318. case MOUSEKEY_DOWN:
  319. tmp_mods = keyboard_report->mods;
  320. host_set_mods(delayed_fn.mods);
  321. register_code(keymap_fn_keycode(FN_INDEX(delayed_fn.code)));
  322. host_set_mods(waiting_key.mods);
  323. register_code(waiting_key.code);
  324. host_set_mods(tmp_mods);
  325. register_code(code);
  326. NEXT(IDLE);
  327. break;
  328. case MOD_DOWN:
  329. register_code(code);
  330. break;
  331. case FN_UP:
  332. layer_switch_off(code);
  333. NEXT(IDLE);
  334. break;
  335. case FNK_UP:
  336. if (code == delayed_fn.code) {
  337. // alt down, key down, alt up
  338. tmp_mods = keyboard_report->mods;
  339. host_set_mods(delayed_fn.mods);
  340. register_code(keymap_fn_keycode(FN_INDEX(delayed_fn.code)));
  341. host_set_mods(waiting_key.mods);
  342. register_code(waiting_key.code);
  343. unregister_code(keymap_fn_keycode(FN_INDEX(delayed_fn.code)));
  344. host_set_mods(tmp_mods);
  345. NEXT(IDLE);
  346. } else {
  347. layer_switch_off(code);
  348. NEXT(IDLE);
  349. }
  350. break;
  351. case KEY_UP:
  352. case MOUSEKEY_UP:
  353. if (code == waiting_key.code) {
  354. layer_switch_on(delayed_fn.code);
  355. NEXT(IDLE);
  356. // process waiting_key
  357. tmp_mods = keyboard_report->mods;
  358. host_set_mods(waiting_key.mods);
  359. process_key(waiting_key.event);
  360. host_set_mods(tmp_mods);
  361. process_key(event);
  362. } else {
  363. unregister_code(code);
  364. }
  365. break;
  366. case MOD_UP:
  367. unregister_code(code);
  368. break;
  369. default:
  370. break;
  371. }
  372. break;
  373. }
  374. // TODO: FAIL SAFE: unregister all keys when no key down
  375. }
  376. void keyboard_init(void)
  377. {
  378. debug_keyboard = true;
  379. timer_init();
  380. matrix_init();
  381. #ifdef PS2_MOUSE_ENABLE
  382. ps2_mouse_init();
  383. #endif
  384. }
  385. void keyboard_task(void)
  386. {
  387. static matrix_row_t matrix_prev[MATRIX_ROWS];
  388. matrix_row_t matrix_row = 0;
  389. matrix_row_t matrix_change = 0;
  390. matrix_scan();
  391. if (command_proc()) {
  392. debug("COMMAND\n");
  393. // TODO: clear all keys
  394. host_clear_keyboard_report();
  395. host_send_keyboard_report();
  396. return;
  397. }
  398. for (int r = 0; r < MATRIX_ROWS; r++) {
  399. matrix_row = matrix_get_row(r);
  400. matrix_change = matrix_row ^ matrix_prev[r];
  401. if (matrix_change) {
  402. // TODO: print once per scan
  403. if (debug_matrix) matrix_print();
  404. for (int c = 0; c < MATRIX_COLS; c++) {
  405. if (matrix_change & (1<<c)) {
  406. process_key((keyevent_t){
  407. .key = (key_t){ .row = r, .col = c },
  408. .pressed = (matrix_row & (1<<c))
  409. });
  410. // record a processed key
  411. matrix_prev[r] ^= (1<<c);
  412. // process a key per task call
  413. goto MATRIX_LOOP_END;
  414. }
  415. }
  416. }
  417. }
  418. MATRIX_LOOP_END:
  419. // TODO: FAIL SAFE: clear all key if no key down
  420. // layer switch when delay term elapses
  421. if (kbdstate == DELAYING || kbdstate == WAITING) {
  422. if (timer_elapsed(delayed_fn.time) > LAYER_DELAY) {
  423. if (kbdstate == DELAYING) {
  424. layer_switch_on(delayed_fn.code);
  425. NEXT(IDLE);
  426. }
  427. if (kbdstate == WAITING) {
  428. layer_switch_on(delayed_fn.code);
  429. NEXT(IDLE);
  430. uint8_t tmp_mods = keyboard_report->mods;
  431. host_set_mods(waiting_key.mods);
  432. process_key(waiting_key.event);
  433. host_set_mods(tmp_mods);
  434. }
  435. }
  436. }
  437. // mousekey repeat & acceleration
  438. mousekey_task();
  439. return;
  440. }
  441. void keyboard_set_leds(uint8_t leds)
  442. {
  443. led_set(leds);
  444. }