1// Copyright 2017 The Fuchsia Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#pragma once
6
7// This header contains elements that may be used to construct Human Interface
8// Device (HID) descriptors, as defined by the USB Implementers Forum.
9//
10// The macros defined here expand to comma-separated byte values, and are
11// suitable for use in array definitions.  E.g.
12//
13// // This is a HID Descriptor that defines a Mouse with no buttons and two
14// // relative positional axes.
15// uint8_t hid_descriptor[] = {
16//     HID_USAGE_PAGE(1), // Generic Desktop
17//     HID_USAGE(2),      // Mouse
18//     HID_COLLECTION_APPLICATION,
19//         HID_USAGE(1),  // Pointer
20//         HID_COLLECTION_PHYSICAL,
21//         HID_LOGICAL_MIN(-127),
22//         HID_LOGICAL_MAX(-127),
23//         HID_REPORT_SIZE(8),
24//         HID_REPORT_COUNT(1),
25//         HID_USAGE(0x30), // X
26//         HID_INPUT(0x6), // Data Variable Relative
27//         HID_USAGE(0x31), // Y
28//         HID_INPUT(0x6), // Data Variable Relative
29//         HID_END_COLLECTION,
30//     HID_END_COLLECTION,
31// };
32//
33// Future Work:
34// - Define nice shorthands for the argument to Input/Output/Feature
35// - Define commonly used usage pages and usages
36// - Define units element and commonly used units
37// - Support Long Items
38
39// clang-format off
40#define _HID_LOW8(v) (unsigned char)(v)
41#define _HID_SECOND8(v) (unsigned char)((v) >> 8)
42#define _HID_THIRD8(v) (unsigned char)((v) >> 16)
43#define _HID_HIGH8(v) (unsigned char)((v) >> 24)
44#define _HID_MAIN_VAL(bTag, v) (((bTag) << 4) | 0x1), _HID_LOW8(v)
45#define _HID_MAIN_VAL16(bTag, v) (((bTag) << 4) | 0x2), _HID_LOW8(v), _HID_SECOND8(v)
46
47#define _HID_GLOBAL_VAL(bTag, v) (((bTag) << 4) | 0x5), _HID_LOW8(v)
48#define _HID_GLOBAL_VAL16(bTag, v) (((bTag) << 4) | 0x6), _HID_LOW8(v), _HID_SECOND8(v)
49#define _HID_GLOBAL_VAL32(bTag, v) (((bTag) << 4) | 0x7), _HID_LOW8(v), _HID_SECOND8(v), \
50                                     _HID_THIRD8(v), _HID_HIGH8(v)
51
52#define _HID_LOCAL_VAL(bTag, v) (((bTag) << 4) | 0x9), _HID_LOW8(v)
53#define _HID_LOCAL_VAL16(bTag, v) (((bTag) << 4) | 0xa), _HID_LOW8(v), _HID_SECOND8(v)
54
55// Main HID items
56#define  HID_INPUT(v)        _HID_MAIN_VAL(0x8,    v)
57#define  HID_INPUT16(v)      _HID_MAIN_VAL16(0x8,  v)
58#define  HID_OUTPUT(v)       _HID_MAIN_VAL(0x9,    v)
59#define  HID_OUTPUT16(v)     _HID_MAIN_VAL16(0x9,  v)
60#define  HID_FEATURE(v)      _HID_MAIN_VAL(0xb,    v)
61#define  HID_FEATURE16(v)    _HID_MAIN_VAL16(0xb,  v)
62#define  HID_COLLECTION(v)   _HID_MAIN_VAL(0xa,    v)
63#define  HID_END_COLLECTION  0xc0
64
65#define  HID_COLLECTION_PHYSICAL        HID_COLLECTION(0)
66#define  HID_COLLECTION_APPLICATION     HID_COLLECTION(1)
67#define  HID_COLLECTION_LOGICAL         HID_COLLECTION(2)
68#define  HID_COLLECTION_REPORT          HID_COLLECTION(3)
69#define  HID_COLLECTION_NAMED_ARRAY     HID_COLLECTION(4)
70#define  HID_COLLECTION_USAGE_SWITCH    HID_COLLECTION(5)
71#define  HID_COLLECTION_USAGE_MODIFIER  HID_COLLECTION(6)
72
73// Global HID items
74#define  HID_USAGE_PAGE(v)      _HID_GLOBAL_VAL(0x0,    v)
75#define  HID_USAGE_PAGE16(v)    _HID_GLOBAL_VAL16(0x0,  v)
76#define  HID_LOGICAL_MIN(v)     _HID_GLOBAL_VAL(0x1,    v)
77#define  HID_LOGICAL_MIN16(v)   _HID_GLOBAL_VAL16(0x1,  v)
78#define  HID_LOGICAL_MIN32(v)   _HID_GLOBAL_VAL32(0x1,  v)
79#define  HID_LOGICAL_MAX(v)     _HID_GLOBAL_VAL(0x2,    v)
80#define  HID_LOGICAL_MAX16(v)   _HID_GLOBAL_VAL16(0x2,  v)
81#define  HID_LOGICAL_MAX32(v)   _HID_GLOBAL_VAL32(0x2,  v)
82#define  HID_PHYSICAL_MIN(v)    _HID_GLOBAL_VAL(0x3,    v)
83#define  HID_PHYSICAL_MIN16(v)  _HID_GLOBAL_VAL16(0x3,  v)
84#define  HID_PHYSICAL_MIN32(v)  _HID_GLOBAL_VAL32(0x3,  v)
85#define  HID_PHYSICAL_MAX(v)    _HID_GLOBAL_VAL(0x4,    v)
86#define  HID_PHYSICAL_MAX16(v)  _HID_GLOBAL_VAL16(0x4,  v)
87#define  HID_PHYSICAL_MAX32(v)  _HID_GLOBAL_VAL32(0x4,  v)
88#define  HID_UNIT_EXPONENT(v)   _HID_GLOBAL_VAL(0x5,    (v) & 0xf)
89#define  HID_REPORT_SIZE(v)     _HID_GLOBAL_VAL(0x7,    v)
90#define  HID_REPORT_ID(v)       _HID_GLOBAL_VAL(0x8,    v)
91#define  HID_REPORT_COUNT(v)    _HID_GLOBAL_VAL(0x9,    v)
92#define  HID_PUSH               0xa4
93#define  HID_POP                0xb4
94
95// Local HID items
96#define  HID_USAGE(v)      _HID_LOCAL_VAL(0x0,    v)
97#define  HID_USAGE16(v)    _HID_LOCAL_VAL16(0x0,  v)
98#define  HID_USAGE_MIN(v)  _HID_LOCAL_VAL(0x1,    v)
99#define  HID_USAGE_MAX(v)  _HID_LOCAL_VAL(0x2,    v)
100
101// Input/Output/Feature Items
102#define HID_Data_Arr_Abs  0x00
103#define HID_Const_Arr_Abs 0x01
104#define HID_Data_Var_Abs  0x02
105#define HID_Const_Var_Abs 0x03
106#define HID_Data_Var_Rel  0x06
107
108// Sensor Data
109#define  HID_USAGE_SENSOR_DATA(a,b) a|b
110
111#define  HID_USAGE_SENSOR_DATA_MOD_NONE                          0x00
112#define  HID_USAGE_SENSOR_DATA_MOD_CHANGE_SENSITIVITY_ABS        0x10
113#define  HID_USAGE_SENSOR_DATA_MOD_MAX                           0x20
114#define  HID_USAGE_SENSOR_DATA_MOD_MIN                           0x30
115#define  HID_USAGE_SENSOR_DATA_MOD_ACCURACY                      0x40
116#define  HID_USAGE_SENSOR_DATA_MOD_RESOLUTION                    0x50
117#define  HID_USAGE_SENSOR_DATA_MOD_THRESHOLD_HIGH                0x60
118#define  HID_USAGE_SENSOR_DATA_MOD_THRESHOLD_LOW                 0x70
119#define  HID_USAGE_SENSOR_DATA_MOD_CALIBRATION_OFFSET            0x80
120#define  HID_USAGE_SENSOR_DATA_MOD_CALIBRATION_MULTIPLIER        0x90
121#define  HID_USAGE_SENSOR_DATA_MOD_REPORT_INTERVAL               0xA0
122#define  HID_USAGE_SENSOR_DATA_MOD_FREQUENCY_MAX                 0xB0
123#define  HID_USAGE_SENSOR_DATA_MOD_PERIOD_MAX                    0xC0
124#define  HID_USAGE_SENSOR_DATA_MOD_CHANGE_SENSITIVITY_RANGE_PCT  0xD0
125#define  HID_USAGE_SENSOR_DATA_MOD_CHANGE_SENSITIVITY_REL_PCT    0xE0
126
127// Sensor Units
128#define  HID_SENSOR_UNITS(v)                                 _HID_GLOBAL_VAL(0x6, v)
129#define  HID_SENSOR_UNITS16(v)                               _HID_GLOBAL_VAL16(0x6, v)
130#define  HID_SENSOR_UNITS32(v)                               _HID_GLOBAL_VAL32(0x6, v)
131#define  HID_USAGE_SENSOR_GENERIC_UNITS_NOT_SPECIFIED        HID_SENSOR_UNITS(0)
132#define  HID_USAGE_SENSOR_GENERIC_UNITS_LUX                  HID_SENSOR_UNITS32(0x010000E1)
133#define  HID_USAGE_SENSOR_GENERIC_UNITS_KELVIN               HID_SENSOR_UNITS32(0x00010001)
134#define  HID_USAGE_SENSOR_GENERIC_UNITS_FAHRENHEIT           HID_SENSOR_UNITS32(0x00010003)
135#define  HID_USAGE_SENSOR_GENERIC_UNITS_PASCAL               HID_SENSOR_UNITS16(0xE1F1)
136#define  HID_USAGE_SENSOR_GENERIC_UNITS_NEWTON               HID_SENSOR_UNITS16(0xE111)
137#define  HID_USAGE_SENSOR_GENERIC_UNITS_METERS_PER_SECOND    HID_SENSOR_UNITS16(0xF011)
138#define  HID_USAGE_SENSOR_GENERIC_UNITS_METERS_PER_SEC_SQRD  HID_SENSOR_UNITS16(0xE011)
139#define  HID_USAGE_SENSOR_GENERIC_UNITS_FARAD                HID_SENSOR_UNITS32(0x00204FE1)
140#define  HID_USAGE_SENSOR_GENERIC_UNITS_AMPERE               HID_SENSOR_UNITS32(0x00100001)
141#define  HID_USAGE_SENSOR_GENERIC_UNITS_WATT                 HID_SENSOR_UNITS16(0xD121)
142#define  HID_USAGE_SENSOR_GENERIC_UNITS_HENRY                HID_SENSOR_UNITS32(0x00E0E121)
143#define  HID_USAGE_SENSOR_GENERIC_UNITS_OHM                  HID_SENSOR_UNITS32(0x00E0D121)
144#define  HID_USAGE_SENSOR_GENERIC_UNITS_VOLT                 HID_SENSOR_UNITS32(0x00F0D121)
145#define  HID_USAGE_SENSOR_GENERIC_UNITS_HERTZ                HID_SENSOR_UNITS16(0xF001)
146#define  HID_USAGE_SENSOR_GENERIC_UNITS_DEGREES              HID_SENSOR_UNITS(0x14)
147#define  HID_USAGE_SENSOR_GENERIC_UNITS_DEGREES_PER_SECOND   HID_SENSOR_UNITS16(0xF014)
148#define  HID_USAGE_SENSOR_GENERIC_UNITS_DEGREES_PER_SEC_SQRD HID_SENSOR_UNITS16(0xE014)
149#define  HID_USAGE_SENSOR_GENERIC_UNITS_RADIANS              HID_SENSOR_UNITS(0x12)
150#define  HID_USAGE_SENSOR_GENERIC_UNITS_RADIANS_PER_SECOND   HID_SENSOR_UNITS16(0xF012)
151#define  HID_USAGE_SENSOR_GENERIC_UNITS_RADIANS_PER_SEC_SQRD HID_SENSOR_UNITS16(0xE012)
152#define  HID_USAGE_SENSOR_GENERIC_UNITS_SECOND               HID_SENSOR_UNITS16(0x1001)
153#define  HID_USAGE_SENSOR_GENERIC_UNITS_GAUSS                HID_SENSOR_UNITS32(0x00F0E101)
154#define  HID_USAGE_SENSOR_GENERIC_UNITS_GRAM                 HID_SENSOR_UNITS16(0x0101)
155#define  HID_USAGE_SENSOR_GENERIC_UNITS_CENTIMETER           HID_SENSOR_UNITS(0x11)
156
157// Sensor State
158#define  HID_USAGE_SENSOR_STATE                              HID_USAGE16(0x0201)
159#define  HID_USAGE_SENSOR_STATE_UNKNOWN                      HID_USAGE16(0x0800)
160#define  HID_USAGE_SENSOR_STATE_READY                        HID_USAGE16(0x0801)
161#define  HID_USAGE_SENSOR_STATE_NOT_AVAILABLE                HID_USAGE16(0x0802)
162#define  HID_USAGE_SENSOR_STATE_NO_DATA                      HID_USAGE16(0x0803)
163#define  HID_USAGE_SENSOR_STATE_INITIALIZING                 HID_USAGE16(0x0804)
164#define  HID_USAGE_SENSOR_STATE_ACCESS_DENIED                HID_USAGE16(0x0805)
165#define  HID_USAGE_SENSOR_STATE_ERROR                        HID_USAGE16(0x0806)
166
167#define  HID_USAGE_SENSOR_STATE_UNKNOWN_VAL                  0x00
168#define  HID_USAGE_SENSOR_STATE_READY_VAL                    0x01
169#define  HID_USAGE_SENSOR_STATE_NOT_AVAILABLE_VAL            0x02
170#define  HID_USAGE_SENSOR_STATE_NO_DATA_VAL                  0x03
171#define  HID_USAGE_SENSOR_STATE_INITIALIZING_VAL             0x04
172#define  HID_USAGE_SENSOR_STATE_ACCESS_DENIED_VAL            0x05
173#define  HID_USAGE_SENSOR_STATE_ERROR_VAL                    0x06
174
175// Event Usages
176#define  HID_USAGE_SENSOR_EVENT                                  HID_USAGE16(0x0202)
177
178#define  HID_USAGE_SENSOR_EVENT_UNKNOWN                          HID_USAGE16(0x0810)
179#define  HID_USAGE_SENSOR_EVENT_STATE_CHANGED                    HID_USAGE16(0x0811)
180#define  HID_USAGE_SENSOR_EVENT_PROPERTY_CHANGED                 HID_USAGE16(0x0812)
181#define  HID_USAGE_SENSOR_EVENT_DATA_UPDATED                     HID_USAGE16(0x0813)
182#define  HID_USAGE_SENSOR_EVENT_POLL_RESPONSE                    HID_USAGE16(0x0814)
183#define  HID_USAGE_SENSOR_EVENT_CHANGE_SENSITIVITY               HID_USAGE16(0x0815)
184#define  HID_USAGE_SENSOR_EVENT_MAX_REACHED                      HID_USAGE16(0x0816)
185#define  HID_USAGE_SENSOR_EVENT_MIN_REACHED                      HID_USAGE16(0x0817)
186#define  HID_USAGE_SENSOR_EVENT_HIGH_THRESHOLD_CROSS_UPWARD      HID_USAGE16(0x0818)
187#define  HID_USAGE_SENSOR_EVENT_HIGH_THRESHOLD_CROSS_DOWNWARD    HID_USAGE16(0x0819)
188#define  HID_USAGE_SENSOR_EVENT_LOW_THRESHOLD_CROSS_UPWARD       HID_USAGE16(0x081A)
189#define  HID_USAGE_SENSOR_EVENT_LOW_THRESHOLD_CROSS_DOWNWARD     HID_USAGE16(0x081B)
190#define  HID_USAGE_SENSOR_EVENT_ZERO_THRESHOLD_CROSS_UPWARD      HID_USAGE16(0x081C)
191#define  HID_USAGE_SENSOR_EVENT_ZERO_THRESHOLD_CROSS_DOWNWARD    HID_USAGE16(0x081D)
192#define  HID_USAGE_SENSOR_EVENT_PERIOD_EXCEEDED                  HID_USAGE16(0x081E)
193#define  HID_USAGE_SENSOR_EVENT_FREQUENCY_EXCEEDED               HID_USAGE16(0x081F)
194#define  HID_USAGE_SENSOR_EVENT_COMPLEX_TRIGGER                  HID_USAGE16(0x0820)
195
196#define  HID_USAGE_SENSOR_EVENT_UNKNOWN_VAL                              0x00
197#define  HID_USAGE_SENSOR_EVENT_STATE_CHANGED_VAL                        0x01
198#define  HID_USAGE_SENSOR_EVENT_PROPERTY_CHANGED_VAL                     0x02
199#define  HID_USAGE_SENSOR_EVENT_DATA_UPDATED_VAL                         0x03
200#define  HID_USAGE_SENSOR_EVENT_POLL_RESPONSE_VAL                        0x04
201#define  HID_USAGE_SENSOR_EVENT_CHANGE_SENSITIVITY_VAL                   0x05
202#define  HID_USAGE_SENSOR_EVENT_MAX_REACHED_VAL                          0x06
203#define  HID_USAGE_SENSOR_EVENT_MIN_REACHED_VAL                          0x07
204#define  HID_USAGE_SENSOR_EVENT_HIGH_THRESHOLD_CROSS_UPWARD_VAL          0x08
205#define  HID_USAGE_SENSOR_EVENT_HIGH_THRESHOLD_CROSS_DOWNWARD_VAL        0x09
206#define  HID_USAGE_SENSOR_EVENT_LOW_THRESHOLD_CROSS_UPWARD_VAL           0x0A
207#define  HID_USAGE_SENSOR_EVENT_LOW_THRESHOLD_CROSS_DOWNWARD_VAL         0x0B
208#define  HID_USAGE_SENSOR_EVENT_ZERO_THRESHOLD_CROSS_UPWARD_VAL          0x0C
209#define  HID_USAGE_SENSOR_EVENT_ZERO_THRESHOLD_CROSS_DOWNWARD_VAL        0x0D
210#define  HID_USAGE_SENSOR_EVENT_PERIOD_EXCEEDED_VAL                      0x0E
211#define  HID_USAGE_SENSOR_EVENT_FREQUENCY_EXCEEDED_VAL                   0x0F
212#define  HID_USAGE_SENSOR_EVENT_COMPLEX_TRIGGER_VAL                      0x10
213
214// Property usages
215#define  HID_USAGE_SENSOR_PROPERTY                              HID_USAGE16(0x0300)
216#define  HID_USAGE_SENSOR_PROPERTY_FRIENDLY_NAME                HID_USAGE16(0x0301)
217#define  HID_USAGE_SENSOR_PROPERTY_PERSISTENT_UNIQUE_ID         HID_USAGE16(0x0302)
218#define  HID_USAGE_SENSOR_PROPERTY_SENSOR_STATUS                HID_USAGE16(0x0303)
219#define  HID_USAGE_SENSOR_PROPERTY_MINIMUM_REPORT_INTERVAL      HID_USAGE16(0x0304)
220#define  HID_USAGE_SENSOR_PROPERTY_SENSOR_MANUFACTURER          HID_USAGE16(0x0305)
221#define  HID_USAGE_SENSOR_PROPERTY_SENSOR_MODEL                 HID_USAGE16(0x0306)
222#define  HID_USAGE_SENSOR_PROPERTY_SENSOR_SERIAL_NUMBER         HID_USAGE16(0x0307)
223#define  HID_USAGE_SENSOR_PROPERTY_SENSOR_DESCRIPTION           HID_USAGE16(0x0308)
224#define  HID_USAGE_SENSOR_PROPERTY_SENSOR_CONNECTION_TYPE       HID_USAGE16(0x0309)
225
226#define  HID_USAGE_SENSOR_PROPERTY_SENSOR_DEVICE_PATH                   HID_USAGE16(0x030A)
227#define  HID_USAGE_SENSOR_PROPERTY_HARDWARE_REVISION                    HID_USAGE16(0x030B)
228#define  HID_USAGE_SENSOR_PROPERTY_FIRMWARE_VERSION                     HID_USAGE16(0x030C)
229#define  HID_USAGE_SENSOR_PROPERTY_RELEASE_DATE                         HID_USAGE16(0x030D)
230#define  HID_USAGE_SENSOR_PROPERTY_REPORT_INTERVAL                      HID_USAGE16(0x030E)
231#define  HID_USAGE_SENSOR_PROPERTY_CHANGE_SENSITIVITY_ABS               HID_USAGE16(0x030F)
232#define  HID_USAGE_SENSOR_PROPERTY_CHANGE_SENSITIVITY_RANGE_PCT         HID_USAGE16(0x0310)
233#define  HID_USAGE_SENSOR_PROPERTY_CHANGE_SENSITIVITY_REL_PCT           HID_USAGE16(0x0311)
234#define  HID_USAGE_SENSOR_PROPERTY_ACCURACY                             HID_USAGE16(0x0312)
235#define  HID_USAGE_SENSOR_PROPERTY_RESOLUTION                           HID_USAGE16(0x0313)
236#define  HID_USAGE_SENSOR_PROPERTY_RANGE_MAXIMUM                        HID_USAGE16(0x0314)
237#define  HID_USAGE_SENSOR_PROPERTY_RANGE_MINIMUM                        HID_USAGE16(0x0315)
238#define  HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE                      HID_USAGE16(0x0316)
239
240#define  HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_NO_EVENTS                    HID_USAGE16(0x0840)
241#define  HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_ALL_EVENTS                   HID_USAGE16(0x0841)
242#define  HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_THRESHOLD_EVENTS             HID_USAGE16(0x0842)
243#define  HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_NO_EVENTS_WAKE               HID_USAGE16(0x0843)
244#define  HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_ALL_EVENTS_WAKE              HID_USAGE16(0x0844)
245#define  HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_THRESHOLD_EVENTS_WAKE        HID_USAGE16(0x0845)
246// clang-format on
247