54 #define USB_CLASS_HID 0x03 58 #define USB_HID_SUBCLASS_NONBOOT 0x00 59 #define USB_HID_SUBCLASS_BOOT 0x01 64 #define USB_HID_PROTO_NONBOOT 0x00 65 #define USB_HID_PROTO_KEYBOARD 0x01 66 #define USB_HID_PROTO_MOUSE 0x02 69 #define USB_HID_REPORT_IN 0x01 70 #define USB_HID_REPORT_OUT 0x02 71 #define USB_HID_REPORT_FEATURE 0x03 76 #define USB_HID_GETREPORT 0x01 77 #define USB_HID_GETIDLE 0x02 78 #define USB_HID_GETPROTOCOL 0x03 79 #define USB_HID_SETREPORT 0x09 80 #define USB_HID_SETIDLE 0x0A 81 #define USB_HID_SETPROTOCOL 0x0B 86 #define USB_DTYPE_HID 0x21 87 #define USB_DTYPE_HID_REPORT 0x22 92 #define USB_HID_COUNTRY_NONE 0 93 #define USB_HID_COUNTRY_AR 1 94 #define USB_HID_COUNTRY_BE 2 95 #define USB_HID_COUNTRY_CA_BI 3 96 #define USB_HID_COUNTRY_CA_FR 4 97 #define USB_HID_COUNTRY_CZ 5 98 #define USB_HID_COUNTRY_DK 6 99 #define USB_HID_COUNTRY_FI 7 100 #define USB_HID_COUNTRY_FR 8 101 #define USB_HID_COUNTRY_DE 9 102 #define USB_HID_COUNTRY_GR 10 103 #define USB_HID_COUNTRY_HEB 11 104 #define USB_HID_COUNTRY_HU 12 105 #define USB_HID_COUNTRY_ISO 13 106 #define USB_HID_COUNTRY_IT 14 107 #define USB_HID_COUNTRY_JP 15 108 #define USB_HID_COUNTRY_KR 16 109 #define USB_HID_COUNTRY_LAT 17 110 #define USB_HID_COUNTRY_NL 18 111 #define USB_HID_COUNTRY_NO 19 112 #define USB_HID_COUNTRY_PER 20 113 #define USB_HID_COUNTRY_PL 21 114 #define USB_HID_COUNTRY_PO 22 115 #define USB_HID_COUNTRY_RU 23 116 #define USB_HID_COUNTRY_SK 24 117 #define USB_HID_COUNTRY_ES 25 118 #define USB_HID_COUNTRY_SE 26 119 #define USB_HID_COUNTRY_CH_FR 26 120 #define USB_HID_COUNTRY_CH_DE 27 121 #define USB_HID_COUNTRY_CH 29 122 #define USB_HID_COUNTRY_TW 30 123 #define USB_HID_COUNTRY_TR_Q 31 124 #define USB_HID_COUNTRY_UK 32 125 #define USB_HID_COUNTRY_US 33 126 #define USB_HID_COUNTRY_YU 34 127 #define USB_HID_COUNTRY_TR_F 35 132 #define HID_PHYSICAL_COLLECTION 0x00 133 #define HID_APPLICATION_COLLECTION 0x01 135 #define HID_LOGICAL_COLLECTION 0x02 136 #define HID_REPORT_COLLECTION 0x03 137 #define HID_NARY_COLLECTION 0x04 139 #define HID_USAGE_SWITCH_COLLECTION 0x05 140 #define HID_USAGE_MODIFIER_COLLECTION 0x06 145 struct usb_hid_descriptor { 147 uint8_t bDescriptorType;
149 uint8_t bCountryCode;
150 uint8_t bNumDescriptors;
151 uint8_t bDescriptorType0;
152 uint16_t wDescriptorLength0;
153 } __attribute__((packed));
162 } __attribute__((packed));
167 uint16_t wDescriptorLength;
168 } __attribute__((packed));
171 #define DECLARE_USB_HID_DESCRIPTOR(p) \ 172 struct usb_hid_descriptor_##p { \ 174 uint8_t bDescriptorType; \ 176 uint8_t bCountryCode; \ 177 uint8_t bNumDescriptors; \ 178 struct usb_hid_report_descriptor report[p]; \ 179 } __attribute__((packed)); 183 #if !defined(__DOXYGEN__) 185 #define CONCAT(x, y) x ## y 186 #define CONCAT_EXPANDED(x, y) CONCAT(x, y) 187 #define HID_RI_DATA_SIZE_MASK 0x03 188 #define HID_RI_TYPE_MASK 0x0C 189 #define HID_RI_TAG_MASK 0xF0 190 #define HID_RI_TYPE_MAIN 0x00 191 #define HID_RI_TYPE_GLOBAL 0x04 192 #define HID_RI_TYPE_LOCAL 0x08 193 #define HID_RI_DATA_BITS_0 0x00 194 #define HID_RI_DATA_BITS_8 0x01 195 #define HID_RI_DATA_BITS_16 0x02 196 #define HID_RI_DATA_BITS_32 0x03 197 #define HID_RI_DATA_BITS(DataBits) CONCAT_EXPANDED(HID_RI_DATA_BITS_, DataBits) 198 #define _HID_RI_ENCODE_0(Data) 199 #define _HID_RI_ENCODE_8(Data) , (Data & 0xFF) 200 #define _HID_RI_ENCODE_16(Data) _HID_RI_ENCODE_8(Data) _HID_RI_ENCODE_8(Data >> 8) 201 #define _HID_RI_ENCODE_32(Data) _HID_RI_ENCODE_16(Data) _HID_RI_ENCODE_16(Data >> 16) 202 #define _HID_RI_ENCODE(DataBits, ...) CONCAT_EXPANDED(_HID_RI_ENCODE_, DataBits(__VA_ARGS__)) 203 #define _HID_RI_ENTRY(Type, Tag, DataBits, ...) (Type | Tag | HID_RI_DATA_BITS(DataBits)) _HID_RI_ENCODE(DataBits, (__VA_ARGS__)) 209 #define HID_IOF_CONSTANT (1 << 0) 210 #define HID_IOF_DATA (0 << 0) 211 #define HID_IOF_VARIABLE (1 << 1) 212 #define HID_IOF_ARRAY (0 << 1) 213 #define HID_IOF_RELATIVE (1 << 2) 214 #define HID_IOF_ABSOLUTE (0 << 2) 215 #define HID_IOF_WRAP (1 << 3) 216 #define HID_IOF_NO_WRAP (0 << 3) 217 #define HID_IOF_NON_LINEAR (1 << 4) 218 #define HID_IOF_LINEAR (0 << 4) 219 #define HID_IOF_NO_PREFERRED_STATE (1 << 5) 220 #define HID_IOF_PREFERRED_STATE (0 << 5) 222 #define HID_IOF_NULLSTATE (1 << 6) 223 #define HID_IOF_NO_NULL_POSITION (0 << 6) 224 #define HID_IOF_VOLATILE (1 << 7) 225 #define HID_IOF_NON_VOLATILE (0 << 7) 226 #define HID_IOF_BUFFERED_BYTES (1 << 8) 227 #define HID_IOF_BITFIELD (0 << 8) 233 #define HID_RI_INPUT(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_MAIN , 0x80, DataBits, __VA_ARGS__) 235 #define HID_RI_OUTPUT(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_MAIN , 0x90, DataBits, __VA_ARGS__) 237 #define HID_RI_COLLECTION(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_MAIN , 0xA0, DataBits, __VA_ARGS__) 239 #define HID_RI_FEATURE(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_MAIN , 0xB0, DataBits, __VA_ARGS__) 241 #define HID_RI_END_COLLECTION(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_MAIN , 0xC0, DataBits, __VA_ARGS__) 246 #define HID_RI_USAGE_PAGE(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_GLOBAL, 0x00, DataBits, __VA_ARGS__) 248 #define HID_RI_LOGICAL_MINIMUM(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_GLOBAL, 0x10, DataBits, __VA_ARGS__) 250 #define HID_RI_LOGICAL_MAXIMUM(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_GLOBAL, 0x20, DataBits, __VA_ARGS__) 252 #define HID_RI_PHYSICAL_MINIMUM(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_GLOBAL, 0x30, DataBits, __VA_ARGS__) 254 #define HID_RI_PHYSICAL_MAXIMUM(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_GLOBAL, 0x40, DataBits, __VA_ARGS__) 258 #define HID_RI_UNIT_EXPONENT(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_GLOBAL, 0x50, DataBits, __VA_ARGS__) 260 #define HID_RI_UNIT(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_GLOBAL, 0x60, DataBits, __VA_ARGS__) 262 #define HID_RI_REPORT_SIZE(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_GLOBAL, 0x70, DataBits, __VA_ARGS__) 264 #define HID_RI_REPORT_ID(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_GLOBAL, 0x80, DataBits, __VA_ARGS__) 266 #define HID_RI_REPORT_COUNT(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_GLOBAL, 0x90, DataBits, __VA_ARGS__) 268 #define HID_RI_PUSH(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_GLOBAL, 0xA0, DataBits, __VA_ARGS__) 270 #define HID_RI_POP(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_GLOBAL, 0xB0, DataBits, __VA_ARGS__) 275 #define HID_RI_USAGE(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_LOCAL , 0x00, DataBits, __VA_ARGS__) 277 #define HID_RI_USAGE_MINIMUM(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_LOCAL , 0x10, DataBits, __VA_ARGS__) 279 #define HID_RI_USAGE_MAXIMUM(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_LOCAL , 0x20, DataBits, __VA_ARGS__) 281 #define HID_RI_DESIGNATOR_INDEX(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_LOCAL , 0x30, DataBits, __VA_ARGS__) 283 #define HID_RI_DESIGNATOR_MIN(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_LOCAL , 0x40, DataBits, __VA_ARGS__) 285 #define HID_RI_DESIGNATOR_MAX(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_LOCAL , 0x50, DataBits, __VA_ARGS__) 287 #define HID_RI_STRING_INDEX(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_LOCAL , 0x70, DataBits, __VA_ARGS__) 289 #define HID_RI_STRING_MINIMUM(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_LOCAL , 0x80, DataBits, __VA_ARGS__) 291 #define HID_RI_STRING_MAXIMUM(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_LOCAL , 0x90, DataBits, __VA_ARGS__) 293 #define HID_RI_DELIMITER(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_LOCAL , 0xA0, DataBits, __VA_ARGS__) 297 #define HID_INPUT(data) HID_RI_INPUT(8, data) 298 #define HID_OUTPUT(data) HID_RI_OUTPUT(8, data) 299 #define HID_COLLECTION(data) HID_RI_COLLECTION(8, data) 300 #define HID_FEATURE(data) HID_RI_FEATURE(8, data) 301 #define HID_END_COLLECTION HID_RI_END_COLLECTION(0) 302 #define HID_USAGE_PAGE(data) HID_RI_USAGE_PAGE(8, data) 303 #define HID_LOGICAL_MINIMUM(data) HID_RI_LOGICAL_MINIMUM(8, data) 304 #define HID_LOGICAL_MAXIMUM(data) HID_RI_LOGICAL_MAXIMUM(8, data) 305 #define HID_PHYSICAL_MINIMUM(data) HID_RI_PHYSICAL_MINIMUM(16, data) 306 #define HID_PHYSICAL_MAXIMUM(data) HID_RI_PHYSICAL_MAXIMUM(16, data) 307 #define HID_UNIT_EXPONENT(data) HID_RI_UNIT_EXPONENT(8, data) 308 #define HID_UNIT(bits, data) HID_RI_UNIT(bits, data) 309 #define HID_REPORT_SIZE(data) HID_RI_REPORT_SIZE(8, data) 310 #define HID_REPORT_ID(data) HID_RI_REPORT_ID(8, data) 311 #define HID_REPORT_COUNT(data) HID_RI_REPORT_COUNT(8, data) 312 #define HID_PUSH HID_RI_PUSH(0) 313 #define HID_POP HID_RI_POP(0) 314 #define HID_USAGE(data) HID_RI_USAGE(8, data) 315 #define HID_USAGE_MINIMUM(data) HID_RI_USAGE_MINIMUM(8, data) 316 #define HID_USAGE_MAXIMUM(data) HID_RI_USAGE_MAXIMUM(8, data) 322 #define HID_UNIT_NONE 0x00 323 #define HID_UNIT_CGS_LINEAR 0x01 324 #define HID_UNIT_CGS_ROTATION 0x02 325 #define HID_UNIT_IMPERIAL_LINEAR 0x03 326 #define HID_UNIT_IMPERIAL_ROTATION 0x04 327 #define HID_UNIT_LENGTH(exp) ((exp & 0x0F) << 4) 328 #define HID_UNIT_ANGLE(exp) ((exp & 0x0F) << 4) 329 #define HID_UNIT_MASS(exp) ((exp & 0x0F) << 8) 330 #define HID_UNIT_TIME(exp) ((exp & 0x0F) << 12) 331 #define HID_UNIT_TEMPERATURE(exp) ((exp & 0x0F) << 16) 332 #define HID_UNIT_CURRENT(exp) ((exp & 0x0F) << 20) 333 #define HID_UNIT_LUMINOUS(exp) ((exp & 0x0F) << 24) 339 #define HID_UNIT_METER(exp) \ 340 HID_UNIT(8, HID_UNIT_CGS_LINEAR | HID_UNIT_LENGTH(1)), \ 341 HID_UNIT_EXPONENT(exp + 2) 343 #define HID_UNIT_KG(exp) \ 344 HID_UNIT(16, HID_UNIT_CGS_LINEAR | HID_UNIT_MASS(1), \ 345 HID_UNIT_EXPONENT(exp + 3) 347 #define HID_UNIT_SECOND(exp) \ 348 HID_UNIT(16, HID_UNIT_CGS_LINEAR | HID_UNIT_TIME(1), \ 349 HID_UNIT_EXPONENT(exp + 0) 351 #define HID_UNIT_MPS(exp) \ 352 HID_UNIT(16, HID_UNIT_CGS_LINEAR | HID_UNIT_LENGTH(1) | HID_UNIT_TIME(-1)), \ 353 HID_UNIT_EXPONENT(exp + 2) 355 #define HID_UNIT_MPS2(exp) \ 356 HID_UNIT(16, HID_UNIT_CGS_LINEAR | HID_UNIT_LENGTH(1) | HID_UNIT_TIME(-2)), \ 357 HID_UNIT_EXPONENT(exp + 2) 359 #define HID_UNIT_NEWTON(exp) \ 360 HID_UNIT(16, HID_UNIT_CGS_LINEAR | HID_UNIT_MASS(1) | HID_UNIT_LENGTH(1) | HID_UNIT_TIME(-2)), \ 361 HID_UNIT_EXPONENT(exp + 5) 363 #define HID_UNIT_JOULE(exp) \ 364 HID_UNIT(16, HID_UNIT_CGS_LINEAR | HID_UNIT_MASS(1) | HID_UNIT_LENGTH(2) | HID_UNIT_TIME(-2)), \ 365 HID_UNIT_EXPONENT(exp + 7) 367 #define HID_UNIT_WATT(exp) \ 368 HID_UNIT(16, HID_UNIT_CGS_LINEAR | HID_UNIT_MASS(1) | HID_UNIT_LENGTH(2) | HID_UNIT_TIME(-3)), \ 369 HID_UNIT_EXPONENT(exp + 7) 371 #define HID_UNIT_PASCAL(exp) \ 372 HID_UNIT(16, HID_UNIT_CGS_LINEAR | HID_UNIT_MASS(1) | HID_UNIT_LENGTH(-1) | HID_UNIT_TIME(-2)), \ 373 HID_UNIT_EXPONENT(exp + 1) 375 #define HID_UNIT_HERTZ(exp) \ 376 HID_UNIT(16, HID_UNIT_CGS_LINEAR | HID_UNIT_TIME(-1)), \ 377 HID_UNIT_EXPONENT(exp + 0) 379 #define HID_UNIT_AMPERE(exp) \ 380 HID_UNIT(32, HID_UNIT_CGS_LINEAR | HID_UNIT_CURRENT(1)), \ 381 HID_UNIT_EXPONENT(exp) 383 #define HID_UNIT_VOLT(exp) \ 384 HID_UNIT(32, HID_UNIT_CGS_LINEAR | HID_UNIT_MASS(1) | HID_UNIT_LENGTH(2) | HID_UNIT_TIME(-3) | HID_UNIT_CURRENT(-1)), \ 385 HID_UNIT_EXPONENT(exp + 7) 387 #define HID_UNIT_OHM(exp) \ 388 HID_UNIT(32, HID_UNIT_CGS_LINEAR | HID_UNIT_MASS(1) | HID_UNIT_LENGTH(2) | HID_UNIT_TIME(-3) | HID_UNIT_CURRENT(-2)), \ 389 HID_UNIT_EXPONENT(exp + 7) 391 #define HID_UNIT_HENRY(exp) \ 392 HID_UNIT(32, HID_UNIT_CGS_LINEAR | HID_UNIT_MASS(1) | HID_UNIT_LENGTH(2) | HID_UNIT_TIME(-2) | HID_UNIT_CURRENT(-2)), \ 393 HID_UNIT_EXPONENT(exp + 7) 395 #define HID_UNIT_FARAD(exp) \ 396 HID_UNIT(32, HID_UNIT_CGS_LINEAR | HID_UNIT_MASS(-1) | HID_UNIT_LENGTH(-2) | HID_UNIT_TIME(4) | HID_UNIT_CURRENT(2)), \ 397 HID_UNIT_EXPONENT(exp - 7) 399 #define HID_UNIT_COULOMB(exp) \ 400 HID_UNIT(32, HID_UNIT_CGS_LINEAR | HID_UNIT_TIME(1) | HID_UNIT_CURRENT(1)), \ 401 HID_UNIT_EXPONENT(exp) 403 #define HID_UNIT_TESLA(exp) \ 404 HID_UNIT(32, HID_UNIT_CGS_LINEAR | HID_UNIT_MASS(1) | HID_UNIT_TIME(-2) | HID_UNIT_CURRENT(-1)), \ 405 HID_UNIT_EXPONENT(exp) 407 #define HID_UNIT_LUX(exp) \ 408 HID_UNIT(32, HID_UNIT_CGS_LINEAR | HID_UNIT_LENGTH(-1) | HID_UNIT_LUMINOUS(1)), \ 409 HID_UNIT_EXPONENT(exp) uint8_t bLength
Size of the descriptor, in bytes.
uint16_t bcdHID
BCD encoded version that the HID descriptor and device complies to.
USB HID report descriptor.
uint8_t bNumDescriptors
Total number of HID report descriptors for the interface.
uint8_t bDescriptorType
Type of the descriptor, set to USB_DTYPE_HID.
USB HID functional descriptor header.
uint8_t bCountryCode
Country code of the localized device, or zero if universal.