title: Increasing the volume of an HID device using feature reports
body: <p><strong>What hex code do I need to send to the device (and what report index) to trigger a volume change?</strong></p>
  
  <p>I'm trying to use HID feature reports to increase the volume of a <a href="https://en.wikipedia.org/wiki/Jabra_(headset)" rel="nofollow noreferrer">Jabra</a> 410 headset. The Jabra provides the following interface and report description:</p>
  
  <p><a href="https://pastebin.com/ES8ivMym" rel="nofollow noreferrer">https://pastebin.com/ES8ivMym</a></p>
  
  <pre><code>Report Descriptor: (length is 273)
          Item(Global): Usage Page, data= [ 0x0c ] 12
                          Consumer
          Item(Local ): Usage, data= [ 0x01 ] 1
                          Consumer Control
          Item(Main  ): Collection, data= [ 0x01 ] 1
                          Application
          Item(Global): Report ID, data= [ 0x01 ] 1
          Item(Global): Usage Page, data= [ 0x0c ] 12
                          Consumer
          Item(Global): Logical Minimum, data= [ 0x00 ] 0
          Item(Global): Logical Maximum, data= [ 0x01 ] 1
          Item(Local ): Usage, data= [ 0xea ] 234
                          Volume Decrement
          Item(Local ): Usage, data= [ 0xe9 ] 233
                          Volume Increment
          Item(Local ): Usage, data= [ 0xe2 ] 226
                          Mute
          Item(Global): Report Size, data= [ 0x01 ] 1
          Item(Global): Report Count, data= [ 0x03 ] 3
          Item(Main  ): Input, data= [ 0x02 ] 2
                          Data Variable Absolute No_Wrap Linear
                          Preferred_State No_Null_Position Non_Volatile Bitfield
          Item(Global): Report Size, data= [ 0x01 ] 1
          Item(Global): Report Count, data= [ 0x05 ] 5
          Item(Main  ): Input, data= [ 0x01 ] 1
                          Constant Array Absolute No_Wrap Linear
                          Preferred_State No_Null_Position Non_Volatile Bitfield
          Item(Main  ): End Collection, data=none
          Item(Global): Usage Page, data= [ 0x00 0xff ] 65280
                          (null)
          Item(Local ): Usage, data= [ 0x01 ] 1
                          (null)
          Item(Main  ): Collection, data= [ 0x01 ] 1
                          Application
          Item(Global): Report ID, data= [ 0x02 ] 2
          Item(Local ): Usage, data= [ 0x01 ] 1
                          (null)
          Item(Global): Logical Minimum, data= [ 0x00 ] 0
          Item(Global): Logical Maximum, data= [ 0xff 0x00 ] 255
          Item(Global): Report Size, data= [ 0x08 ] 8
          Item(Global): Report Count, data= [ 0x20 ] 32
          Item(Main  ): Output, data= [ 0x02 0x01 ] 258
                          Data Variable Absolute No_Wrap Linear
                          Preferred_State No_Null_Position Non_Volatile Buffered Bytes
          Item(Local ): Usage, data= [ 0x01 ] 1
                          (null)
          Item(Global): Logical Minimum, data= [ 0x00 ] 0
          Item(Global): Logical Maximum, data= [ 0xff 0x00 ] 255
          Item(Global): Report Size, data= [ 0x08 ] 8
          Item(Global): Report Count, data= [ 0x20 ] 32
          Item(Main  ): Input, data= [ 0x02 0x01 ] 258
                          Data Variable Absolute No_Wrap Linear
                          Preferred_State No_Null_Position Non_Volatile Buffered Bytes
          Item(Global): Report ID, data= [ 0x04 ] 4
          Item(Global): Usage Page, data= [ 0x30 0xff ] 65328
                          (null)
          Item(Global): Logical Minimum, data= [ 0x00 ] 0
          Item(Global): Logical Maximum, data= [ 0x01 ] 1
          Item(Local ): Usage, data= [ 0x20 ] 32
                          (null)
          Item(Local ): Usage, data= [ 0x97 ] 151
                          (null)
          Item(Local ): Usage, data= [ 0x2b ] 43
                          (null)
          Item(Global): Report Size, data= [ 0x01 ] 1
          Item(Global): Report Count, data= [ 0x03 ] 3
          Item(Main  ): Input, data= [ 0x23 ] 35
                          Constant Variable Absolute No_Wrap Linear
                          No_Preferred_State No_Null_Position Non_Volatile Bitfield
          Item(Local ): Usage, data= [ 0x2f ] 47
                          (null)
          Item(Local ): Usage, data= [ 0x21 ] 33
                          (null)
          Item(Local ): Usage, data= [ 0x24 ] 36
                          (null)
          Item(Local ): Usage, data= [ 0xfd 0xff ] 65533
                          (null)
          Item(Global): Report Size, data= [ 0x01 ] 1
          Item(Global): Report Count, data= [ 0x04 ] 4
          Item(Main  ): Input, data= [ 0x07 ] 7
                          Constant Variable Relative No_Wrap Linear
                          Preferred_State No_Null_Position Non_Volatile Bitfield
          Item(Global): Report Size, data= [ 0x01 ] 1
          Item(Global): Report Count, data= [ 0x09 ] 9
          Item(Main  ): Input, data= [ 0x01 ] 1
                          Constant Array Absolute No_Wrap Linear
                          Preferred_State No_Null_Position Non_Volatile Bitfield
          Item(Local ): Usage, data= [ 0xff 0xff ] 65535
                          (null)
          Item(Global): Report Size, data= [ 0x01 ] 1
          Item(Global): Report Count, data= [ 0x01 ] 1
          Item(Main  ): Feature, data= [ 0x22 ] 34
                          Data Variable Absolute No_Wrap Linear
                          No_Preferred_State No_Null_Position Non_Volatile Bitfield
          Item(Global): Report Size, data= [ 0x01 ] 1
          Item(Global): Report Count, data= [ 0x07 ] 7
          Item(Main  ): Feature, data= [ 0x01 ] 1
                          Constant Array Absolute No_Wrap Linear
                          Preferred_State No_Null_Position Non_Volatile Bitfield
          Item(Global): Usage Page, data= [ 0x40 0xff ] 65344
                          (null)
          Item(Global): Logical Minimum, data= [ 0x00 ] 0
          Item(Global): Logical Maximum, data= [ 0x01 ] 1
          Item(Local ): Usage, data= [ 0x17 ] 23
                          (null)
          Item(Local ): Usage, data= [ 0x1e ] 30
                          (null)
          Item(Local ): Usage, data= [ 0x09 ] 9
                          (null)
          Item(Local ): Usage, data= [ 0x18 ] 24
                          (null)
          Item(Local ): Usage, data= [ 0x20 ] 32
                          (null)
          Item(Local ): Usage, data= [ 0x21 ] 33
                          (null)
          Item(Global): Report Size, data= [ 0x01 ] 1
          Item(Global): Report Count, data= [ 0x06 ] 6
          Item(Main  ): Output, data= [ 0x22 ] 34
                          Data Variable Absolute No_Wrap Linear
                          No_Preferred_State No_Null_Position Non_Volatile Bitfield
          Item(Global): Usage Page, data= [ 0x30 0xff ] 65328
                          (null)
          Item(Global): Logical Minimum, data= [ 0x00 ] 0
          Item(Global): Logical Maximum, data= [ 0x01 ] 1
          Item(Local ): Usage, data= [ 0x9e ] 158
                          (null)
          Item(Global): Report Size, data= [ 0x01 ] 1
          Item(Global): Report Count, data= [ 0x01 ] 1
          Item(Main  ): Output, data= [ 0x22 ] 34
                          Data Variable Absolute No_Wrap Linear
                          No_Preferred_State No_Null_Position Non_Volatile Bitfield
          Item(Global): Report Size, data= [ 0x01 ] 1
          Item(Global): Report Count, data= [ 0x09 ] 9
          Item(Main  ): Output, data= [ 0x01 ] 1
                          Constant Array Absolute No_Wrap Linear
                          Preferred_State No_Null_Position Non_Volatile Bitfield
          Item(Main  ): End Collection, data=none
          Item(Global): Usage Page, data= [ 0x0b ] 11
                          Telephony
          Item(Local ): Usage, data= [ 0x05 ] 5
                          Headset
          Item(Main  ): Collection, data= [ 0x01 ] 1
                          Application
          Item(Global): Report ID, data= [ 0x03 ] 3
          Item(Global): Usage Page, data= [ 0x0b ] 11
                          Telephony
          Item(Global): Logical Minimum, data= [ 0x00 ] 0
          Item(Global): Logical Maximum, data= [ 0x01 ] 1
          Item(Local ): Usage, data= [ 0x20 ] 32
                          Hook Switch
          Item(Local ): Usage, data= [ 0x97 ] 151
                          Line Busy Tone
          Item(Local ): Usage, data= [ 0x2b ] 43
                          Speaker Phone
          Item(Global): Report Size, data= [ 0x01 ] 1
          Item(Global): Report Count, data= [ 0x03 ] 3
          Item(Main  ): Input, data= [ 0x23 ] 35
                          Constant Variable Absolute No_Wrap Linear
                          No_Preferred_State No_Null_Position Non_Volatile Bitfield
          Item(Local ): Usage, data= [ 0x2f ] 47
                          Phone Mute
          Item(Local ): Usage, data= [ 0x21 ] 33
                          Flash
          Item(Local ): Usage, data= [ 0x24 ] 36
                          Redial
          Item(Global): Report Size, data= [ 0x01 ] 1
          Item(Global): Report Count, data= [ 0x03 ] 3
          Item(Main  ): Input, data= [ 0x07 ] 7
                          Constant Variable Relative No_Wrap Linear
                          Preferred_State No_Null_Position Non_Volatile Bitfield
          Item(Local ): Usage, data= [ 0x07 ] 7
                          Programmable Button
          Item(Global): Usage Page, data= [ 0x09 ] 9
                          Buttons
          Item(Local ): Usage, data= [ 0x01 ] 1
                          Button 1 (Primary)
          Item(Global): Report Size, data= [ 0x01 ] 1
          Item(Global): Report Count, data= [ 0x01 ] 1
          Item(Main  ): Input, data= [ 0x02 ] 2
                          Data Variable Absolute No_Wrap Linear
                          Preferred_State No_Null_Position Non_Volatile Bitfield
          Item(Global): Report Count, data= [ 0x09 ] 9
          Item(Main  ): Input, data= [ 0x01 ] 1
                          Constant Array Absolute No_Wrap Linear
                          Preferred_State No_Null_Position Non_Volatile Bitfield
          Item(Global): Usage Page, data= [ 0x08 ] 8
                          LEDs
          Item(Global): Logical Minimum, data= [ 0x00 ] 0
          Item(Global): Logical Maximum, data= [ 0x01 ] 1
          Item(Local ): Usage, data= [ 0x17 ] 23
                          Off-Hook
          Item(Local ): Usage, data= [ 0x1e ] 30
                          Speaker
          Item(Local ): Usage, data= [ 0x09 ] 9
                          Mute
          Item(Local ): Usage, data= [ 0x18 ] 24
                          Ring
          Item(Local ): Usage, data= [ 0x20 ] 32
                          Hold
          Item(Local ): Usage, data= [ 0x21 ] 33
                          Microphone
          Item(Global): Report Size, data= [ 0x01 ] 1
          Item(Global): Report Count, data= [ 0x06 ] 6
          Item(Main  ): Output, data= [ 0x22 ] 34
                          Data Variable Absolute No_Wrap Linear
                          No_Preferred_State No_Null_Position Non_Volatile Bitfield
          Item(Global): Usage Page, data= [ 0x0b ] 11
                          Telephony
          Item(Global): Logical Minimum, data= [ 0x00 ] 0
          Item(Global): Logical Maximum, data= [ 0x01 ] 1
          Item(Local ): Usage, data= [ 0x9e ] 158
                          (null)
          Item(Global): Report Size, data= [ 0x01 ] 1
          Item(Global): Report Count, data= [ 0x01 ] 1
          Item(Main  ): Output, data= [ 0x22 ] 34
                          Data Variable Absolute No_Wrap Linear
                          No_Preferred_State No_Null_Position Non_Volatile Bitfield
          Item(Global): Report Size, data= [ 0x01 ] 1
          Item(Global): Report Count, data= [ 0x09 ] 9
          Item(Main  ): Output, data= [ 0x01 ] 1
                          Constant Array Absolute No_Wrap Linear
                          Preferred_State No_Null_Position Non_Volatile Bitfield
          Item(Main  ): End Collection, data=none
  </code></pre>
  
  <p>I have successfully used feature report #3 to interact with the device, including the manipulation of some LEDs and call states. However, no combination of data changes the volume, and I get no response whatsoever when interacting with feature report #1, which should be responsible for volume if I'm reading the report properly.</p>
  
  <p>For example, sending a hex value of 05 (as in 00000101) to page #3 results in the device going to a muted state.</p>