Statistics
| Branch: | Tag: | Revision:

root / LUFA / Drivers / USB / Class / Common / HID.h @ 978b99e5

History | View | Annotate | Download (35.6 KB)

1
/*
2
             LUFA Library
3
     Copyright (C) Dean Camera, 2011.
4

5
  dean [at] fourwalledcubicle [dot] com
6
           www.lufa-lib.org
7
*/
8

    
9
/*
10
  Copyright 2011  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 disclaim 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_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_MODIFER_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_MODIFER_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_MODIFER_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_MODIFER_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_MODIFER_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_MODIFER_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_MODIFER_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_MODIFER_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 KATANA mode is currently set. */
107
                #define HID_KEYBOARD_LED_KATANA                           (1 << 3)
108
                //@}
109

    
110
                /** \name Keyboard Standard Report Key Scan-codes */
111
                //@{        
112
                #define HID_KEYBOARD_SC_ERROR_ROLLOVER                    0x01
113
                #define HID_KEYBOARD_SC_POST_FAIL                         0x02
114
                #define HID_KEYBOARD_SC_ERROR_UNDEFINED                   0x03
115
                #define HID_KEYBOARD_SC_A                                 0x04
116
                #define HID_KEYBOARD_SC_B                                 0x05
117
                #define HID_KEYBOARD_SC_C                                 0x06
118
                #define HID_KEYBOARD_SC_D                                 0x07
119
                #define HID_KEYBOARD_SC_E                                 0x08
120
                #define HID_KEYBOARD_SC_F                                 0x09
121
                #define HID_KEYBOARD_SC_G                                 0x0A
122
                #define HID_KEYBOARD_SC_H                                 0x0B
123
                #define HID_KEYBOARD_SC_I                                 0x0C
124
                #define HID_KEYBOARD_SC_J                                 0x0D
125
                #define HID_KEYBOARD_SC_K                                 0x0E
126
                #define HID_KEYBOARD_SC_L                                 0x0F
127
                #define HID_KEYBOARD_SC_M                                 0x10
128
                #define HID_KEYBOARD_SC_N                                 0x11
129
                #define HID_KEYBOARD_SC_O                                 0x12
130
                #define HID_KEYBOARD_SC_P                                 0x13
131
                #define HID_KEYBOARD_SC_Q                                 0x14
132
                #define HID_KEYBOARD_SC_R                                 0x15
133
                #define HID_KEYBOARD_SC_S                                 0x16
134
                #define HID_KEYBOARD_SC_T                                 0x17
135
                #define HID_KEYBOARD_SC_U                                 0x18
136
                #define HID_KEYBOARD_SC_V                                 0x19
137
                #define HID_KEYBOARD_SC_W                                 0x1A
138
                #define HID_KEYBOARD_SC_X                                 0x1B
139
                #define HID_KEYBOARD_SC_Y                                 0x1C
140
                #define HID_KEYBOARD_SC_Z                                 0x1D
141
                #define HID_KEYBOARD_SC_1_AND_EXCLAMATION                 0x1E
142
                #define HID_KEYBOARD_SC_2_AND_AT                          0x1F
143
                #define HID_KEYBOARD_SC_3_AND_HASHMARK                    0x20
144
                #define HID_KEYBOARD_SC_4_AND_DOLLAR                      0x21
145
                #define HID_KEYBOARD_SC_5_AND_PERCENTAGE                  0x22
146
                #define HID_KEYBOARD_SC_6_AND_CARET                       0x23
147
                #define HID_KEYBOARD_SC_7_AND_AND_AMPERSAND               0x24
148
                #define HID_KEYBOARD_SC_8_AND_ASTERISK                    0x25
149
                #define HID_KEYBOARD_SC_9_AND_OPENING_PARENTHESIS         0x26
150
                #define HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS         0x27
151
                #define HID_KEYBOARD_SC_ENTER                             0x28
152
                #define HID_KEYBOARD_SC_ESCAPE                            0x29
153
                #define HID_KEYBOARD_SC_BACKSPACE                         0x2A
154
                #define HID_KEYBOARD_SC_TAB                               0x2B
155
                #define HID_KEYBOARD_SC_SPACE                             0x2C
156
                #define HID_KEYBOARD_SC_MINUS_AND_UNDERSCORE              0x2D
157
                #define HID_KEYBOARD_SC_EQUAL_AND_PLUS                    0x2E
158
                #define HID_KEYBOARD_SC_OPENING_BRACKET_AND_OPENING_BRACE 0x2F
159
                #define HID_KEYBOARD_SC_CLOSING_BRACKET_AND_CLOSING_BRACE 0x30
160
                #define HID_KEYBOARD_SC_BACKSLASH_AND_PIPE                0x31
161
                #define HID_KEYBOARD_SC_NON_US_HASHMARK_AND_TILDE         0x32
162
                #define HID_KEYBOARD_SC_SEMICOLON_AND_COLON               0x33
163
                #define HID_KEYBOARD_SC_APOSTROPHE_AND_QUOTE              0x34
164
                #define HID_KEYBOARD_SC_GRAVE_ACCENT_AND_TILDE            0x35
165
                #define HID_KEYBOARD_SC_COMMA_AND_LESS_THAN_SIGN          0x36
166
                #define HID_KEYBOARD_SC_DOT_AND_GREATER_THAN_SIGN         0x37
167
                #define HID_KEYBOARD_SC_SLASH_AND_QUESTION_MARK           0x38
168
                #define HID_KEYBOARD_SC_CAPS_LOCK                         0x39
169
                #define HID_KEYBOARD_SC_F1                                0x3A
170
                #define HID_KEYBOARD_SC_F2                                0x3B
171
                #define HID_KEYBOARD_SC_F3                                0x3C
172
                #define HID_KEYBOARD_SC_F4                                0x3D
173
                #define HID_KEYBOARD_SC_F5                                0x3E
174
                #define HID_KEYBOARD_SC_F6                                0x3F
175
                #define HID_KEYBOARD_SC_F7                                0x40
176
                #define HID_KEYBOARD_SC_F8                                0x41
177
                #define HID_KEYBOARD_SC_F9                                0x42
178
                #define HID_KEYBOARD_SC_F10                               0x43
179
                #define HID_KEYBOARD_SC_F11                               0x44
180
                #define HID_KEYBOARD_SC_F12                               0x45
181
                #define HID_KEYBOARD_SC_PRINT_SCREEN                      0x46
182
                #define HID_KEYBOARD_SC_SCROLL_LOCK                       0x47
183
                #define HID_KEYBOARD_SC_PAUSE                             0x48
184
                #define HID_KEYBOARD_SC_INSERT                            0x49
185
                #define HID_KEYBOARD_SC_HOME                              0x4A
186
                #define HID_KEYBOARD_SC_PAGE_UP                           0x4B
187
                #define HID_KEYBOARD_SC_DELETE                            0x4C
188
                #define HID_KEYBOARD_SC_END                               0x4D
189
                #define HID_KEYBOARD_SC_PAGE_DOWN                         0x4E
190
                #define HID_KEYBOARD_SC_RIGHT_ARROW                       0x4F
191
                #define HID_KEYBOARD_SC_LEFT_ARROW                        0x50
192
                #define HID_KEYBOARD_SC_DOWN_ARROW                        0x51
193
                #define HID_KEYBOARD_SC_UP_ARROW                          0x52
194
                #define HID_KEYBOARD_SC_NUM_LOCK                          0x53
195
                #define HID_KEYBOARD_SC_KEYPAD_SLASH                      0x54
196
                #define HID_KEYBOARD_SC_KEYPAD_ASTERISK                   0x55
197
                #define HID_KEYBOARD_SC_KEYPAD_MINUS                      0x56
198
                #define HID_KEYBOARD_SC_KEYPAD_PLUS                       0x57
199
                #define HID_KEYBOARD_SC_KEYPAD_ENTER                      0x58
200
                #define HID_KEYBOARD_SC_KEYPAD_1_AND_END                  0x59
201
                #define HID_KEYBOARD_SC_KEYPAD_2_AND_DOWN_ARROW           0x5A
202
                #define HID_KEYBOARD_SC_KEYPAD_3_AND_PAGE_DOWN            0x5B
203
                #define HID_KEYBOARD_SC_KEYPAD_4_AND_LEFT_ARROW           0x5C
204
                #define HID_KEYBOARD_SC_KEYPAD_5                          0x5D
205
                #define HID_KEYBOARD_SC_KEYPAD_6_AND_RIGHT_ARROW          0x5E
206
                #define HID_KEYBOARD_SC_KEYPAD_7_AND_HOME                 0x5F
207
                #define HID_KEYBOARD_SC_KEYPAD_8_AND_UP_ARROW             0x60
208
                #define HID_KEYBOARD_SC_KEYPAD_9_AND_PAGE_UP              0x61
209
                #define HID_KEYBOARD_SC_KEYPAD_0_AND_INSERT               0x62
210
                #define HID_KEYBOARD_SC_KEYPAD_DOT_AND_DELETE             0x63
211
                #define HID_KEYBOARD_SC_NON_US_BACKSLASH_AND_PIPE         0x64                
212
                #define HID_KEYBOARD_SC_POWER                             0x66
213
                #define HID_KEYBOARD_SC_EQUAL_SIGN                        0x67
214
                #define HID_KEYBOARD_SC_F13                               0x68
215
                #define HID_KEYBOARD_SC_F14                               0x69
216
                #define HID_KEYBOARD_SC_F15                               0x6A
217
                #define HID_KEYBOARD_SC_F16                               0x6B
218
                #define HID_KEYBOARD_SC_F17                               0x6C
219
                #define HID_KEYBOARD_SC_F18                               0x6D
220
                #define HID_KEYBOARD_SC_F19                               0x6E
221
                #define HID_KEYBOARD_SC_F20                               0x6F
222
                #define HID_KEYBOARD_SC_F21                               0x70
223
                #define HID_KEYBOARD_SC_F22                               0x71
224
                #define HID_KEYBOARD_SC_F23                               0x72
225
                #define HID_KEYBOARD_SC_F24                               0x73
226
                #define HID_KEYBOARD_SC_EXECUTE                           0x74
227
                #define HID_KEYBOARD_SC_HELP                              0x75
228
                #define HID_KEYBOARD_SC_MANU                              0x76
229
                #define HID_KEYBOARD_SC_SELECT                            0x77
230
                #define HID_KEYBOARD_SC_STOP                              0x78
231
                #define HID_KEYBOARD_SC_AGAIN                             0x79
232
                #define HID_KEYBOARD_SC_UNDO                              0x7A
233
                #define HID_KEYBOARD_SC_CUT                               0x7B
234
                #define HID_KEYBOARD_SC_COPY                              0x7C
235
                #define HID_KEYBOARD_SC_PASTE                             0x7D
236
                #define HID_KEYBOARD_SC_FIND                              0x7E
237
                #define HID_KEYBOARD_SC_MUTE                              0x7F
238
                #define HID_KEYBOARD_SC_VOLUME_UP                         0x80
239
                #define HID_KEYBOARD_SC_VOLUME_DOWN                       0x81
240
                #define HID_KEYBOARD_SC_LOCKING_CAPS_LOCK                 0x82
241
                #define HID_KEYBOARD_SC_LOCKING_NUM_LOCK                  0x83
242
                #define HID_KEYBOARD_SC_LOCKING_SCROLL_LOCK               0x84
243
                #define HID_KEYBOARD_SC_KEYPAD_COMMA                      0x85
244
                #define HID_KEYBOARD_SC_KEYPAD_EQUAL_SIGN                 0x86
245
                #define HID_KEYBOARD_SC_INTERNATIONAL1                    0x87
246
                #define HID_KEYBOARD_SC_INTERNATIONAL2                    0x88
247
                #define HID_KEYBOARD_SC_INTERNATIONAL3                    0x89
248
                #define HID_KEYBOARD_SC_INTERNATIONAL4                    0x8A
249
                #define HID_KEYBOARD_SC_INTERNATIONAL5                    0x8B
250
                #define HID_KEYBOARD_SC_INTERNATIONAL6                    0x8C
251
                #define HID_KEYBOARD_SC_INTERNATIONAL7                    0x8D
252
                #define HID_KEYBOARD_SC_INTERNATIONAL8                    0x8E
253
                #define HID_KEYBOARD_SC_INTERNATIONAL9                    0x8F
254
                #define HID_KEYBOARD_SC_LANG1                             0x90
255
                #define HID_KEYBOARD_SC_LANG2                             0x91
256
                #define HID_KEYBOARD_SC_LANG3                             0x92
257
                #define HID_KEYBOARD_SC_LANG4                             0x93
258
                #define HID_KEYBOARD_SC_LANG5                             0x94
259
                #define HID_KEYBOARD_SC_LANG6                             0x95
260
                #define HID_KEYBOARD_SC_LANG7                             0x96
261
                #define HID_KEYBOARD_SC_LANG8                             0x97
262
                #define HID_KEYBOARD_SC_LANG9                             0x98
263
                #define HID_KEYBOARD_SC_ALTERNATE_ERASE                   0x99
264
                #define HID_KEYBOARD_SC_SISREQ                            0x9A
265
                #define HID_KEYBOARD_SC_CANCEL                            0x9B
266
                #define HID_KEYBOARD_SC_CLEAR                             0x9C
267
                #define HID_KEYBOARD_SC_PRIOR                             0x9D
268
                #define HID_KEYBOARD_SC_RETURN                            0x9E
269
                #define HID_KEYBOARD_SC_SEPARATOR                         0x9F
270
                #define HID_KEYBOARD_SC_OUT                               0xA0
271
                #define HID_KEYBOARD_SC_OPER                              0xA1
272
                #define HID_KEYBOARD_SC_CLEAR_AND_AGAIN                   0xA2
273
                #define HID_KEYBOARD_SC_CRSEL_ANDPROPS                    0xA3
274
                #define HID_KEYBOARD_SC_EXSEL                             0xA4
275
                #define HID_KEYBOARD_SC_KEYPAD_00                         0xB0
276
                #define HID_KEYBOARD_SC_KEYPAD_000                        0xB1
277
                #define HID_KEYBOARD_SC_THOUSANDS_SEPARATOR               0xB2
278
                #define HID_KEYBOARD_SC_DECIMAL_SEPARATOR                 0xB3
279
                #define HID_KEYBOARD_SC_CURRENCY_UNIT                     0xB4
280
                #define HID_KEYBOARD_SC_CURRENCY_SUB_UNIT                 0xB5
281
                #define HID_KEYBOARD_SC_KEYPAD_OPENING_PARENTHESIS        0xB6
282
                #define HID_KEYBOARD_SC_KEYPAD_CLOSING_PARENTHESIS        0xB7
283
                #define HID_KEYBOARD_SC_KEYPAD_OPENING_BRACE              0xB8
284
                #define HID_KEYBOARD_SC_KEYPAD_CLOSING_BRACE              0xB9
285
                #define HID_KEYBOARD_SC_KEYPAD_TAB                        0xBA
286
                #define HID_KEYBOARD_SC_KEYPAD_BACKSPACE                  0xBB
287
                #define HID_KEYBOARD_SC_KEYPAD_A                          0xBC
288
                #define HID_KEYBOARD_SC_KEYPAD_B                          0xBD
289
                #define HID_KEYBOARD_SC_KEYPAD_C                          0xBE
290
                #define HID_KEYBOARD_SC_KEYPAD_D                          0xBF
291
                #define HID_KEYBOARD_SC_KEYPAD_E                          0xC0
292
                #define HID_KEYBOARD_SC_KEYPAD_F                          0xC1
293
                #define HID_KEYBOARD_SC_KEYPAD_XOR                        0xC2
294
                #define HID_KEYBOARD_SC_KEYPAD_CARET                      0xC3
295
                #define HID_KEYBOARD_SC_KEYPAD_PERCENTAGE                 0xC4
296
                #define HID_KEYBOARD_SC_KEYPAD_LESS_THAN_SIGN             0xC5
297
                #define HID_KEYBOARD_SC_KEYPAD_GREATER_THAN_SIGN          0xC6
298
                #define HID_KEYBOARD_SC_KEYPAD_AMP                        0xC7
299
                #define HID_KEYBOARD_SC_KEYPAD_AMP_AMP                    0xC8
300
                #define HID_KEYBOARD_SC_KEYPAD_PIPE                       0xC9
301
                #define HID_KEYBOARD_SC_KEYPAD_PIPE_PIPE                  0xCA
302
                #define HID_KEYBOARD_SC_KEYPAD_COLON                      0xCB
303
                #define HID_KEYBOARD_SC_KEYPAD_HASHMARK                   0xCC
304
                #define HID_KEYBOARD_SC_KEYPAD_SPACE                      0xCD
305
                #define HID_KEYBOARD_SC_KEYPAD_AT                         0xCE
306
                #define HID_KEYBOARD_SC_KEYPAD_EXCLAMATION_SIGN           0xCF
307
                #define HID_KEYBOARD_SC_KEYPAD_MEMORY_STORE               0xD0
308
                #define HID_KEYBOARD_SC_KEYPAD_MEMORY_RECALL              0xD1
309
                #define HID_KEYBOARD_SC_KEYPAD_MEMORY_CLEAR               0xD2
310
                #define HID_KEYBOARD_SC_KEYPAD_MEMORY_ADD                 0xD3
311
                #define HID_KEYBOARD_SC_KEYPAD_MEMORY_SUBTRACT            0xD4
312
                #define HID_KEYBOARD_SC_KEYPAD_MEMORY_MULTIPLY            0xD5
313
                #define HID_KEYBOARD_SC_KEYPAD_MEMORY_DIVIDE              0xD6
314
                #define HID_KEYBOARD_SC_KEYPAD_PLUS_AND_MINUS             0xD7
315
                #define HID_KEYBOARD_SC_KEYPAD_CLEAR                      0xD8
316
                #define HID_KEYBOARD_SC_KEYPAD_CLEAR_ENTRY                0xD9
317
                #define HID_KEYBOARD_SC_KEYPAD_BINARY                     0xDA
318
                #define HID_KEYBOARD_SC_KEYPAD_OCTAL                      0xDB
319
                #define HID_KEYBOARD_SC_KEYPAD_DECIMAL                    0xDC
320
                #define HID_KEYBOARD_SC_KEYPAD_HEXADECIMAL                0xDD
321
                #define HID_KEYBOARD_SC_LEFT_CONTROL                      0xE0
322
                #define HID_KEYBOARD_SC_LEFT_SHIFT                        0xE1
323
                #define HID_KEYBOARD_SC_LEFT_ALT                          0xE2
324
                #define HID_KEYBOARD_SC_LEFT_GUI                          0xE3
325
                #define HID_KEYBOARD_SC_RIGHT_CONTROL                     0xE4
326
                #define HID_KEYBOARD_SC_RIGHT_SHIFT                       0xE5
327
                #define HID_KEYBOARD_SC_RIGHT_ALT                         0xE6
328
                #define HID_KEYBOARD_SC_RIGHT_GUI                         0xE7
329
                //@}
330

    
331
                /** \name Common HID Device Report Descriptors */
332
                //@{
333
                /** \hideinitializer
334
                 *  A list of HID report item array elements that describe a typical HID USB Joystick. The resulting report
335
                 *  descriptor is structured according to the following layout:
336
                 *
337
                 *  \code
338
                 *  struct
339
                 *  {
340
                 *      intB_t X; // Signed X axis value
341
                 *      intB_t Y; // Signed Y axis value
342
                 *      int8_t Z; // Signed Z axis value
343
                 *      // Additional axis elements here
344
                 *      uintA_t Buttons; // Pressed buttons bitmask
345
                 *  } Joystick_Report;
346
                 *  \endcode
347
                 *
348
                 *  Where \c uintA_t is a type large enough to hold one bit per button, and \c intB_t is a type large enough to hold the
349
                 *  ranges of the signed \c MinAxisVal and \c MaxAxisVal values.
350
                 *
351
                 *  \param[in] NumAxis         Number of axis in the joystick (8-bit)
352
                 *  \param[in] MinAxisVal      Minimum logical axis value (16-bit).
353
                 *  \param[in] MaxAxisVal      Maximum logical axis value (16-bit).
354
                 *  \param[in] MinPhysicalVal  Minimum physical axis value, for movement resolution calculations (16-bit).
355
                 *  \param[in] MaxPhysicalVal  Maximum physical axis value, for movement resolution calculations (16-bit).
356
                 *  \param[in] Buttons         Total number of buttons in the device (8-bit).
357
                 */
358
                #define HID_DESCRIPTOR_JOYSTICK(NumAxis, MinAxisVal, MaxAxisVal, MinPhysicalVal, MaxPhysicalVal, Buttons) \
359
                        HID_RI_USAGE_PAGE(8, 0x01),                     \
360
                        HID_RI_USAGE(8, 0x04),                          \
361
                        HID_RI_COLLECTION(8, 0x01),                     \
362
                                HID_RI_USAGE(8, 0x01),                      \
363
                                HID_RI_COLLECTION(8, 0x00),                 \
364
                                        HID_RI_USAGE_MINIMUM(8, 0x30),          \
365
                                        HID_RI_USAGE_MAXIMUM(8, (0x30 + (NumAxis - 1))), \
366
                                        HID_RI_LOGICAL_MINIMUM(16, MinAxisVal), \
367
                                        HID_RI_LOGICAL_MAXIMUM(16, MaxAxisVal), \
368
                                        HID_RI_PHYSICAL_MINIMUM(16, MinPhysicalVal), \
369
                                        HID_RI_PHYSICAL_MAXIMUM(16, MaxPhysicalVal), \
370
                                        HID_RI_REPORT_COUNT(8, NumAxis),        \
371
                                        HID_RI_REPORT_SIZE(8, ((((MinAxisVal >= -0xFF) && (MaxAxisVal <= 0xFF)) ? 8 : 16))), \
372
                                        HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), \
373
                                HID_RI_END_COLLECTION(0),                   \
374
                                HID_RI_USAGE_PAGE(8, 0x09),                 \
375
                                HID_RI_USAGE_MINIMUM(8, 0x01),              \
376
                                HID_RI_USAGE_MAXIMUM(8, Buttons),           \
377
                                HID_RI_LOGICAL_MINIMUM(8, 0x00),            \
378
                                HID_RI_LOGICAL_MAXIMUM(8, 0x01),            \
379
                                HID_RI_REPORT_SIZE(8, 0x01),                \
380
                                HID_RI_REPORT_COUNT(8, Buttons),            \
381
                                HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), \
382
                                HID_RI_REPORT_SIZE(8, (8 - (Buttons % 8))), \
383
                                HID_RI_REPORT_COUNT(8, 0x01),               \
384
                                HID_RI_INPUT(8, HID_IOF_CONSTANT),          \
385
                        HID_RI_END_COLLECTION(0)
386

    
387
                /** \hideinitializer
388
                 *  A list of HID report item array elements that describe a typical HID USB keyboard. The resulting report descriptor
389
                 *  is compatible with \ref USB_KeyboardReport_Data_t when \c MaxKeys is equal to 6. For other values, the report will
390
                 *  be structured according to the following layout:
391
                 *
392
                 *  \code
393
                 *  struct
394
                 *  {
395
                 *      uint8_t Modifier; // Keyboard modifier byte indicating pressed modifier keys (HID_KEYBOARD_MODIFER_* masks)
396
                 *      uint8_t Reserved; // Reserved for OEM use, always set to 0.
397
                 *      uint8_t KeyCode[MaxKeys]; // Length determined by the number of keys that can be reported
398
                 *  } Keyboard_Report;
399
                 *  \endcode
400
                 *
401
                 *  \param[in] MaxKeys  Number of simultaneous keys that can be reported at the one time (8-bit).
402
                 */
403
                #define HID_DESCRIPTOR_KEYBOARD(MaxKeys)            \
404
                        HID_RI_USAGE_PAGE(8, 0x01),                     \
405
                        HID_RI_USAGE(8, 0x06),                          \
406
                        HID_RI_COLLECTION(8, 0x01),                     \
407
                                HID_RI_USAGE_PAGE(8, 0x07),                 \
408
                                HID_RI_USAGE_MINIMUM(8, 0xE0),              \
409
                                HID_RI_USAGE_MAXIMUM(8, 0xE7),              \
410
                                HID_RI_LOGICAL_MINIMUM(8, 0x00),            \
411
                                HID_RI_LOGICAL_MAXIMUM(8, 0x01),            \
412
                                HID_RI_REPORT_SIZE(8, 0x01),                \
413
                                HID_RI_REPORT_COUNT(8, 0x08),               \
414
                                HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), \
415
                                HID_RI_REPORT_COUNT(8, 0x01),               \
416
                                HID_RI_REPORT_SIZE(8, 0x08),                \
417
                                HID_RI_INPUT(8, HID_IOF_CONSTANT),          \
418
                                HID_RI_USAGE_PAGE(8, 0x08),                 \
419
                                HID_RI_USAGE_MINIMUM(8, 0x01),              \
420
                                HID_RI_USAGE_MAXIMUM(8, 0x05),              \
421
                                HID_RI_REPORT_COUNT(8, 0x05),               \
422
                                HID_RI_REPORT_SIZE(8, 0x01),                \
423
                                HID_RI_OUTPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE), \
424
                                HID_RI_REPORT_COUNT(8, 0x01),               \
425
                                HID_RI_REPORT_SIZE(8, 0x03),                \
426
                                HID_RI_OUTPUT(8, HID_IOF_CONSTANT),         \
427
                                HID_RI_LOGICAL_MINIMUM(8, 0x00),            \
428
                                HID_RI_LOGICAL_MAXIMUM(8, 0x65),            \
429
                                HID_RI_USAGE_PAGE(8, 0x07),                 \
430
                                HID_RI_USAGE_MINIMUM(8, 0x00),              \
431
                                HID_RI_USAGE_MAXIMUM(8, 0x65),              \
432
                                HID_RI_REPORT_COUNT(8, MaxKeys),            \
433
                                HID_RI_REPORT_SIZE(8, 0x08),                \
434
                                HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_ARRAY | HID_IOF_ABSOLUTE), \
435
                        HID_RI_END_COLLECTION(0)
436

    
437
                /** \hideinitializer
438
                 *  A list of HID report item array elements that describe a typical HID USB mouse. The resulting report descriptor
439
                 *  is compatible with \ref USB_MouseReport_Data_t if the \c MinAxisVal and \c MaxAxisVal values fit within a \c int8_t range
440
                 *  and the number of Buttons is less than 8. For other values, the report is structured according to the following layout:
441
                 *
442
                 *  \code
443
                 *  struct
444
                 *  {
445
                 *      uintA_t Buttons; // Pressed buttons bitmask
446
                 *      intB_t X; // X axis value
447
                 *      intB_t Y; // Y axis value
448
                 *  } Mouse_Report;
449
                 *  \endcode
450
                 *
451
                 *  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
452
                 *  ranges of the signed \c MinAxisVal and \c MaxAxisVal values.
453
                 *
454
                 *  \param[in] MinAxisVal      Minimum X/Y logical axis value (16-bit).
455
                 *  \param[in] MaxAxisVal      Maximum X/Y logical axis value (16-bit).
456
                 *  \param[in] MinPhysicalVal  Minimum X/Y physical axis value, for movement resolution calculations (16-bit).
457
                 *  \param[in] MaxPhysicalVal  Maximum X/Y physical axis value, for movement resolution calculations (16-bit).
458
                 *  \param[in] Buttons         Total number of buttons in the device (8-bit).
459
                 *  \param[in] AbsoluteCoords  Boolean true to use absolute X/Y coordinates (e.g. touchscreen).
460
                 */
461
                #define HID_DESCRIPTOR_MOUSE(MinAxisVal, MaxAxisVal, MinPhysicalVal, MaxPhysicalVal, Buttons, AbsoluteCoords) \
462
                        HID_RI_USAGE_PAGE(8, 0x01),                     \
463
                        HID_RI_USAGE(8, 0x02),                          \
464
                        HID_RI_COLLECTION(8, 0x01),                     \
465
                                HID_RI_USAGE(8, 0x01),                      \
466
                                HID_RI_COLLECTION(8, 0x00),                 \
467
                                        HID_RI_USAGE_PAGE(8, 0x09),             \
468
                                        HID_RI_USAGE_MINIMUM(8, 0x01),          \
469
                                        HID_RI_USAGE_MAXIMUM(8, Buttons),       \
470
                                        HID_RI_LOGICAL_MINIMUM(8, 0x00),        \
471
                                        HID_RI_LOGICAL_MAXIMUM(8, 0x01),        \
472
                                        HID_RI_REPORT_COUNT(8, Buttons),        \
473
                                        HID_RI_REPORT_SIZE(8, 0x01),            \
474
                                        HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), \
475
                                        HID_RI_REPORT_COUNT(8, 0x01),           \
476
                                        HID_RI_REPORT_SIZE(8, (8 - (Buttons % 8))), \
477
                                        HID_RI_INPUT(8, HID_IOF_CONSTANT),      \
478
                                        HID_RI_USAGE_PAGE(8, 0x01),             \
479
                                        HID_RI_USAGE(8, 0x30),                  \
480
                                        HID_RI_USAGE(8, 0x31),                  \
481
                                        HID_RI_LOGICAL_MINIMUM(16, MinAxisVal), \
482
                                        HID_RI_LOGICAL_MAXIMUM(16, MaxAxisVal), \
483
                                        HID_RI_PHYSICAL_MINIMUM(16, MinPhysicalVal), \
484
                                        HID_RI_PHYSICAL_MAXIMUM(16, MaxPhysicalVal), \
485
                                        HID_RI_REPORT_COUNT(8, 0x02),           \
486
                                        HID_RI_REPORT_SIZE(8, ((((MinAxisVal >= -0xFF) && (MaxAxisVal <= 0xFF)) ? 8 : 16))), \
487
                                        HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | (AbsoluteCoords ? HID_IOF_ABSOLUTE : HID_IOF_RELATIVE)), \
488
                                HID_RI_END_COLLECTION(0),                   \
489
                        HID_RI_END_COLLECTION(0)
490

    
491
                /** \hideinitializer
492
                 *  A list of HID report item array elements that describe a typical Vendor Defined byte array HID report descriptor,
493
                 *  used for transporting arbitrary data between the USB host and device via HID reports. The resulting report should be
494
                 *  a uint8_t byte array of the specified length in both Device to Host (IN) and Host to Device (OUT) directions.
495
                 *
496
                 *  \param[in] VendorPageNum    Vendor Defined HID Usage Page index, ranging from 0x00 to 0xFF.
497
                 *  \param[in] CollectionUsage  Vendor Usage for the encompassing report IN and OUT collection, ranging from 0x00 to 0xFF.
498
                 *  \param[in] DataINUsage      Vendor Usage for the IN report data, ranging from 0x00 to 0xFF.
499
                 *  \param[in] DataOUTUsage     Vendor Usage for the OUT report data, ranging from 0x00 to 0xFF.   
500
                 *  \param[in] NumBytes         Length of the data IN and OUT reports.
501
                 */
502
                #define HID_DESCRIPTOR_VENDOR(VendorPageNum, CollectionUsage, DataINUsage, DataOUTUsage, NumBytes) \
503
                        HID_RI_USAGE_PAGE(16, (0xFF00 | VendorPageNum)), \
504
                        HID_RI_USAGE(8, CollectionUsage),           \
505
                        HID_RI_COLLECTION(8, 0x01),                 \
506
                                HID_RI_USAGE(8, DataINUsage),           \
507
                                HID_RI_LOGICAL_MINIMUM(8, 0x00),        \
508
                                HID_RI_LOGICAL_MAXIMUM(8, 0xFF),        \
509
                                HID_RI_REPORT_SIZE(8, 0x08),            \
510
                                HID_RI_REPORT_COUNT(8, NumBytes),       \
511
                                HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), \
512
                                HID_RI_USAGE(8, DataOUTUsage),          \
513
                                HID_RI_LOGICAL_MINIMUM(8, 0x00),        \
514
                                HID_RI_LOGICAL_MAXIMUM(8, 0xFF),        \
515
                                HID_RI_REPORT_SIZE(8, 0x08),            \
516
                                HID_RI_REPORT_COUNT(8, NumBytes),       \
517
                                HID_RI_OUTPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE), \
518
                        HID_RI_END_COLLECTION(0)
519
                //@}
520
                
521
        /* Type Defines: */
522
                /** Enum for possible Class, Subclass and Protocol values of device and interface descriptors relating to the HID
523
                 *  device class.
524
                 */
525
                enum HID_Descriptor_ClassSubclassProtocol_t
526
                {
527
                        HID_CSCP_HIDClass             = 0x03, /**< Descriptor Class value indicating that the device or interface
528
                                                               *   belongs to the HID class.
529
                                                               */
530
                        HID_CSCP_NonBootSubclass      = 0x00, /**< Descriptor Subclass value indicating that the device or interface
531
                                                               *   does not implement a HID boot protocol.
532
                                                               */
533
                        HID_CSCP_BootSubclass         = 0x01, /**< Descriptor Subclass value indicating that the device or interface
534
                                                               *   implements a HID boot protocol.
535
                                                               */
536
                        HID_CSCP_NonBootProtocol      = 0x00, /**< Descriptor Protocol value indicating that the device or interface
537
                                                               *   does not belong to a HID boot protocol.
538
                                                               */
539
                        HID_CSCP_KeyboardBootProtocol = 0x01, /**< Descriptor Protocol value indicating that the device or interface
540
                                                               *   belongs to the Keyboard HID boot protocol.
541
                                                               */
542
                        HID_CSCP_MouseBootProtocol    = 0x02, /**< Descriptor Protocol value indicating that the device or interface
543
                                                               *   belongs to the Mouse HID boot protocol.
544
                                                               */
545
                };
546
        
547
                /** Enum for the HID class specific control requests that can be issued by the USB bus host. */
548
                enum HID_ClassRequests_t
549
                {
550
                        HID_REQ_GetReport       = 0x01, /**< HID class-specific Request to get the current HID report from the device. */
551
                        HID_REQ_GetIdle         = 0x02, /**< HID class-specific Request to get the current device idle count. */
552
                        HID_REQ_GetProtocol     = 0x03, /**< HID class-specific Request to get the current HID report protocol mode. */
553
                        HID_REQ_SetReport       = 0x09, /**< HID class-specific Request to set the current HID report to the device. */
554
                        HID_REQ_SetIdle         = 0x0A, /**< HID class-specific Request to set the device's idle count. */
555
                        HID_REQ_SetProtocol     = 0x0B, /**< HID class-specific Request to set the current HID report protocol mode. */
556
                };
557

    
558
                /** Enum for the HID class specific descriptor types. */
559
                enum HID_DescriptorTypes_t
560
                {
561
                        HID_DTYPE_HID           = 0x21, /**< Descriptor header type value, to indicate a HID class HID descriptor. */
562
                        HID_DTYPE_Report        = 0x22, /**< Descriptor header type value, to indicate a HID class HID report descriptor. */
563
                };
564

    
565
                /** Enum for the different types of HID reports. */
566
                enum HID_ReportItemTypes_t
567
                {
568
                        HID_REPORT_ITEM_In      = 0, /**< Indicates that the item is an IN report type. */
569
                        HID_REPORT_ITEM_Out     = 1, /**< Indicates that the item is an OUT report type. */
570
                        HID_REPORT_ITEM_Feature = 2, /**< Indicates that the item is a FEATURE report type. */
571
                };
572

    
573
                /** \brief HID class-specific HID Descriptor (LUFA naming conventions).
574
                 *
575
                 *  Type define for the HID class-specific HID descriptor, to describe the HID device's specifications. Refer to the HID
576
                 *  specification for details on the structure elements.
577
                 *
578
                 *  \see \ref USB_HID_StdDescriptor_HID_t for the version of this type with standard element names.
579
                 *
580
                 *  \note Regardless of CPU architecture, these values should be stored as little endian.
581
                 */
582
                typedef struct
583
                {
584
                        USB_Descriptor_Header_t Header; /**< Regular descriptor header containing the descriptor's type and length. */
585

    
586
                        uint16_t                HIDSpec; /**< BCD encoded version that the HID descriptor and device complies to. */
587
                        uint8_t                 CountryCode; /**< Country code of the localized device, or zero if universal. */
588

    
589
                        uint8_t                 TotalReportDescriptors; /**< Total number of HID report descriptors for the interface. */
590

    
591
                        uint8_t                 HIDReportType; /**< Type of HID report, set to \ref HID_DTYPE_Report. */
592
                        uint16_t                HIDReportLength; /**< Length of the associated HID report descriptor, in bytes. */
593
                } ATTR_PACKED USB_HID_Descriptor_HID_t;
594

    
595
                /** \brief HID class-specific HID Descriptor (USB-IF naming conventions).
596
                 *
597
                 *  Type define for the HID class-specific HID descriptor, to describe the HID device's specifications. Refer to the HID
598
                 *  specification for details on the structure elements.
599
                 *
600
                 *  \see \ref USB_HID_Descriptor_HID_t for the version of this type with non-standard LUFA specific
601
                 *       element names.
602
                 *
603
                 *  \note Regardless of CPU architecture, these values should be stored as little endian.
604
                 */
605
                typedef struct
606
                {
607
                        uint8_t  bLength; /**< Size of the descriptor, in bytes. */
608
                        uint8_t  bDescriptorType; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a value
609
                                                   *   given by the specific class.
610
                                                   */
611

    
612
                        uint16_t bcdHID; /**< BCD encoded version that the HID descriptor and device complies to. */
613
                        uint8_t  bCountryCode; /**< Country code of the localized device, or zero if universal. */
614

    
615
                        uint8_t  bNumDescriptors; /**< Total number of HID report descriptors for the interface. */
616

    
617
                        uint8_t  bDescriptorType2; /**< Type of HID report, set to \ref HID_DTYPE_Report. */
618
                        uint16_t wDescriptorLength; /**< Length of the associated HID report descriptor, in bytes. */
619
                } ATTR_PACKED USB_HID_StdDescriptor_HID_t;
620

    
621
                /** \brief Standard HID Boot Protocol Mouse Report.
622
                 *
623
                 *  Type define for a standard Boot Protocol Mouse report
624
                 */
625
                typedef struct
626
                {
627
                        uint8_t Button; /**< Button mask for currently pressed buttons in the mouse. */
628
                        int8_t  X; /**< Current delta X movement of the mouse. */
629
                        int8_t  Y; /**< Current delta Y movement on the mouse. */
630
                } ATTR_PACKED USB_MouseReport_Data_t;
631

    
632
                /** \brief Standard HID Boot Protocol Keyboard Report.
633
                 *
634
                 *  Type define for a standard Boot Protocol Keyboard report
635
                 */
636
                typedef struct
637
                {
638
                        uint8_t Modifier; /**< Keyboard modifier byte, indicating pressed modifier keys (a combination of
639
                                           *   \c HID_KEYBOARD_MODIFER_* masks).
640
                                           */
641
                        uint8_t Reserved; /**< Reserved for OEM use, always set to 0. */
642
                        uint8_t KeyCode[6]; /**< Key codes of the currently pressed keys. */
643
                } ATTR_PACKED USB_KeyboardReport_Data_t;
644

    
645
                /** Type define for the data type used to store HID report descriptor elements. */
646
                typedef uint8_t USB_Descriptor_HIDReport_Datatype_t;
647

    
648
        /* Disable C linkage for C++ Compilers: */
649
                #if defined(__cplusplus)
650
                        }
651
                #endif
652

    
653
#endif
654

    
655
/** @} */
656