furi_hal_usb_hid.h 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350
  1. #pragma once
  2. /** HID keyboard key codes */
  3. enum HidKeyboardKeys {
  4. KEY_NONE = 0x00,
  5. KEY_ERROR_ROLLOVER = 0x01,
  6. KEY_POST_FAIL = 0x02,
  7. KEY_ERROR_UNDEFINED = 0x03,
  8. KEY_A = 0x04,
  9. KEY_B = 0x05,
  10. KEY_C = 0x06,
  11. KEY_D = 0x07,
  12. KEY_E = 0x08,
  13. KEY_F = 0x09,
  14. KEY_G = 0x0A,
  15. KEY_H = 0x0B,
  16. KEY_I = 0x0C,
  17. KEY_J = 0x0D,
  18. KEY_K = 0x0E,
  19. KEY_L = 0x0F,
  20. KEY_M = 0x10,
  21. KEY_N = 0x11,
  22. KEY_O = 0x12,
  23. KEY_P = 0x13,
  24. KEY_Q = 0x14,
  25. KEY_R = 0x15,
  26. KEY_S = 0x16,
  27. KEY_T = 0x17,
  28. KEY_U = 0x18,
  29. KEY_V = 0x19,
  30. KEY_W = 0x1A,
  31. KEY_X = 0x1B,
  32. KEY_Y = 0x1C,
  33. KEY_Z = 0x1D,
  34. KEY_1 = 0x1E,
  35. KEY_2 = 0x1F,
  36. KEY_3 = 0x20,
  37. KEY_4 = 0x21,
  38. KEY_5 = 0x22,
  39. KEY_6 = 0x23,
  40. KEY_7 = 0x24,
  41. KEY_8 = 0x25,
  42. KEY_9 = 0x26,
  43. KEY_0 = 0x27,
  44. KEY_ENTER = 0x28,
  45. KEY_ESC = 0x29,
  46. KEY_BACKSPACE = 0x2A,
  47. KEY_TAB = 0x2B,
  48. KEY_SPACE = 0x2C,
  49. KEY_MINUS = 0x2D,
  50. KEY_EQUAL = 0x2E,
  51. KEY_LEFT_BRACE = 0x2F,
  52. KEY_RIGHT_BRACE = 0x30,
  53. KEY_BACKSLASH = 0x31,
  54. KEY_NON_US_NUM = 0x32,
  55. KEY_SEMICOLON = 0x33,
  56. KEY_QUOTE = 0x34,
  57. KEY_TILDE = 0x35,
  58. KEY_COMMA = 0x36,
  59. KEY_PERIOD = 0x37,
  60. KEY_SLASH = 0x38,
  61. KEY_CAPS_LOCK = 0x39,
  62. KEY_F1 = 0x3A,
  63. KEY_F2 = 0x3B,
  64. KEY_F3 = 0x3C,
  65. KEY_F4 = 0x3D,
  66. KEY_F5 = 0x3E,
  67. KEY_F6 = 0x3F,
  68. KEY_F7 = 0x40,
  69. KEY_F8 = 0x41,
  70. KEY_F9 = 0x42,
  71. KEY_F10 = 0x43,
  72. KEY_F11 = 0x44,
  73. KEY_F12 = 0x45,
  74. KEY_PRINT = 0x46,
  75. KEY_SCROLL_LOCK = 0x47,
  76. KEY_PAUSE = 0x48,
  77. KEY_INSERT = 0x49,
  78. KEY_HOME = 0x4A,
  79. KEY_PAGE_UP = 0x4B,
  80. KEY_DELETE = 0x4C,
  81. KEY_END = 0x4D,
  82. KEY_PAGE_DOWN = 0x4E,
  83. KEY_RIGHT_ARROW = 0x4F,
  84. KEY_LEFT_ARROW = 0x50,
  85. KEY_DOWN_ARROW = 0x51,
  86. KEY_UP_ARROW = 0x52,
  87. KEY_NUM_LOCK = 0x53,
  88. KEYPAD_DIVIDE = 0x54,
  89. KEYPAD_MULTIPLY = 0x55,
  90. KEYPAD_SUBTRACT = 0x56,
  91. KEYPAD_ADD = 0x57,
  92. KEYPAD_ENTER = 0x58,
  93. KEYPAD_1 = 0x59,
  94. KEYPAD_2 = 0x5A,
  95. KEYPAD_3 = 0x5B,
  96. KEYPAD_4 = 0x5C,
  97. KEYPAD_5 = 0x5D,
  98. KEYPAD_6 = 0x5E,
  99. KEYPAD_7 = 0x5F,
  100. KEYPAD_8 = 0x60,
  101. KEYPAD_9 = 0x61,
  102. KEYPAD_0 = 0x62,
  103. KEYPAD_DOT = 0x63,
  104. KEY_NON_US = 0x64,
  105. KEY_APPLICATION = 0x65,
  106. };
  107. /** HID keyboard modifier keys */
  108. enum HidKeyboardMods {
  109. KEY_MOD_LEFT_CTRL = (1 << 8),
  110. KEY_MOD_LEFT_SHIFT = (1 << 9),
  111. KEY_MOD_LEFT_ALT = (1 << 10),
  112. KEY_MOD_LEFT_GUI = (1 << 11),
  113. KEY_MOD_RIGHT_CTRL = (1 << 12),
  114. KEY_MOD_RIGHT_SHIFT = (1 << 13),
  115. KEY_MOD_RIGHT_ALT = (1 << 14),
  116. KEY_MOD_RIGHT_GUI = (1 << 15),
  117. };
  118. /** ASCII to keycode conversion table */
  119. static const uint16_t hid_asciimap[] = {
  120. KEY_NONE, // NUL
  121. KEY_NONE, // SOH
  122. KEY_NONE, // STX
  123. KEY_NONE, // ETX
  124. KEY_NONE, // EOT
  125. KEY_NONE, // ENQ
  126. KEY_NONE, // ACK
  127. KEY_NONE, // BEL
  128. KEY_BACKSPACE, // BS Backspace
  129. KEY_TAB, // TAB Tab
  130. KEY_ENTER, // LF Enter
  131. KEY_NONE, // VT
  132. KEY_NONE, // FF
  133. KEY_NONE, // CR
  134. KEY_NONE, // SO
  135. KEY_NONE, // SI
  136. KEY_NONE, // DEL
  137. KEY_NONE, // DC1
  138. KEY_NONE, // DC2
  139. KEY_NONE, // DC3
  140. KEY_NONE, // DC4
  141. KEY_NONE, // NAK
  142. KEY_NONE, // SYN
  143. KEY_NONE, // ETB
  144. KEY_NONE, // CAN
  145. KEY_NONE, // EM
  146. KEY_NONE, // SUB
  147. KEY_NONE, // ESC
  148. KEY_NONE, // FS
  149. KEY_NONE, // GS
  150. KEY_NONE, // RS
  151. KEY_NONE, // US
  152. KEY_SPACE, // ' ' Space
  153. KEY_1 | KEY_MOD_LEFT_SHIFT, // !
  154. KEY_QUOTE | KEY_MOD_LEFT_SHIFT, // "
  155. KEY_3 | KEY_MOD_LEFT_SHIFT, // #
  156. KEY_4 | KEY_MOD_LEFT_SHIFT, // $
  157. KEY_5 | KEY_MOD_LEFT_SHIFT, // %
  158. KEY_7 | KEY_MOD_LEFT_SHIFT, // &
  159. KEY_QUOTE, // '
  160. KEY_9 | KEY_MOD_LEFT_SHIFT, // (
  161. KEY_0 | KEY_MOD_LEFT_SHIFT, // )
  162. KEY_8 | KEY_MOD_LEFT_SHIFT, // *
  163. KEY_EQUAL | KEY_MOD_LEFT_SHIFT, // +
  164. KEY_COMMA, // ,
  165. KEY_MINUS, // -
  166. KEY_PERIOD, // .
  167. KEY_SLASH, // /
  168. KEY_0, // 0
  169. KEY_1, // 1
  170. KEY_2, // 2
  171. KEY_3, // 3
  172. KEY_4, // 4
  173. KEY_5, // 5
  174. KEY_6, // 6
  175. KEY_7, // 7
  176. KEY_8, // 8
  177. KEY_9, // 9
  178. KEY_SEMICOLON | KEY_MOD_LEFT_SHIFT, // :
  179. KEY_SEMICOLON, // ;
  180. KEY_COMMA | KEY_MOD_LEFT_SHIFT, // <
  181. KEY_EQUAL, // =
  182. KEY_PERIOD | KEY_MOD_LEFT_SHIFT, // >
  183. KEY_SLASH | KEY_MOD_LEFT_SHIFT, // ?
  184. KEY_2 | KEY_MOD_LEFT_SHIFT, // @
  185. KEY_A | KEY_MOD_LEFT_SHIFT, // A
  186. KEY_B | KEY_MOD_LEFT_SHIFT, // B
  187. KEY_C | KEY_MOD_LEFT_SHIFT, // C
  188. KEY_D | KEY_MOD_LEFT_SHIFT, // D
  189. KEY_E | KEY_MOD_LEFT_SHIFT, // E
  190. KEY_F | KEY_MOD_LEFT_SHIFT, // F
  191. KEY_G | KEY_MOD_LEFT_SHIFT, // G
  192. KEY_H | KEY_MOD_LEFT_SHIFT, // H
  193. KEY_I | KEY_MOD_LEFT_SHIFT, // I
  194. KEY_J | KEY_MOD_LEFT_SHIFT, // J
  195. KEY_K | KEY_MOD_LEFT_SHIFT, // K
  196. KEY_L | KEY_MOD_LEFT_SHIFT, // L
  197. KEY_M | KEY_MOD_LEFT_SHIFT, // M
  198. KEY_N | KEY_MOD_LEFT_SHIFT, // N
  199. KEY_O | KEY_MOD_LEFT_SHIFT, // O
  200. KEY_P | KEY_MOD_LEFT_SHIFT, // P
  201. KEY_Q | KEY_MOD_LEFT_SHIFT, // Q
  202. KEY_R | KEY_MOD_LEFT_SHIFT, // R
  203. KEY_S | KEY_MOD_LEFT_SHIFT, // S
  204. KEY_T | KEY_MOD_LEFT_SHIFT, // T
  205. KEY_U | KEY_MOD_LEFT_SHIFT, // U
  206. KEY_V | KEY_MOD_LEFT_SHIFT, // V
  207. KEY_W | KEY_MOD_LEFT_SHIFT, // W
  208. KEY_X | KEY_MOD_LEFT_SHIFT, // X
  209. KEY_Y | KEY_MOD_LEFT_SHIFT, // Y
  210. KEY_Z | KEY_MOD_LEFT_SHIFT, // Z
  211. KEY_LEFT_BRACE, // [
  212. KEY_BACKSLASH, // bslash
  213. KEY_RIGHT_BRACE, // ]
  214. KEY_6 | KEY_MOD_LEFT_SHIFT, // ^
  215. KEY_MINUS | KEY_MOD_LEFT_SHIFT, // _
  216. KEY_TILDE, // `
  217. KEY_A, // a
  218. KEY_B, // b
  219. KEY_C, // c
  220. KEY_D, // d
  221. KEY_E, // e
  222. KEY_F, // f
  223. KEY_G, // g
  224. KEY_H, // h
  225. KEY_I, // i
  226. KEY_J, // j
  227. KEY_K, // k
  228. KEY_L, // l
  229. KEY_M, // m
  230. KEY_N, // n
  231. KEY_O, // o
  232. KEY_P, // p
  233. KEY_Q, // q
  234. KEY_R, // r
  235. KEY_S, // s
  236. KEY_T, // t
  237. KEY_U, // u
  238. KEY_V, // v
  239. KEY_W, // w
  240. KEY_X, // x
  241. KEY_Y, // y
  242. KEY_Z, // z
  243. KEY_LEFT_BRACE | KEY_MOD_LEFT_SHIFT, // {
  244. KEY_BACKSLASH | KEY_MOD_LEFT_SHIFT, // |
  245. KEY_RIGHT_BRACE | KEY_MOD_LEFT_SHIFT, // }
  246. KEY_TILDE | KEY_MOD_LEFT_SHIFT, // ~
  247. KEY_NONE, // DEL
  248. };
  249. typedef struct {
  250. uint32_t vid;
  251. uint32_t pid;
  252. char manuf[32];
  253. char product[32];
  254. } FuriHalUsbHidConfig;
  255. typedef void (*HidStateCallback)(bool state, void* context);
  256. /** ASCII to keycode conversion macro */
  257. #define HID_ASCII_TO_KEY(x) (((uint8_t)x < 128) ? (hid_asciimap[(uint8_t)x]) : KEY_NONE)
  258. /** HID keyboard leds */
  259. enum HidKeyboardLeds {
  260. HID_KB_LED_NUM = (1 << 0),
  261. HID_KB_LED_CAPS = (1 << 1),
  262. HID_KB_LED_SCROLL = (1 << 2),
  263. };
  264. /** HID mouse buttons */
  265. enum HidMouseButtons {
  266. HID_MOUSE_BTN_LEFT = (1 << 0),
  267. HID_MOUSE_BTN_RIGHT = (1 << 1),
  268. HID_MOUSE_BTN_WHEEL = (1 << 2),
  269. };
  270. /** Get USB HID connection state
  271. *
  272. * @return true / false
  273. */
  274. bool furi_hal_hid_is_connected();
  275. /** Get USB HID keyboard leds state
  276. *
  277. * @return leds state
  278. */
  279. uint8_t furi_hal_hid_get_led_state();
  280. /** Set USB HID connect/disconnect callback
  281. *
  282. * @param cb callback
  283. * @param ctx callback context
  284. */
  285. void furi_hal_hid_set_state_callback(HidStateCallback cb, void* ctx);
  286. /** Set the following key to pressed state and send HID report
  287. *
  288. * @param button key code
  289. */
  290. bool furi_hal_hid_kb_press(uint16_t button);
  291. /** Set the following key to released state and send HID report
  292. *
  293. * @param button key code
  294. */
  295. bool furi_hal_hid_kb_release(uint16_t button);
  296. /** Clear all pressed keys and send HID report
  297. *
  298. */
  299. bool furi_hal_hid_kb_release_all();
  300. /** Set mouse movement and send HID report
  301. *
  302. * @param dx x coordinate delta
  303. * @param dy y coordinate delta
  304. */
  305. bool furi_hal_hid_mouse_move(int8_t dx, int8_t dy);
  306. /** Set mouse button to pressed state and send HID report
  307. *
  308. * @param button key code
  309. */
  310. bool furi_hal_hid_mouse_press(uint8_t button);
  311. /** Set mouse button to released state and send HID report
  312. *
  313. * @param button key code
  314. */
  315. bool furi_hal_hid_mouse_release(uint8_t button);
  316. /** Set mouse wheel position and send HID report
  317. *
  318. * @param delta number of scroll steps
  319. */
  320. bool furi_hal_hid_mouse_scroll(int8_t delta);
  321. /** Set the following consumer key to pressed state and send HID report
  322. *
  323. * @param button key code
  324. */
  325. bool furi_hal_hid_consumer_key_press(uint16_t button);
  326. /** Set the following consumer key to released state and send HID report
  327. *
  328. * @param button key code
  329. */
  330. bool furi_hal_hid_consumer_key_release(uint16_t button);