Loading...
Searching...
No Matches
furi_hal_usb_hid.h
1#pragma once
2#include "hid_usage_desktop.h"
3#include "hid_usage_button.h"
4#include "hid_usage_keyboard.h"
5#include "hid_usage_consumer.h"
6#include "hid_usage_led.h"
7
8#ifdef __cplusplus
9extern "C" {
10#endif
11
12#define HID_MANUF_PRODUCT_NAME_LEN 32
13
14#define HID_VID_DEFAULT 0x046D
15#define HID_PID_DEFAULT 0xC529
16
18#define HID_KB_MAX_KEYS 6
20#define HID_CONSUMER_MAX_KEYS 2
21
23#define HID_CONSUMER_BRIGHTNESS_INCREMENT 0x006F
24#define HID_CONSUMER_BRIGHTNESS_DECREMENT 0x0070
25#define HID_CONSUMER_FN_GLOBE 0x029D
26
27#define HID_KEYBOARD_NONE 0x00
28
30enum HidKeyboardMods {
31 KEY_MOD_LEFT_CTRL = (1 << 8),
32 KEY_MOD_LEFT_SHIFT = (1 << 9),
33 KEY_MOD_LEFT_ALT = (1 << 10),
34 KEY_MOD_LEFT_GUI = (1 << 11),
35 KEY_MOD_RIGHT_CTRL = (1 << 12),
36 KEY_MOD_RIGHT_SHIFT = (1 << 13),
37 KEY_MOD_RIGHT_ALT = (1 << 14),
38 KEY_MOD_RIGHT_GUI = (1 << 15),
39};
40
42static const uint16_t hid_asciimap[] = {
43 HID_KEYBOARD_NONE, // NUL
44 HID_KEYBOARD_NONE, // SOH
45 HID_KEYBOARD_NONE, // STX
46 HID_KEYBOARD_NONE, // ETX
47 HID_KEYBOARD_NONE, // EOT
48 HID_KEYBOARD_NONE, // ENQ
49 HID_KEYBOARD_NONE, // ACK
50 HID_KEYBOARD_NONE, // BEL
51 HID_KEYBOARD_DELETE, // BS Backspace
52 HID_KEYBOARD_TAB, // TAB Tab
53 HID_KEYBOARD_RETURN, // LF Enter
54 HID_KEYBOARD_NONE, // VT
55 HID_KEYBOARD_NONE, // FF
56 HID_KEYBOARD_NONE, // CR
57 HID_KEYBOARD_NONE, // SO
58 HID_KEYBOARD_NONE, // SI
59 HID_KEYBOARD_NONE, // DEL
60 HID_KEYBOARD_NONE, // DC1
61 HID_KEYBOARD_NONE, // DC2
62 HID_KEYBOARD_NONE, // DC3
63 HID_KEYBOARD_NONE, // DC4
64 HID_KEYBOARD_NONE, // NAK
65 HID_KEYBOARD_NONE, // SYN
66 HID_KEYBOARD_NONE, // ETB
67 HID_KEYBOARD_NONE, // CAN
68 HID_KEYBOARD_NONE, // EM
69 HID_KEYBOARD_NONE, // SUB
70 HID_KEYBOARD_NONE, // ESC
71 HID_KEYBOARD_NONE, // FS
72 HID_KEYBOARD_NONE, // GS
73 HID_KEYBOARD_NONE, // RS
74 HID_KEYBOARD_NONE, // US
75 HID_KEYBOARD_SPACEBAR, // ' ' Space
76 HID_KEYBOARD_1 | KEY_MOD_LEFT_SHIFT, // !
77 HID_KEYBOARD_APOSTROPHE | KEY_MOD_LEFT_SHIFT, // "
78 HID_KEYBOARD_3 | KEY_MOD_LEFT_SHIFT, // #
79 HID_KEYBOARD_4 | KEY_MOD_LEFT_SHIFT, // $
80 HID_KEYBOARD_5 | KEY_MOD_LEFT_SHIFT, // %
81 HID_KEYBOARD_7 | KEY_MOD_LEFT_SHIFT, // &
82 HID_KEYBOARD_APOSTROPHE, // '
83 HID_KEYBOARD_9 | KEY_MOD_LEFT_SHIFT, // (
84 HID_KEYBOARD_0 | KEY_MOD_LEFT_SHIFT, // )
85 HID_KEYBOARD_8 | KEY_MOD_LEFT_SHIFT, // *
86 HID_KEYBOARD_EQUAL_SIGN | KEY_MOD_LEFT_SHIFT, // +
87 HID_KEYBOARD_COMMA, // ,
88 HID_KEYBOARD_MINUS, // -
89 HID_KEYBOARD_DOT, // .
90 HID_KEYBOARD_SLASH, // /
91 HID_KEYBOARD_0, // 0
92 HID_KEYBOARD_1, // 1
93 HID_KEYBOARD_2, // 2
94 HID_KEYBOARD_3, // 3
95 HID_KEYBOARD_4, // 4
96 HID_KEYBOARD_5, // 5
97 HID_KEYBOARD_6, // 6
98 HID_KEYBOARD_7, // 7
99 HID_KEYBOARD_8, // 8
100 HID_KEYBOARD_9, // 9
101 HID_KEYBOARD_SEMICOLON | KEY_MOD_LEFT_SHIFT, // :
102 HID_KEYBOARD_SEMICOLON, // ;
103 HID_KEYBOARD_COMMA | KEY_MOD_LEFT_SHIFT, // <
104 HID_KEYBOARD_EQUAL_SIGN, // =
105 HID_KEYBOARD_DOT | KEY_MOD_LEFT_SHIFT, // >
106 HID_KEYBOARD_SLASH | KEY_MOD_LEFT_SHIFT, // ?
107 HID_KEYBOARD_2 | KEY_MOD_LEFT_SHIFT, // @
108 HID_KEYBOARD_A | KEY_MOD_LEFT_SHIFT, // A
109 HID_KEYBOARD_B | KEY_MOD_LEFT_SHIFT, // B
110 HID_KEYBOARD_C | KEY_MOD_LEFT_SHIFT, // C
111 HID_KEYBOARD_D | KEY_MOD_LEFT_SHIFT, // D
112 HID_KEYBOARD_E | KEY_MOD_LEFT_SHIFT, // E
113 HID_KEYBOARD_F | KEY_MOD_LEFT_SHIFT, // F
114 HID_KEYBOARD_G | KEY_MOD_LEFT_SHIFT, // G
115 HID_KEYBOARD_H | KEY_MOD_LEFT_SHIFT, // H
116 HID_KEYBOARD_I | KEY_MOD_LEFT_SHIFT, // I
117 HID_KEYBOARD_J | KEY_MOD_LEFT_SHIFT, // J
118 HID_KEYBOARD_K | KEY_MOD_LEFT_SHIFT, // K
119 HID_KEYBOARD_L | KEY_MOD_LEFT_SHIFT, // L
120 HID_KEYBOARD_M | KEY_MOD_LEFT_SHIFT, // M
121 HID_KEYBOARD_N | KEY_MOD_LEFT_SHIFT, // N
122 HID_KEYBOARD_O | KEY_MOD_LEFT_SHIFT, // O
123 HID_KEYBOARD_P | KEY_MOD_LEFT_SHIFT, // P
124 HID_KEYBOARD_Q | KEY_MOD_LEFT_SHIFT, // Q
125 HID_KEYBOARD_R | KEY_MOD_LEFT_SHIFT, // R
126 HID_KEYBOARD_S | KEY_MOD_LEFT_SHIFT, // S
127 HID_KEYBOARD_T | KEY_MOD_LEFT_SHIFT, // T
128 HID_KEYBOARD_U | KEY_MOD_LEFT_SHIFT, // U
129 HID_KEYBOARD_V | KEY_MOD_LEFT_SHIFT, // V
130 HID_KEYBOARD_W | KEY_MOD_LEFT_SHIFT, // W
131 HID_KEYBOARD_X | KEY_MOD_LEFT_SHIFT, // X
132 HID_KEYBOARD_Y | KEY_MOD_LEFT_SHIFT, // Y
133 HID_KEYBOARD_Z | KEY_MOD_LEFT_SHIFT, // Z
134 HID_KEYBOARD_OPEN_BRACKET, // [
135 HID_KEYBOARD_BACKSLASH, // bslash
136 HID_KEYBOARD_CLOSE_BRACKET, // ]
137 HID_KEYBOARD_6 | KEY_MOD_LEFT_SHIFT, // ^
138 HID_KEYBOARD_MINUS | KEY_MOD_LEFT_SHIFT, // _
139 HID_KEYBOARD_GRAVE_ACCENT, // `
140 HID_KEYBOARD_A, // a
141 HID_KEYBOARD_B, // b
142 HID_KEYBOARD_C, // c
143 HID_KEYBOARD_D, // d
144 HID_KEYBOARD_E, // e
145 HID_KEYBOARD_F, // f
146 HID_KEYBOARD_G, // g
147 HID_KEYBOARD_H, // h
148 HID_KEYBOARD_I, // i
149 HID_KEYBOARD_J, // j
150 HID_KEYBOARD_K, // k
151 HID_KEYBOARD_L, // l
152 HID_KEYBOARD_M, // m
153 HID_KEYBOARD_N, // n
154 HID_KEYBOARD_O, // o
155 HID_KEYBOARD_P, // p
156 HID_KEYBOARD_Q, // q
157 HID_KEYBOARD_R, // r
158 HID_KEYBOARD_S, // s
159 HID_KEYBOARD_T, // t
160 HID_KEYBOARD_U, // u
161 HID_KEYBOARD_V, // v
162 HID_KEYBOARD_W, // w
163 HID_KEYBOARD_X, // x
164 HID_KEYBOARD_Y, // y
165 HID_KEYBOARD_Z, // z
166 HID_KEYBOARD_OPEN_BRACKET | KEY_MOD_LEFT_SHIFT, // {
167 HID_KEYBOARD_BACKSLASH | KEY_MOD_LEFT_SHIFT, // |
168 HID_KEYBOARD_CLOSE_BRACKET | KEY_MOD_LEFT_SHIFT, // }
169 HID_KEYBOARD_GRAVE_ACCENT | KEY_MOD_LEFT_SHIFT, // ~
170 HID_KEYBOARD_NONE, // DEL
171};
172
173typedef struct {
174 // Note: vid/pid should be uint16_t and are treated as such
175 uint32_t vid;
176 uint32_t pid;
177 char manuf[HID_MANUF_PRODUCT_NAME_LEN];
178 char product[HID_MANUF_PRODUCT_NAME_LEN];
180
181typedef void (*HidStateCallback)(bool state, void* context);
182
184#define HID_ASCII_TO_KEY(x) (((uint8_t)x < 128) ? (hid_asciimap[(uint8_t)x]) : HID_KEYBOARD_NONE)
185
187enum HidKeyboardLeds {
188 HID_KB_LED_NUM = (1 << 0),
189 HID_KB_LED_CAPS = (1 << 1),
190 HID_KB_LED_SCROLL = (1 << 2),
191};
192
194enum HidMouseButtons {
195 HID_MOUSE_BTN_LEFT = (1 << 0),
196 HID_MOUSE_BTN_RIGHT = (1 << 1),
197 HID_MOUSE_BTN_WHEEL = (1 << 2),
198};
199
204bool furi_hal_hid_is_connected(void);
205
210uint8_t furi_hal_hid_get_led_state(void);
211
217void furi_hal_hid_set_state_callback(HidStateCallback cb, void* ctx);
218
223bool furi_hal_hid_kb_press(uint16_t button);
224
229bool furi_hal_hid_kb_release(uint16_t button);
230
234bool furi_hal_hid_kb_release_all(void);
235
241bool furi_hal_hid_mouse_move(int8_t dx, int8_t dy);
242
247bool furi_hal_hid_mouse_press(uint8_t button);
248
253bool furi_hal_hid_mouse_release(uint8_t button);
254
259bool furi_hal_hid_mouse_scroll(int8_t delta);
260
265bool furi_hal_hid_consumer_key_press(uint16_t button);
266
271bool furi_hal_hid_consumer_key_release(uint16_t button);
272
276bool furi_hal_hid_consumer_key_release_all(void);
277
278#ifdef __cplusplus
279}
280#endif
Definition furi_hal_usb_hid.h:173