Remove outdated known issue from the Known Issues list of the documentation.
[pub/USBasp.git] / LUFA / Drivers / USB / Class / Common / HIDClassCommon.h
1 /*
2 LUFA Library
3 Copyright (C) Dean Camera, 2013.
4
5 dean [at] fourwalledcubicle [dot] com
6 www.lufa-lib.org
7 */
8
9 /*
10 Copyright 2013 Dean Camera (dean [at] fourwalledcubicle [dot] com)
11
12 Permission to use, copy, modify, distribute, and sell this
13 software and its documentation for any purpose is hereby granted
14 without fee, provided that the above copyright notice appear in
15 all copies and that both that the copyright notice and this
16 permission notice and warranty disclaimer appear in supporting
17 documentation, and that the name of the author not be used in
18 advertising or publicity pertaining to distribution of the
19 software without specific, written prior permission.
20
21 The author disclaims all warranties with regard to this
22 software, including all implied warranties of merchantability
23 and fitness. In no event shall the author be liable for any
24 special, indirect or consequential damages or any damages
25 whatsoever resulting from loss of use, data or profits, whether
26 in an action of contract, negligence or other tortious action,
27 arising out of or in connection with the use or performance of
28 this software.
29 */
30
31 /** \file
32 * \brief Common definitions and declarations for the library USB HID Class driver.
33 *
34 * Common definitions and declarations for the library USB HID Class driver.
35 *
36 * \note This file should not be included directly. It is automatically included as needed by the USB module driver
37 * dispatch header located in LUFA/Drivers/USB.h.
38 */
39
40 /** \ingroup Group_USBClassHID
41 * \defgroup Group_USBClassHIDCommon Common Class Definitions
42 *
43 * \section Sec_USBClassHIDCommon_ModDescription Module Description
44 * Constants, Types and Enum definitions that are common to both Device and Host modes for the USB
45 * HID Class.
46 *
47 * @{
48 */
49
50 #ifndef _HID_CLASS_COMMON_H_
51 #define _HID_CLASS_COMMON_H_
52
53 /* Includes: */
54 #include "../../Core/StdDescriptors.h"
55 #include "HIDParser.h"
56
57 /* Enable C linkage for C++ Compilers: */
58 #if defined(__cplusplus)
59 extern "C" {
60 #endif
61
62 /* Preprocessor Checks: */
63 #if !defined(__INCLUDE_FROM_HID_DRIVER)
64 #error Do not include this file directly. Include LUFA/Drivers/USB.h instead.
65 #endif
66
67 /* Macros: */
68 /** \name Keyboard Standard Report Modifier Masks */
69 //@{
70 /** Constant for a keyboard report modifier byte, indicating that the keyboard's left control key is currently pressed. */
71 #define HID_KEYBOARD_MODIFIER_LEFTCTRL (1 << 0)
72
73 /** Constant for a keyboard report modifier byte, indicating that the keyboard's left shift key is currently pressed. */
74 #define HID_KEYBOARD_MODIFIER_LEFTSHIFT (1 << 1)
75
76 /** Constant for a keyboard report modifier byte, indicating that the keyboard's left alt key is currently pressed. */
77 #define HID_KEYBOARD_MODIFIER_LEFTALT (1 << 2)
78
79 /** Constant for a keyboard report modifier byte, indicating that the keyboard's left GUI key is currently pressed. */
80 #define HID_KEYBOARD_MODIFIER_LEFTGUI (1 << 3)
81
82 /** Constant for a keyboard report modifier byte, indicating that the keyboard's right control key is currently pressed. */
83 #define HID_KEYBOARD_MODIFIER_RIGHTCTRL (1 << 4)
84
85 /** Constant for a keyboard report modifier byte, indicating that the keyboard's right shift key is currently pressed. */
86 #define HID_KEYBOARD_MODIFIER_RIGHTSHIFT (1 << 5)
87
88 /** Constant for a keyboard report modifier byte, indicating that the keyboard's right alt key is currently pressed. */
89 #define HID_KEYBOARD_MODIFIER_RIGHTALT (1 << 6)
90
91 /** Constant for a keyboard report modifier byte, indicating that the keyboard's right GUI key is currently pressed. */
92 #define HID_KEYBOARD_MODIFIER_RIGHTGUI (1 << 7)
93 //@}
94
95 /** \name Keyboard Standard Report LED Masks */
96 //@{
97 /** Constant for a keyboard output report LED byte, indicating that the host's NUM LOCK mode is currently set. */
98 #define HID_KEYBOARD_LED_NUMLOCK (1 << 0)
99
100 /** Constant for a keyboard output report LED byte, indicating that the host's CAPS LOCK mode is currently set. */
101 #define HID_KEYBOARD_LED_CAPSLOCK (1 << 1)
102
103 /** Constant for a keyboard output report LED byte, indicating that the host's SCROLL LOCK mode is currently set. */
104 #define HID_KEYBOARD_LED_SCROLLLOCK (1 << 2)
105
106 /** Constant for a keyboard output report LED byte, indicating that the host's COMPOSE mode is currently set. */
107 #define HID_KEYBOARD_LED_COMPOSE (1 << 3)
108
109 /** Constant for a keyboard output report LED byte, indicating that the host's KANA mode is currently set. */
110 #define HID_KEYBOARD_LED_KANA (1 << 4)
111 //@}
112
113 /** \name Keyboard Standard Report Key Scan-codes */
114 //@{
115 #define HID_KEYBOARD_SC_ERROR_ROLLOVER 0x01
116 #define HID_KEYBOARD_SC_POST_FAIL 0x02
117 #define HID_KEYBOARD_SC_ERROR_UNDEFINED 0x03
118 #define HID_KEYBOARD_SC_A 0x04
119 #define HID_KEYBOARD_SC_B 0x05
120 #define HID_KEYBOARD_SC_C 0x06
121 #define HID_KEYBOARD_SC_D 0x07
122 #define HID_KEYBOARD_SC_E 0x08
123 #define HID_KEYBOARD_SC_F 0x09
124 #define HID_KEYBOARD_SC_G 0x0A
125 #define HID_KEYBOARD_SC_H 0x0B
126 #define HID_KEYBOARD_SC_I 0x0C
127 #define HID_KEYBOARD_SC_J 0x0D
128 #define HID_KEYBOARD_SC_K 0x0E
129 #define HID_KEYBOARD_SC_L 0x0F
130 #define HID_KEYBOARD_SC_M 0x10
131 #define HID_KEYBOARD_SC_N 0x11
132 #define HID_KEYBOARD_SC_O 0x12
133 #define HID_KEYBOARD_SC_P 0x13
134 #define HID_KEYBOARD_SC_Q 0x14
135 #define HID_KEYBOARD_SC_R 0x15
136 #define HID_KEYBOARD_SC_S 0x16
137 #define HID_KEYBOARD_SC_T 0x17
138 #define HID_KEYBOARD_SC_U 0x18
139 #define HID_KEYBOARD_SC_V 0x19
140 #define HID_KEYBOARD_SC_W 0x1A
141 #define HID_KEYBOARD_SC_X 0x1B
142 #define HID_KEYBOARD_SC_Y 0x1C
143 #define HID_KEYBOARD_SC_Z 0x1D
144 #define HID_KEYBOARD_SC_1_AND_EXCLAMATION 0x1E
145 #define HID_KEYBOARD_SC_2_AND_AT 0x1F
146 #define HID_KEYBOARD_SC_3_AND_HASHMARK 0x20
147 #define HID_KEYBOARD_SC_4_AND_DOLLAR 0x21
148 #define HID_KEYBOARD_SC_5_AND_PERCENTAGE 0x22
149 #define HID_KEYBOARD_SC_6_AND_CARET 0x23
150 #define HID_KEYBOARD_SC_7_AND_AND_AMPERSAND 0x24
151 #define HID_KEYBOARD_SC_8_AND_ASTERISK 0x25
152 #define HID_KEYBOARD_SC_9_AND_OPENING_PARENTHESIS 0x26
153 #define HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS 0x27
154 #define HID_KEYBOARD_SC_ENTER 0x28
155 #define HID_KEYBOARD_SC_ESCAPE 0x29
156 #define HID_KEYBOARD_SC_BACKSPACE 0x2A
157 #define HID_KEYBOARD_SC_TAB 0x2B
158 #define HID_KEYBOARD_SC_SPACE 0x2C
159 #define HID_KEYBOARD_SC_MINUS_AND_UNDERSCORE 0x2D
160 #define HID_KEYBOARD_SC_EQUAL_AND_PLUS 0x2E
161 #define HID_KEYBOARD_SC_OPENING_BRACKET_AND_OPENING_BRACE 0x2F
162 #define HID_KEYBOARD_SC_CLOSING_BRACKET_AND_CLOSING_BRACE 0x30
163 #define HID_KEYBOARD_SC_BACKSLASH_AND_PIPE 0x31
164 #define HID_KEYBOARD_SC_NON_US_HASHMARK_AND_TILDE 0x32
165 #define HID_KEYBOARD_SC_SEMICOLON_AND_COLON 0x33
166 #define HID_KEYBOARD_SC_APOSTROPHE_AND_QUOTE 0x34
167 #define HID_KEYBOARD_SC_GRAVE_ACCENT_AND_TILDE 0x35
168 #define HID_KEYBOARD_SC_COMMA_AND_LESS_THAN_SIGN 0x36
169 #define HID_KEYBOARD_SC_DOT_AND_GREATER_THAN_SIGN 0x37
170 #define HID_KEYBOARD_SC_SLASH_AND_QUESTION_MARK 0x38
171 #define HID_KEYBOARD_SC_CAPS_LOCK 0x39
172 #define HID_KEYBOARD_SC_F1 0x3A
173 #define HID_KEYBOARD_SC_F2 0x3B
174 #define HID_KEYBOARD_SC_F3 0x3C
175 #define HID_KEYBOARD_SC_F4 0x3D
176 #define HID_KEYBOARD_SC_F5 0x3E
177 #define HID_KEYBOARD_SC_F6 0x3F
178 #define HID_KEYBOARD_SC_F7 0x40
179 #define HID_KEYBOARD_SC_F8 0x41
180 #define HID_KEYBOARD_SC_F9 0x42
181 #define HID_KEYBOARD_SC_F10 0x43
182 #define HID_KEYBOARD_SC_F11 0x44
183 #define HID_KEYBOARD_SC_F12 0x45
184 #define HID_KEYBOARD_SC_PRINT_SCREEN 0x46
185 #define HID_KEYBOARD_SC_SCROLL_LOCK 0x47
186 #define HID_KEYBOARD_SC_PAUSE 0x48
187 #define HID_KEYBOARD_SC_INSERT 0x49
188 #define HID_KEYBOARD_SC_HOME 0x4A
189 #define HID_KEYBOARD_SC_PAGE_UP 0x4B
190 #define HID_KEYBOARD_SC_DELETE 0x4C
191 #define HID_KEYBOARD_SC_END 0x4D
192 #define HID_KEYBOARD_SC_PAGE_DOWN 0x4E
193 #define HID_KEYBOARD_SC_RIGHT_ARROW 0x4F
194 #define HID_KEYBOARD_SC_LEFT_ARROW 0x50
195 #define HID_KEYBOARD_SC_DOWN_ARROW 0x51
196 #define HID_KEYBOARD_SC_UP_ARROW 0x52
197 #define HID_KEYBOARD_SC_NUM_LOCK 0x53
198 #define HID_KEYBOARD_SC_KEYPAD_SLASH 0x54
199 #define HID_KEYBOARD_SC_KEYPAD_ASTERISK 0x55
200 #define HID_KEYBOARD_SC_KEYPAD_MINUS 0x56
201 #define HID_KEYBOARD_SC_KEYPAD_PLUS 0x57
202 #define HID_KEYBOARD_SC_KEYPAD_ENTER 0x58
203 #define HID_KEYBOARD_SC_KEYPAD_1_AND_END 0x59
204 #define HID_KEYBOARD_SC_KEYPAD_2_AND_DOWN_ARROW 0x5A
205 #define HID_KEYBOARD_SC_KEYPAD_3_AND_PAGE_DOWN 0x5B
206 #define HID_KEYBOARD_SC_KEYPAD_4_AND_LEFT_ARROW 0x5C
207 #define HID_KEYBOARD_SC_KEYPAD_5 0x5D
208 #define HID_KEYBOARD_SC_KEYPAD_6_AND_RIGHT_ARROW 0x5E
209 #define HID_KEYBOARD_SC_KEYPAD_7_AND_HOME 0x5F
210 #define HID_KEYBOARD_SC_KEYPAD_8_AND_UP_ARROW 0x60
211 #define HID_KEYBOARD_SC_KEYPAD_9_AND_PAGE_UP 0x61
212 #define HID_KEYBOARD_SC_KEYPAD_0_AND_INSERT 0x62
213 #define HID_KEYBOARD_SC_KEYPAD_DOT_AND_DELETE 0x63
214 #define HID_KEYBOARD_SC_NON_US_BACKSLASH_AND_PIPE 0x64
215 #define HID_KEYBOARD_SC_APPLICATION 0x65
216 #define HID_KEYBOARD_SC_POWER 0x66
217 #define HID_KEYBOARD_SC_KEYPAD_EQUAL_SIGN 0x67
218 #define HID_KEYBOARD_SC_F13 0x68
219 #define HID_KEYBOARD_SC_F14 0x69
220 #define HID_KEYBOARD_SC_F15 0x6A
221 #define HID_KEYBOARD_SC_F16 0x6B
222 #define HID_KEYBOARD_SC_F17 0x6C
223 #define HID_KEYBOARD_SC_F18 0x6D
224 #define HID_KEYBOARD_SC_F19 0x6E
225 #define HID_KEYBOARD_SC_F20 0x6F
226 #define HID_KEYBOARD_SC_F21 0x70
227 #define HID_KEYBOARD_SC_F22 0x71
228 #define HID_KEYBOARD_SC_F23 0x72
229 #define HID_KEYBOARD_SC_F24 0x73
230 #define HID_KEYBOARD_SC_EXECUTE 0x74
231 #define HID_KEYBOARD_SC_HELP 0x75
232 #define HID_KEYBOARD_SC_MANU 0x76
233 #define HID_KEYBOARD_SC_SELECT 0x77
234 #define HID_KEYBOARD_SC_STOP 0x78
235 #define HID_KEYBOARD_SC_AGAIN 0x79
236 #define HID_KEYBOARD_SC_UNDO 0x7A
237 #define HID_KEYBOARD_SC_CUT 0x7B
238 #define HID_KEYBOARD_SC_COPY 0x7C
239 #define HID_KEYBOARD_SC_PASTE 0x7D
240 #define HID_KEYBOARD_SC_FIND 0x7E
241 #define HID_KEYBOARD_SC_MUTE 0x7F
242 #define HID_KEYBOARD_SC_VOLUME_UP 0x80
243 #define HID_KEYBOARD_SC_VOLUME_DOWN 0x81
244 #define HID_KEYBOARD_SC_LOCKING_CAPS_LOCK 0x82
245 #define HID_KEYBOARD_SC_LOCKING_NUM_LOCK 0x83
246 #define HID_KEYBOARD_SC_LOCKING_SCROLL_LOCK 0x84
247 #define HID_KEYBOARD_SC_KEYPAD_COMMA 0x85
248 #define HID_KEYBOARD_SC_KEYPAD_EQUAL_SIGN_AS400 0x86
249 #define HID_KEYBOARD_SC_INTERNATIONAL1 0x87
250 #define HID_KEYBOARD_SC_INTERNATIONAL2 0x88
251 #define HID_KEYBOARD_SC_INTERNATIONAL3 0x89
252 #define HID_KEYBOARD_SC_INTERNATIONAL4 0x8A
253 #define HID_KEYBOARD_SC_INTERNATIONAL5 0x8B
254 #define HID_KEYBOARD_SC_INTERNATIONAL6 0x8C
255 #define HID_KEYBOARD_SC_INTERNATIONAL7 0x8D
256 #define HID_KEYBOARD_SC_INTERNATIONAL8 0x8E
257 #define HID_KEYBOARD_SC_INTERNATIONAL9 0x8F
258 #define HID_KEYBOARD_SC_LANG1 0x90
259 #define HID_KEYBOARD_SC_LANG2 0x91
260 #define HID_KEYBOARD_SC_LANG3 0x92
261 #define HID_KEYBOARD_SC_LANG4 0x93
262 #define HID_KEYBOARD_SC_LANG5 0x94
263 #define HID_KEYBOARD_SC_LANG6 0x95
264 #define HID_KEYBOARD_SC_LANG7 0x96
265 #define HID_KEYBOARD_SC_LANG8 0x97
266 #define HID_KEYBOARD_SC_LANG9 0x98
267 #define HID_KEYBOARD_SC_ALTERNATE_ERASE 0x99
268 #define HID_KEYBOARD_SC_SISREQ 0x9A
269 #define HID_KEYBOARD_SC_CANCEL 0x9B
270 #define HID_KEYBOARD_SC_CLEAR 0x9C
271 #define HID_KEYBOARD_SC_PRIOR 0x9D
272 #define HID_KEYBOARD_SC_RETURN 0x9E
273 #define HID_KEYBOARD_SC_SEPARATOR 0x9F
274 #define HID_KEYBOARD_SC_OUT 0xA0
275 #define HID_KEYBOARD_SC_OPER 0xA1
276 #define HID_KEYBOARD_SC_CLEAR_AND_AGAIN 0xA2
277 #define HID_KEYBOARD_SC_CRSEL_ANDPROPS 0xA3
278 #define HID_KEYBOARD_SC_EXSEL 0xA4
279 #define HID_KEYBOARD_SC_KEYPAD_00 0xB0
280 #define HID_KEYBOARD_SC_KEYPAD_000 0xB1
281 #define HID_KEYBOARD_SC_THOUSANDS_SEPARATOR 0xB2
282 #define HID_KEYBOARD_SC_DECIMAL_SEPARATOR 0xB3
283 #define HID_KEYBOARD_SC_CURRENCY_UNIT 0xB4
284 #define HID_KEYBOARD_SC_CURRENCY_SUB_UNIT 0xB5
285 #define HID_KEYBOARD_SC_KEYPAD_OPENING_PARENTHESIS 0xB6
286 #define HID_KEYBOARD_SC_KEYPAD_CLOSING_PARENTHESIS 0xB7
287 #define HID_KEYBOARD_SC_KEYPAD_OPENING_BRACE 0xB8
288 #define HID_KEYBOARD_SC_KEYPAD_CLOSING_BRACE 0xB9
289 #define HID_KEYBOARD_SC_KEYPAD_TAB 0xBA
290 #define HID_KEYBOARD_SC_KEYPAD_BACKSPACE 0xBB
291 #define HID_KEYBOARD_SC_KEYPAD_A 0xBC
292 #define HID_KEYBOARD_SC_KEYPAD_B 0xBD
293 #define HID_KEYBOARD_SC_KEYPAD_C 0xBE
294 #define HID_KEYBOARD_SC_KEYPAD_D 0xBF
295 #define HID_KEYBOARD_SC_KEYPAD_E 0xC0
296 #define HID_KEYBOARD_SC_KEYPAD_F 0xC1
297 #define HID_KEYBOARD_SC_KEYPAD_XOR 0xC2
298 #define HID_KEYBOARD_SC_KEYPAD_CARET 0xC3
299 #define HID_KEYBOARD_SC_KEYPAD_PERCENTAGE 0xC4
300 #define HID_KEYBOARD_SC_KEYPAD_LESS_THAN_SIGN 0xC5
301 #define HID_KEYBOARD_SC_KEYPAD_GREATER_THAN_SIGN 0xC6
302 #define HID_KEYBOARD_SC_KEYPAD_AMP 0xC7
303 #define HID_KEYBOARD_SC_KEYPAD_AMP_AMP 0xC8
304 #define HID_KEYBOARD_SC_KEYPAD_PIPE 0xC9
305 #define HID_KEYBOARD_SC_KEYPAD_PIPE_PIPE 0xCA
306 #define HID_KEYBOARD_SC_KEYPAD_COLON 0xCB
307 #define HID_KEYBOARD_SC_KEYPAD_HASHMARK 0xCC
308 #define HID_KEYBOARD_SC_KEYPAD_SPACE 0xCD
309 #define HID_KEYBOARD_SC_KEYPAD_AT 0xCE
310 #define HID_KEYBOARD_SC_KEYPAD_EXCLAMATION_SIGN 0xCF
311 #define HID_KEYBOARD_SC_KEYPAD_MEMORY_STORE 0xD0
312 #define HID_KEYBOARD_SC_KEYPAD_MEMORY_RECALL 0xD1
313 #define HID_KEYBOARD_SC_KEYPAD_MEMORY_CLEAR 0xD2
314 #define HID_KEYBOARD_SC_KEYPAD_MEMORY_ADD 0xD3
315 #define HID_KEYBOARD_SC_KEYPAD_MEMORY_SUBTRACT 0xD4
316 #define HID_KEYBOARD_SC_KEYPAD_MEMORY_MULTIPLY 0xD5
317 #define HID_KEYBOARD_SC_KEYPAD_MEMORY_DIVIDE 0xD6
318 #define HID_KEYBOARD_SC_KEYPAD_PLUS_AND_MINUS 0xD7
319 #define HID_KEYBOARD_SC_KEYPAD_CLEAR 0xD8
320 #define HID_KEYBOARD_SC_KEYPAD_CLEAR_ENTRY 0xD9
321 #define HID_KEYBOARD_SC_KEYPAD_BINARY 0xDA
322 #define HID_KEYBOARD_SC_KEYPAD_OCTAL 0xDB
323 #define HID_KEYBOARD_SC_KEYPAD_DECIMAL 0xDC
324 #define HID_KEYBOARD_SC_KEYPAD_HEXADECIMAL 0xDD
325 #define HID_KEYBOARD_SC_LEFT_CONTROL 0xE0
326 #define HID_KEYBOARD_SC_LEFT_SHIFT 0xE1
327 #define HID_KEYBOARD_SC_LEFT_ALT 0xE2
328 #define HID_KEYBOARD_SC_LEFT_GUI 0xE3
329 #define HID_KEYBOARD_SC_RIGHT_CONTROL 0xE4
330 #define HID_KEYBOARD_SC_RIGHT_SHIFT 0xE5
331 #define HID_KEYBOARD_SC_RIGHT_ALT 0xE6
332 #define HID_KEYBOARD_SC_RIGHT_GUI 0xE7
333 //@}
334
335 /** \name Common HID Device Report Descriptors */
336 //@{
337 /** \hideinitializer
338 * A list of HID report item array elements that describe a typical HID USB Joystick. The resulting report
339 * descriptor is structured according to the following layout:
340 *
341 * \code
342 * struct
343 * {
344 * intA_t X; // Signed X axis value
345 * intA_t Y; // Signed Y axis value
346 * intA_t Z; // Signed Z axis value
347 * uintB_t Buttons; // Pressed buttons bitmask
348 * } Joystick_Report;
349 * \endcode
350 *
351 * Where \c uintA_t is a type large enough to hold the ranges of the signed \c MinAxisVal and \c MaxAxisVal values,
352 * and \c intB_t is a type large enough to hold one bit per button.
353 *
354 * \param[in] MinAxisVal Minimum logical axis value (16-bit).
355 * \param[in] MaxAxisVal Maximum logical axis value (16-bit).
356 * \param[in] MinPhysicalVal Minimum physical axis value, for movement resolution calculations (16-bit).
357 * \param[in] MaxPhysicalVal Maximum physical axis value, for movement resolution calculations (16-bit).
358 * \param[in] Buttons Total number of buttons in the device (8-bit).
359 */
360 #define HID_DESCRIPTOR_JOYSTICK(MinAxisVal, MaxAxisVal, MinPhysicalVal, MaxPhysicalVal, Buttons) \
361 HID_RI_USAGE_PAGE(8, 0x01), \
362 HID_RI_USAGE(8, 0x04), \
363 HID_RI_COLLECTION(8, 0x01), \
364 HID_RI_USAGE(8, 0x01), \
365 HID_RI_COLLECTION(8, 0x00), \
366 HID_RI_USAGE(8, 0x30), \
367 HID_RI_USAGE(8, 0x31), \
368 HID_RI_USAGE(8, 0x32), \
369 HID_RI_LOGICAL_MINIMUM(16, MinAxisVal), \
370 HID_RI_LOGICAL_MAXIMUM(16, MaxAxisVal), \
371 HID_RI_PHYSICAL_MINIMUM(16, MinPhysicalVal), \
372 HID_RI_PHYSICAL_MAXIMUM(16, MaxPhysicalVal), \
373 HID_RI_REPORT_COUNT(8, 3), \
374 HID_RI_REPORT_SIZE(8, (((MinAxisVal >= -128) && (MaxAxisVal <= 127)) ? 8 : 16)), \
375 HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), \
376 HID_RI_END_COLLECTION(0), \
377 HID_RI_USAGE_PAGE(8, 0x09), \
378 HID_RI_USAGE_MINIMUM(8, 0x01), \
379 HID_RI_USAGE_MAXIMUM(8, Buttons), \
380 HID_RI_LOGICAL_MINIMUM(8, 0x00), \
381 HID_RI_LOGICAL_MAXIMUM(8, 0x01), \
382 HID_RI_REPORT_SIZE(8, 0x01), \
383 HID_RI_REPORT_COUNT(8, Buttons), \
384 HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), \
385 HID_RI_REPORT_SIZE(8, (Buttons % 8) ? (8 - (Buttons % 8)) : 0), \
386 HID_RI_REPORT_COUNT(8, 0x01), \
387 HID_RI_INPUT(8, HID_IOF_CONSTANT), \
388 HID_RI_END_COLLECTION(0)
389
390 /** \hideinitializer
391 * A list of HID report item array elements that describe a typical HID USB keyboard. The resulting report descriptor
392 * is compatible with \ref USB_KeyboardReport_Data_t when \c MaxKeys is equal to 6. For other values, the report will
393 * be structured according to the following layout:
394 *
395 * \code
396 * struct
397 * {
398 * uint8_t Modifier; // Keyboard modifier byte indicating pressed modifier keys (\c HID_KEYBOARD_MODIFER_* masks)
399 * uint8_t Reserved; // Reserved for OEM use, always set to 0.
400 * uint8_t KeyCode[MaxKeys]; // Length determined by the number of keys that can be reported
401 * } Keyboard_Report;
402 * \endcode
403 *
404 * \param[in] MaxKeys Number of simultaneous keys that can be reported at the one time (8-bit).
405 */
406 #define HID_DESCRIPTOR_KEYBOARD(MaxKeys) \
407 HID_RI_USAGE_PAGE(8, 0x01), \
408 HID_RI_USAGE(8, 0x06), \
409 HID_RI_COLLECTION(8, 0x01), \
410 HID_RI_USAGE_PAGE(8, 0x07), \
411 HID_RI_USAGE_MINIMUM(8, 0xE0), \
412 HID_RI_USAGE_MAXIMUM(8, 0xE7), \
413 HID_RI_LOGICAL_MINIMUM(8, 0x00), \
414 HID_RI_LOGICAL_MAXIMUM(8, 0x01), \
415 HID_RI_REPORT_SIZE(8, 0x01), \
416 HID_RI_REPORT_COUNT(8, 0x08), \
417 HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), \
418 HID_RI_REPORT_COUNT(8, 0x01), \
419 HID_RI_REPORT_SIZE(8, 0x08), \
420 HID_RI_INPUT(8, HID_IOF_CONSTANT), \
421 HID_RI_USAGE_PAGE(8, 0x08), \
422 HID_RI_USAGE_MINIMUM(8, 0x01), \
423 HID_RI_USAGE_MAXIMUM(8, 0x05), \
424 HID_RI_REPORT_COUNT(8, 0x05), \
425 HID_RI_REPORT_SIZE(8, 0x01), \
426 HID_RI_OUTPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE), \
427 HID_RI_REPORT_COUNT(8, 0x01), \
428 HID_RI_REPORT_SIZE(8, 0x03), \
429 HID_RI_OUTPUT(8, HID_IOF_CONSTANT), \
430 HID_RI_LOGICAL_MINIMUM(8, 0x00), \
431 HID_RI_LOGICAL_MAXIMUM(8, 0xFF), \
432 HID_RI_USAGE_PAGE(8, 0x07), \
433 HID_RI_USAGE_MINIMUM(8, 0x00), \
434 HID_RI_USAGE_MAXIMUM(8, 0xFF), \
435 HID_RI_REPORT_COUNT(8, MaxKeys), \
436 HID_RI_REPORT_SIZE(8, 0x08), \
437 HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_ARRAY | HID_IOF_ABSOLUTE), \
438 HID_RI_END_COLLECTION(0)
439
440 /** \hideinitializer
441 * A list of HID report item array elements that describe a typical HID USB mouse. The resulting report descriptor
442 * is compatible with \ref USB_MouseReport_Data_t if the \c MinAxisVal and \c MaxAxisVal values fit within a \c int8_t range
443 * and the number of Buttons is less than 8. For other values, the report is structured according to the following layout:
444 *
445 * \code
446 * struct
447 * {
448 * uintA_t Buttons; // Pressed buttons bitmask
449 * intB_t X; // X axis value
450 * intB_t Y; // Y axis value
451 * } Mouse_Report;
452 * \endcode
453 *
454 * Where \c intA_t is a type large enough to hold one bit per button, and \c intB_t is a type large enough to hold the
455 * ranges of the signed \c MinAxisVal and \c MaxAxisVal values.
456 *
457 * \param[in] MinAxisVal Minimum X/Y logical axis value (16-bit).
458 * \param[in] MaxAxisVal Maximum X/Y logical axis value (16-bit).
459 * \param[in] MinPhysicalVal Minimum X/Y physical axis value, for movement resolution calculations (16-bit).
460 * \param[in] MaxPhysicalVal Maximum X/Y physical axis value, for movement resolution calculations (16-bit).
461 * \param[in] Buttons Total number of buttons in the device (8-bit).
462 * \param[in] AbsoluteCoords Boolean \c true to use absolute X/Y coordinates (e.g. touchscreen).
463 */
464 #define HID_DESCRIPTOR_MOUSE(MinAxisVal, MaxAxisVal, MinPhysicalVal, MaxPhysicalVal, Buttons, AbsoluteCoords) \
465 HID_RI_USAGE_PAGE(8, 0x01), \
466 HID_RI_USAGE(8, 0x02), \
467 HID_RI_COLLECTION(8, 0x01), \
468 HID_RI_USAGE(8, 0x01), \
469 HID_RI_COLLECTION(8, 0x00), \
470 HID_RI_USAGE_PAGE(8, 0x09), \
471 HID_RI_USAGE_MINIMUM(8, 0x01), \
472 HID_RI_USAGE_MAXIMUM(8, Buttons), \
473 HID_RI_LOGICAL_MINIMUM(8, 0x00), \
474 HID_RI_LOGICAL_MAXIMUM(8, 0x01), \
475 HID_RI_REPORT_COUNT(8, Buttons), \
476 HID_RI_REPORT_SIZE(8, 0x01), \
477 HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), \
478 HID_RI_REPORT_COUNT(8, 0x01), \
479 HID_RI_REPORT_SIZE(8, (Buttons % 8) ? (8 - (Buttons % 8)) : 0), \
480 HID_RI_INPUT(8, HID_IOF_CONSTANT), \
481 HID_RI_USAGE_PAGE(8, 0x01), \
482 HID_RI_USAGE(8, 0x30), \
483 HID_RI_USAGE(8, 0x31), \
484 HID_RI_LOGICAL_MINIMUM(16, MinAxisVal), \
485 HID_RI_LOGICAL_MAXIMUM(16, MaxAxisVal), \
486 HID_RI_PHYSICAL_MINIMUM(16, MinPhysicalVal), \
487 HID_RI_PHYSICAL_MAXIMUM(16, MaxPhysicalVal), \
488 HID_RI_REPORT_COUNT(8, 0x02), \
489 HID_RI_REPORT_SIZE(8, (((MinAxisVal >= -128) && (MaxAxisVal <= 127)) ? 8 : 16)), \
490 HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | (AbsoluteCoords ? HID_IOF_ABSOLUTE : HID_IOF_RELATIVE)), \
491 HID_RI_END_COLLECTION(0), \
492 HID_RI_END_COLLECTION(0)
493
494 /** \hideinitializer
495 * A list of HID report item array elements that describe a typical Vendor Defined byte array HID report descriptor,
496 * used for transporting arbitrary data between the USB host and device via HID reports. The resulting report should be
497 * a \c uint8_t byte array of the specified length in both Device to Host (IN) and Host to Device (OUT) directions.
498 *
499 * \param[in] VendorPageNum Vendor Defined HID Usage Page index, ranging from 0x00 to 0xFF.
500 * \param[in] CollectionUsage Vendor Usage for the encompassing report IN and OUT collection, ranging from 0x00 to 0xFF.
501 * \param[in] DataINUsage Vendor Usage for the IN report data, ranging from 0x00 to 0xFF.
502 * \param[in] DataOUTUsage Vendor Usage for the OUT report data, ranging from 0x00 to 0xFF.
503 * \param[in] NumBytes Length of the data IN and OUT reports.
504 */
505 #define HID_DESCRIPTOR_VENDOR(VendorPageNum, CollectionUsage, DataINUsage, DataOUTUsage, NumBytes) \
506 HID_RI_USAGE_PAGE(16, (0xFF00 | VendorPageNum)), \
507 HID_RI_USAGE(8, CollectionUsage), \
508 HID_RI_COLLECTION(8, 0x01), \
509 HID_RI_USAGE(8, DataINUsage), \
510 HID_RI_LOGICAL_MINIMUM(8, 0x00), \
511 HID_RI_LOGICAL_MAXIMUM(8, 0xFF), \
512 HID_RI_REPORT_SIZE(8, 0x08), \
513 HID_RI_REPORT_COUNT(8, NumBytes), \
514 HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), \
515 HID_RI_USAGE(8, DataOUTUsage), \
516 HID_RI_LOGICAL_MINIMUM(8, 0x00), \
517 HID_RI_LOGICAL_MAXIMUM(8, 0xFF), \
518 HID_RI_REPORT_SIZE(8, 0x08), \
519 HID_RI_REPORT_COUNT(8, NumBytes), \
520 HID_RI_OUTPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE), \
521 HID_RI_END_COLLECTION(0)
522 //@}
523
524 /* Type Defines: */
525 /** Enum for possible Class, Subclass and Protocol values of device and interface descriptors relating to the HID
526 * device class.
527 */
528 enum HID_Descriptor_ClassSubclassProtocol_t
529 {
530 HID_CSCP_HIDClass = 0x03, /**< Descriptor Class value indicating that the device or interface
531 * belongs to the HID class.
532 */
533 HID_CSCP_NonBootSubclass = 0x00, /**< Descriptor Subclass value indicating that the device or interface
534 * does not implement a HID boot protocol.
535 */
536 HID_CSCP_BootSubclass = 0x01, /**< Descriptor Subclass value indicating that the device or interface
537 * implements a HID boot protocol.
538 */
539 HID_CSCP_NonBootProtocol = 0x00, /**< Descriptor Protocol value indicating that the device or interface
540 * does not belong to a HID boot protocol.
541 */
542 HID_CSCP_KeyboardBootProtocol = 0x01, /**< Descriptor Protocol value indicating that the device or interface
543 * belongs to the Keyboard HID boot protocol.
544 */
545 HID_CSCP_MouseBootProtocol = 0x02, /**< Descriptor Protocol value indicating that the device or interface
546 * belongs to the Mouse HID boot protocol.
547 */
548 };
549
550 /** Enum for the HID class specific control requests that can be issued by the USB bus host. */
551 enum HID_ClassRequests_t
552 {
553 HID_REQ_GetReport = 0x01, /**< HID class-specific Request to get the current HID report from the device. */
554 HID_REQ_GetIdle = 0x02, /**< HID class-specific Request to get the current device idle count. */
555 HID_REQ_GetProtocol = 0x03, /**< HID class-specific Request to get the current HID report protocol mode. */
556 HID_REQ_SetReport = 0x09, /**< HID class-specific Request to set the current HID report to the device. */
557 HID_REQ_SetIdle = 0x0A, /**< HID class-specific Request to set the device's idle count. */
558 HID_REQ_SetProtocol = 0x0B, /**< HID class-specific Request to set the current HID report protocol mode. */
559 };
560
561 /** Enum for the HID class specific descriptor types. */
562 enum HID_DescriptorTypes_t
563 {
564 HID_DTYPE_HID = 0x21, /**< Descriptor header type value, to indicate a HID class HID descriptor. */
565 HID_DTYPE_Report = 0x22, /**< Descriptor header type value, to indicate a HID class HID report descriptor. */
566 };
567
568 /** Enum for the different types of HID reports. */
569 enum HID_ReportItemTypes_t
570 {
571 HID_REPORT_ITEM_In = 0, /**< Indicates that the item is an IN report type. */
572 HID_REPORT_ITEM_Out = 1, /**< Indicates that the item is an OUT report type. */
573 HID_REPORT_ITEM_Feature = 2, /**< Indicates that the item is a FEATURE report type. */
574 };
575
576 /** \brief HID class-specific HID Descriptor (LUFA naming conventions).
577 *
578 * Type define for the HID class-specific HID descriptor, to describe the HID device's specifications. Refer to the HID
579 * specification for details on the structure elements.
580 *
581 * \see \ref USB_HID_StdDescriptor_HID_t for the version of this type with standard element names.
582 *
583 * \note Regardless of CPU architecture, these values should be stored as little endian.
584 */
585 typedef struct
586 {
587 USB_Descriptor_Header_t Header; /**< Regular descriptor header containing the descriptor's type and length. */
588
589 uint16_t HIDSpec; /**< BCD encoded version that the HID descriptor and device complies to.
590 *
591 * \see \ref VERSION_BCD() utility macro.
592 */
593 uint8_t CountryCode; /**< Country code of the localized device, or zero if universal. */
594
595 uint8_t TotalReportDescriptors; /**< Total number of HID report descriptors for the interface. */
596
597 uint8_t HIDReportType; /**< Type of HID report, set to \ref HID_DTYPE_Report. */
598 uint16_t HIDReportLength; /**< Length of the associated HID report descriptor, in bytes. */
599 } ATTR_PACKED USB_HID_Descriptor_HID_t;
600
601 /** \brief HID class-specific HID Descriptor (USB-IF naming conventions).
602 *
603 * Type define for the HID class-specific HID descriptor, to describe the HID device's specifications. Refer to the HID
604 * specification for details on the structure elements.
605 *
606 * \see \ref USB_HID_Descriptor_HID_t for the version of this type with non-standard LUFA specific
607 * element names.
608 *
609 * \note Regardless of CPU architecture, these values should be stored as little endian.
610 */
611 typedef struct
612 {
613 uint8_t bLength; /**< Size of the descriptor, in bytes. */
614 uint8_t bDescriptorType; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a value
615 * given by the specific class.
616 */
617
618 uint16_t bcdHID; /**< BCD encoded version that the HID descriptor and device complies to.
619 *
620 * \see \ref VERSION_BCD() utility macro.
621 */
622 uint8_t bCountryCode; /**< Country code of the localized device, or zero if universal. */
623
624 uint8_t bNumDescriptors; /**< Total number of HID report descriptors for the interface. */
625
626 uint8_t bDescriptorType2; /**< Type of HID report, set to \ref HID_DTYPE_Report. */
627 uint16_t wDescriptorLength; /**< Length of the associated HID report descriptor, in bytes. */
628 } ATTR_PACKED USB_HID_StdDescriptor_HID_t;
629
630 /** \brief Standard HID Boot Protocol Mouse Report.
631 *
632 * Type define for a standard Boot Protocol Mouse report
633 */
634 typedef struct
635 {
636 uint8_t Button; /**< Button mask for currently pressed buttons in the mouse. */
637 int8_t X; /**< Current delta X movement of the mouse. */
638 int8_t Y; /**< Current delta Y movement on the mouse. */
639 } ATTR_PACKED USB_MouseReport_Data_t;
640
641 /** \brief Standard HID Boot Protocol Keyboard Report.
642 *
643 * Type define for a standard Boot Protocol Keyboard report
644 */
645 typedef struct
646 {
647 uint8_t Modifier; /**< Keyboard modifier byte, indicating pressed modifier keys (a combination of
648 * \c HID_KEYBOARD_MODIFER_* masks).
649 */
650 uint8_t Reserved; /**< Reserved for OEM use, always set to 0. */
651 uint8_t KeyCode[6]; /**< Key codes of the currently pressed keys. */
652 } ATTR_PACKED USB_KeyboardReport_Data_t;
653
654 /** Type define for the data type used to store HID report descriptor elements. */
655 typedef uint8_t USB_Descriptor_HIDReport_Datatype_t;
656
657 /* Disable C linkage for C++ Compilers: */
658 #if defined(__cplusplus)
659 }
660 #endif
661
662 #endif
663
664 /** @} */
665