Usb 使用功能报告增加HID设备的容量

Usb 使用功能报告增加HID设备的容量,usb,google-chrome-app,chromium,hid,Usb,Google Chrome App,Chromium,Hid,我需要向设备发送什么十六进制代码(以及什么报告索引)才能触发卷更改? 我正在尝试使用HID功能报告来增加410耳机的音量。Jabra提供以下界面和报告说明: 我已经成功地使用FeatureReport#3与设备交互,包括操纵一些LED和呼叫状态。但是,任何数据组合都不会改变音量,在与feature report#1交互时,我也不会得到任何响应,如果我正确阅读报告,它应该对音量负责 例如,将十六进制值05(如00000101)发送到第3页会导致设备进入静音状态。我解码了报告描述符,似乎音量增量/

我需要向设备发送什么十六进制代码(以及什么报告索引)才能触发卷更改?

我正在尝试使用HID功能报告来增加410耳机的音量。Jabra提供以下界面和报告说明:

我已经成功地使用FeatureReport#3与设备交互,包括操纵一些LED和呼叫状态。但是,任何数据组合都不会改变音量,在与feature report#1交互时,我也不会得到任何响应,如果我正确阅读报告,它应该对音量负责


例如,将十六进制值05(如00000101)发送到第3页会导致设备进入静音状态。

我解码了报告描述符,似乎音量增量/减量报告是使用输入报告(而不是功能报告)从设备(耳机)发送到主机(PC或其他)。也就是说,设备告诉主机增加/减少音量,而不是相反

顺便说一句,我只看到一个定义的特性报告,它使用报告ID 0x04

具体而言,报告ID为0x01的输入报告用于音量控制:

//--------------------------------------------------------------------------------
// Consumer Device Page inputReport 01 (Device --> Host)
//--------------------------------------------------------------------------------

typedef struct
{
  uint8_t  reportId;                                 // Report ID = 0x01 (1)
                                                     // Collection: ConsumerControl
  uint8_t  CD_ConsumerControlVolumeDecrement : 1;    // Usage 0x000C00EA: Volume Decrement, Value = 0 to 1
  uint8_t  CD_ConsumerControlVolumeIncrement : 1;    // Usage 0x000C00E9: Volume Increment, Value = 0 to 1
  uint8_t  CD_ConsumerControlMute : 1;               // Usage 0x000C00E2: Mute, Value = 0 to 1
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
} inputReport01_t;
完整的解码报告描述符如下所示

hidrdd git:master ❯ rexx rd.rex --dump -dsa samples/headset-jabra410.rd

//--------------------------------------------------------------------------------
// Report descriptor data in hex (length 273 bytes)
//--------------------------------------------------------------------------------


// 050C0901 A1018501 050C1500 250109EA 09E909E2 75019503 81027501 95058101
// C00600FF 0901A101 85020901 150026FF 00750895 20920201 09011500 26FF0075
// 08952082 02018504 0630FF15 00250109 20099709 2B750195 03812309 2F092109
// 240AFDFF 75019504 81077501 95098101 0AFFFF75 019501B1 22750195 07B10106
// 40FF1500 25010917 091E0909 09180920 09217501 95069122 0630FF15 00250109
// 9E750195 01912275 01950991 01C0050B 0905A101 8503050B 15002501 09200997
// 092B7501 95038123 092F0921 09247501 95038107 09070509 09017501 95018102
// 95098101 05081500 25010917 091E0909 09180920 09217501 95069122 050B1500
// 2501099E 75019501 91227501 95099101 C0


//--------------------------------------------------------------------------------
// Decoded Application Collection
//--------------------------------------------------------------------------------

/*
05 0C        (GLOBAL) USAGE_PAGE         0x000C Consumer Device Page
09 01        (LOCAL)  USAGE              0x000C0001 Consumer Control (CA=Application Collection)
A1 01        (MAIN)   COLLECTION         0x00000001 Application (Usage=0x000C0001: Page=Consumer Device Page, Usage=Consumer Control, Type=CA)
85 01          (GLOBAL) REPORT_ID          0x01 (1)
05 0C          (GLOBAL) USAGE_PAGE         0x000C Consumer Device Page <-- Redundant: USAGE_PAGE is already 0x000C
15 00          (GLOBAL) LOGICAL_MINIMUM    0x00 (0)  <-- Info: Consider replacing 15 00 with 14
25 01          (GLOBAL) LOGICAL_MAXIMUM    0x01 (1)
09 EA          (LOCAL)  USAGE              0x000C00EA Volume Decrement (RTC=Re-trigger Control)
09 E9          (LOCAL)  USAGE              0x000C00E9 Volume Increment (RTC=Re-trigger Control)
09 E2          (LOCAL)  USAGE              0x000C00E2 Mute (OOC=On/Off Control)
75 01          (GLOBAL) REPORT_SIZE        0x01 (1) Number of bits per field
95 03          (GLOBAL) REPORT_COUNT       0x03 (3) Number of fields
81 02          (MAIN)   INPUT              0x00000002 (3 fields x 1 bit) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap
75 01          (GLOBAL) REPORT_SIZE        0x01 (1) Number of bits per field <-- Redundant: REPORT_SIZE is already 1
95 05          (GLOBAL) REPORT_COUNT       0x05 (5) Number of fields
81 01          (MAIN)   INPUT              0x00000001 (5 fields x 1 bit) 1=Constant 0=Array 0=Absolute
C0           (MAIN)   END_COLLECTION     Application
*/

//--------------------------------------------------------------------------------
// Consumer Device Page inputReport 01 (Device --> Host)
//--------------------------------------------------------------------------------

typedef struct
{
  uint8_t  reportId;                                 // Report ID = 0x01 (1)
                                                     // Collection: ConsumerControl
  uint8_t  CD_ConsumerControlVolumeDecrement : 1;    // Usage 0x000C00EA: Volume Decrement, Value = 0 to 1
  uint8_t  CD_ConsumerControlVolumeIncrement : 1;    // Usage 0x000C00E9: Volume Increment, Value = 0 to 1
  uint8_t  CD_ConsumerControlMute : 1;               // Usage 0x000C00E2: Mute, Value = 0 to 1
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
} inputReport01_t;


//--------------------------------------------------------------------------------
// Decoded Application Collection
//--------------------------------------------------------------------------------

/*
06 00FF      (GLOBAL) USAGE_PAGE         0xFF00 Vendor-defined
09 01        (LOCAL)  USAGE              0xFF000001 <-- Warning: Undocumented usage
A1 01        (MAIN)   COLLECTION         0x00000001 Application (Usage=0xFF000001: Page=Vendor-defined, Usage=, Type=)
85 02          (GLOBAL) REPORT_ID          0x02 (2)
09 01          (LOCAL)  USAGE              0xFF000001 <-- Warning: Undocumented usage
15 00          (GLOBAL) LOGICAL_MINIMUM    0x00 (0) <-- Redundant: LOGICAL_MINIMUM is already 0 <-- Info: Consider replacing 15 00 with 14
26 FF00        (GLOBAL) LOGICAL_MAXIMUM    0x00FF (255)
75 08          (GLOBAL) REPORT_SIZE        0x08 (8) Number of bits per field
95 20          (GLOBAL) REPORT_COUNT       0x20 (32) Number of fields
92 0201        (MAIN)   OUTPUT             0x00000102 (32 fields x 8 bits) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 1=Buffer
09 01          (LOCAL)  USAGE              0xFF000001 <-- Warning: Undocumented usage
15 00          (GLOBAL) LOGICAL_MINIMUM    0x00 (0) <-- Redundant: LOGICAL_MINIMUM is already 0 <-- Info: Consider replacing 15 00 with 14
26 FF00        (GLOBAL) LOGICAL_MAXIMUM    0x00FF (255) <-- Redundant: LOGICAL_MAXIMUM is already 255
75 08          (GLOBAL) REPORT_SIZE        0x08 (8) Number of bits per field <-- Redundant: REPORT_SIZE is already 8
95 20          (GLOBAL) REPORT_COUNT       0x20 (32) Number of fields <-- Redundant: REPORT_COUNT is already 32
82 0201        (MAIN)   INPUT              0x00000102 (32 fields x 8 bits) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 1=Buffer
85 04          (GLOBAL) REPORT_ID          0x04 (4)
06 30FF        (GLOBAL) USAGE_PAGE         0xFF30 Vendor-defined
15 00          (GLOBAL) LOGICAL_MINIMUM    0x00 (0) <-- Redundant: LOGICAL_MINIMUM is already 0 <-- Info: Consider replacing 15 00 with 14
25 01          (GLOBAL) LOGICAL_MAXIMUM    0x01 (1)
09 20          (LOCAL)  USAGE              0xFF300020 <-- Warning: Undocumented usage
09 97          (LOCAL)  USAGE              0xFF300097 <-- Warning: Undocumented usage
09 2B          (LOCAL)  USAGE              0xFF30002B <-- Warning: Undocumented usage
75 01          (GLOBAL) REPORT_SIZE        0x01 (1) Number of bits per field
95 03          (GLOBAL) REPORT_COUNT       0x03 (3) Number of fields
81 23          (MAIN)   INPUT              0x00000023 (3 fields x 1 bit) 1=Constant 1=Variable 0=Absolute 0=NoWrap 0=Linear 1=NoPrefState 0=NoNull 0=NonVolatile 0=Bitmap
09 2F          (LOCAL)  USAGE              0xFF30002F <-- Warning: Undocumented usage
09 21          (LOCAL)  USAGE              0xFF300021 <-- Warning: Undocumented usage
09 24          (LOCAL)  USAGE              0xFF300024 <-- Warning: Undocumented usage
0A FDFF        (LOCAL)  USAGE              0xFF30FFFD <-- Warning: Undocumented usage
75 01          (GLOBAL) REPORT_SIZE        0x01 (1) Number of bits per field <-- Redundant: REPORT_SIZE is already 1
95 04          (GLOBAL) REPORT_COUNT       0x04 (4) Number of fields
81 07          (MAIN)   INPUT              0x00000007 (4 fields x 1 bit) 1=Constant 1=Variable 1=Relative 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap
75 01          (GLOBAL) REPORT_SIZE        0x01 (1) Number of bits per field <-- Redundant: REPORT_SIZE is already 1
95 09          (GLOBAL) REPORT_COUNT       0x09 (9) Number of fields
81 01          (MAIN)   INPUT              0x00000001 (9 fields x 1 bit) 1=Constant 0=Array 0=Absolute
0A FFFF        (LOCAL)  USAGE              0xFF30FFFF <-- Warning: Undocumented usage
75 01          (GLOBAL) REPORT_SIZE        0x01 (1) Number of bits per field <-- Redundant: REPORT_SIZE is already 1
95 01          (GLOBAL) REPORT_COUNT       0x01 (1) Number of fields
B1 22          (MAIN)   FEATURE            0x00000022 (1 field x 1 bit) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 1=NoPrefState 0=NoNull 0=NonVolatile 0=Bitmap
75 01          (GLOBAL) REPORT_SIZE        0x01 (1) Number of bits per field <-- Redundant: REPORT_SIZE is already 1
95 07          (GLOBAL) REPORT_COUNT       0x07 (7) Number of fields
B1 01          (MAIN)   FEATURE            0x00000001 (7 fields x 1 bit) 1=Constant 0=Array 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap
06 40FF        (GLOBAL) USAGE_PAGE         0xFF40 Vendor-defined
15 00          (GLOBAL) LOGICAL_MINIMUM    0x00 (0) <-- Redundant: LOGICAL_MINIMUM is already 0 <-- Info: Consider replacing 15 00 with 14
25 01          (GLOBAL) LOGICAL_MAXIMUM    0x01 (1) <-- Redundant: LOGICAL_MAXIMUM is already 1
09 17          (LOCAL)  USAGE              0xFF400017 <-- Warning: Undocumented usage
09 1E          (LOCAL)  USAGE              0xFF40001E <-- Warning: Undocumented usage
09 09          (LOCAL)  USAGE              0xFF400009 <-- Warning: Undocumented usage
09 18          (LOCAL)  USAGE              0xFF400018 <-- Warning: Undocumented usage
09 20          (LOCAL)  USAGE              0xFF400020 <-- Warning: Undocumented usage
09 21          (LOCAL)  USAGE              0xFF400021 <-- Warning: Undocumented usage
75 01          (GLOBAL) REPORT_SIZE        0x01 (1) Number of bits per field <-- Redundant: REPORT_SIZE is already 1
95 06          (GLOBAL) REPORT_COUNT       0x06 (6) Number of fields
91 22          (MAIN)   OUTPUT             0x00000022 (6 fields x 1 bit) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 1=NoPrefState 0=NoNull 0=NonVolatile 0=Bitmap
06 30FF        (GLOBAL) USAGE_PAGE         0xFF30 Vendor-defined
15 00          (GLOBAL) LOGICAL_MINIMUM    0x00 (0) <-- Redundant: LOGICAL_MINIMUM is already 0 <-- Info: Consider replacing 15 00 with 14
25 01          (GLOBAL) LOGICAL_MAXIMUM    0x01 (1) <-- Redundant: LOGICAL_MAXIMUM is already 1
09 9E          (LOCAL)  USAGE              0xFF30009E <-- Warning: Undocumented usage
75 01          (GLOBAL) REPORT_SIZE        0x01 (1) Number of bits per field <-- Redundant: REPORT_SIZE is already 1
95 01          (GLOBAL) REPORT_COUNT       0x01 (1) Number of fields
91 22          (MAIN)   OUTPUT             0x00000022 (1 field x 1 bit) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 1=NoPrefState 0=NoNull 0=NonVolatile 0=Bitmap
75 01          (GLOBAL) REPORT_SIZE        0x01 (1) Number of bits per field <-- Redundant: REPORT_SIZE is already 1
95 09          (GLOBAL) REPORT_COUNT       0x09 (9) Number of fields
91 01          (MAIN)   OUTPUT             0x00000001 (9 fields x 1 bit) 1=Constant 0=Array 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap
C0           (MAIN)   END_COLLECTION     Application
*/

//--------------------------------------------------------------------------------
// Vendor-defined featureReport 04 (Device <-> Host)
//--------------------------------------------------------------------------------

typedef struct
{
  uint8_t  reportId;                                 // Report ID = 0x04 (4)
  uint8_t  VEN_VendorDefinedFFFF : 1;                // Usage 0xFF30FFFF: , Value = 0 to 1
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
} featureReport04_t;


//--------------------------------------------------------------------------------
// Vendor-defined inputReport 02 (Device --> Host)
//--------------------------------------------------------------------------------

typedef struct
{
  uint8_t  reportId;                                 // Report ID = 0x02 (2)
  uint8_t  VEN_VendorDefined0001[32];                // Usage 0xFF000001: , Value = 0 to 255
} inputReport02_t;


//--------------------------------------------------------------------------------
// Vendor-defined inputReport 04 (Device --> Host)
//--------------------------------------------------------------------------------

typedef struct
{
  uint8_t  reportId;                                 // Report ID = 0x04 (4)
  uint8_t  VEN_VendorDefined0020 : 1;                // Usage 0xFF300020: , Value = 0 to 1
  uint8_t  VEN_VendorDefined0097 : 1;                // Usage 0xFF300097: , Value = 0 to 1
  uint8_t  VEN_VendorDefined002B : 1;                // Usage 0xFF30002B: , Value = 0 to 1
  uint8_t  VEN_VendorDefined002F : 1;                // Usage 0xFF30002F: , Value = 0 to 1
  uint8_t  VEN_VendorDefined0021 : 1;                // Usage 0xFF300021: , Value = 0 to 1
  uint8_t  VEN_VendorDefined0024 : 1;                // Usage 0xFF300024: , Value = 0 to 1
  uint8_t  VEN_VendorDefinedFFFD : 1;                // Usage 0xFF30FFFD: , Value = 0 to 1
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
} inputReport04_t;


//--------------------------------------------------------------------------------
// Vendor-defined outputReport 02 (Device <-- Host)
//--------------------------------------------------------------------------------

typedef struct
{
  uint8_t  reportId;                                 // Report ID = 0x02 (2)
  uint8_t  VEN_VendorDefined0001[32];                // Usage 0xFF000001: , Value = 0 to 255
} outputReport02_t;


//--------------------------------------------------------------------------------
// Vendor-defined outputReport 04 (Device <-- Host)
//--------------------------------------------------------------------------------

typedef struct
{
  uint8_t  reportId;                                 // Report ID = 0x04 (4)
  uint8_t  VEN_VendorDefined0017 : 1;                // Usage 0xFF400017: , Value = 0 to 1
  uint8_t  VEN_VendorDefined001E : 1;                // Usage 0xFF40001E: , Value = 0 to 1
  uint8_t  VEN_VendorDefined0009 : 1;                // Usage 0xFF400009: , Value = 0 to 1
  uint8_t  VEN_VendorDefined0018 : 1;                // Usage 0xFF400018: , Value = 0 to 1
  uint8_t  VEN_VendorDefined0020 : 1;                // Usage 0xFF400020: , Value = 0 to 1
  uint8_t  VEN_VendorDefined0021 : 1;                // Usage 0xFF400021: , Value = 0 to 1
  uint8_t  VEN_VendorDefined009E : 1;                // Usage 0xFF30009E: , Value = 0 to 1
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
} outputReport04_t;


//--------------------------------------------------------------------------------
// Decoded Application Collection
//--------------------------------------------------------------------------------

/*
05 0B        (GLOBAL) USAGE_PAGE         0x000B Telephony Device Page
09 05        (LOCAL)  USAGE              0x000B0005 Headset (CL=Logical Collection)
A1 01        (MAIN)   COLLECTION         0x00000001 Application (Usage=0x000B0005: Page=Telephony Device Page, Usage=Headset, Type=CL) <-- Warning: USAGE type should be CA (Application)
85 03          (GLOBAL) REPORT_ID          0x03 (3)
05 0B          (GLOBAL) USAGE_PAGE         0x000B Telephony Device Page <-- Redundant: USAGE_PAGE is already 0x000B
15 00          (GLOBAL) LOGICAL_MINIMUM    0x00 (0) <-- Redundant: LOGICAL_MINIMUM is already 0 <-- Info: Consider replacing 15 00 with 14
25 01          (GLOBAL) LOGICAL_MAXIMUM    0x01 (1) <-- Redundant: LOGICAL_MAXIMUM is already 1
09 20          (LOCAL)  USAGE              0x000B0020 Hook Switch (OOC=On/Off Control)
09 97          (LOCAL)  USAGE              0x000B0097 Line Busy Tone (MC=Momentary Control)
09 2B          (LOCAL)  USAGE              0x000B002B Speaker Phone (OOC=On/Off Control)
75 01          (GLOBAL) REPORT_SIZE        0x01 (1) Number of bits per field <-- Redundant: REPORT_SIZE is already 1
95 03          (GLOBAL) REPORT_COUNT       0x03 (3) Number of fields
81 23          (MAIN)   INPUT              0x00000023 (3 fields x 1 bit) 1=Constant 1=Variable 0=Absolute 0=NoWrap 0=Linear 1=NoPrefState 0=NoNull 0=NonVolatile 0=Bitmap
09 2F          (LOCAL)  USAGE              0x000B002F Phone Mute (OOC=On/Off Control)
09 21          (LOCAL)  USAGE              0x000B0021 Flash (MC=Momentary Control)
09 24          (LOCAL)  USAGE              0x000B0024 Redial (OSC=One Shot Control)
75 01          (GLOBAL) REPORT_SIZE        0x01 (1) Number of bits per field <-- Redundant: REPORT_SIZE is already 1
95 03          (GLOBAL) REPORT_COUNT       0x03 (3) Number of fields <-- Redundant: REPORT_COUNT is already 3
81 07          (MAIN)   INPUT              0x00000007 (3 fields x 1 bit) 1=Constant 1=Variable 1=Relative 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap
09 07          (LOCAL)  USAGE              0x000B0007 Programmable Button (NAry=Named Array)
05 09          (GLOBAL) USAGE_PAGE         0x0009 Button Page
09 01          (LOCAL)  USAGE              0x00090001 Button 1 Primary/trigger (MULTI=Selector, On/Off, Momentary, or One Shot)
75 01          (GLOBAL) REPORT_SIZE        0x01 (1) Number of bits per field <-- Redundant: REPORT_SIZE is already 1
95 01          (GLOBAL) REPORT_COUNT       0x01 (1) Number of fields
81 02          (MAIN)   INPUT              0x00000002 (1 field x 1 bit) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap
95 09          (GLOBAL) REPORT_COUNT       0x09 (9) Number of fields
81 01          (MAIN)   INPUT              0x00000001 (9 fields x 1 bit) 1=Constant 0=Array 0=Absolute
05 08          (GLOBAL) USAGE_PAGE         0x0008 LED Indicator Page
15 00          (GLOBAL) LOGICAL_MINIMUM    0x00 (0) <-- Redundant: LOGICAL_MINIMUM is already 0 <-- Info: Consider replacing 15 00 with 14
25 01          (GLOBAL) LOGICAL_MAXIMUM    0x01 (1) <-- Redundant: LOGICAL_MAXIMUM is already 1
09 17          (LOCAL)  USAGE              0x00080017 Off-Hook (OOC=On/Off Control)
09 1E          (LOCAL)  USAGE              0x0008001E Speaker (OOC=On/Off Control)
09 09          (LOCAL)  USAGE              0x00080009 Mute (OOC=On/Off Control)
09 18          (LOCAL)  USAGE              0x00080018 Ring (OOC=On/Off Control)
09 20          (LOCAL)  USAGE              0x00080020 Hold (OOC=On/Off Control)
09 21          (LOCAL)  USAGE              0x00080021 Microphone (OOC=On/Off Control)
75 01          (GLOBAL) REPORT_SIZE        0x01 (1) Number of bits per field <-- Redundant: REPORT_SIZE is already 1
95 06          (GLOBAL) REPORT_COUNT       0x06 (6) Number of fields
91 22          (MAIN)   OUTPUT             0x00000022 (6 fields x 1 bit) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 1=NoPrefState 0=NoNull 0=NonVolatile 0=Bitmap
05 0B          (GLOBAL) USAGE_PAGE         0x000B Telephony Device Page
15 00          (GLOBAL) LOGICAL_MINIMUM    0x00 (0) <-- Redundant: LOGICAL_MINIMUM is already 0 <-- Info: Consider replacing 15 00 with 14
25 01          (GLOBAL) LOGICAL_MAXIMUM    0x01 (1) <-- Redundant: LOGICAL_MAXIMUM is already 1
09 9E          (LOCAL)  USAGE              0x000B009E Ringer (OOC=On/Off Control)
75 01          (GLOBAL) REPORT_SIZE        0x01 (1) Number of bits per field <-- Redundant: REPORT_SIZE is already 1
95 01          (GLOBAL) REPORT_COUNT       0x01 (1) Number of fields
91 22          (MAIN)   OUTPUT             0x00000022 (1 field x 1 bit) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 1=NoPrefState 0=NoNull 0=NonVolatile 0=Bitmap
75 01          (GLOBAL) REPORT_SIZE        0x01 (1) Number of bits per field <-- Redundant: REPORT_SIZE is already 1
95 09          (GLOBAL) REPORT_COUNT       0x09 (9) Number of fields
91 01          (MAIN)   OUTPUT             0x00000001 (9 fields x 1 bit) 1=Constant 0=Array 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap
C0           (MAIN)   END_COLLECTION     Application
*/

//--------------------------------------------------------------------------------
// Telephony Device Page inputReport 03 (Device --> Host)
//--------------------------------------------------------------------------------

typedef struct
{
  uint8_t  reportId;                                 // Report ID = 0x03 (3)
                                                     // Collection: Headset
  uint8_t  TEL_HeadsetHookSwitch : 1;                // Usage 0x000B0020: Hook Switch, Value = 0 to 1
  uint8_t  TEL_HeadsetLineBusyTone : 1;              // Usage 0x000B0097: Line Busy Tone, Value = 0 to 1
  uint8_t  TEL_HeadsetSpeakerPhone : 1;              // Usage 0x000B002B: Speaker Phone, Value = 0 to 1
  uint8_t  TEL_HeadsetPhoneMute : 1;                 // Usage 0x000B002F: Phone Mute, Value = 0 to 1
  uint8_t  TEL_HeadsetFlash : 1;                     // Usage 0x000B0021: Flash, Value = 0 to 1
  uint8_t  TEL_HeadsetRedial : 1;                    // Usage 0x000B0024: Redial, Value = 0 to 1
  uint8_t  TEL_HeadsetProgrammableButton : 1;        // Usage 0x000B0007: Programmable Button, Value = 0 to 1
                                                     // Usage 0x00090001 Button 1 Primary/trigger (MULTI=Selector, On/Off, Momentary, or One Shot) Value = 0 to 1 <-- Ignored: REPORT_COUNT (1) is too small
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
} inputReport03_t;


//--------------------------------------------------------------------------------
// LED Indicator Page outputReport 03 (Device <-- Host)
//--------------------------------------------------------------------------------

typedef struct
{
  uint8_t  reportId;                                 // Report ID = 0x03 (3)
                                                     // Collection: Headset
  uint8_t  LED_HeadsetOffHook : 1;                   // Usage 0x00080017: Off-Hook, Value = 0 to 1
  uint8_t  LED_HeadsetSpeaker : 1;                   // Usage 0x0008001E: Speaker, Value = 0 to 1
  uint8_t  LED_HeadsetMute : 1;                      // Usage 0x00080009: Mute, Value = 0 to 1
  uint8_t  LED_HeadsetRing : 1;                      // Usage 0x00080018: Ring, Value = 0 to 1
  uint8_t  LED_HeadsetHold : 1;                      // Usage 0x00080020: Hold, Value = 0 to 1
  uint8_t  LED_HeadsetMicrophone : 1;                // Usage 0x00080021: Microphone, Value = 0 to 1
  uint8_t  TEL_HeadsetRinger : 1;                    // Usage 0x000B009E: Ringer, Value = 0 to 1
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
} outputReport03_t;
hidrddgit:master❯ rexx rd.rex--转储-dsa样本/耳机-jabra410.rd
//--------------------------------------------------------------------------------
//十六进制报表描述符数据(长度273字节)
//--------------------------------------------------------------------------------
//050C0901 A10185001 050C1500 250109EA 09E909E2 75019503 81027501 95058101
//C00600FF 0901A101 85020901 150026FF 00750895 20920201 09011500 26FF0075
//08952082 02018504 0630FF15 00250109 20099709 2B750195 03812309 2F092109
//240AFDFF 75019504 81077501 95098101 0AFFF75 019501B1 2275019507B10106
//40FF1500 25010917 091E0909 09180920 09217501 95069122 0630FF15 00250109
//9E75019501912275 01950991 01C0050B 0905A101 8503050B 15002501 09200997
//092B7501 95038123 092F0921 09247501 95038107 09070509 09017501 95018102
//95098101 05081500 25010917 091E0909 09180920 09217501 95069122 050B1500
//2501099E 75019501 91227501 95099101 C0
//--------------------------------------------------------------------------------
//解码应用程序集合
//--------------------------------------------------------------------------------
/*
05 0C(全球)使用情况\u页面0x000C消费设备页面
09 01(本地)使用0x000C0001用户控制(CA=应用程序集合)
A1 01(主)集合0x00000001应用程序(用法=0x000C0001:页面=用户设备页面,用法=用户控件,类型=CA)
85 01(全球)报告编号0x01(1)

05 0C(全球)使用情况\u第0x000C页消费者设备页面非常感谢您的回复aja。我有点困惑,因为当我将Jabra 410连接到macbook并按下macbook上的音量下降按钮时,Jabra反映了音量的变化。你是说HID报告没有指出任何通过HID接口设置音量的方法吗?是的,这是我的想法-但当涉及供应商定义的用法时,很难100%确定。例如,报告id 0x02似乎是针对32字节数据包中的数字化音频的(我真的说不出来,因为它是供应商定义的),但谁知道每个数据包是否还包含允许控制数据流动的头。你可能需要用wireshark或类似的工具窥探流量才能发现。再次感谢你的回复,aja。如果您有时间的话,Jabra规范描述了如何从主机设置卷,但我无法理解他们建议我使用哪个接口@你是说解码的信号源吗?它不是被复制的,而是由我写的一些软件生成的,这些软件可以解码隐藏的报告描述符。看见
hidrdd git:master ❯ rexx rd.rex --dump -dsa samples/headset-jabra410.rd

//--------------------------------------------------------------------------------
// Report descriptor data in hex (length 273 bytes)
//--------------------------------------------------------------------------------


// 050C0901 A1018501 050C1500 250109EA 09E909E2 75019503 81027501 95058101
// C00600FF 0901A101 85020901 150026FF 00750895 20920201 09011500 26FF0075
// 08952082 02018504 0630FF15 00250109 20099709 2B750195 03812309 2F092109
// 240AFDFF 75019504 81077501 95098101 0AFFFF75 019501B1 22750195 07B10106
// 40FF1500 25010917 091E0909 09180920 09217501 95069122 0630FF15 00250109
// 9E750195 01912275 01950991 01C0050B 0905A101 8503050B 15002501 09200997
// 092B7501 95038123 092F0921 09247501 95038107 09070509 09017501 95018102
// 95098101 05081500 25010917 091E0909 09180920 09217501 95069122 050B1500
// 2501099E 75019501 91227501 95099101 C0


//--------------------------------------------------------------------------------
// Decoded Application Collection
//--------------------------------------------------------------------------------

/*
05 0C        (GLOBAL) USAGE_PAGE         0x000C Consumer Device Page
09 01        (LOCAL)  USAGE              0x000C0001 Consumer Control (CA=Application Collection)
A1 01        (MAIN)   COLLECTION         0x00000001 Application (Usage=0x000C0001: Page=Consumer Device Page, Usage=Consumer Control, Type=CA)
85 01          (GLOBAL) REPORT_ID          0x01 (1)
05 0C          (GLOBAL) USAGE_PAGE         0x000C Consumer Device Page <-- Redundant: USAGE_PAGE is already 0x000C
15 00          (GLOBAL) LOGICAL_MINIMUM    0x00 (0)  <-- Info: Consider replacing 15 00 with 14
25 01          (GLOBAL) LOGICAL_MAXIMUM    0x01 (1)
09 EA          (LOCAL)  USAGE              0x000C00EA Volume Decrement (RTC=Re-trigger Control)
09 E9          (LOCAL)  USAGE              0x000C00E9 Volume Increment (RTC=Re-trigger Control)
09 E2          (LOCAL)  USAGE              0x000C00E2 Mute (OOC=On/Off Control)
75 01          (GLOBAL) REPORT_SIZE        0x01 (1) Number of bits per field
95 03          (GLOBAL) REPORT_COUNT       0x03 (3) Number of fields
81 02          (MAIN)   INPUT              0x00000002 (3 fields x 1 bit) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap
75 01          (GLOBAL) REPORT_SIZE        0x01 (1) Number of bits per field <-- Redundant: REPORT_SIZE is already 1
95 05          (GLOBAL) REPORT_COUNT       0x05 (5) Number of fields
81 01          (MAIN)   INPUT              0x00000001 (5 fields x 1 bit) 1=Constant 0=Array 0=Absolute
C0           (MAIN)   END_COLLECTION     Application
*/

//--------------------------------------------------------------------------------
// Consumer Device Page inputReport 01 (Device --> Host)
//--------------------------------------------------------------------------------

typedef struct
{
  uint8_t  reportId;                                 // Report ID = 0x01 (1)
                                                     // Collection: ConsumerControl
  uint8_t  CD_ConsumerControlVolumeDecrement : 1;    // Usage 0x000C00EA: Volume Decrement, Value = 0 to 1
  uint8_t  CD_ConsumerControlVolumeIncrement : 1;    // Usage 0x000C00E9: Volume Increment, Value = 0 to 1
  uint8_t  CD_ConsumerControlMute : 1;               // Usage 0x000C00E2: Mute, Value = 0 to 1
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
} inputReport01_t;


//--------------------------------------------------------------------------------
// Decoded Application Collection
//--------------------------------------------------------------------------------

/*
06 00FF      (GLOBAL) USAGE_PAGE         0xFF00 Vendor-defined
09 01        (LOCAL)  USAGE              0xFF000001 <-- Warning: Undocumented usage
A1 01        (MAIN)   COLLECTION         0x00000001 Application (Usage=0xFF000001: Page=Vendor-defined, Usage=, Type=)
85 02          (GLOBAL) REPORT_ID          0x02 (2)
09 01          (LOCAL)  USAGE              0xFF000001 <-- Warning: Undocumented usage
15 00          (GLOBAL) LOGICAL_MINIMUM    0x00 (0) <-- Redundant: LOGICAL_MINIMUM is already 0 <-- Info: Consider replacing 15 00 with 14
26 FF00        (GLOBAL) LOGICAL_MAXIMUM    0x00FF (255)
75 08          (GLOBAL) REPORT_SIZE        0x08 (8) Number of bits per field
95 20          (GLOBAL) REPORT_COUNT       0x20 (32) Number of fields
92 0201        (MAIN)   OUTPUT             0x00000102 (32 fields x 8 bits) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 1=Buffer
09 01          (LOCAL)  USAGE              0xFF000001 <-- Warning: Undocumented usage
15 00          (GLOBAL) LOGICAL_MINIMUM    0x00 (0) <-- Redundant: LOGICAL_MINIMUM is already 0 <-- Info: Consider replacing 15 00 with 14
26 FF00        (GLOBAL) LOGICAL_MAXIMUM    0x00FF (255) <-- Redundant: LOGICAL_MAXIMUM is already 255
75 08          (GLOBAL) REPORT_SIZE        0x08 (8) Number of bits per field <-- Redundant: REPORT_SIZE is already 8
95 20          (GLOBAL) REPORT_COUNT       0x20 (32) Number of fields <-- Redundant: REPORT_COUNT is already 32
82 0201        (MAIN)   INPUT              0x00000102 (32 fields x 8 bits) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 1=Buffer
85 04          (GLOBAL) REPORT_ID          0x04 (4)
06 30FF        (GLOBAL) USAGE_PAGE         0xFF30 Vendor-defined
15 00          (GLOBAL) LOGICAL_MINIMUM    0x00 (0) <-- Redundant: LOGICAL_MINIMUM is already 0 <-- Info: Consider replacing 15 00 with 14
25 01          (GLOBAL) LOGICAL_MAXIMUM    0x01 (1)
09 20          (LOCAL)  USAGE              0xFF300020 <-- Warning: Undocumented usage
09 97          (LOCAL)  USAGE              0xFF300097 <-- Warning: Undocumented usage
09 2B          (LOCAL)  USAGE              0xFF30002B <-- Warning: Undocumented usage
75 01          (GLOBAL) REPORT_SIZE        0x01 (1) Number of bits per field
95 03          (GLOBAL) REPORT_COUNT       0x03 (3) Number of fields
81 23          (MAIN)   INPUT              0x00000023 (3 fields x 1 bit) 1=Constant 1=Variable 0=Absolute 0=NoWrap 0=Linear 1=NoPrefState 0=NoNull 0=NonVolatile 0=Bitmap
09 2F          (LOCAL)  USAGE              0xFF30002F <-- Warning: Undocumented usage
09 21          (LOCAL)  USAGE              0xFF300021 <-- Warning: Undocumented usage
09 24          (LOCAL)  USAGE              0xFF300024 <-- Warning: Undocumented usage
0A FDFF        (LOCAL)  USAGE              0xFF30FFFD <-- Warning: Undocumented usage
75 01          (GLOBAL) REPORT_SIZE        0x01 (1) Number of bits per field <-- Redundant: REPORT_SIZE is already 1
95 04          (GLOBAL) REPORT_COUNT       0x04 (4) Number of fields
81 07          (MAIN)   INPUT              0x00000007 (4 fields x 1 bit) 1=Constant 1=Variable 1=Relative 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap
75 01          (GLOBAL) REPORT_SIZE        0x01 (1) Number of bits per field <-- Redundant: REPORT_SIZE is already 1
95 09          (GLOBAL) REPORT_COUNT       0x09 (9) Number of fields
81 01          (MAIN)   INPUT              0x00000001 (9 fields x 1 bit) 1=Constant 0=Array 0=Absolute
0A FFFF        (LOCAL)  USAGE              0xFF30FFFF <-- Warning: Undocumented usage
75 01          (GLOBAL) REPORT_SIZE        0x01 (1) Number of bits per field <-- Redundant: REPORT_SIZE is already 1
95 01          (GLOBAL) REPORT_COUNT       0x01 (1) Number of fields
B1 22          (MAIN)   FEATURE            0x00000022 (1 field x 1 bit) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 1=NoPrefState 0=NoNull 0=NonVolatile 0=Bitmap
75 01          (GLOBAL) REPORT_SIZE        0x01 (1) Number of bits per field <-- Redundant: REPORT_SIZE is already 1
95 07          (GLOBAL) REPORT_COUNT       0x07 (7) Number of fields
B1 01          (MAIN)   FEATURE            0x00000001 (7 fields x 1 bit) 1=Constant 0=Array 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap
06 40FF        (GLOBAL) USAGE_PAGE         0xFF40 Vendor-defined
15 00          (GLOBAL) LOGICAL_MINIMUM    0x00 (0) <-- Redundant: LOGICAL_MINIMUM is already 0 <-- Info: Consider replacing 15 00 with 14
25 01          (GLOBAL) LOGICAL_MAXIMUM    0x01 (1) <-- Redundant: LOGICAL_MAXIMUM is already 1
09 17          (LOCAL)  USAGE              0xFF400017 <-- Warning: Undocumented usage
09 1E          (LOCAL)  USAGE              0xFF40001E <-- Warning: Undocumented usage
09 09          (LOCAL)  USAGE              0xFF400009 <-- Warning: Undocumented usage
09 18          (LOCAL)  USAGE              0xFF400018 <-- Warning: Undocumented usage
09 20          (LOCAL)  USAGE              0xFF400020 <-- Warning: Undocumented usage
09 21          (LOCAL)  USAGE              0xFF400021 <-- Warning: Undocumented usage
75 01          (GLOBAL) REPORT_SIZE        0x01 (1) Number of bits per field <-- Redundant: REPORT_SIZE is already 1
95 06          (GLOBAL) REPORT_COUNT       0x06 (6) Number of fields
91 22          (MAIN)   OUTPUT             0x00000022 (6 fields x 1 bit) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 1=NoPrefState 0=NoNull 0=NonVolatile 0=Bitmap
06 30FF        (GLOBAL) USAGE_PAGE         0xFF30 Vendor-defined
15 00          (GLOBAL) LOGICAL_MINIMUM    0x00 (0) <-- Redundant: LOGICAL_MINIMUM is already 0 <-- Info: Consider replacing 15 00 with 14
25 01          (GLOBAL) LOGICAL_MAXIMUM    0x01 (1) <-- Redundant: LOGICAL_MAXIMUM is already 1
09 9E          (LOCAL)  USAGE              0xFF30009E <-- Warning: Undocumented usage
75 01          (GLOBAL) REPORT_SIZE        0x01 (1) Number of bits per field <-- Redundant: REPORT_SIZE is already 1
95 01          (GLOBAL) REPORT_COUNT       0x01 (1) Number of fields
91 22          (MAIN)   OUTPUT             0x00000022 (1 field x 1 bit) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 1=NoPrefState 0=NoNull 0=NonVolatile 0=Bitmap
75 01          (GLOBAL) REPORT_SIZE        0x01 (1) Number of bits per field <-- Redundant: REPORT_SIZE is already 1
95 09          (GLOBAL) REPORT_COUNT       0x09 (9) Number of fields
91 01          (MAIN)   OUTPUT             0x00000001 (9 fields x 1 bit) 1=Constant 0=Array 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap
C0           (MAIN)   END_COLLECTION     Application
*/

//--------------------------------------------------------------------------------
// Vendor-defined featureReport 04 (Device <-> Host)
//--------------------------------------------------------------------------------

typedef struct
{
  uint8_t  reportId;                                 // Report ID = 0x04 (4)
  uint8_t  VEN_VendorDefinedFFFF : 1;                // Usage 0xFF30FFFF: , Value = 0 to 1
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
} featureReport04_t;


//--------------------------------------------------------------------------------
// Vendor-defined inputReport 02 (Device --> Host)
//--------------------------------------------------------------------------------

typedef struct
{
  uint8_t  reportId;                                 // Report ID = 0x02 (2)
  uint8_t  VEN_VendorDefined0001[32];                // Usage 0xFF000001: , Value = 0 to 255
} inputReport02_t;


//--------------------------------------------------------------------------------
// Vendor-defined inputReport 04 (Device --> Host)
//--------------------------------------------------------------------------------

typedef struct
{
  uint8_t  reportId;                                 // Report ID = 0x04 (4)
  uint8_t  VEN_VendorDefined0020 : 1;                // Usage 0xFF300020: , Value = 0 to 1
  uint8_t  VEN_VendorDefined0097 : 1;                // Usage 0xFF300097: , Value = 0 to 1
  uint8_t  VEN_VendorDefined002B : 1;                // Usage 0xFF30002B: , Value = 0 to 1
  uint8_t  VEN_VendorDefined002F : 1;                // Usage 0xFF30002F: , Value = 0 to 1
  uint8_t  VEN_VendorDefined0021 : 1;                // Usage 0xFF300021: , Value = 0 to 1
  uint8_t  VEN_VendorDefined0024 : 1;                // Usage 0xFF300024: , Value = 0 to 1
  uint8_t  VEN_VendorDefinedFFFD : 1;                // Usage 0xFF30FFFD: , Value = 0 to 1
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
} inputReport04_t;


//--------------------------------------------------------------------------------
// Vendor-defined outputReport 02 (Device <-- Host)
//--------------------------------------------------------------------------------

typedef struct
{
  uint8_t  reportId;                                 // Report ID = 0x02 (2)
  uint8_t  VEN_VendorDefined0001[32];                // Usage 0xFF000001: , Value = 0 to 255
} outputReport02_t;


//--------------------------------------------------------------------------------
// Vendor-defined outputReport 04 (Device <-- Host)
//--------------------------------------------------------------------------------

typedef struct
{
  uint8_t  reportId;                                 // Report ID = 0x04 (4)
  uint8_t  VEN_VendorDefined0017 : 1;                // Usage 0xFF400017: , Value = 0 to 1
  uint8_t  VEN_VendorDefined001E : 1;                // Usage 0xFF40001E: , Value = 0 to 1
  uint8_t  VEN_VendorDefined0009 : 1;                // Usage 0xFF400009: , Value = 0 to 1
  uint8_t  VEN_VendorDefined0018 : 1;                // Usage 0xFF400018: , Value = 0 to 1
  uint8_t  VEN_VendorDefined0020 : 1;                // Usage 0xFF400020: , Value = 0 to 1
  uint8_t  VEN_VendorDefined0021 : 1;                // Usage 0xFF400021: , Value = 0 to 1
  uint8_t  VEN_VendorDefined009E : 1;                // Usage 0xFF30009E: , Value = 0 to 1
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
} outputReport04_t;


//--------------------------------------------------------------------------------
// Decoded Application Collection
//--------------------------------------------------------------------------------

/*
05 0B        (GLOBAL) USAGE_PAGE         0x000B Telephony Device Page
09 05        (LOCAL)  USAGE              0x000B0005 Headset (CL=Logical Collection)
A1 01        (MAIN)   COLLECTION         0x00000001 Application (Usage=0x000B0005: Page=Telephony Device Page, Usage=Headset, Type=CL) <-- Warning: USAGE type should be CA (Application)
85 03          (GLOBAL) REPORT_ID          0x03 (3)
05 0B          (GLOBAL) USAGE_PAGE         0x000B Telephony Device Page <-- Redundant: USAGE_PAGE is already 0x000B
15 00          (GLOBAL) LOGICAL_MINIMUM    0x00 (0) <-- Redundant: LOGICAL_MINIMUM is already 0 <-- Info: Consider replacing 15 00 with 14
25 01          (GLOBAL) LOGICAL_MAXIMUM    0x01 (1) <-- Redundant: LOGICAL_MAXIMUM is already 1
09 20          (LOCAL)  USAGE              0x000B0020 Hook Switch (OOC=On/Off Control)
09 97          (LOCAL)  USAGE              0x000B0097 Line Busy Tone (MC=Momentary Control)
09 2B          (LOCAL)  USAGE              0x000B002B Speaker Phone (OOC=On/Off Control)
75 01          (GLOBAL) REPORT_SIZE        0x01 (1) Number of bits per field <-- Redundant: REPORT_SIZE is already 1
95 03          (GLOBAL) REPORT_COUNT       0x03 (3) Number of fields
81 23          (MAIN)   INPUT              0x00000023 (3 fields x 1 bit) 1=Constant 1=Variable 0=Absolute 0=NoWrap 0=Linear 1=NoPrefState 0=NoNull 0=NonVolatile 0=Bitmap
09 2F          (LOCAL)  USAGE              0x000B002F Phone Mute (OOC=On/Off Control)
09 21          (LOCAL)  USAGE              0x000B0021 Flash (MC=Momentary Control)
09 24          (LOCAL)  USAGE              0x000B0024 Redial (OSC=One Shot Control)
75 01          (GLOBAL) REPORT_SIZE        0x01 (1) Number of bits per field <-- Redundant: REPORT_SIZE is already 1
95 03          (GLOBAL) REPORT_COUNT       0x03 (3) Number of fields <-- Redundant: REPORT_COUNT is already 3
81 07          (MAIN)   INPUT              0x00000007 (3 fields x 1 bit) 1=Constant 1=Variable 1=Relative 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap
09 07          (LOCAL)  USAGE              0x000B0007 Programmable Button (NAry=Named Array)
05 09          (GLOBAL) USAGE_PAGE         0x0009 Button Page
09 01          (LOCAL)  USAGE              0x00090001 Button 1 Primary/trigger (MULTI=Selector, On/Off, Momentary, or One Shot)
75 01          (GLOBAL) REPORT_SIZE        0x01 (1) Number of bits per field <-- Redundant: REPORT_SIZE is already 1
95 01          (GLOBAL) REPORT_COUNT       0x01 (1) Number of fields
81 02          (MAIN)   INPUT              0x00000002 (1 field x 1 bit) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap
95 09          (GLOBAL) REPORT_COUNT       0x09 (9) Number of fields
81 01          (MAIN)   INPUT              0x00000001 (9 fields x 1 bit) 1=Constant 0=Array 0=Absolute
05 08          (GLOBAL) USAGE_PAGE         0x0008 LED Indicator Page
15 00          (GLOBAL) LOGICAL_MINIMUM    0x00 (0) <-- Redundant: LOGICAL_MINIMUM is already 0 <-- Info: Consider replacing 15 00 with 14
25 01          (GLOBAL) LOGICAL_MAXIMUM    0x01 (1) <-- Redundant: LOGICAL_MAXIMUM is already 1
09 17          (LOCAL)  USAGE              0x00080017 Off-Hook (OOC=On/Off Control)
09 1E          (LOCAL)  USAGE              0x0008001E Speaker (OOC=On/Off Control)
09 09          (LOCAL)  USAGE              0x00080009 Mute (OOC=On/Off Control)
09 18          (LOCAL)  USAGE              0x00080018 Ring (OOC=On/Off Control)
09 20          (LOCAL)  USAGE              0x00080020 Hold (OOC=On/Off Control)
09 21          (LOCAL)  USAGE              0x00080021 Microphone (OOC=On/Off Control)
75 01          (GLOBAL) REPORT_SIZE        0x01 (1) Number of bits per field <-- Redundant: REPORT_SIZE is already 1
95 06          (GLOBAL) REPORT_COUNT       0x06 (6) Number of fields
91 22          (MAIN)   OUTPUT             0x00000022 (6 fields x 1 bit) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 1=NoPrefState 0=NoNull 0=NonVolatile 0=Bitmap
05 0B          (GLOBAL) USAGE_PAGE         0x000B Telephony Device Page
15 00          (GLOBAL) LOGICAL_MINIMUM    0x00 (0) <-- Redundant: LOGICAL_MINIMUM is already 0 <-- Info: Consider replacing 15 00 with 14
25 01          (GLOBAL) LOGICAL_MAXIMUM    0x01 (1) <-- Redundant: LOGICAL_MAXIMUM is already 1
09 9E          (LOCAL)  USAGE              0x000B009E Ringer (OOC=On/Off Control)
75 01          (GLOBAL) REPORT_SIZE        0x01 (1) Number of bits per field <-- Redundant: REPORT_SIZE is already 1
95 01          (GLOBAL) REPORT_COUNT       0x01 (1) Number of fields
91 22          (MAIN)   OUTPUT             0x00000022 (1 field x 1 bit) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 1=NoPrefState 0=NoNull 0=NonVolatile 0=Bitmap
75 01          (GLOBAL) REPORT_SIZE        0x01 (1) Number of bits per field <-- Redundant: REPORT_SIZE is already 1
95 09          (GLOBAL) REPORT_COUNT       0x09 (9) Number of fields
91 01          (MAIN)   OUTPUT             0x00000001 (9 fields x 1 bit) 1=Constant 0=Array 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap
C0           (MAIN)   END_COLLECTION     Application
*/

//--------------------------------------------------------------------------------
// Telephony Device Page inputReport 03 (Device --> Host)
//--------------------------------------------------------------------------------

typedef struct
{
  uint8_t  reportId;                                 // Report ID = 0x03 (3)
                                                     // Collection: Headset
  uint8_t  TEL_HeadsetHookSwitch : 1;                // Usage 0x000B0020: Hook Switch, Value = 0 to 1
  uint8_t  TEL_HeadsetLineBusyTone : 1;              // Usage 0x000B0097: Line Busy Tone, Value = 0 to 1
  uint8_t  TEL_HeadsetSpeakerPhone : 1;              // Usage 0x000B002B: Speaker Phone, Value = 0 to 1
  uint8_t  TEL_HeadsetPhoneMute : 1;                 // Usage 0x000B002F: Phone Mute, Value = 0 to 1
  uint8_t  TEL_HeadsetFlash : 1;                     // Usage 0x000B0021: Flash, Value = 0 to 1
  uint8_t  TEL_HeadsetRedial : 1;                    // Usage 0x000B0024: Redial, Value = 0 to 1
  uint8_t  TEL_HeadsetProgrammableButton : 1;        // Usage 0x000B0007: Programmable Button, Value = 0 to 1
                                                     // Usage 0x00090001 Button 1 Primary/trigger (MULTI=Selector, On/Off, Momentary, or One Shot) Value = 0 to 1 <-- Ignored: REPORT_COUNT (1) is too small
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
} inputReport03_t;


//--------------------------------------------------------------------------------
// LED Indicator Page outputReport 03 (Device <-- Host)
//--------------------------------------------------------------------------------

typedef struct
{
  uint8_t  reportId;                                 // Report ID = 0x03 (3)
                                                     // Collection: Headset
  uint8_t  LED_HeadsetOffHook : 1;                   // Usage 0x00080017: Off-Hook, Value = 0 to 1
  uint8_t  LED_HeadsetSpeaker : 1;                   // Usage 0x0008001E: Speaker, Value = 0 to 1
  uint8_t  LED_HeadsetMute : 1;                      // Usage 0x00080009: Mute, Value = 0 to 1
  uint8_t  LED_HeadsetRing : 1;                      // Usage 0x00080018: Ring, Value = 0 to 1
  uint8_t  LED_HeadsetHold : 1;                      // Usage 0x00080020: Hold, Value = 0 to 1
  uint8_t  LED_HeadsetMicrophone : 1;                // Usage 0x00080021: Microphone, Value = 0 to 1
  uint8_t  TEL_HeadsetRinger : 1;                    // Usage 0x000B009E: Ringer, Value = 0 to 1
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
  uint8_t  : 1;                                      // Pad
} outputReport03_t;