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.

keyboard.c 18KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584
  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. } keykind_t;
  39. typedef enum { IDLE, DELAYING, WAITING, PRESSING } kbdstate_t;
  40. uint8_t current_layer = 0;
  41. uint8_t default_layer = 0;
  42. /* keyboard internal states */
  43. static kbdstate_t kbdstate = IDLE;
  44. static uint8_t fn_state_bits = 0;
  45. static keyrecord_t delayed_fn;
  46. static keyrecord_t waiting_key;
  47. static const char *state_str(kbdstate_t state)
  48. {
  49. if (state == IDLE) return PSTR("IDLE");
  50. if (state == DELAYING) return PSTR("DELAYING");
  51. if (state == WAITING) return PSTR("WAITING");
  52. if (state == PRESSING) return PSTR("PRESSING");
  53. return PSTR("UNKNOWN");
  54. }
  55. static inline keykind_t get_keykind(uint8_t code, bool pressed)
  56. {
  57. if IS_KEY(code) return (pressed ? KEY_DOWN : KEY_UP);
  58. if IS_MOD(code) return (pressed ? MOD_DOWN : MOD_UP);
  59. if IS_FN(code) {
  60. if (keymap_fn_keycode(FN_INDEX(code)))
  61. return (pressed ? FNK_DOWN : FNK_UP);
  62. else
  63. return (pressed ? FN_DOWN : FN_UP);
  64. }
  65. if IS_MOUSEKEY(code) return (pressed ? KEY_DOWN : KEY_UP);
  66. if IS_SYSTEM(code) return (pressed ? KEY_DOWN : KEY_UP);
  67. if IS_CONSUMER(code) return (pressed ? KEY_DOWN : KEY_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. // clear all key execpt Mod key
  76. host_clear_all_keys_but_mods();
  77. host_system_send(0);
  78. host_consumer_send(0);
  79. mousekey_clear();
  80. mousekey_send();
  81. debug("Layer Switch(on): "); debug_hex(current_layer);
  82. current_layer = keymap_fn_layer(FN_INDEX(code));
  83. debug(" -> "); debug_hex(current_layer); debug("\n");
  84. }
  85. }
  86. static void layer_switch_off(uint8_t code)
  87. {
  88. if (!IS_FN(code)) return;
  89. fn_state_bits &= ~FN_BIT(code);
  90. if (current_layer != keymap_fn_layer(biton(fn_state_bits))) {
  91. // clear all key execpt Mod key
  92. host_clear_all_keys_but_mods();
  93. host_system_send(0);
  94. host_consumer_send(0);
  95. mousekey_clear();
  96. mousekey_send();
  97. debug("Layer Switch(off): "); debug_hex(current_layer);
  98. current_layer = keymap_fn_layer(biton(fn_state_bits));
  99. debug(" -> "); debug_hex(current_layer); debug("\n");
  100. }
  101. }
  102. static inline uint8_t get_keycode(key_t key)
  103. {
  104. return keymap_get_keycode(current_layer, key.row, key.col);
  105. }
  106. // whether any key except modifier is down or not
  107. static inline bool is_anykey_down(void)
  108. {
  109. for (int r = 0; r < MATRIX_ROWS; r++) {
  110. matrix_row_t matrix_row = matrix_get_row(r);
  111. for (int c = 0; c < MATRIX_COLS; c++) {
  112. if (matrix_row && (1<<c)) {
  113. if (IS_KEY(get_keycode((key_t){ .row = r, .col = c }))) {
  114. return true;
  115. }
  116. }
  117. }
  118. }
  119. return false;
  120. }
  121. static void register_code(uint8_t code)
  122. {
  123. debug("register_code\n");
  124. if IS_KEY(code) {
  125. host_add_key(code);
  126. host_send_keyboard_report();
  127. }
  128. else if IS_MOD(code) {
  129. host_add_mod_bit(MOD_BIT(code));
  130. host_send_keyboard_report();
  131. }
  132. else if IS_MOUSEKEY(code) {
  133. mousekey_on(code);
  134. mousekey_send();
  135. }
  136. else if IS_CONSUMER(code) {
  137. debug("consumer\n");
  138. uint16_t usage = 0;
  139. switch (code) {
  140. case KB_AUDIO_MUTE:
  141. usage = AUDIO_MUTE;
  142. break;
  143. case KB_AUDIO_VOL_UP:
  144. usage = AUDIO_VOL_UP;
  145. break;
  146. case KB_AUDIO_VOL_DOWN:
  147. usage = AUDIO_VOL_DOWN;
  148. break;
  149. case KB_MEDIA_NEXT_TRACK:
  150. usage = TRANSPORT_NEXT_TRACK;
  151. break;
  152. case KB_MEDIA_PREV_TRACK:
  153. usage = TRANSPORT_PREV_TRACK;
  154. break;
  155. case KB_MEDIA_STOP:
  156. usage = TRANSPORT_STOP;
  157. break;
  158. case KB_MEDIA_PLAY_PAUSE:
  159. usage = TRANSPORT_PLAY_PAUSE;
  160. break;
  161. case KB_MEDIA_SELECT:
  162. usage = AL_CC_CONFIG;
  163. break;
  164. case KB_MAIL:
  165. usage = AL_EMAIL;
  166. break;
  167. case KB_CALCULATOR:
  168. usage = AL_CALCULATOR;
  169. break;
  170. case KB_MY_COMPUTER:
  171. usage = AL_LOCAL_BROWSER;
  172. break;
  173. case KB_WWW_SEARCH:
  174. usage = AC_SEARCH;
  175. break;
  176. case KB_WWW_HOME:
  177. usage = AC_HOME;
  178. break;
  179. case KB_WWW_BACK:
  180. usage = AC_BACK;
  181. break;
  182. case KB_WWW_FORWARD:
  183. usage = AC_FORWARD;
  184. break;
  185. case KB_WWW_STOP:
  186. usage = AC_STOP;
  187. break;
  188. case KB_WWW_REFRESH:
  189. usage = AC_REFRESH;
  190. break;
  191. case KB_WWW_FAVORITES:
  192. usage = AC_BOOKMARKS;
  193. break;
  194. }
  195. debug("usage: "); phex16(usage); debug("\n");
  196. host_consumer_send(usage);
  197. }
  198. else if IS_SYSTEM(code) {
  199. uint16_t usage = 0;
  200. switch (code) {
  201. case KB_SYSTEM_POWER:
  202. usage = SYSTEM_POWER_DOWN;
  203. break;
  204. case KB_SYSTEM_SLEEP:
  205. usage = SYSTEM_SLEEP;
  206. break;
  207. case KB_SYSTEM_WAKE:
  208. usage = SYSTEM_WAKE_UP;
  209. break;
  210. }
  211. host_system_send(usage);
  212. }
  213. }
  214. static void unregister_code(uint8_t code)
  215. {
  216. if IS_KEY(code) {
  217. host_del_key(code);
  218. host_send_keyboard_report();
  219. }
  220. else if IS_MOD(code) {
  221. host_del_mod_bit(MOD_BIT(code));
  222. host_send_keyboard_report();
  223. }
  224. else if IS_MOUSEKEY(code) {
  225. mousekey_off(code);
  226. mousekey_send();
  227. }
  228. else if IS_CONSUMER(code) {
  229. host_consumer_send(0x0000);
  230. }
  231. else if IS_SYSTEM(code) {
  232. host_system_send(0x0000);
  233. }
  234. }
  235. /*
  236. *
  237. * Event/State|IDLE DELAYING[f] WAITING[f,k] PRESSING
  238. * -----------+------------------------------------------------------------------
  239. * Fn Down |IDLE(L+) WAITING(Sk) WAITING(Sk) -
  240. * Up |IDLE(L-) IDLE(L-) IDLE(L-) IDLE(L-)
  241. * Fnk Down |DELAYING(Sf) WAITING(Sk) WAINTING(Sk) PRESSING(Rf)
  242. * Up |IDLE(L-) IDLE(Rf,Uf) IDLE(Rf,Ps,Uf)*3 PRESSING(Uf)
  243. * Key Down |PRESSING(Rk) WAITING(Sk) WAITING(Sk) PRESSING(Rk)
  244. * Up |IDLE(Uk) DELAYING(Uk) IDLE(L+,Ps,Uk) IDLE(Uk)*4
  245. * Delay |- IDLE(L+) IDLE(L+,Ps) -
  246. * |
  247. * No key Down|IDLE(Ld) IDLE(Ld) IDLE(Ld) IDLE(Ld)
  248. *
  249. * *2: register Fnk if any key is pressing
  250. * *3: when Fnk == Stored Fnk, if not ignore.
  251. * *4: when no registered key any more
  252. *
  253. * States:
  254. * IDLE:
  255. * DELAYING: delay layer switch after pressing Fn with alt keycode
  256. * WAITING: key is pressed during DELAYING
  257. *
  258. * Events:
  259. * Fn: Fn key without alternative keycode
  260. * Fnk: Fn key with alternative keycode
  261. * -: ignore
  262. *
  263. * Actions:
  264. * Rk: register key
  265. * Uk: unregister key
  266. * Rf: register stored Fn(alt keycode)
  267. * Uf: unregister stored Fn(alt keycode)
  268. * Rs: register stored key
  269. * Us: unregister stored key
  270. * Sk: store key
  271. * Sf: store Fn
  272. * Ps: play stored key(Interpret stored key and transit state)
  273. * L+: Switch to new layer(*retain* Modifiers only)
  274. * L-: Switch back to last layer(*clear* stored key/Fn, *unregister* all Modifier/key)
  275. * Ld: Switch back to default layer(*clear* stored key/Fn, *unregister* all Modifier/key)
  276. */
  277. #define NEXT(state) do { \
  278. debug("NEXT: "); print_P(state_str(kbdstate)); \
  279. kbdstate = state; \
  280. debug(" -> "); print_P(state_str(kbdstate)); debug("\n"); \
  281. } while (0)
  282. static inline void process_key(keyevent_t event)
  283. {
  284. /* TODO: ring buffer
  285. static keyrecord_t waiting_keys[5];
  286. static uint8_t waiting_keys_head = 0;
  287. static uint8_t waiting_keys_tail = 0;
  288. */
  289. uint8_t code = get_keycode(event.key);
  290. keykind_t kind = get_keykind(code, event.pressed);
  291. uint8_t tmp_mods;
  292. debug("state: "); print_P(state_str(kbdstate));
  293. debug(" kind: "); debug_hex(kind);
  294. debug(" code: "); debug_hex(code);
  295. if (event.pressed) { debug("d"); } else { debug("u"); }
  296. debug("\n");
  297. switch (kbdstate) {
  298. case IDLE:
  299. switch (kind) {
  300. case FN_DOWN:
  301. layer_switch_on(code);
  302. break;
  303. case FN_UP:
  304. layer_switch_off(code);
  305. break;
  306. case FNK_DOWN:
  307. // repeat Fn alt key when press Fn key down, up then down again quickly
  308. if (KEYEQ(delayed_fn.event.key, event.key) &&
  309. timer_elapsed(delayed_fn.time) < LAYER_DELAY) {
  310. register_code(keymap_fn_keycode(FN_INDEX(code)));
  311. NEXT(PRESSING);
  312. } else {
  313. delayed_fn = (keyrecord_t) {
  314. .event = event,
  315. .code = code,
  316. .mods = keyboard_report->mods,
  317. .time = timer_read()
  318. };
  319. NEXT(DELAYING);
  320. }
  321. break;
  322. case FNK_UP:
  323. layer_switch_off(code);
  324. break;
  325. case KEY_DOWN:
  326. register_code(code);
  327. NEXT(PRESSING);
  328. break;
  329. case MOD_DOWN:
  330. register_code(code);
  331. break;
  332. case KEY_UP:
  333. case MOD_UP:
  334. unregister_code(code);
  335. break;
  336. default:
  337. break;
  338. }
  339. break;
  340. case PRESSING:
  341. switch (kind) {
  342. case FN_DOWN:
  343. // ignored when any key is pressed
  344. break;
  345. case FN_UP:
  346. layer_switch_off(code);
  347. NEXT(IDLE);
  348. break;
  349. case FNK_DOWN:
  350. register_code(keymap_fn_keycode(FN_INDEX(code)));
  351. break;
  352. case FNK_UP:
  353. // can't know whether layer switched or not
  354. layer_switch_off(code);
  355. unregister_code(keymap_fn_keycode(FN_INDEX(code)));
  356. break;
  357. case KEY_DOWN:
  358. case MOD_DOWN:
  359. register_code(code);
  360. break;
  361. case KEY_UP:
  362. case MOD_UP:
  363. unregister_code(code);
  364. // no key registered? mousekey, mediakey, systemkey
  365. if (!host_has_anykey())
  366. NEXT(IDLE);
  367. break;
  368. default:
  369. break;
  370. }
  371. break;
  372. case DELAYING:
  373. switch (kind) {
  374. case FN_DOWN:
  375. case FNK_DOWN:
  376. case KEY_DOWN:
  377. waiting_key = (keyrecord_t) {
  378. .event = event,
  379. .code = code,
  380. .mods = keyboard_report->mods,
  381. .time = timer_read()
  382. };
  383. NEXT(WAITING);
  384. break;
  385. case MOD_DOWN:
  386. register_code(code);
  387. break;
  388. case FN_UP:
  389. layer_switch_off(code);
  390. NEXT(IDLE);
  391. break;
  392. case FNK_UP:
  393. if (code == delayed_fn.code) {
  394. // type Fn with alt keycode
  395. // restore the mod status at the time of pressing Fn key
  396. tmp_mods = keyboard_report->mods;
  397. host_set_mods(delayed_fn.mods);
  398. register_code(keymap_fn_keycode(FN_INDEX(delayed_fn.code)));
  399. unregister_code(keymap_fn_keycode(FN_INDEX(delayed_fn.code)));
  400. host_set_mods(tmp_mods);
  401. NEXT(IDLE);
  402. } else {
  403. layer_switch_off(code);
  404. NEXT(IDLE);
  405. }
  406. break;
  407. case KEY_UP:
  408. unregister_code(code);
  409. NEXT(IDLE);
  410. break;
  411. case MOD_UP:
  412. unregister_code(code);
  413. break;
  414. default:
  415. break;
  416. }
  417. break;
  418. case WAITING:
  419. switch (kind) {
  420. case FN_DOWN:
  421. case FNK_DOWN:
  422. case KEY_DOWN:
  423. tmp_mods = keyboard_report->mods;
  424. host_set_mods(delayed_fn.mods);
  425. register_code(keymap_fn_keycode(FN_INDEX(delayed_fn.code)));
  426. host_set_mods(waiting_key.mods);
  427. register_code(waiting_key.code);
  428. host_set_mods(tmp_mods);
  429. register_code(code);
  430. NEXT(IDLE);
  431. break;
  432. case MOD_DOWN:
  433. register_code(code);
  434. break;
  435. case FN_UP:
  436. layer_switch_off(code);
  437. NEXT(IDLE);
  438. break;
  439. case FNK_UP:
  440. if (code == delayed_fn.code) {
  441. // alt down, key down, alt up
  442. tmp_mods = keyboard_report->mods;
  443. host_set_mods(delayed_fn.mods);
  444. register_code(keymap_fn_keycode(FN_INDEX(delayed_fn.code)));
  445. host_set_mods(waiting_key.mods);
  446. register_code(waiting_key.code);
  447. unregister_code(keymap_fn_keycode(FN_INDEX(delayed_fn.code)));
  448. host_set_mods(tmp_mods);
  449. NEXT(IDLE);
  450. } else {
  451. layer_switch_off(code);
  452. NEXT(IDLE);
  453. }
  454. break;
  455. case KEY_UP:
  456. if (code == waiting_key.code) {
  457. layer_switch_on(delayed_fn.code);
  458. NEXT(IDLE);
  459. // process waiting_key
  460. tmp_mods = keyboard_report->mods;
  461. host_set_mods(waiting_key.mods);
  462. process_key(waiting_key.event);
  463. host_set_mods(tmp_mods);
  464. process_key(event);
  465. } else {
  466. unregister_code(code);
  467. }
  468. break;
  469. case MOD_UP:
  470. unregister_code(code);
  471. break;
  472. default:
  473. break;
  474. }
  475. break;
  476. }
  477. // TODO: FAIL SAFE: unregister all keys when no key down
  478. }
  479. void keyboard_init(void)
  480. {
  481. debug_keyboard = true;
  482. timer_init();
  483. matrix_init();
  484. #ifdef PS2_MOUSE_ENABLE
  485. ps2_mouse_init();
  486. #endif
  487. }
  488. void keyboard_task(void)
  489. {
  490. static matrix_row_t matrix_prev[MATRIX_ROWS];
  491. matrix_row_t matrix_row = 0;
  492. matrix_row_t matrix_change = 0;
  493. matrix_scan();
  494. if (command_proc()) {
  495. debug("COMMAND\n");
  496. // TODO: clear all keys
  497. host_clear_keyboard_report();
  498. host_send_keyboard_report();
  499. return;
  500. }
  501. for (int r = 0; r < MATRIX_ROWS; r++) {
  502. matrix_row = matrix_get_row(r);
  503. matrix_change = matrix_row ^ matrix_prev[r];
  504. if (matrix_change) {
  505. if (debug_matrix) matrix_print();
  506. for (int c = 0; c < MATRIX_COLS; c++) {
  507. if (matrix_change & (1<<c)) {
  508. process_key((keyevent_t){
  509. .key = (key_t){ .row = r, .col = c },
  510. .pressed = (matrix_row & (1<<c))
  511. });
  512. // record a processed key
  513. matrix_prev[r] ^= (1<<c);
  514. // process a key per task call
  515. goto MATRIX_LOOP_END;
  516. }
  517. }
  518. }
  519. }
  520. MATRIX_LOOP_END:
  521. // TODO: FAIL SAFE: clear all key if no key down
  522. // layer switch when delay term elapses
  523. if (kbdstate == DELAYING || kbdstate == WAITING) {
  524. if (timer_elapsed(delayed_fn.time) > LAYER_DELAY) {
  525. if (kbdstate == DELAYING) {
  526. layer_switch_on(delayed_fn.code);
  527. NEXT(IDLE);
  528. }
  529. if (kbdstate == WAITING) {
  530. layer_switch_on(delayed_fn.code);
  531. NEXT(IDLE);
  532. uint8_t tmp_mods = keyboard_report->mods;
  533. host_set_mods(waiting_key.mods);
  534. process_key(waiting_key.event);
  535. host_set_mods(tmp_mods);
  536. }
  537. }
  538. }
  539. // mousekey repeat & acceleration
  540. mousekey_task();
  541. return;
  542. }
  543. void keyboard_set_leds(uint8_t leds)
  544. {
  545. led_set(leds);
  546. }