title: Why Usage Minimum is 224 in USB Report descriptor of Keyboard?
body: <p>I am trying to make a USB keyboard which has very minimal keys and i will be using some modifier keys like SHIFT and ALT keys.</p>
  
  <p>Now my question </p>
  
  <p>This is a truncated section of the report descriptor I am using </p>
  
  <pre><code>0x09, 0x06,                    // USAGE (Keyboard)
   0xa1, 0x01,                    // COLLECTION (Application)
   0x05, 0x07,                    //   USAGE_PAGE (Keyboard)
   0x19, 0xe0,                    //   USAGE_MINIMUM (Keyboard LeftControl)
   0x29, 0xe7,                    //   USAGE_MAXIMUM (Keyboard Right GUI)
   0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
   0x25, 0x01,                    //   LOGICAL_MAXIMUM (1)
   0x75, 0x01,                    //   REPORT_SIZE (1)
   0x95, 0x08,                    //   REPORT_COUNT (8)
  </code></pre>
  
  <p>And this section describes the modifier byte (Byte 0) of the USB message.</p>
  
  <p>As i understand the bits of this byte are set when the following keys are pressed</p>
  
  <pre><code>bit 0 - Left Ctrl
  bit 1 - Left Shift
  bit 2 - Left Alt
  bit 3 - Left GUI or Windows Key
  bit 4 - Right Ctrl
  bit 5 - Right Shift
  bit 6 - Right Alt
  bit 7 - Right GUI or Windows Key
  </code></pre>
  
  <p>Now I am not able to understand why the USAGE_MINIMUM (Keyboard LeftControl) and USAGE_MAXIMUM (Keyboard Right GUI) are limited at these values?</p>
  
  <p>The USB HID specification says</p>
  
  <blockquote>
    <p>Since only one array element can be reported in each array field,
    modifier keys  should be reported as bitmap data (a group of 1-bit
    variable fields). For example,  keys such as CTRL, SHIFT, ALT, and GUI
    keys make up the 8 bit modifier byte in a  standard keyboard report.
    Although these usage codes are defined in the Usage  Table as E0–E7,
    the usage is not sent as array data.</p>
  </blockquote>