hid.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2021 Nils Ollrogge
3  *
4  * This file is subject to the terms and conditions of the GNU Lesser General
5  * Public License v2.1. See the file LICENSE in the top level directory for
6  * more details.
7  */
8 
9 #pragma once
10 
24 #include <stdint.h>
25 
26 #include "usb/hid/hid_usage.h"
27 
28 #ifdef __cplusplus
29 extern "C" {
30 #endif
31 
35 #define USB_TYPE_DESCRIPTOR_HID 0x21
36 
40 #define USB_HID_VERSION_BCD 0x0110
41 
46 #define USB_HID_SUBCLASS_NONE 0x0
47 #define USB_HID_SUBCLASS_BOOT 0x1
54 #define USB_HID_PROTOCOL_NONE 0x0
55 #define USB_HID_PROTOCOL_KEYBOARD 0x1
56 #define USB_HID_PROTOCOL_MOUSE 0x2
63 #define USB_HID_DESCR_HID 0x21
64 #define USB_HID_DESCR_REPORT 0x22
65 #define USB_HID_DESCR_PHYSICAL 0x23
71 #define USB_HID_COUNTRY_CODE_NOTSUPPORTED 0x00
72 
77 #define USB_HID_REQUEST_GET_REPORT 0x01
78 #define USB_HID_REQUEST_GET_IDLE 0x02
79 #define USB_HID_REQUEST_GET_PROTOCOL 0x03
80 #define USB_HID_REQUEST_SET_REPORT 0x09
81 #define USB_HID_REQUEST_SET_IDLE 0x0a
82 #define USB_HID_REQUEST_SET_PROTOCOL 0x0b
88 #define USBUS_HID_EP_IN_REQUIRED_NUMOF 1
89 
93 #define USBUS_HID_EP_OUT_REQUIRED_NUMOF 1
94 
100 typedef struct __attribute__((packed)){
101  uint8_t length;
103  uint8_t desc_type;
106  uint16_t bcd_hid;
108  uint8_t country_code;
110  uint8_t num_descrs;
113  uint8_t report_type;
114  uint16_t report_length;
116 
128 #define USB_HID_ITEM_TYPE_MAIN 0x0
129 
133 #define USB_HID_ITEM_TYPE_GLOBAL 0x1
134 
138 #define USB_HID_ITEM_TYPE_LOCAL 0x2
139 
143 #define USB_HID_ITEM_TAG_INPUT 0x8
144 
148 #define USB_HID_ITEM_TAG_OUTPUT 0x9
149 
153 #define USB_HID_ITEM_TAG_COLLECTION 0xA
154 
158 #define USB_HID_ITEM_TAG_FEATURE 0xB
159 
163 #define USB_HID_ITEM_TAG_COLLECTION_END 0xC
164 
168 #define USB_HID_ITEM_TAG_USAGE_PAGE 0x0
172 #define USB_HID_ITEM_TAG_LOGICAL_MIN 0x1
173 
177 #define USB_HID_ITEM_TAG_LOGICAL_MAX 0x2
178 
182 #define USB_HID_ITEM_TAG_PHYSICAL_MIN 0x3
183 
187 #define USB_HID_ITEM_TAG_PHYSICAL_MAX 0x4
188 
192 #define USB_HID_ITEM_TAG_UNIT_EXPONENT 0x5
193 
197 #define USB_HID_ITEM_TAG_UNIT 0x6
198 
202 #define USB_HID_ITEM_TAG_REPORT_SIZE 0x7
203 
207 #define USB_HID_ITEM_TAG_REPORT_ID 0x8
208 
212 #define USB_HID_ITEM_TAG_REPORT_COUNT 0x9
213 
217 #define USB_HID_ITEM_TAG_USAGE 0x0
218 
222 #define USB_HID_ITEM_TAG_USAGE_MIN 0x1
223 
227 #define USB_HID_ITEM_TAG_USAGE_MAX 0x2
228 
232 #define USB_HID_COLLECTION_PHYSICAL 0x00
233 
237 #define USB_HID_COLLECTION_APPLICATION 0x01
238 
242 #define USB_HID_COLLECTION_LOGICAL 0x02
243 
247 #define USB_HID_COLLECTION_REPORT 0x03
248 
252 #define USB_HID_COLLECTION_NAMED_ARRAY 0x04
253 
257 #define USB_HID_COLLECTION_USAGE_SWITCH 0x05
258 
262 #define USB_HID_COLLECTION_USAGE_MOD 0x06
263 
271 #define USB_HID_ITEM(tag, type, size) \
272  (((tag & 0xF) << 4) | ((type & 0x3) << 2) | (size & 0x3))
273 
281 #define USB_HID_INPUT(input) \
282  USB_HID_ITEM(USB_HID_ITEM_TAG_INPUT, USB_HID_ITEM_TYPE_MAIN, 1), \
283  input
284 
292 #define USB_HID_OUTPUT(output) \
293  USB_HID_ITEM(USB_HID_ITEM_TAG_OUTPUT, USB_HID_ITEM_TYPE_MAIN, 1), \
294  output
295 
303 #define USB_HID_FEATURE(feature) \
304  USB_HID_ITEM(USB_HID_ITEM_TAG_FEATURE, USB_HID_ITEM_TYPE_MAIN, 1), \
305  feature
306 
314 #define USB_HID_COLLECTION(collection) \
315  USB_HID_ITEM(USB_HID_ITEM_TAG_COLLECTION, USB_HID_ITEM_TYPE_MAIN, 1), \
316  collection
317 
321 #define USB_HID_END_COLLECTION \
322  USB_HID_ITEM(USB_HID_ITEM_TAG_COLLECTION_END, USB_HID_ITEM_TYPE_MAIN, 0)
323 
331 #define USB_HID_USAGE_PAGE(page) \
332  USB_HID_ITEM(USB_HID_ITEM_TAG_USAGE_PAGE, USB_HID_ITEM_TYPE_GLOBAL, 1), \
333  page
334 
342 #define USB_HID_USAGE_PAGE16(page) \
343  USB_HID_ITEM(USB_HID_ITEM_TAG_USAGE_PAGE, USB_HID_ITEM_TYPE_GLOBAL, 2), \
344  page & 0xff, (page >> 8)
345 
353 #define USB_HID_LOGICAL_MIN8(minimum) \
354  USB_HID_ITEM(USB_HID_ITEM_TAG_LOGICAL_MIN, USB_HID_ITEM_TYPE_GLOBAL, 1), \
355  minimum
356 
364 #define USB_HID_LOGICAL_MIN16(minimum) \
365  USB_HID_ITEM(USB_HID_ITEM_TAG_LOGICAL_MIN, USB_HID_ITEM_TYPE_GLOBAL, 2), \
366  minimum & 0xff, (minimum >> 8)
367 
375 #define USB_HID_LOGICAL_MIN32(minimum) \
376  USB_HID_ITEM(USB_HID_ITEM_TAG_LOGICAL_MIN, USB_HID_ITEM_TYPE_GLOBAL, 3), \
377  minimum & 0xff, \
378  (minimum >> 8) & 0xff, \
379  (minimum >> 16) & 0xff, \
380  (minimum >> 24) & 0xff
381 
389 #define USB_HID_LOGICAL_MAX8(maximum) \
390  USB_HID_ITEM(USB_HID_ITEM_TAG_LOGICAL_MAX, USB_HID_ITEM_TYPE_GLOBAL, 1), \
391  maximum
392 
400 #define USB_HID_LOGICAL_MAX16(maximum) \
401  USB_HID_ITEM(USB_HID_ITEM_TAG_LOGICAL_MAX, USB_HID_ITEM_TYPE_GLOBAL, 2), \
402  (maximum & 0xff), (maximum >> 8)
403 
411 #define USB_HID_LOGICAL_MAX32(maximum) \
412  USB_HID_ITEM(USB_HID_ITEM_TAG_LOGICAL_MAX, USB_HID_ITEM_TYPE_GLOBAL, 3), \
413  maximum & 0xff, \
414  (maximum >> 8) & 0xff, \
415  (maximum >> 16) & 0xff, \
416  (maximum >> 24) & 0xff
417 
425 #define USB_HID_REPORT_SIZE(size) \
426  USB_HID_ITEM(USB_HID_ITEM_TAG_REPORT_SIZE, USB_HID_ITEM_TYPE_GLOBAL, 1), \
427  size
428 
436 #define USB_HID_REPORT_ID(id) \
437  USB_HID_ITEM(USB_HID_ITEM_TAG_REPORT_ID, USB_HID_ITEM_TYPE_GLOBAL, 1), \
438  id
439 
447 #define USB_HID_REPORT_COUNT(count) \
448  USB_HID_ITEM(USB_HID_ITEM_TAG_REPORT_COUNT, USB_HID_ITEM_TYPE_GLOBAL, 1), \
449  count
450 
458 #define USB_HID_USAGE(index) \
459  USB_HID_ITEM(USB_HID_ITEM_TAG_USAGE, USB_HID_ITEM_TYPE_LOCAL, 1), \
460  index
461 
469 #define USB_HID_USAGE_MIN8(start) \
470  USB_HID_ITEM(USB_HID_ITEM_TAG_USAGE_MIN, USB_HID_ITEM_TYPE_LOCAL, 1), \
471  start
472 
480 #define USB_HID_USAGE_MIN16(start) \
481  USB_HID_ITEM(USB_HID_ITEM_TAG_USAGE_MIN, USB_HID_ITEM_TYPE_LOCAL, 2), \
482  start & 0xff, (start >> 8) & 0xff
483 
491 #define USB_HID_USAGE_MAX8(end) \
492  USB_HID_ITEM(USB_HID_ITEM_TAG_USAGE_MAX, USB_HID_ITEM_TYPE_LOCAL, 1), \
493  end
494 
502 #define USB_HID_USAGE_MAX16(end) \
503  USB_HID_ITEM(USB_HID_ITEM_TAG_USAGE_MAX, USB_HID_ITEM_TYPE_LOCAL, 2), \
504  end & 0xff, (end >> 8) & 0xff
505 
508 #ifdef __cplusplus
509 }
510 #endif
511 
Definition for USB HID usage tables.
USB HID descriptor struct.
Definition: hid.h:100
uint8_t report_type
Type of HID class report.
Definition: hid.h:113
uint8_t country_code
Numeric expression identifying country code of the localized hardware.
Definition: hid.h:108
uint16_t report_length
the total size of the Report descriptor.
Definition: hid.h:114
uint8_t desc_type
Constant name specifying type of HID descriptor.
Definition: hid.h:103
uint8_t length
Numeric expression that is the total size of the HID descriptor.
Definition: hid.h:101
uint16_t bcd_hid
Numeric expression identifying the HID Class Specification release.
Definition: hid.h:106
uint8_t num_descrs
Numeric expression specifying the number of class descriptors.
Definition: hid.h:110