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.

преди 11 години
преди 11 години
преди 11 години
преди 11 години
преди 11 години
преди 11 години
преди 11 години
преди 11 години
преди 11 години
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297
  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. /*
  15. * Keymap for PS/2 keyboard
  16. */
  17. #include <stdint.h>
  18. #include <stdbool.h>
  19. #include <avr/pgmspace.h>
  20. #include "keycode.h"
  21. #include "print.h"
  22. #include "debug.h"
  23. #include "util.h"
  24. #include "keymap.h"
  25. // Following macros help you to define a keymap with the form of actual keyboard layout.
  26. /* US layout plus all other various keys */
  27. #define KEYMAP_ALL( \
  28. K76,K05,K06,K04,K0C,K03,K0B,K83,K0A,K01,K09,K78,K07, KFC,K7E,KFE, \
  29. K0E,K16,K1E,K26,K25,K2E,K36,K3D,K3E,K46,K45,K4E,K55,K66, KF0,KEC,KFD, K77,KCA,K7C,K7B, \
  30. K0D,K15,K1D,K24,K2D,K2C,K35,K3C,K43,K44,K4D,K54,K5B,K5D, KF1,KE9,KFA, K6C,K75,K7D, \
  31. K58,K1C,K1B,K23,K2B,K34,K33,K3B,K42,K4B,K4C,K52, K5A, K6B,K73,K74,K79, \
  32. K12,K1A,K22,K21,K2A,K32,K31,K3A,K41,K49,K4A, K59, KF5, K69,K72,K7A, \
  33. K14,K9F,K11, K29, K91,KA7,KAF,K94, KEB,KF2,KF4, K70, K71,KDA, \
  34. \
  35. K61, /* for European ISO */ \
  36. K51, K13, K6A, K64, K67, /* for Japanese JIS */ \
  37. K08, K10, K18, K20, K28, K30, K38, K40, K48, K50, K57, K5F, /* F13-24 */ \
  38. KB7, KBF, KDE, /* System Power, Sleep, Wake */ \
  39. KA3, KB2, KA1, /* Mute, Volume Up, Volume Down */ \
  40. KCD, K95, KBB, KB4, KD0, /* Next, Previous, Stop, Pause, Media Select */ \
  41. KC8, KAB, KC0, /* Mail, Calculator, My Computer */ \
  42. K90, KBA, KB8, KB0, /* WWW Search, Home, Back, Forward */ \
  43. KA8, KA0, K98 /* WWW Stop, Refresh, Favorites */ \
  44. ) { \
  45. { KC_NO, KC_##K01, KC_NO, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07 }, \
  46. { KC_##K08, KC_##K09, KC_##K0A, KC_##K0B, KC_##K0C, KC_##K0D, KC_##K0E, KC_NO }, \
  47. { KC_##K10, KC_##K11, KC_##K12, KC_##K13, KC_##K14, KC_##K15, KC_##K16, KC_NO }, \
  48. { KC_##K18, KC_NO, KC_##K1A, KC_##K1B, KC_##K1C, KC_##K1D, KC_##K1E, KC_NO }, \
  49. { KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26, KC_NO }, \
  50. { KC_##K28, KC_##K29, KC_##K2A, KC_##K2B, KC_##K2C, KC_##K2D, KC_##K2E, KC_NO }, \
  51. { KC_##K30, KC_##K31, KC_##K32, KC_##K33, KC_##K34, KC_##K35, KC_##K36, KC_NO }, \
  52. { KC_##K38, KC_NO, KC_##K3A, KC_##K3B, KC_##K3C, KC_##K3D, KC_##K3E, KC_NO }, \
  53. { KC_##K40, KC_##K41, KC_##K42, KC_##K43, KC_##K44, KC_##K45, KC_##K46, KC_NO }, \
  54. { KC_##K48, KC_##K49, KC_##K4A, KC_##K4B, KC_##K4C, KC_##K4D, KC_##K4E, KC_NO }, \
  55. { KC_##K50, KC_##K51, KC_##K52, KC_NO, KC_##K54, KC_##K55, KC_NO, KC_##K57 }, \
  56. { KC_##K58, KC_##K59, KC_##K5A, KC_##K5B, KC_NO, KC_##K5D, KC_NO, KC_##K5F }, \
  57. { KC_NO, KC_##K61, KC_NO, KC_NO, KC_##K64, KC_NO, KC_##K66, KC_##K67 }, \
  58. { KC_NO, KC_##K69, KC_##K6A, KC_##K6B, KC_##K6C, KC_NO, KC_NO, KC_NO }, \
  59. { KC_##K70, KC_##K71, KC_##K72, KC_##K73, KC_##K74, KC_##K75, KC_##K76, KC_##K77 }, \
  60. { KC_##K78, KC_##K79, KC_##K7A, KC_##K7B, KC_##K7C, KC_##K7D, KC_##K7E, KC_NO }, \
  61. { KC_NO, KC_NO, KC_NO, KC_##K83, KC_NO, KC_NO, KC_NO, KC_NO }, \
  62. { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \
  63. { KC_##K90, KC_##K91, KC_NO, KC_NO, KC_##K94, KC_##K95, KC_NO, KC_NO }, \
  64. { KC_##K98, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_##K9F }, \
  65. { KC_##KA0, KC_##KA1, KC_NO, KC_##KA3, KC_NO, KC_NO, KC_NO, KC_##KA7 }, \
  66. { KC_##KA8, KC_NO, KC_NO, KC_##KAB, KC_NO, KC_NO, KC_NO, KC_##KAF }, \
  67. { KC_##KB0, KC_NO, KC_##KB2, KC_NO, KC_##KB4, KC_NO, KC_NO, KC_##KB7 }, \
  68. { KC_##KB8, KC_NO, KC_##KBA, KC_##KBB, KC_NO, KC_NO, KC_NO, KC_##KBF }, \
  69. { KC_##KC0, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \
  70. { KC_##KC8, KC_NO, KC_##KCA, KC_NO, KC_NO, KC_##KCD, KC_NO, KC_NO }, \
  71. { KC_##KD0, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \
  72. { KC_NO, KC_NO, KC_##KDA, KC_NO, KC_NO, KC_NO, KC_##KDE, KC_NO }, \
  73. { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \
  74. { KC_NO, KC_##KE9, KC_NO, KC_##KEB, KC_##KEC, KC_NO, KC_NO, KC_NO }, \
  75. { KC_##KF0, KC_##KF1, KC_##KF2, KC_NO, KC_##KF4, KC_##KF5, KC_NO, KC_NO }, \
  76. { KC_NO, KC_NO, KC_##KFA, KC_NO, KC_##KFC, KC_##KFD, KC_##KFE, KC_NO }, \
  77. }
  78. /* JIS layout */
  79. #define KEYMAP_JIS( \
  80. K76,K05,K06,K04,K0C,K03,K0B,K83,K0A,K01,K09,K78,K07, KFC,K7E,KFE, \
  81. K0E,K16,K1E,K26,K25,K2E,K36,K3D,K3E,K46,K45,K4E,K55,K6A,K66, KF0,KEC,KFD, K77,KCA,K7C,K7B, \
  82. K0D,K15,K1D,K24,K2D,K2C,K35,K3C,K43,K44,K4D,K54,K5B, KF1,KE9,KFA, K6C,K75,K7D, \
  83. K58,K1C,K1B,K23,K2B,K34,K33,K3B,K42,K4B,K4C,K52,K5D, K5A, K6B,K73,K74,K79, \
  84. K12,K1A,K22,K21,K2A,K32,K31,K3A,K41,K49,K4A,K51, K59, KF5, K69,K72,K7A, \
  85. K14,K9F,K11, K67,K29,K64,K13, K91,KA7,KAF,K94, KEB,KF2,KF4, K70, K71,KDA \
  86. ) \
  87. KEYMAP_ALL( \
  88. K76,K05,K06,K04,K0C,K03,K0B,K83,K0A,K01,K09,K78,K07, KFC,K7E,KFE, \
  89. K0E,K16,K1E,K26,K25,K2E,K36,K3D,K3E,K46,K45,K4E,K55,K66, KF0,KEC,KFD, K77,KCA,K7C,K7B, \
  90. K0D,K15,K1D,K24,K2D,K2C,K35,K3C,K43,K44,K4D,K54,K5B,K5D, KF1,KE9,KFA, K6C,K75,K7D, \
  91. K58,K1C,K1B,K23,K2B,K34,K33,K3B,K42,K4B,K4C,K52, K5A, K6B,K73,K74,K79, \
  92. K12,K1A,K22,K21,K2A,K32,K31,K3A,K41,K49,K4A, K59, KF5, K69,K72,K7A, \
  93. K14,K9F,K11, K29, K91,KA7,KAF,K94, KEB,KF2,KF4, K70, K71,KDA, \
  94. \
  95. NUBS, \
  96. K51, K13, K6A, K64, K67, \
  97. F13, F14, F15, F16, F17, F18, F19, F20, F21, F22, F23, F24, \
  98. SYSTEM_POWER, SYSTEM_SLEEP, SYSTEM_WAKE, \
  99. AUDIO_MUTE, AUDIO_VOL_UP, AUDIO_VOL_DOWN, \
  100. MEDIA_NEXT_TRACK, MEDIA_PREV_TRACK, MEDIA_STOP, MEDIA_PLAY_PAUSE, MEDIA_SELECT, \
  101. MAIL, CALCULATOR, MY_COMPUTER, \
  102. WWW_SEARCH, WWW_HOME, WWW_BACK, WWW_FORWARD, \
  103. WWW_STOP, WWW_REFRESH, WWW_FAVORITES \
  104. )
  105. #define KEYMAP_JIS_COMPACT( \
  106. K0E,K16,K1E,K26,K25,K2E,K36,K3D,K3E,K46,K45,K4E,K55,K6A,K66, \
  107. K0D,K15,K1D,K24,K2D,K2C,K35,K3C,K43,K44,K4D,K54,K5B, \
  108. K58,K1C,K1B,K23,K2B,K34,K33,K3B,K42,K4B,K4C,K52,K5D, K5A, \
  109. K12,K1A,K22,K21,K2A,K32,K31,K3A,K41,K49,K4A,K51, K59, \
  110. K14,K9F,K11, K67,K29,K64,K13, K91,KA7,KAF,K94 \
  111. ) \
  112. KEYMAP_ALL( \
  113. ESC,F1, F2, F3, F4, F5, F6, F7, F8, F9, F10,F11,F12, PSCR,SLCK,BRK, \
  114. K0E,K16,K1E,K26,K25,K2E,K36,K3D,K3E,K46,K45,K4E,K55,K66, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, \
  115. K0D,K15,K1D,K24,K2D,K2C,K35,K3C,K43,K44,K4D,K54,K5B,K5D, DEL, END, PGDN, P7, P8, P9, \
  116. K58,K1C,K1B,K23,K2B,K34,K33,K3B,K42,K4B,K4C,K52, K5A, P4, P5, P6, PPLS, \
  117. K12,K1A,K22,K21,K2A,K32,K31,K3A,K41,K49,K4A, K59, UP, P1, P2, P3, \
  118. K14,K9F,K11, K29, K91,KA7,KAF,K94, LEFT,DOWN,RGHT, P0, PDOT,PENT, \
  119. \
  120. NUBS, \
  121. K51, K13, K6A, K64, K67, \
  122. F13, F14, F15, F16, F17, F18, F19, F20, F21, F22, F23, F24, \
  123. SYSTEM_POWER, SYSTEM_SLEEP, SYSTEM_WAKE, \
  124. AUDIO_MUTE, AUDIO_VOL_UP, AUDIO_VOL_DOWN, \
  125. MEDIA_NEXT_TRACK, MEDIA_PREV_TRACK, MEDIA_STOP, MEDIA_PLAY_PAUSE, MEDIA_SELECT, \
  126. MAIL, CALCULATOR, MY_COMPUTER, \
  127. WWW_SEARCH, WWW_HOME, WWW_BACK, WWW_FORWARD, \
  128. WWW_STOP, WWW_REFRESH, WWW_FAVORITES \
  129. )
  130. // Assign Fn key(0-7) to a layer to which switch with the Fn key pressed.
  131. static const uint8_t PROGMEM fn_layer[] = {
  132. 1, // Fn0
  133. 2, // Fn1
  134. 1, // Fn2
  135. 2, // Fn3
  136. 3, // Fn4
  137. 4, // Fn5
  138. 0, // Fn6
  139. 0 // Fn7
  140. };
  141. // Assign Fn key(0-7) to a keycode sent when release Fn key without use of the layer.
  142. // See layer.c for details.
  143. static const uint8_t PROGMEM fn_keycode[] = {
  144. KC_SCLN, // Fn0
  145. KC_SLSH, // Fn1
  146. KC_BSPC, // Fn2
  147. KC_NO, // Fn3
  148. KC_NO, // Fn4
  149. KC_SPC, // Fn5
  150. KC_NO, // Fn6
  151. KC_NO // Fn7
  152. };
  153. // The keymap is a 32*8 byte array which convert a PS/2 scan code into a USB keycode.
  154. // See keycode.h for USB keycodes. You should omit a 'KC_' prefix of USB keycodes in keymap macro.
  155. // Use KEYMAP_ISO() or KEYMAP_JIS() instead of KEYMAP() if your keyboard is ISO or JIS.
  156. static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  157. /* 0: JIS LAYOUT
  158. * ,---. ,---------------. ,---------------. ,---------------. ,-----------. ,-----------.
  159. * |Esc| |F1 |F2 |F3 |F4 | |F5 |F6 |F7 |F8 | |F9 |F10|F11|F12| |PrS|ScL|Pau| |Pwr|Slp|Wak|
  160. * `---' `---------------' `---------------' `---------------' `-----------' `-----------'
  161. * ,-----------------------------------------------------------. ,-----------. ,---------------.
  162. * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| JY|Bsp| |Ins|Hom|PgU| |NmL| /| *| -|
  163. * |-----------------------------------------------------------| |-----------| |---------------|
  164. * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| Ret | |Del|End|PgD| | 7| 8| 9| |
  165. * |------------------------------------------------------` | `-----------' |-----------| +|
  166. * |CapsLo| A| S| D| F| G| H| J| K| L| ;| :| \| | | 4| 5| 6| |
  167. * |-----------------------------------------------------------| ,---. |---------------|
  168. * |Shift | Z| X| C| V| B| N| M| ,| ,| /| RO|Shift | |Up | | 1| 2| 3| |
  169. * |-----------------------------------------------------------| ,-----------. |-----------|Ent|
  170. * |Ctrl |Gui |Alt |MHEN| Space |HENK|KANA|Alt |Gui |Menu|Ctrl| |Lef|Dow|Rig| | 0| .| |
  171. * `-----------------------------------------------------------' `-----------' `---------------'
  172. */
  173. /*
  174. KEYMAP_JIS(
  175. ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,BRK,
  176. GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, JYEN,BSPC, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS,
  177. TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC, DEL, END, PGDN, P7, P8, P9,
  178. CAPS,A, S, D, F, G, H, J, K, L, SCLN,QUOT,BSLS, ENT, P4, P5, P6, PPLS,
  179. LSFT,Z, X, C, V, B, N, M, COMM,DOT, SLSH,RO, RSFT, UP, P1, P2, P3,
  180. LCTL,LGUI,LALT, MHEN,SPC, HENK,KANA, RALT,RGUI,APP, RCTL, LEFT,DOWN,RGHT, P0, PDOT,PENT
  181. ),
  182. */
  183. /* 0: HHKB-wise
  184. * ,-----------------------------------------------------------.
  185. * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| \| `|
  186. * |-----------------------------------------------------------|
  187. * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| Bsp |
  188. * |------------------------------------------------------` |
  189. * |Ctrl | A| S| D| F| G| H| J| K| L| ;| :|Ret| |
  190. * |-----------------------------------------------------------|
  191. * |Shift | Z| X| C| V| B| N| M| ,| ,| /| RO|Shift |
  192. * |-----------------------------------------------------------|
  193. * |Ctrl |Gui |Alt |MHEN| Space |HENK|KANA|Alt |Gui |Menu|Ctrl|
  194. * `-----------------------------------------------------------'
  195. */
  196. KEYMAP_JIS_COMPACT(
  197. ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSLS,BSPC,
  198. TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,
  199. LCTL,A, S, D, F, G, H, J, K, L, FN0, QUOT,GRV, ENT,
  200. LSFT,Z, X, C, V, B, N, M, COMM,DOT, FN1, RSFT, FN4,
  201. LCTL,LGUI,LALT, LALT,FN5, FN2, FN3, RALT,RGUI,APP, LGUI
  202. ),
  203. /* 1: Mouse keys
  204. * ,-----------------------------------------------------------.
  205. * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Backspa|
  206. * |-----------------------------------------------------------|
  207. * |Tab |MwL|MwU|McU|WwU|WwR|MwL|MwD|MwU|MwR| | | | \|
  208. * |-----------------------------------------------------------|
  209. * |CapsLo| |McL|McD|McR| |McL|McD|McU|McR|Fn0| |Return |
  210. * |-----------------------------------------------------------|
  211. * |Shift |VoD|VoU|Mut|Mb2|Mb3|Mb2|Mb1|VoD|VoU|Mut|Shift |
  212. * |-----------------------------------------------------------|
  213. * |Ctrl |Gui |Alt | Mb1 |Alt |Gui |Menu|Ctrl|
  214. * `-----------------------------------------------------------'
  215. * Mc = mouse cursor, Mw = mouse wheel, Mb = mouse button
  216. * Vo = Volume, Mut = Mute
  217. */
  218. KEYMAP_JIS_COMPACT(
  219. GRV, F1, F2, F3, F4, F5, F6, F7, F8, F8, F10, F11, F12, INS, DEL,
  220. TAB, WH_L,WH_D,MS_U,WH_U,WH_R,WH_L,WH_D,WH_U,WH_R,NO, NO, NO,
  221. LCTL,NO, MS_L,MS_D,MS_R,NO, MS_L,MS_D,MS_U,MS_R,FN0, NO, NO, ENT,
  222. LSFT,NO, NO, BTN1,BTN2,BTN3,BTN2,BTN1,BTN2,BTN3,NO, RSFT, RSFT,
  223. LCTL,LGUI,LALT, LALT,BTN1,FN2, RALT, RALT,RGUI,APP, LGUI
  224. ),
  225. /* 2: Cursor keys
  226. * ,-----------------------------------------------------------.
  227. * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Backspa|
  228. * |-----------------------------------------------------------|
  229. * |Tab |Hom|PgU| Up|PgU|End|Hom|PgD|PgU|End| | | | \|
  230. * |-----------------------------------------------------------|
  231. * |CapsLo| |Lef|Dow|Rig| |Lef|Dow| Up|Rig| | |Return |
  232. * |-----------------------------------------------------------|
  233. * |Shift | | | | | |Hom|PgD|PgU|End|Fn1|Shift |
  234. * |-----------------------------------------------------------|
  235. * |Ctrl |Gui |Alt | Space |Alt |Gui |Menu|Ctrl|
  236. * `-----------------------------------------------------------'
  237. */
  238. KEYMAP_JIS_COMPACT(
  239. GRV, F1, F2, F3, F4, F5, F6, F7, F8, F8, F10, F11, F12, INS, DEL,
  240. TAB, HOME,PGUP,UP, PGDN,END, HOME,PGDN,PGUP,END, NO, NO, NO,
  241. LCTL,HOME,LEFT,DOWN,RGHT,END, LEFT,DOWN,UP, RGHT,NO, NO, NO, ENT,
  242. LSFT,NO, NO, NO, NO, NO, HOME,PGDN,PGUP,END, FN1, RSFT, RSFT,
  243. LCTL,LGUI,LALT, LALT,BTN1,BSPC,FN3, RALT,RGUI,APP, LGUI
  244. ),
  245. /* 3: HHKB Fn layer */
  246. KEYMAP_JIS_COMPACT(
  247. GRV, F1, F2, F3, F4, F5, F6, F7, F8, F8, F10, F11, F12, INS, DEL,
  248. CAPS,NO, NO, NO, NO, NO, NO, NO, PSCR,SLCK,PAUS,UP, NO,
  249. LCTL,VOLD,VOLU,MUTE,NO, NO, NO, NO, HOME,PGUP,LEFT,RGHT,NO, ENT,
  250. LSFT,NO, NO, NO, NO, NO, NO, NO, END, PGDN,DOWN,RSFT, FN4,
  251. LCTL,LGUI,LALT, LALT,SPC, BSPC,NO, RALT,RGUI,APP, LGUI
  252. ),
  253. /* 4: Number */
  254. KEYMAP_JIS_COMPACT(
  255. GRV, F1, F2, F3, F4, F5, F6, F7, F8, F8, F10, F11, F12, INS, DEL,
  256. TAB, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO,
  257. LCTL,1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, ENT,
  258. LSFT,NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, RSFT, RSFT,
  259. LCTL,LGUI,LALT, LALT,FN5, BSPC,NO, RALT,RGUI,APP, LGUI
  260. ),
  261. };
  262. uint8_t keymap_get_keycode(uint8_t layer, uint8_t row, uint8_t col)
  263. {
  264. return pgm_read_byte(&keymaps[(layer)][(row)][(col)]);
  265. }
  266. uint8_t keymap_fn_layer(uint8_t fn_bits)
  267. {
  268. return pgm_read_byte(&fn_layer[biton(fn_bits)]);
  269. }
  270. uint8_t keymap_fn_keycode(uint8_t fn_bits)
  271. {
  272. return pgm_read_byte(&fn_keycode[(biton(fn_bits))]);
  273. }