【问题标题】:Custom HID device HID report descriptor report count自定义 HID 设备 HID 报告描述符报告计数
【发布时间】:2017-11-17 06:25:14
【问题描述】:

我只是想用两个报告 ID 从设备发送到主机。这些报告必须具有不同的报告计数(第一个报告 ID 有 4 个报告计数,第二个报告 ID 有 40 个)。这是我到目前为止所做的:

//14    bytes
0x06, 0x00, 0xff,              // USAGE_PAGE (Vendor Defined Page 1)
0x09, 0x01,                    // USAGE (Vendor Usage 1)
0xa1, 0x01,                    // COLLECTION (Application)
                               // -------- common global items ---------
0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
0x26, 0xff, 0x00,              //   LOGICAL_MAXIMUM (255)
0x75, 0x08,                    //   REPORT_SIZE (8)

// 10 bytes | Input message 1 (sent from device to host)
0x85,  5,            // Global  Report ID (cannot be 0)
0x95, 4,             // Global  Report Count (number of Report Size fields)
0x19, 0x01,                    //   USAGE_MINIMUM (Vendor Usage 1)
0x29, 5,                    //   USAGE_MAXIMUM (Vendor Usage 64)    
0x81, 0x02,          // Main    Input (data, array, absolute)
// 10 bytes | Input message 1 (sent from device to host)
0x85,  6,            // Global  Report ID (cannot be 0)
0x95, 40,             // Global  Report Count (number of Report Size fields)
0x19, 0x01,                    //   USAGE_MINIMUM (Vendor Usage 1)
0x29, 41,                    //   USAGE_MAXIMUM (Vendor Usage 64)   
0x81, 0x02,          // Main    Input (data, array, absolute)
0xC0

但第一个报告 id 发送 40bayt。我的错误在哪里?

HID 终端输出:

R 02 0C 16 20 2A 34 3E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0

R 01 0B 15 1F 29 34 3E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0> 0

【问题讨论】:

  • 报告描述符内容与您的设备在中断管道上发送的报告负载无关,因此,您确定您确实从您的代码中发送了相关大小的报告吗?

标签: usb hid


【解决方案1】:

我相信@Nipo 已经给了你正确的答案:报告描述符指示每个报告应该的样子,但发送具有指定正确长度的报告仍然是你的代码的责任。

对于报告 ID 5,它将为 5(报告 ID 为 1 + 负载为 4),并且 对于报告它 6,它将是 41(报告 id 为 1 + 有效负载为 40)。

顺便说一句,您的报告描述符可能需要稍作调整。就目前而言,它解码为:

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

PROGMEM char usbHidReportDescriptor[] =
{
  0x06, 0x00, 0xFF,            // (GLOBAL) USAGE_PAGE         0xFF00 Vendor-defined 
  0x09, 0x01,                  // (LOCAL)  USAGE              0xFF000001 <-- Warning: Undocumented usage
  0xA1, 0x01,                  // (MAIN)   COLLECTION         0x00000001 Application (Usage=0xFF000001: Page=Vendor-defined, Usage=, Type=)
  0x15, 0x00,                  //   (GLOBAL) LOGICAL_MINIMUM    0x00 (0) <-- Redundant: LOGICAL_MINIMUM is already 0 <-- Info: Consider replacing 15 00 with 14
  0x26, 0xFF, 0x00,            //   (GLOBAL) LOGICAL_MAXIMUM    0x00FF (255)  
  0x75, 0x08,                  //   (GLOBAL) REPORT_SIZE        0x08 (8) Number of bits per field  
  0x85, 0x05,                  //   (GLOBAL) REPORT_ID          0x05 (5) 
  0x95, 0x04,                  //   (GLOBAL) REPORT_COUNT       0x04 (4) Number of fields  
  0x19, 0x01,                  //   (LOCAL)  USAGE_MINIMUM      0xFF000001 <-- Warning: Undocumented usage
  0x29, 0x05,                  //   (LOCAL)  USAGE_MAXIMUM      0xFF000005 <-- Warning: Undocumented usage
  0x81, 0x02,                  //   (MAIN)   INPUT              0x00000002 (4 fields x 8 bits) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap 
  0x85, 0x06,                  //   (GLOBAL) REPORT_ID          0x06 (6) 
  0x95, 0x28,                  //   (GLOBAL) REPORT_COUNT       0x28 (40) Number of fields  
  0x19, 0x01,                  //   (LOCAL)  USAGE_MINIMUM      0xFF000001 <-- Warning: Undocumented usage
  0x29, 0x29,                  //   (LOCAL)  USAGE_MAXIMUM      0xFF000029 <-- Warning: Undocumented usage
  0x81, 0x02,                  //   (MAIN)   INPUT              0x00000002 (40 fields x 8 bits) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap 
  0xC0,                        // (MAIN)   END_COLLECTION     Application
};

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

typedef struct
{
  uint8_t  reportId;                                 // Report ID = 0x05 (5)
  uint8_t  VEN_VendorDefined0001;                    // Usage 0xFF000001: , Value = 0 to 255
  uint8_t  VEN_VendorDefined0002;                    // Usage 0xFF000002: , Value = 0 to 255
  uint8_t  VEN_VendorDefined0003;                    // Usage 0xFF000003: , Value = 0 to 255
  uint8_t  VEN_VendorDefined0004;                    // Usage 0xFF000004: , Value = 0 to 255
                                                     // Usage 0xFF000005  Value = 0 to 255 <-- Ignored: REPORT_COUNT (4) is too small
} inputReport05_t;


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

typedef struct
{
  uint8_t  reportId;                                 // Report ID = 0x06 (6)
  uint8_t  VEN_VendorDefined0001;                    // Usage 0xFF000001: , Value = 0 to 255
  uint8_t  VEN_VendorDefined0002;                    // Usage 0xFF000002: , Value = 0 to 255
  uint8_t  VEN_VendorDefined0003;                    // Usage 0xFF000003: , Value = 0 to 255
  uint8_t  VEN_VendorDefined0004;                    // Usage 0xFF000004: , Value = 0 to 255
  uint8_t  VEN_VendorDefined0005;                    // Usage 0xFF000005: , Value = 0 to 255
  uint8_t  VEN_VendorDefined0006;                    // Usage 0xFF000006: , Value = 0 to 255
  uint8_t  VEN_VendorDefined0007;                    // Usage 0xFF000007: , Value = 0 to 255
  uint8_t  VEN_VendorDefined0008;                    // Usage 0xFF000008: , Value = 0 to 255
  uint8_t  VEN_VendorDefined0009;                    // Usage 0xFF000009: , Value = 0 to 255
  uint8_t  VEN_VendorDefined000A;                    // Usage 0xFF00000A: , Value = 0 to 255
  uint8_t  VEN_VendorDefined000B;                    // Usage 0xFF00000B: , Value = 0 to 255
  uint8_t  VEN_VendorDefined000C;                    // Usage 0xFF00000C: , Value = 0 to 255
  uint8_t  VEN_VendorDefined000D;                    // Usage 0xFF00000D: , Value = 0 to 255
  uint8_t  VEN_VendorDefined000E;                    // Usage 0xFF00000E: , Value = 0 to 255
  uint8_t  VEN_VendorDefined000F;                    // Usage 0xFF00000F: , Value = 0 to 255
  uint8_t  VEN_VendorDefined0010;                    // Usage 0xFF000010: , Value = 0 to 255
  uint8_t  VEN_VendorDefined0011;                    // Usage 0xFF000011: , Value = 0 to 255
  uint8_t  VEN_VendorDefined0012;                    // Usage 0xFF000012: , Value = 0 to 255
  uint8_t  VEN_VendorDefined0013;                    // Usage 0xFF000013: , Value = 0 to 255
  uint8_t  VEN_VendorDefined0014;                    // Usage 0xFF000014: , Value = 0 to 255
  uint8_t  VEN_VendorDefined0015;                    // Usage 0xFF000015: , Value = 0 to 255
  uint8_t  VEN_VendorDefined0016;                    // Usage 0xFF000016: , Value = 0 to 255
  uint8_t  VEN_VendorDefined0017;                    // Usage 0xFF000017: , Value = 0 to 255
  uint8_t  VEN_VendorDefined0018;                    // Usage 0xFF000018: , Value = 0 to 255
  uint8_t  VEN_VendorDefined0019;                    // Usage 0xFF000019: , Value = 0 to 255
  uint8_t  VEN_VendorDefined001A;                    // Usage 0xFF00001A: , Value = 0 to 255
  uint8_t  VEN_VendorDefined001B;                    // Usage 0xFF00001B: , Value = 0 to 255
  uint8_t  VEN_VendorDefined001C;                    // Usage 0xFF00001C: , Value = 0 to 255
  uint8_t  VEN_VendorDefined001D;                    // Usage 0xFF00001D: , Value = 0 to 255
  uint8_t  VEN_VendorDefined001E;                    // Usage 0xFF00001E: , Value = 0 to 255
  uint8_t  VEN_VendorDefined001F;                    // Usage 0xFF00001F: , Value = 0 to 255
  uint8_t  VEN_VendorDefined0020;                    // Usage 0xFF000020: , Value = 0 to 255
  uint8_t  VEN_VendorDefined0021;                    // Usage 0xFF000021: , Value = 0 to 255
  uint8_t  VEN_VendorDefined0022;                    // Usage 0xFF000022: , Value = 0 to 255
  uint8_t  VEN_VendorDefined0023;                    // Usage 0xFF000023: , Value = 0 to 255
  uint8_t  VEN_VendorDefined0024;                    // Usage 0xFF000024: , Value = 0 to 255
  uint8_t  VEN_VendorDefined0025;                    // Usage 0xFF000025: , Value = 0 to 255
  uint8_t  VEN_VendorDefined0026;                    // Usage 0xFF000026: , Value = 0 to 255
  uint8_t  VEN_VendorDefined0027;                    // Usage 0xFF000027: , Value = 0 to 255
  uint8_t  VEN_VendorDefined0028;                    // Usage 0xFF000028: , Value = 0 to 255
                                                     // Usage 0xFF000029  Value = 0 to 255 <-- Ignored: REPORT_COUNT (40) is too small
} inputReport06_t;

您可能想尝试以下方法:

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

PROGMEM char usbHidReportDescriptor[] =
{
  0x06, 0x00, 0xFF,            // (GLOBAL) USAGE_PAGE         0xFF00 Vendor-defined 
  0x09, 0x01,                  // (LOCAL)  USAGE              0xFF000001 <-- Warning: Undocumented usage
  0xA1, 0x01,                  // (MAIN)   COLLECTION         0x00000001 Application (Usage=0xFF000001: Page=Vendor-defined, Usage=, Type=)
  0x15, 0x00,                  //   (GLOBAL) LOGICAL_MINIMUM    0x00 (0) <-- Redundant: LOGICAL_MINIMUM is already 0 <-- Info: Consider replacing 15 00 with 14
  0x26, 0xFF, 0x00,            //   (GLOBAL) LOGICAL_MAXIMUM    0x00FF (255)  
  0x75, 0x08,                  //   (GLOBAL) REPORT_SIZE        0x08 (8) Number of bits per field  
  0x85, 0x05,                  //   (GLOBAL) REPORT_ID          0x05 (5) 
  0x95, 0x04,                  //   (GLOBAL) REPORT_COUNT       0x04 (4) Number of fields  
  0x19, 0x01,                  //   (LOCAL)  USAGE_MINIMUM      0xFF000001 <-- Warning: Undocumented usage
  0x29, 0x04,                  //   (LOCAL)  USAGE_MAXIMUM      0xFF000004 <-- Warning: Undocumented usage
  0x81, 0x00,                  //   (MAIN)   INPUT              0x00000000 (4 fields x 8 bits) 0=Data 0=Array 0=Absolute 0=Ignored 0=Ignored 0=PrefState 0=NoNull 
  0x85, 0x06,                  //   (GLOBAL) REPORT_ID          0x06 (6) 
  0x95, 0x28,                  //   (GLOBAL) REPORT_COUNT       0x28 (40) Number of fields  
  0x19, 0x01,                  //   (LOCAL)  USAGE_MINIMUM      0xFF000001 <-- Warning: Undocumented usage
  0x29, 0x28,                  //   (LOCAL)  USAGE_MAXIMUM      0xFF000028 <-- Warning: Undocumented usage
  0x81, 0x00,                  //   (MAIN)   INPUT              0x00000000 (40 fields x 8 bits) 0=Data 0=Array 0=Absolute 0=Ignored 0=Ignored 0=PrefState 0=NoNull 
  0xC0,                        // (MAIN)   END_COLLECTION     Application
};

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

typedef struct
{
  uint8_t  reportId;                                 // Report ID = 0x05 (5)
  uint8_t  VEN_VendorDefined[4];                     // Value = 0 to 255
} inputReport05_t;


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

typedef struct
{
  uint8_t  reportId;                                 // Report ID = 0x06 (6)
  uint8_t  VEN_VendorDefined[40];                    // Value = 0 to 255
} inputReport06_t;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-10
    • 2011-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-31
    • 2014-11-27
    相关资源
    最近更新 更多