M471M/R1/S BSP V3.01.000
The Board Support Package for M4521
usbh_hid.h
Go to the documentation of this file.
1/**************************************************************************/
8#ifndef _USBH_HID_H_
9#define _USBH_HID_H_
10
11#include "NuMicro.h"
12#include "usb.h"
13
14#ifdef __cplusplus
15extern "C"
16{
17#endif
18
20
21#define ENABLE_ERR_MSG 1
22#define ENABLE_DBG_MSG 0
23
24#if ENABLE_ERR_MSG
25#define HID_ERRMSG printf
26#else
27#define HID_ERRMSG(...)
28#endif
29
30#if ENABLE_DBG_MSG
31#define HID_DBGMSG printf
32#else
33#define HID_DBGMSG(...)
34#endif
35
37
38
51#define CONFIG_HID_MAX_DEV 4
52#define CONFIG_HID_DEV_MAX_PIPE 8
55
56#define HID_DESCRIPTOR_TYPE 0x21
57#define REPORT_DESCRIPTOR_TYPE 0x22
58
59#define HID_SUBCLASS_BOOT_DEVICE 0x01
61#define HID_PROTOCOL_KEYBOARD 0x01
62#define HID_PROTOCOL_MOUSE 0x02
64/*-----------------------------------------------------------------------------------
65 * Short Item Tags
66 */
67
68/* Main item tag (tag & 0xFC) */
69#define TAG_INPUT 0x80
70#define TAG_OUTPUT 0x90
71#define TAG_FEATURE 0xB0
72#define TAG_COLLECTION 0xA0
73#define TAG_END_COLLECTION 0xC0
74
75
76/* Global item tag (tag & 0xFC) */
77#define TAG_USAGE_PAGE 0x04
78#define TAG_LOGICAL_MIN 0x14
79#define TAG_LOGICAL_MAX 0x24
80#define TAG_PHYSICAL_MIN 0x34
81#define TAG_PHYSICAL_MAX 0x44
82#define TAG_UNIT_EXPONENT 0x54
83#define TAG_UNIT 0x64
84#define TAG_REPORT_SIZE 0x74
85#define TAG_REPORT_ID 0x84
86#define TAG_REPORT_COUNT 0x94
87#define TAG_PUSH 0xA4
88#define TAG_POP 0xB4
89
90/* Local item tag (tag & 0xFC) */
91#define TAG_USAGE 0x08
92#define TAG_USAGE_MIN 0x18
93#define TAG_USAGE_MAX 0x28
94#define TAG_DESIGNATOR_INDEX 0x38
95#define TAG_DESIGNATOR_MIN 0x48
96#define TAG_DESIGNATOR_MAX 0x58
97#define TAG_STRING_INDEX 0x78
98#define TAG_STRING_MIN 0x88
99#define TAG_STRING_MAX 0x98
100#define TAG_DELIMITER 0xA8
101
102/* Collection */
103#define COLLECT_PHYSICAL 0x00 /* group of axes */
104#define COLLECT_APPLICATION 0x01 /* mouse, keyboard */
105#define COLLECT_LOGICAL 0x02 /* interrelated data */
106#define COLLECT_VENDOR 0xFF /* 0x80-0xFF Vendor-defined */
107
108/*-----------------------------------------------------------------------------------
109 * Usage Page
110 */
111#define UP_GENERIC_DESKTOP 0x01
112#define UP_SIMULATION_CONTROLS 0x02
113#define UP_VR_CONTROLS 0x03
114#define UP_SPORT_CONTROLS 0x04
115#define UP_GAME_CONTROLS 0x05
116#define UP_KEYCODE 0x07
117#define UP_LEDS 0x08
118#define UP_BUTTON 0x09
119#define UP_ORDINAL 0x0A
120#define UP_TELEPHONY 0x0B
121#define UP_CONSUMER 0x0C
122#define UP_DIGITIZER 0x0D
123#define UP_PID_PAGE 0x0F
124#define UP_UNICODE 0x10
125#define UP_BARCODE_SCANNER 0x8C
126
127/* Usage ID of Generic Desktop Page */
128#define USAGE_ID_POINTER 0x01
129#define USAGE_ID_MOUSE 0x02
130#define USAGE_ID_JOYSTICK 0x04
131#define USAGE_ID_GAMEPAD 0x05
132#define USAGE_ID_KEYBOARD 0x06
133#define USAGE_ID_KEYPAD 0x07
134#define USAGE_ID_X 0x30
135#define USAGE_ID_Y 0x31
136#define USAGE_ID_Z 0x32
137#define USAGE_ID_WHEEL 0x38
138
139#define KEYCODE_CAPS_LOCK 0x39
140#define KEYCODE_SCROLL_LOCK 0x47
141#define KEYCODE_NUM_LOCK 0x53
142
143#define STATE_MASK_NUM_LOCK 0x01
144#define STATE_MASK_CAPS_LOCK 0x02
145#define STATE_MASK_SCROLL_LOCK 0x04
146
148
149
151#define USB_DT_HID (REQ_TYPE_CLASS_DEV | 0x01)
152#define USB_DT_REPORT (REQ_TYPE_CLASS_DEV | 0x02)
154
155#define HID_REPORT_GET 0x01
156#define HID_GET_IDLE 0x02
157#define HID_GET_PROTOCOL 0x03
158#define HID_REPORT_SET 0x09
159#define HID_SET_IDLE 0x0A
160#define HID_SET_PROTOCOL 0x0B
162/* HID Report type */
163#define RT_INPUT 1
164#define RT_OUTPUT 2
165#define RT_FEATURE 3 /* end of group USBH_EXPORTED_CONSTANTS */
169
170
176/*
177 * HID Descriptor
178 */
179#ifdef __ICCARM__
180typedef struct hid_descriptor
181{
182 __packed uint8_t bLength;
183 __packed uint8_t bDescriptorType;
184 __packed uint16_t bcdHID;
185 __packed uint8_t bCountryCode;
186 __packed uint8_t bNumDescriptors;
187 __packed uint8_t bRPDescType;
188 __packed uint16_t wDescriptorLength;
189} DESC_HID_T;
190#else
191typedef struct __attribute__((__packed__)) hid_descriptor
192{
193 uint8_t bLength;
194 uint8_t bDescriptorType;
195 uint16_t bcdHID;
196 uint8_t bCountryCode;
197 uint8_t bNumDescriptors;
198 uint8_t bRPDescType;
199 uint16_t wDescriptorLength;
200} DESC_HID_T;
201#endif
202
203typedef struct report_info
204{
205 uint8_t type; /* TAG_INPUT, TAG_OUTPUT, or TAG_FEATURE */
206 uint8_t usage_page;
207 uint8_t app_usage;
208 uint8_t data_usage;
209 signed int usage_mim;
210 signed int usage_max;
211 signed int logical_min;
212 signed int logical_max;
213 signed int physical_min;
214 signed int physical_max;
215 signed int unit_exponent;
216 signed int unit;
217 signed int designator_index;
218 signed int designator_min;
219 signed int designator_max;
220 signed int string_index;
221 signed int string_min;
222 signed int string_max;
223 uint8_t report_id;
224 uint8_t report_size;
225 uint8_t report_count;
226 struct
227 {
228 uint32_t constant:1; /* {Data (0) | Constant (1)} */
229 uint32_t variable:1; /* {Array (0) | Variable (1)} */
230 uint32_t relative:1; /* {Absolute (0) | Relative (1)} */
231 uint32_t wrap:1; /* {No Wrap (0) | Wrap (1)} */
232 uint32_t non_linear:1; /* {Linear (0) | Non Linear (1)} */
233 uint32_t no_preferred:1; /* {Preferred State (0) | No Preferred (1)} */
234 uint32_t null_state:1; /* {No Null position (0) | Null state(1)} */
235 uint32_t is_volatile:1; /* {Non Volatile (0) | Volatile (1)} */
236 uint32_t buffered_bytes:1; /* {Bit Field (0) | Buffered Bytes (1)} */
237 uint32_t reserved:23; /* Reserved (0) */
238 } status;
239 struct report_info *next;
240} RP_INFO_T;
241
242static uint8_t _designator_index, _designator_min, _designator_max;
243static uint8_t _string_index, _string_max, _string_min;
244
245
246typedef struct rp_desc_info
247{
248 uint8_t has_report_id; /* If a Report ID tag is used anywhere in Report descriptor, all data reports for the device are preceded by a single byte ID field. */
249 uint8_t last_pressed_lock_keys; /* Recording the key-press state of last time (for keyboard) */
250 uint8_t lock_state;
251 char utr_led_idle; /* recording if the utr_led is in idle or not */
252 UTR_T *utr_led; /* UTR for LED control */
253 RP_INFO_T *report;
254} RPD_T;
255
257
258
259/*---------------------------------------------------------------------------------------------*/
260/* HID device */
261/*---------------------------------------------------------------------------------------------*/
263typedef struct usbhid_dev
264{
265 uint16_t idVendor;
266 uint16_t idProduct;
273 void *iface;
274 uint32_t uid;
275 RPD_T rpd;
276 struct usbhid_dev *next;
279/*---------------------------------------------------------------------------------------------*/
280/* HID keyboard event. */
281/* HID driver delivers the keyboarde event to user application via callback function. */
282/*---------------------------------------------------------------------------------------------*/
285{
286 uint8_t lock_state;
287 uint8_t modifier;
288 uint8_t keycode[6];
289 uint8_t key_cnt;
291
292/*---------------------------------------------------------------------------------------------*/
293/* HID mouse event. */
294/* HID driver delivers the mouse event to user application via callback function. */
295/*---------------------------------------------------------------------------------------------*/
297typedef struct usbhid_mouse_event
298{
301 uint8_t button_cnt;
302 uint32_t button_map;
303 signed int axis_min;
304 signed int axis_max;
305 signed int X;
306 signed int Y;
307 signed int wheel_min;
308 signed int wheel_max;
309 signed int wheel;
311
312typedef void (HID_MOUSE_FUNC)(struct usbhid_dev *hdev, MOUSE_EVENT_T *mouse);
313typedef void (HID_KEYBOARD_FUNC)(struct usbhid_dev *hdev, KEYBOARD_EVENT_T *kbd); /* end of group USBH_EXPORTED_STRUCTURES */
316
317
324
326int hid_parse_report_descriptor(HID_DEV_T *hdev, IFACE_T *iface);
327int hid_parse_keyboard_reports(HID_DEV_T *hdev, uint8_t *data, int data_len);
328int hid_parse_mouse_reports(HID_DEV_T *hdev, uint8_t *data, int data_len);
329int32_t usbh_hid_set_report_non_blocking(HID_DEV_T *hdev, int rtp_typ, int rtp_id, uint8_t *data, int len);
331 /* end of group USBH_EXPORTED_FUNCTIONS */
333 /* end of group USBH_Library */
335 /* end of group Library */
337
338#ifdef __cplusplus
339}
340#endif
341
342#endif /* _USBH_HID_H_ */
343
344
345
void *__dso_handle __attribute__((weak))
Definition: _syscalls.c:35
NuMicro peripheral access layer header file.
#define CONFIG_HID_DEV_MAX_PIPE
Definition: usbh_hid.h:52
signed int wheel_min
Definition: usbh_hid.h:307
HID_IW_FUNC * write_func
Definition: usbh_hid.h:270
void * iface
Definition: usbh_hid.h:273
signed int Y
Definition: usbh_hid.h:306
uint8_t keycode[6]
Definition: usbh_hid.h:288
RPD_T rpd
Definition: usbh_hid.h:275
uint32_t button_map
Definition: usbh_hid.h:302
uint8_t button_cnt
Definition: usbh_hid.h:301
void usbh_hid_regitser_mouse_callback(HID_MOUSE_FUNC *func)
Register the mouse event callback function to HID class driver. Any mouse reports will be sent to use...
Definition: hid_core.c:761
HID_IR_FUNC * read_func
Definition: usbh_hid.h:269
uint16_t idVendor
Definition: usbh_hid.h:265
void usbh_hid_regitser_keyboard_callback(HID_KEYBOARD_FUNC *func)
Register the keyboard event callback function to HID class driver. Any keyboard reports will be sent ...
Definition: hid_core.c:773
struct usbhid_dev * next
Definition: usbh_hid.h:276
uint8_t wheel_relative
Definition: usbh_hid.h:300
uint32_t uid
Definition: usbh_hid.h:274
UTR_T * out_utr_list
Definition: usbh_hid.h:272
signed int wheel
Definition: usbh_hid.h:309
uint8_t bProtocolCode
Definition: usbh_hid.h:268
signed int axis_min
Definition: usbh_hid.h:303
UTR_T * utr_list[CONFIG_HID_DEV_MAX_PIPE]
Definition: usbh_hid.h:271
uint16_t idProduct
Definition: usbh_hid.h:266
signed int wheel_max
Definition: usbh_hid.h:308
uint8_t axis_relative
Definition: usbh_hid.h:299
signed int axis_max
Definition: usbh_hid.h:304
uint8_t bSubClassCode
Definition: usbh_hid.h:267
signed int X
Definition: usbh_hid.h:305
void() HID_KEYBOARD_FUNC(struct usbhid_dev *hdev, KEYBOARD_EVENT_T *kbd)
Definition: usbh_hid.h:313
void() HID_MOUSE_FUNC(struct usbhid_dev *hdev, MOUSE_EVENT_T *mouse)
Definition: usbh_hid.h:312
HIDDEN_SYMBOLS struct usbhid_dev HID_DEV_T
struct usbhid_mouse_event MOUSE_EVENT_T
struct usbhid_keyboard_event KEYBOARD_EVENT_T
void() HID_IR_FUNC(struct usbhid_dev *hdev, uint16_t ep_addr, int status, uint8_t *rdata, uint32_t data_len)
Definition: usbh_lib.h:122
void() HID_IW_FUNC(struct usbhid_dev *hdev, uint16_t ep_addr, int status, uint8_t *wbuff, uint32_t *data_len)
Definition: usbh_lib.h:123
USB Host library header file.