3      Copyright (C) Dean Camera, 2018. 
   5   dean [at] fourwalledcubicle [dot] com 
  10   Copyright 2018  Dean Camera (dean [at] fourwalledcubicle [dot] com) 
  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. 
  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 
  32  *  \brief Common definitions and declarations for the library USB HID Class driver. 
  34  *  Common definitions and declarations for the library USB HID Class driver. 
  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. 
  40 /** \ingroup Group_USBClassHID 
  41  *  \defgroup Group_USBClassHIDCommon  Common Class Definitions 
  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 
  50 #ifndef _HID_CLASS_COMMON_H_ 
  51 #define _HID_CLASS_COMMON_H_ 
  54                 #include "../../Core/StdDescriptors.h" 
  55                 #include "HIDParser.h" 
  57         /* Enable C linkage for C++ Compilers: */ 
  58                 #if defined(__cplusplus) 
  62         /* Preprocessor Checks: */ 
  63                 #if !defined(__INCLUDE_FROM_HID_DRIVER) 
  64                         #error Do not include this file directly. Include LUFA/Drivers/USB.h instead. 
  68                 /** \name Keyboard Standard Report Modifier Masks */ 
  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) 
  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) 
  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) 
  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) 
  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) 
  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) 
  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) 
  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) 
  95                 /** \name Keyboard Standard Report LED Masks */ 
  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) 
 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) 
 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) 
 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) 
 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) 
 113                 /** \name Keyboard Standard Report Key Scan-codes */ 
 115                 #define HID_KEYBOARD_SC_RESERVED                          0x00 
 116                 #define HID_KEYBOARD_SC_ERROR_ROLLOVER                    0x01 
 117                 #define HID_KEYBOARD_SC_POST_FAIL                         0x02 
 118                 #define HID_KEYBOARD_SC_ERROR_UNDEFINED                   0x03 
 119                 #define HID_KEYBOARD_SC_A                                 0x04 
 120                 #define HID_KEYBOARD_SC_B                                 0x05 
 121                 #define HID_KEYBOARD_SC_C                                 0x06 
 122                 #define HID_KEYBOARD_SC_D                                 0x07 
 123                 #define HID_KEYBOARD_SC_E                                 0x08 
 124                 #define HID_KEYBOARD_SC_F                                 0x09 
 125                 #define HID_KEYBOARD_SC_G                                 0x0A 
 126                 #define HID_KEYBOARD_SC_H                                 0x0B 
 127                 #define HID_KEYBOARD_SC_I                                 0x0C 
 128                 #define HID_KEYBOARD_SC_J                                 0x0D 
 129                 #define HID_KEYBOARD_SC_K                                 0x0E 
 130                 #define HID_KEYBOARD_SC_L                                 0x0F 
 131                 #define HID_KEYBOARD_SC_M                                 0x10 
 132                 #define HID_KEYBOARD_SC_N                                 0x11 
 133                 #define HID_KEYBOARD_SC_O                                 0x12 
 134                 #define HID_KEYBOARD_SC_P                                 0x13 
 135                 #define HID_KEYBOARD_SC_Q                                 0x14 
 136                 #define HID_KEYBOARD_SC_R                                 0x15 
 137                 #define HID_KEYBOARD_SC_S                                 0x16 
 138                 #define HID_KEYBOARD_SC_T                                 0x17 
 139                 #define HID_KEYBOARD_SC_U                                 0x18 
 140                 #define HID_KEYBOARD_SC_V                                 0x19 
 141                 #define HID_KEYBOARD_SC_W                                 0x1A 
 142                 #define HID_KEYBOARD_SC_X                                 0x1B 
 143                 #define HID_KEYBOARD_SC_Y                                 0x1C 
 144                 #define HID_KEYBOARD_SC_Z                                 0x1D 
 145                 #define HID_KEYBOARD_SC_1_AND_EXCLAMATION                 0x1E 
 146                 #define HID_KEYBOARD_SC_2_AND_AT                          0x1F 
 147                 #define HID_KEYBOARD_SC_3_AND_HASHMARK                    0x20 
 148                 #define HID_KEYBOARD_SC_4_AND_DOLLAR                      0x21 
 149                 #define HID_KEYBOARD_SC_5_AND_PERCENTAGE                  0x22 
 150                 #define HID_KEYBOARD_SC_6_AND_CARET                       0x23 
 151                 #define HID_KEYBOARD_SC_7_AND_AMPERSAND                   0x24 
 152                 #define HID_KEYBOARD_SC_8_AND_ASTERISK                    0x25 
 153                 #define HID_KEYBOARD_SC_9_AND_OPENING_PARENTHESIS         0x26 
 154                 #define HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS         0x27 
 155                 #define HID_KEYBOARD_SC_ENTER                             0x28 
 156                 #define HID_KEYBOARD_SC_ESCAPE                            0x29 
 157                 #define HID_KEYBOARD_SC_BACKSPACE                         0x2A 
 158                 #define HID_KEYBOARD_SC_TAB                               0x2B 
 159                 #define HID_KEYBOARD_SC_SPACE                             0x2C 
 160                 #define HID_KEYBOARD_SC_MINUS_AND_UNDERSCORE              0x2D 
 161                 #define HID_KEYBOARD_SC_EQUAL_AND_PLUS                    0x2E 
 162                 #define HID_KEYBOARD_SC_OPENING_BRACKET_AND_OPENING_BRACE 0x2F 
 163                 #define HID_KEYBOARD_SC_CLOSING_BRACKET_AND_CLOSING_BRACE 0x30 
 164                 #define HID_KEYBOARD_SC_BACKSLASH_AND_PIPE                0x31 
 165                 #define HID_KEYBOARD_SC_NON_US_HASHMARK_AND_TILDE         0x32 
 166                 #define HID_KEYBOARD_SC_SEMICOLON_AND_COLON               0x33 
 167                 #define HID_KEYBOARD_SC_APOSTROPHE_AND_QUOTE              0x34 
 168                 #define HID_KEYBOARD_SC_GRAVE_ACCENT_AND_TILDE            0x35 
 169                 #define HID_KEYBOARD_SC_COMMA_AND_LESS_THAN_SIGN          0x36 
 170                 #define HID_KEYBOARD_SC_DOT_AND_GREATER_THAN_SIGN         0x37 
 171                 #define HID_KEYBOARD_SC_SLASH_AND_QUESTION_MARK           0x38 
 172                 #define HID_KEYBOARD_SC_CAPS_LOCK                         0x39 
 173                 #define HID_KEYBOARD_SC_F1                                0x3A 
 174                 #define HID_KEYBOARD_SC_F2                                0x3B 
 175                 #define HID_KEYBOARD_SC_F3                                0x3C 
 176                 #define HID_KEYBOARD_SC_F4                                0x3D 
 177                 #define HID_KEYBOARD_SC_F5                                0x3E 
 178                 #define HID_KEYBOARD_SC_F6                                0x3F 
 179                 #define HID_KEYBOARD_SC_F7                                0x40 
 180                 #define HID_KEYBOARD_SC_F8                                0x41 
 181                 #define HID_KEYBOARD_SC_F9                                0x42 
 182                 #define HID_KEYBOARD_SC_F10                               0x43 
 183                 #define HID_KEYBOARD_SC_F11                               0x44 
 184                 #define HID_KEYBOARD_SC_F12                               0x45 
 185                 #define HID_KEYBOARD_SC_PRINT_SCREEN                      0x46 
 186                 #define HID_KEYBOARD_SC_SCROLL_LOCK                       0x47 
 187                 #define HID_KEYBOARD_SC_PAUSE                             0x48 
 188                 #define HID_KEYBOARD_SC_INSERT                            0x49 
 189                 #define HID_KEYBOARD_SC_HOME                              0x4A 
 190                 #define HID_KEYBOARD_SC_PAGE_UP                           0x4B 
 191                 #define HID_KEYBOARD_SC_DELETE                            0x4C 
 192                 #define HID_KEYBOARD_SC_END                               0x4D 
 193                 #define HID_KEYBOARD_SC_PAGE_DOWN                         0x4E 
 194                 #define HID_KEYBOARD_SC_RIGHT_ARROW                       0x4F 
 195                 #define HID_KEYBOARD_SC_LEFT_ARROW                        0x50 
 196                 #define HID_KEYBOARD_SC_DOWN_ARROW                        0x51 
 197                 #define HID_KEYBOARD_SC_UP_ARROW                          0x52 
 198                 #define HID_KEYBOARD_SC_NUM_LOCK                          0x53 
 199                 #define HID_KEYBOARD_SC_KEYPAD_SLASH                      0x54 
 200                 #define HID_KEYBOARD_SC_KEYPAD_ASTERISK                   0x55 
 201                 #define HID_KEYBOARD_SC_KEYPAD_MINUS                      0x56 
 202                 #define HID_KEYBOARD_SC_KEYPAD_PLUS                       0x57 
 203                 #define HID_KEYBOARD_SC_KEYPAD_ENTER                      0x58 
 204                 #define HID_KEYBOARD_SC_KEYPAD_1_AND_END                  0x59 
 205                 #define HID_KEYBOARD_SC_KEYPAD_2_AND_DOWN_ARROW           0x5A 
 206                 #define HID_KEYBOARD_SC_KEYPAD_3_AND_PAGE_DOWN            0x5B 
 207                 #define HID_KEYBOARD_SC_KEYPAD_4_AND_LEFT_ARROW           0x5C 
 208                 #define HID_KEYBOARD_SC_KEYPAD_5                          0x5D 
 209                 #define HID_KEYBOARD_SC_KEYPAD_6_AND_RIGHT_ARROW          0x5E 
 210                 #define HID_KEYBOARD_SC_KEYPAD_7_AND_HOME                 0x5F 
 211                 #define HID_KEYBOARD_SC_KEYPAD_8_AND_UP_ARROW             0x60 
 212                 #define HID_KEYBOARD_SC_KEYPAD_9_AND_PAGE_UP              0x61 
 213                 #define HID_KEYBOARD_SC_KEYPAD_0_AND_INSERT               0x62 
 214                 #define HID_KEYBOARD_SC_KEYPAD_DOT_AND_DELETE             0x63 
 215                 #define HID_KEYBOARD_SC_NON_US_BACKSLASH_AND_PIPE         0x64 
 216                 #define HID_KEYBOARD_SC_APPLICATION                       0x65 
 217                 #define HID_KEYBOARD_SC_POWER                             0x66 
 218                 #define HID_KEYBOARD_SC_KEYPAD_EQUAL_SIGN                 0x67 
 219                 #define HID_KEYBOARD_SC_F13                               0x68 
 220                 #define HID_KEYBOARD_SC_F14                               0x69 
 221                 #define HID_KEYBOARD_SC_F15                               0x6A 
 222                 #define HID_KEYBOARD_SC_F16                               0x6B 
 223                 #define HID_KEYBOARD_SC_F17                               0x6C 
 224                 #define HID_KEYBOARD_SC_F18                               0x6D 
 225                 #define HID_KEYBOARD_SC_F19                               0x6E 
 226                 #define HID_KEYBOARD_SC_F20                               0x6F 
 227                 #define HID_KEYBOARD_SC_F21                               0x70 
 228                 #define HID_KEYBOARD_SC_F22                               0x71 
 229                 #define HID_KEYBOARD_SC_F23                               0x72 
 230                 #define HID_KEYBOARD_SC_F24                               0x73 
 231                 #define HID_KEYBOARD_SC_EXECUTE                           0x74 
 232                 #define HID_KEYBOARD_SC_HELP                              0x75 
 233                 #define HID_KEYBOARD_SC_MENU                              0x76 
 234                 #define HID_KEYBOARD_SC_SELECT                            0x77 
 235                 #define HID_KEYBOARD_SC_STOP                              0x78 
 236                 #define HID_KEYBOARD_SC_AGAIN                             0x79 
 237                 #define HID_KEYBOARD_SC_UNDO                              0x7A 
 238                 #define HID_KEYBOARD_SC_CUT                               0x7B 
 239                 #define HID_KEYBOARD_SC_COPY                              0x7C 
 240                 #define HID_KEYBOARD_SC_PASTE                             0x7D 
 241                 #define HID_KEYBOARD_SC_FIND                              0x7E 
 242                 #define HID_KEYBOARD_SC_MUTE                              0x7F 
 243                 #define HID_KEYBOARD_SC_VOLUME_UP                         0x80 
 244                 #define HID_KEYBOARD_SC_VOLUME_DOWN                       0x81 
 245                 #define HID_KEYBOARD_SC_LOCKING_CAPS_LOCK                 0x82 
 246                 #define HID_KEYBOARD_SC_LOCKING_NUM_LOCK                  0x83 
 247                 #define HID_KEYBOARD_SC_LOCKING_SCROLL_LOCK               0x84 
 248                 #define HID_KEYBOARD_SC_KEYPAD_COMMA                      0x85 
 249                 #define HID_KEYBOARD_SC_KEYPAD_EQUAL_SIGN_AS400           0x86 
 250                 #define HID_KEYBOARD_SC_INTERNATIONAL1                    0x87 
 251                 #define HID_KEYBOARD_SC_INTERNATIONAL2                    0x88 
 252                 #define HID_KEYBOARD_SC_INTERNATIONAL3                    0x89 
 253                 #define HID_KEYBOARD_SC_INTERNATIONAL4                    0x8A 
 254                 #define HID_KEYBOARD_SC_INTERNATIONAL5                    0x8B 
 255                 #define HID_KEYBOARD_SC_INTERNATIONAL6                    0x8C 
 256                 #define HID_KEYBOARD_SC_INTERNATIONAL7                    0x8D 
 257                 #define HID_KEYBOARD_SC_INTERNATIONAL8                    0x8E 
 258                 #define HID_KEYBOARD_SC_INTERNATIONAL9                    0x8F 
 259                 #define HID_KEYBOARD_SC_LANG1                             0x90 
 260                 #define HID_KEYBOARD_SC_LANG2                             0x91 
 261                 #define HID_KEYBOARD_SC_LANG3                             0x92 
 262                 #define HID_KEYBOARD_SC_LANG4                             0x93 
 263                 #define HID_KEYBOARD_SC_LANG5                             0x94 
 264                 #define HID_KEYBOARD_SC_LANG6                             0x95 
 265                 #define HID_KEYBOARD_SC_LANG7                             0x96 
 266                 #define HID_KEYBOARD_SC_LANG8                             0x97 
 267                 #define HID_KEYBOARD_SC_LANG9                             0x98 
 268                 #define HID_KEYBOARD_SC_ALTERNATE_ERASE                   0x99 
 269                 #define HID_KEYBOARD_SC_SYSREQ                            0x9A 
 270                 #define HID_KEYBOARD_SC_CANCEL                            0x9B 
 271                 #define HID_KEYBOARD_SC_CLEAR                             0x9C 
 272                 #define HID_KEYBOARD_SC_PRIOR                             0x9D 
 273                 #define HID_KEYBOARD_SC_RETURN                            0x9E 
 274                 #define HID_KEYBOARD_SC_SEPARATOR                         0x9F 
 275                 #define HID_KEYBOARD_SC_OUT                               0xA0 
 276                 #define HID_KEYBOARD_SC_OPER                              0xA1 
 277                 #define HID_KEYBOARD_SC_CLEAR_AND_AGAIN                   0xA2 
 278                 #define HID_KEYBOARD_SC_CRSEL_AND_PROPS                   0xA3 
 279                 #define HID_KEYBOARD_SC_EXSEL                             0xA4 
 280                 #define HID_KEYBOARD_SC_KEYPAD_00                         0xB0 
 281                 #define HID_KEYBOARD_SC_KEYPAD_000                        0xB1 
 282                 #define HID_KEYBOARD_SC_THOUSANDS_SEPARATOR               0xB2 
 283                 #define HID_KEYBOARD_SC_DECIMAL_SEPARATOR                 0xB3 
 284                 #define HID_KEYBOARD_SC_CURRENCY_UNIT                     0xB4 
 285                 #define HID_KEYBOARD_SC_CURRENCY_SUB_UNIT                 0xB5 
 286                 #define HID_KEYBOARD_SC_KEYPAD_OPENING_PARENTHESIS        0xB6 
 287                 #define HID_KEYBOARD_SC_KEYPAD_CLOSING_PARENTHESIS        0xB7 
 288                 #define HID_KEYBOARD_SC_KEYPAD_OPENING_BRACE              0xB8 
 289                 #define HID_KEYBOARD_SC_KEYPAD_CLOSING_BRACE              0xB9 
 290                 #define HID_KEYBOARD_SC_KEYPAD_TAB                        0xBA 
 291                 #define HID_KEYBOARD_SC_KEYPAD_BACKSPACE                  0xBB 
 292                 #define HID_KEYBOARD_SC_KEYPAD_A                          0xBC 
 293                 #define HID_KEYBOARD_SC_KEYPAD_B                          0xBD 
 294                 #define HID_KEYBOARD_SC_KEYPAD_C                          0xBE 
 295                 #define HID_KEYBOARD_SC_KEYPAD_D                          0xBF 
 296                 #define HID_KEYBOARD_SC_KEYPAD_E                          0xC0 
 297                 #define HID_KEYBOARD_SC_KEYPAD_F                          0xC1 
 298                 #define HID_KEYBOARD_SC_KEYPAD_XOR                        0xC2 
 299                 #define HID_KEYBOARD_SC_KEYPAD_CARET                      0xC3 
 300                 #define HID_KEYBOARD_SC_KEYPAD_PERCENTAGE                 0xC4 
 301                 #define HID_KEYBOARD_SC_KEYPAD_LESS_THAN_SIGN             0xC5 
 302                 #define HID_KEYBOARD_SC_KEYPAD_GREATER_THAN_SIGN          0xC6 
 303                 #define HID_KEYBOARD_SC_KEYPAD_AMP                        0xC7 
 304                 #define HID_KEYBOARD_SC_KEYPAD_AMP_AMP                    0xC8 
 305                 #define HID_KEYBOARD_SC_KEYPAD_PIPE                       0xC9 
 306                 #define HID_KEYBOARD_SC_KEYPAD_PIPE_PIPE                  0xCA 
 307                 #define HID_KEYBOARD_SC_KEYPAD_COLON                      0xCB 
 308                 #define HID_KEYBOARD_SC_KEYPAD_HASHMARK                   0xCC 
 309                 #define HID_KEYBOARD_SC_KEYPAD_SPACE                      0xCD 
 310                 #define HID_KEYBOARD_SC_KEYPAD_AT                         0xCE 
 311                 #define HID_KEYBOARD_SC_KEYPAD_EXCLAMATION_SIGN           0xCF 
 312                 #define HID_KEYBOARD_SC_KEYPAD_MEMORY_STORE               0xD0 
 313                 #define HID_KEYBOARD_SC_KEYPAD_MEMORY_RECALL              0xD1 
 314                 #define HID_KEYBOARD_SC_KEYPAD_MEMORY_CLEAR               0xD2 
 315                 #define HID_KEYBOARD_SC_KEYPAD_MEMORY_ADD                 0xD3 
 316                 #define HID_KEYBOARD_SC_KEYPAD_MEMORY_SUBTRACT            0xD4 
 317                 #define HID_KEYBOARD_SC_KEYPAD_MEMORY_MULTIPLY            0xD5 
 318                 #define HID_KEYBOARD_SC_KEYPAD_MEMORY_DIVIDE              0xD6 
 319                 #define HID_KEYBOARD_SC_KEYPAD_PLUS_AND_MINUS             0xD7 
 320                 #define HID_KEYBOARD_SC_KEYPAD_CLEAR                      0xD8 
 321                 #define HID_KEYBOARD_SC_KEYPAD_CLEAR_ENTRY                0xD9 
 322                 #define HID_KEYBOARD_SC_KEYPAD_BINARY                     0xDA 
 323                 #define HID_KEYBOARD_SC_KEYPAD_OCTAL                      0xDB 
 324                 #define HID_KEYBOARD_SC_KEYPAD_DECIMAL                    0xDC 
 325                 #define HID_KEYBOARD_SC_KEYPAD_HEXADECIMAL                0xDD 
 326                 #define HID_KEYBOARD_SC_LEFT_CONTROL                      0xE0 
 327                 #define HID_KEYBOARD_SC_LEFT_SHIFT                        0xE1 
 328                 #define HID_KEYBOARD_SC_LEFT_ALT                          0xE2 
 329                 #define HID_KEYBOARD_SC_LEFT_GUI                          0xE3 
 330                 #define HID_KEYBOARD_SC_RIGHT_CONTROL                     0xE4 
 331                 #define HID_KEYBOARD_SC_RIGHT_SHIFT                       0xE5 
 332                 #define HID_KEYBOARD_SC_RIGHT_ALT                         0xE6 
 333                 #define HID_KEYBOARD_SC_RIGHT_GUI                         0xE7 
 334                 #define HID_KEYBOARD_SC_MEDIA_PLAY                        0xE8 
 335                 #define HID_KEYBOARD_SC_MEDIA_STOP                        0xE9 
 336                 #define HID_KEYBOARD_SC_MEDIA_PREVIOUS_TRACK              0xEA 
 337                 #define HID_KEYBOARD_SC_MEDIA_NEXT_TRACK                  0xEB 
 338                 #define HID_KEYBOARD_SC_MEDIA_EJECT                       0xEC 
 339                 #define HID_KEYBOARD_SC_MEDIA_VOLUME_UP                   0xED 
 340                 #define HID_KEYBOARD_SC_MEDIA_VOLUME_DOWN                 0xEE 
 341                 #define HID_KEYBOARD_SC_MEDIA_MUTE                        0xEF 
 342                 #define HID_KEYBOARD_SC_MEDIA_WWW                         0xF0 
 343                 #define HID_KEYBOARD_SC_MEDIA_BACKWARD                    0xF1 
 344                 #define HID_KEYBOARD_SC_MEDIA_FORWARD                     0xF2 
 345                 #define HID_KEYBOARD_SC_MEDIA_CANCEL                      0xF3 
 346                 #define HID_KEYBOARD_SC_MEDIA_SEARCH                      0xF4 
 347                 #define HID_KEYBOARD_SC_MEDIA_SLEEP                       0xF8 
 348                 #define HID_KEYBOARD_SC_MEDIA_LOCK                        0xF9 
 349                 #define HID_KEYBOARD_SC_MEDIA_RELOAD                      0xFA 
 350                 #define HID_KEYBOARD_SC_MEDIA_CALCULATOR                  0xFB 
 353                 /** \name Common HID Device Report Descriptors */ 
 356                  *  A list of HID report item array elements that describe a typical HID USB Joystick. The resulting report 
 357                  *  descriptor is structured according to the following layout: 
 362                  *      intA_t X; // Signed X axis value 
 363                  *      intA_t Y; // Signed Y axis value 
 364                  *      intA_t Z; // Signed Z axis value 
 365                  *      uintB_t Buttons; // Pressed buttons bitmask 
 369                  *  Where \c uintA_t is a type large enough to hold the ranges of the signed \c MinAxisVal and \c MaxAxisVal values, 
 370                  *  and \c intB_t is a type large enough to hold one bit per button. 
 372                  *  \param[in] MinAxisVal      Minimum logical axis value (16-bit). 
 373                  *  \param[in] MaxAxisVal      Maximum logical axis value (16-bit). 
 374                  *  \param[in] MinPhysicalVal  Minimum physical axis value, for movement resolution calculations (16-bit). 
 375                  *  \param[in] MaxPhysicalVal  Maximum physical axis value, for movement resolution calculations (16-bit). 
 376                  *  \param[in] Buttons         Total number of buttons in the device (8-bit). 
 378                 #define HID_DESCRIPTOR_JOYSTICK(MinAxisVal, MaxAxisVal, MinPhysicalVal, MaxPhysicalVal, Buttons) \ 
 379                         HID_RI_USAGE_PAGE(8, 0x01),                     \ 
 380                         HID_RI_USAGE(8, 0x04),                          \ 
 381                         HID_RI_COLLECTION(8, 0x01),                     \ 
 382                                 HID_RI_USAGE(8, 0x01),                      \ 
 383                                 HID_RI_COLLECTION(8, 0x00),                 \ 
 384                                         HID_RI_USAGE(8, 0x30),                  \ 
 385                                         HID_RI_USAGE(8, 0x31),                  \ 
 386                                         HID_RI_USAGE(8, 0x32),                  \ 
 387                                         HID_RI_LOGICAL_MINIMUM(16, MinAxisVal), \ 
 388                                         HID_RI_LOGICAL_MAXIMUM(16, MaxAxisVal), \ 
 389                                         HID_RI_PHYSICAL_MINIMUM(16, MinPhysicalVal), \ 
 390                                         HID_RI_PHYSICAL_MAXIMUM(16, MaxPhysicalVal), \ 
 391                                         HID_RI_REPORT_COUNT(8, 3),              \ 
 392                                         HID_RI_REPORT_SIZE(8, (((MinAxisVal >= -128) && (MaxAxisVal <= 127)) ? 8 : 16)), \ 
 393                                         HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), \ 
 394                                 HID_RI_END_COLLECTION(0),                   \ 
 395                                 HID_RI_USAGE_PAGE(8, 0x09),                 \ 
 396                                 HID_RI_USAGE_MINIMUM(8, 0x01),              \ 
 397                                 HID_RI_USAGE_MAXIMUM(8, Buttons),           \ 
 398                                 HID_RI_LOGICAL_MINIMUM(8, 0x00),            \ 
 399                                 HID_RI_LOGICAL_MAXIMUM(8, 0x01),            \ 
 400                                 HID_RI_REPORT_SIZE(8, 0x01),                \ 
 401                                 HID_RI_REPORT_COUNT(8, Buttons),            \ 
 402                                 HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), \ 
 403                                 HID_RI_REPORT_SIZE(8, (Buttons % 8) ? (8 - (Buttons % 8)) : 0), \ 
 404                                 HID_RI_REPORT_COUNT(8, 0x01),               \ 
 405                                 HID_RI_INPUT(8, HID_IOF_CONSTANT),          \ 
 406                         HID_RI_END_COLLECTION(0) 
 409                  *  A list of HID report item array elements that describe a typical HID USB keyboard. The resulting report descriptor 
 410                  *  is compatible with \ref USB_KeyboardReport_Data_t when \c MaxKeys is equal to 6. For other values, the report will 
 411                  *  be structured according to the following layout: 
 416                  *      uint8_t Modifier; // Keyboard modifier byte indicating pressed modifier keys (\c HID_KEYBOARD_MODIFER_* masks) 
 417                  *      uint8_t Reserved; // Reserved for OEM use, always set to 0. 
 418                  *      uint8_t KeyCode[MaxKeys]; // Length determined by the number of keys that can be reported 
 422                  *  \param[in] MaxKeys  Number of simultaneous keys that can be reported at the one time (8-bit). 
 424                 #define HID_DESCRIPTOR_KEYBOARD(MaxKeys)            \ 
 425                         HID_RI_USAGE_PAGE(8, 0x01),                     \ 
 426                         HID_RI_USAGE(8, 0x06),                          \ 
 427                         HID_RI_COLLECTION(8, 0x01),                     \ 
 428                                 HID_RI_USAGE_PAGE(8, 0x07),                 \ 
 429                                 HID_RI_USAGE_MINIMUM(8, 0xE0),              \ 
 430                                 HID_RI_USAGE_MAXIMUM(8, 0xE7),              \ 
 431                                 HID_RI_LOGICAL_MINIMUM(8, 0x00),            \ 
 432                                 HID_RI_LOGICAL_MAXIMUM(8, 0x01),            \ 
 433                                 HID_RI_REPORT_SIZE(8, 0x01),                \ 
 434                                 HID_RI_REPORT_COUNT(8, 0x08),               \ 
 435                                 HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), \ 
 436                                 HID_RI_REPORT_COUNT(8, 0x01),               \ 
 437                                 HID_RI_REPORT_SIZE(8, 0x08),                \ 
 438                                 HID_RI_INPUT(8, HID_IOF_CONSTANT),          \ 
 439                                 HID_RI_USAGE_PAGE(8, 0x08),                 \ 
 440                                 HID_RI_USAGE_MINIMUM(8, 0x01),              \ 
 441                                 HID_RI_USAGE_MAXIMUM(8, 0x05),              \ 
 442                                 HID_RI_REPORT_COUNT(8, 0x05),               \ 
 443                                 HID_RI_REPORT_SIZE(8, 0x01),                \ 
 444                                 HID_RI_OUTPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE), \ 
 445                                 HID_RI_REPORT_COUNT(8, 0x01),               \ 
 446                                 HID_RI_REPORT_SIZE(8, 0x03),                \ 
 447                                 HID_RI_OUTPUT(8, HID_IOF_CONSTANT),         \ 
 448                                 HID_RI_LOGICAL_MINIMUM(8, 0x00),            \ 
 449                                 HID_RI_LOGICAL_MAXIMUM(16, 0xFF),           \ 
 450                                 HID_RI_USAGE_PAGE(8, 0x07),                 \ 
 451                                 HID_RI_USAGE_MINIMUM(8, 0x00),              \ 
 452                                 HID_RI_USAGE_MAXIMUM(8, 0xFF),              \ 
 453                                 HID_RI_REPORT_COUNT(8, MaxKeys),            \ 
 454                                 HID_RI_REPORT_SIZE(8, 0x08),                \ 
 455                                 HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_ARRAY | HID_IOF_ABSOLUTE), \ 
 456                         HID_RI_END_COLLECTION(0) 
 459                  *  A list of HID report item array elements that describe a typical HID USB mouse. The resulting report descriptor 
 460                  *  is compatible with \ref USB_MouseReport_Data_t if the \c MinAxisVal and \c MaxAxisVal values fit within a \c int8_t range 
 461                  *  and the number of Buttons is less than 8. For other values, the report is structured according to the following layout: 
 466                  *      uintA_t Buttons; // Pressed buttons bitmask 
 467                  *      intB_t X; // X axis value 
 468                  *      intB_t Y; // Y axis value 
 472                  *  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 
 473                  *  ranges of the signed \c MinAxisVal and \c MaxAxisVal values. 
 475                  *  \param[in] MinAxisVal      Minimum X/Y logical axis value (16-bit). 
 476                  *  \param[in] MaxAxisVal      Maximum X/Y logical axis value (16-bit). 
 477                  *  \param[in] MinPhysicalVal  Minimum X/Y physical axis value, for movement resolution calculations (16-bit). 
 478                  *  \param[in] MaxPhysicalVal  Maximum X/Y physical axis value, for movement resolution calculations (16-bit). 
 479                  *  \param[in] Buttons         Total number of buttons in the device (8-bit). 
 480                  *  \param[in] AbsoluteCoords  Boolean \c true to use absolute X/Y coordinates (e.g. touchscreen). 
 482                 #define HID_DESCRIPTOR_MOUSE(MinAxisVal, MaxAxisVal, MinPhysicalVal, MaxPhysicalVal, Buttons, AbsoluteCoords) \ 
 483                         HID_RI_USAGE_PAGE(8, 0x01),                     \ 
 484                         HID_RI_USAGE(8, 0x02),                          \ 
 485                         HID_RI_COLLECTION(8, 0x01),                     \ 
 486                                 HID_RI_USAGE(8, 0x01),                      \ 
 487                                 HID_RI_COLLECTION(8, 0x00),                 \ 
 488                                         HID_RI_USAGE_PAGE(8, 0x09),             \ 
 489                                         HID_RI_USAGE_MINIMUM(8, 0x01),          \ 
 490                                         HID_RI_USAGE_MAXIMUM(8, Buttons),       \ 
 491                                         HID_RI_LOGICAL_MINIMUM(8, 0x00),        \ 
 492                                         HID_RI_LOGICAL_MAXIMUM(8, 0x01),        \ 
 493                                         HID_RI_REPORT_COUNT(8, Buttons),        \ 
 494                                         HID_RI_REPORT_SIZE(8, 0x01),            \ 
 495                                         HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), \ 
 496                                         HID_RI_REPORT_COUNT(8, 0x01),           \ 
 497                                         HID_RI_REPORT_SIZE(8, (Buttons % 8) ? (8 - (Buttons % 8)) : 0), \ 
 498                                         HID_RI_INPUT(8, HID_IOF_CONSTANT),      \ 
 499                                         HID_RI_USAGE_PAGE(8, 0x01),             \ 
 500                                         HID_RI_USAGE(8, 0x30),                  \ 
 501                                         HID_RI_USAGE(8, 0x31),                  \ 
 502                                         HID_RI_LOGICAL_MINIMUM(16, MinAxisVal), \ 
 503                                         HID_RI_LOGICAL_MAXIMUM(16, MaxAxisVal), \ 
 504                                         HID_RI_PHYSICAL_MINIMUM(16, MinPhysicalVal), \ 
 505                                         HID_RI_PHYSICAL_MAXIMUM(16, MaxPhysicalVal), \ 
 506                                         HID_RI_REPORT_COUNT(8, 0x02),           \ 
 507                                         HID_RI_REPORT_SIZE(8, (((MinAxisVal >= -128) && (MaxAxisVal <= 127)) ? 8 : 16)), \ 
 508                                         HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | (AbsoluteCoords ? HID_IOF_ABSOLUTE : HID_IOF_RELATIVE)), \ 
 509                                 HID_RI_END_COLLECTION(0),                   \ 
 510                         HID_RI_END_COLLECTION(0) 
 513                  *  A list of HID report item array elements that describe a typical Vendor Defined byte array HID report descriptor, 
 514                  *  used for transporting arbitrary data between the USB host and device via HID reports. The resulting report should be 
 515                  *  a \c uint8_t byte array of the specified length in both Device to Host (IN) and Host to Device (OUT) directions. 
 517                  *  \param[in] VendorPageNum    Vendor Defined HID Usage Page index, ranging from 0x00 to 0xFF. 
 518                  *  \param[in] CollectionUsage  Vendor Usage for the encompassing report IN and OUT collection, ranging from 0x00 to 0xFF. 
 519                  *  \param[in] DataINUsage      Vendor Usage for the IN report data, ranging from 0x00 to 0xFF. 
 520                  *  \param[in] DataOUTUsage     Vendor Usage for the OUT report data, ranging from 0x00 to 0xFF. 
 521                  *  \param[in] NumBytes         Length of the data IN and OUT reports. 
 523                 #define HID_DESCRIPTOR_VENDOR(VendorPageNum, CollectionUsage, DataINUsage, DataOUTUsage, NumBytes) \ 
 524                         HID_RI_USAGE_PAGE(16, (0xFF00 | VendorPageNum)), \ 
 525                         HID_RI_USAGE(8, CollectionUsage),           \ 
 526                         HID_RI_COLLECTION(8, 0x01),                 \ 
 527                                 HID_RI_USAGE(8, DataINUsage),           \ 
 528                                 HID_RI_LOGICAL_MINIMUM(8, 0x00),        \ 
 529                                 HID_RI_LOGICAL_MAXIMUM(8, 0xFF),        \ 
 530                                 HID_RI_REPORT_SIZE(8, 0x08),            \ 
 531                                 HID_RI_REPORT_COUNT(8, NumBytes),       \ 
 532                                 HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), \ 
 533                                 HID_RI_USAGE(8, DataOUTUsage),          \ 
 534                                 HID_RI_LOGICAL_MINIMUM(8, 0x00),        \ 
 535                                 HID_RI_LOGICAL_MAXIMUM(8, 0xFF),        \ 
 536                                 HID_RI_REPORT_SIZE(8, 0x08),            \ 
 537                                 HID_RI_REPORT_COUNT(8, NumBytes),       \ 
 538                                 HID_RI_OUTPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE), \ 
 539                         HID_RI_END_COLLECTION(0) 
 543                 /** Enum for possible Class, Subclass and Protocol values of device and interface descriptors relating to the HID 
 546                 enum HID_Descriptor_ClassSubclassProtocol_t
 
 548                         HID_CSCP_HIDClass             
= 0x03, /**< Descriptor Class value indicating that the device or interface 
 549                                                                *   belongs to the HID class. 
 551                         HID_CSCP_NonBootSubclass      
= 0x00, /**< Descriptor Subclass value indicating that the device or interface 
 552                                                                *   does not implement a HID boot protocol. 
 554                         HID_CSCP_BootSubclass         
= 0x01, /**< Descriptor Subclass value indicating that the device or interface 
 555                                                                *   implements a HID boot protocol. 
 557                         HID_CSCP_NonBootProtocol      
= 0x00, /**< Descriptor Protocol value indicating that the device or interface 
 558                                                                *   does not belong to a HID boot protocol. 
 560                         HID_CSCP_KeyboardBootProtocol 
= 0x01, /**< Descriptor Protocol value indicating that the device or interface 
 561                                                                *   belongs to the Keyboard HID boot protocol. 
 563                         HID_CSCP_MouseBootProtocol    
= 0x02, /**< Descriptor Protocol value indicating that the device or interface 
 564                                                                *   belongs to the Mouse HID boot protocol. 
 568                 /** Enum for the HID class specific control requests that can be issued by the USB bus host. */ 
 569                 enum HID_ClassRequests_t
 
 571                         HID_REQ_GetReport       
= 0x01, /**< HID class-specific Request to get the current HID report from the device. */ 
 572                         HID_REQ_GetIdle         
= 0x02, /**< HID class-specific Request to get the current device idle count. */ 
 573                         HID_REQ_GetProtocol     
= 0x03, /**< HID class-specific Request to get the current HID report protocol mode. */ 
 574                         HID_REQ_SetReport       
= 0x09, /**< HID class-specific Request to set the current HID report to the device. */ 
 575                         HID_REQ_SetIdle         
= 0x0A, /**< HID class-specific Request to set the device's idle count. */ 
 576                         HID_REQ_SetProtocol     
= 0x0B, /**< HID class-specific Request to set the current HID report protocol mode. */ 
 579                 /** Enum for the HID class specific descriptor types. */ 
 580                 enum HID_DescriptorTypes_t
 
 582                         HID_DTYPE_HID           
= 0x21, /**< Descriptor header type value, to indicate a HID class HID descriptor. */ 
 583                         HID_DTYPE_Report        
= 0x22, /**< Descriptor header type value, to indicate a HID class HID report descriptor. */ 
 586                 /** Enum for the different types of HID reports. */ 
 587                 enum HID_ReportItemTypes_t
 
 589                         HID_REPORT_ITEM_In      
= 0, /**< Indicates that the item is an IN report type. */ 
 590                         HID_REPORT_ITEM_Out     
= 1, /**< Indicates that the item is an OUT report type. */ 
 591                         HID_REPORT_ITEM_Feature 
= 2, /**< Indicates that the item is a FEATURE report type. */ 
 594                 /** \brief HID class-specific HID Descriptor (LUFA naming conventions). 
 596                  *  Type define for the HID class-specific HID descriptor, to describe the HID device's specifications. Refer to the HID 
 597                  *  specification for details on the structure elements. 
 599                  *  \see \ref USB_HID_StdDescriptor_HID_t for the version of this type with standard element names. 
 601                  *  \note Regardless of CPU architecture, these values should be stored as little endian. 
 605                         USB_Descriptor_Header_t Header
; /**< Regular descriptor header containing the descriptor's type and length. */ 
 607                         uint16_t                HIDSpec
; /**< BCD encoded version that the HID descriptor and device complies to. 
 609                                                           *   \see \ref VERSION_BCD() utility macro. 
 611                         uint8_t                 CountryCode
; /**< Country code of the localized device, or zero if universal. */ 
 613                         uint8_t                 TotalReportDescriptors
; /**< Total number of HID report descriptors for the interface. */ 
 615                         uint8_t                 HIDReportType
; /**< Type of HID report, set to \ref HID_DTYPE_Report. */ 
 616                         uint16_t                HIDReportLength
; /**< Length of the associated HID report descriptor, in bytes. */ 
 617                 } ATTR_PACKED USB_HID_Descriptor_HID_t
; 
 619                 /** \brief HID class-specific HID Descriptor (USB-IF naming conventions). 
 621                  *  Type define for the HID class-specific HID descriptor, to describe the HID device's specifications. Refer to the HID 
 622                  *  specification for details on the structure elements. 
 624                  *  \see \ref USB_HID_Descriptor_HID_t for the version of this type with non-standard LUFA specific 
 627                  *  \note Regardless of CPU architecture, these values should be stored as little endian. 
 631                         uint8_t  bLength
; /**< Size of the descriptor, in bytes. */ 
 632                         uint8_t  bDescriptorType
; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a value 
 633                                                    *   given by the specific class. 
 636                         uint16_t bcdHID
; /**< BCD encoded version that the HID descriptor and device complies to. 
 638                                           *   \see \ref VERSION_BCD() utility macro. 
 640                         uint8_t  bCountryCode
; /**< Country code of the localized device, or zero if universal. */ 
 642                         uint8_t  bNumDescriptors
; /**< Total number of HID report descriptors for the interface. */ 
 644                         uint8_t  bDescriptorType2
; /**< Type of HID report, set to \ref HID_DTYPE_Report. */ 
 645                         uint16_t wDescriptorLength
; /**< Length of the associated HID report descriptor, in bytes. */ 
 646                 } ATTR_PACKED USB_HID_StdDescriptor_HID_t
; 
 648                 /** \brief Standard HID Boot Protocol Mouse Report. 
 650                  *  Type define for a standard Boot Protocol Mouse report 
 654                         uint8_t Button
; /**< Button mask for currently pressed buttons in the mouse. */ 
 655                         int8_t  X
; /**< Current delta X movement of the mouse. */ 
 656                         int8_t  Y
; /**< Current delta Y movement on the mouse. */ 
 657                 } ATTR_PACKED USB_MouseReport_Data_t
; 
 659                 /** \brief Standard HID Boot Protocol Keyboard Report. 
 661                  *  Type define for a standard Boot Protocol Keyboard report 
 665                         uint8_t Modifier
; /**< Keyboard modifier byte, indicating pressed modifier keys (a combination of 
 666                                            *   \c HID_KEYBOARD_MODIFER_* masks). 
 668                         uint8_t Reserved
; /**< Reserved for OEM use, always set to 0. */ 
 669                         uint8_t KeyCode
[6]; /**< Key codes of the currently pressed keys. */ 
 670                 } ATTR_PACKED USB_KeyboardReport_Data_t
; 
 672                 /** Type define for the data type used to store HID report descriptor elements. */ 
 673                 typedef uint8_t USB_Descriptor_HIDReport_Datatype_t
; 
 675         /* Disable C linkage for C++ Compilers: */ 
 676                 #if defined(__cplusplus)