STM32 USB HID报告描述符分析

USB HID报告描述符分析

芯片:STM32F407VE

编译器:KEIL5

作者:SY

日期:2017-7-21 15:19:46

简介

报告描述符是HID设备使用的描述符,主机通过解析从机上传的报告描述符,才能知道从机上传的报告代表什么含义。从机主要上传2份数据,一个是报告描述符,一个是报告。

解析单个数据

  • 一般使用键值对的方式表示:Usage(Usage Page:Usage ID)

  • 使用HID Descriptor Tool我们可以快速制作HID报告描述符,

    举个例子:0x05, 0x01, // USAGE_PAGE (Generic Desktop)

    分两部分解析:

    • 第一部分0x05,主要使用手册Device Class Definition for Human Interface Devices (HID)

    翻到p24 5.3 Generic Item Format ,将一个字节分为三部分:

    7-4bTag,参考p45

    3-2pType,参考p36

含义
0 Main
1 Global
2 Local
3 Reserved

1-0bSize

含义
0 0 bytes
1 1 bytes
2 2 bytes
3 4 bytes

那么05h == 0000 0101就表示Usage Page Global 1Bytes数据,1Bytes表示后面跟着的数据部分为1个字节。

  • 第二部分为0x01,参考Universal Serial Bus HID Usage Table.pdfp14,表示General Desktop Control
  • 其他数据皆可按照这种方法分析。

解析整个报告

使用HID Descriptor Tool产生如下鼠标报告:

char ReportDescriptor[52] = {
    0x05, 0x01,                    // USAGE_PAGE (Generic Desktop)
    0x09, 0x02,                    // USAGE (Mouse)
    0xa1, 0x01,                    // COLLECTION (Application)
    0x09, 0x01,                    //   USAGE (Pointer)
    0xa1, 0x00,                    //   COLLECTION (Physical)
    0x05, 0x09,                    //     USAGE_PAGE (Button)
    0x19, 0x01,                    //     USAGE_MINIMUM (Button 1)
    0x29, 0x03,                    //     USAGE_MAXIMUM (Button 3)
    0x15, 0x00,                    //     LOGICAL_MINIMUM (0)
    0x25, 0x01,                    //     LOGICAL_MAXIMUM (1)
    0x95, 0x03,                    //     REPORT_COUNT (3)
    0x75, 0x01,                    //     REPORT_SIZE (1)
    0x81, 0x02,                    //     INPUT (Data,Var,Abs)
    0x95, 0x01,                    //     REPORT_COUNT (1)
    0x75, 0x05,                    //     REPORT_SIZE (5)
    0x81, 0x03,                    //     INPUT (Cnst,Var,Abs)
    0x05, 0x01,                    //     USAGE_PAGE (Generic Desktop)
    0x09, 0x30,                    //     USAGE (X)
    0x09, 0x31,                    //     USAGE (Y)
    0x09, 0x38,                    //     USAGE (Wheel)
    0x15, 0x81,                    //     LOGICAL_MINIMUM (-127)
    0x25, 0x7f,                    //     LOGICAL_MAXIMUM (127)
    0x75, 0x08,                    //     REPORT_SIZE (8)
    0x95, 0x03,                    //     REPORT_COUNT (3)
    0x81, 0x06,                    //     INPUT (Data,Var,Rel)
    0xc0,                          //     END_COLLECTION
    0xc0                           // END_COLLECTION
};

含义很明确:

​ 先定义鼠标的3个按键,解释他的数值范围。再定义鼠标的移动坐标和滚轮。这样,主机拿到这个报告一一解析出来就知道报告的含义了。

参考

Device Class Definition for Human Interface Devices (HID)

Universal Serial Bus HID Usage Table.pdf

[HID Descriptor Tool](http://www.usb.org/developers/hidpage#HID Descriptor Tool)

Language Identifiers (LANGIDs)

usb ids

你可能感兴趣的:(USB,STM32)