目录

1.HID设备概述

2.HID描述符组成

3.STM32配置描述符集合代码(必须按顺序)

4.HID描述符组成详解


1.HID设备概述

USB设备中有一大类就是HID设备,即Human Interface Devices,人机接口设备。这类设备包括鼠标、键盘、游戏手柄等,主要用于人与计算机进行交互。HID设备可以作为低速、 全速、高速设备用。由于HID设备要求用户输入能得到及时响应,故其传输方式通常采用中断传输

在USB协议中,HID设备的类型定义放置在接口描述符中,USB的设备描述符和配置描述符中不包含HID设备的信息。因此,对于某些特定的HID设备,可以定义多个接口,一个接口为HID设备类即可。当USB一个设备为HID设备时,其设备描述符里面的bDeviceClass、bDeviceSubClass、bDeviceProtocol应为0,具体的定义在接口描述符中,接口描述符bInterfaceClass、bInterfaceSubClass、bInterfaceProtocol三个值如下:

bInterfaceClass 0x03:表示HID为设备
bInterfaceSubClass

0x00:对无需支持引导的HID设备;

0x01:对支持引导的USB设备(鼠标、键盘);

其他:保留。

bInterfaceProtocol

当bInterfaceSubClass为0x00,此值无效

当bInterfaceSubClass为0x01

设置为0x01:键盘接口

设置为0x02:鼠标接口

注:说明下,支持引导就是在BIOS界面USB设备就可以使用了,比如我们的键盘和鼠标。

2.HID描述符组成

当一个USB设备被定义为HID设备的时候,设备必须实现HID描述符。首先要明确的一点是HID描述符不能单独返回给USB主机,主机会请求获得配置描述符集合,配置描述符集合主要由标准配置描述符、接口描述符、HID描述符、端点描述符,报告描述符物理描述符是单独返回给USB主机。HID描述符组成如下:

3.STM32配置描述符集合代码(必须按顺序)

/* USB Configuration Descriptor */
const uint8_t CustomHID_ConfigDescriptor[CUSTOMHID_SIZ_CONFIG_DESC] =
{
//
// 标准配置描述符
//  0x09, /* bLength: Configuation Descriptor size */USB_CONFIGURATION_DESCRIPTOR_TYPE,     /* bDescriptorType: Configuration */CUSTOMHID_SIZ_CONFIG_DESC,          /* wTotalLength low : Bytes returned */0x00,                                /* wTotalLength high: Bytes returned */0x01,         /* bNumInterfaces: 1 interface */0x01,         /* bConfigurationValue: Configuration value */0x00,         /* iConfiguration: Index of string descriptor describing the configuration*/0xC0,         /* bmAttributes: Bus powered *//*Bus powered: 7th bit, Self Powered: 6th bit, Remote wakeup: 5th bit, reserved: 4..0 bits */0x96,         /* MaxPower 300 mA: this current is used for detecting Vbus *///
// 接口描述符
//      /************** Descriptor of Custom HID interface ****************//* 09 */0x09,                               /* bLength: Interface Descriptor size */USB_INTERFACE_DESCRIPTOR_TYPE,      /* bDescriptorType: Interface descriptor type */0x00,         /* bInterfaceNumber: Number of Interface */0x00,         /* bAlternateSetting: Alternate setting */0x02,         /* bNumEndpoints 此接口有两个端点 */0x03,         /* bInterfaceClass: HID */0x00,         /* bInterfaceSubClass : 1=BOOT, 0=no boot */0x00,         /* nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse */0,            /* iInterface: Index of string descriptor *///
// HID描述符
//      /******************** Descriptor of Custom HID HID ********************/0x09,                   /* bLength: HID Descriptor size */HID_DESCRIPTOR_TYPE,  /* bDescriptorType: HID */0x10,                     /* bcdHID: HID Class Spec release number */0x01,0x00,         /* bCountryCode: Hardware target country 国家代码 */0x01,         /* bNumDescriptors: Number of HID class descriptors to follow类别描述符数目(至少有一个报表描述符)*/0x22,         /* bDescriptorType 报告描述符 */CUSTOMHID_SIZ_REPORT_DESC, /* wItemLength: Total length of Report descriptor 报告描述符大小 */0x00,                       /* 标志类别描述符说明结束 */ //
// 端点1描述符
//      /******************** Descriptor of Custom HID endpoints ******************//* 27 */0x07,          /* bLength: Endpoint Descriptor size */USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: */0x82,          /* bEndpointAddress: Endpoint Address (IN) */               // bit 3...0 : the endpoint number// bit 6...4 : reserved// bit 7     : 0(OUT), 1(IN)0x03,          /* bmAttributes: Interrupt endpoint */0x40,          /* wMaxPacketSize: 64 Bytes max */0x00,0x02,          /* bInterval: Polling Interval (2 ms) *//* 34 *///
// 端点2描述符
//      0x07,   /* bLength: Endpoint Descriptor size */USB_ENDPOINT_DESCRIPTOR_TYPE,    /* bDescriptorType: *//*    Endpoint descriptor type */0x01,    /* bEndpointAddress: *//*   Endpoint Address (OUT) */0x03,  /* bmAttributes: Interrupt endpoint */0x40, /* wMaxPacketSize: 64 Bytes max  */0x00,0x02,   /* bInterval: Polling Interval (2 ms) *//* 41 */
}; /* CustomHID_ConfigDescriptor */

4.HID描述符组成详解

1.bLength

描述符长度。HID描述符长度不是固定的,长度多少与描述符中包含的下级描述符个数相关。如果只有一个下级描述符,也就是不包括可选的部分,一共有9字节的长度,如果有多个下级描述符,按照长度往上加。

2.bDescriptorType

描述符类型,设置为0x21。

3.bcdHID

HID设备所遵循的HID版本号,为4位16进制的BCD码。1.0即0x0100,1.1即0x0101,2.0即0x0200。

4.bCountryCode

HID设备国家/地区代码,如下表格自行查询。

5.bNumDescriptor

HID设备支持的下级描述符的数量。在这里大家一定要注意,下一级描述符的类型有两种,报告描述符物理描述符,对于HID设备报告描述符和物理描述符可以有多个,但是至少有一个报告描述符,物理描述符是可选的,bNumDescriptor表示报告描述符和物理描述符的个数总和。由于HID设备至少需要包括一个报告描述符,故其值至小为0x01,一般的HID设备也为1,也就是有一个报告描述符,物理描述符很少用到。

6.bDescriptorTyep

下级描述符的类型,下级描述符第1个必须是报告描述符,所以这里存放报告描述符类型,如下表格,报告描述符的类型为0x22,其他描述符的类型可速查。

7.wDescriptorLength

下级描述符的长度,下级描述符第1个必须是报告描述符,所以这里存放报告描述符的长度,每种HID设备的报告描述符长度是不一样的,比如STM32某HID设备的报告描述符长度为43字节,代码如下,下一节详解报告描述符

//
// 报告描述符
//
const unsigned char ReportDesc[0x2b] =   // Report descriptor{0x05,0x01,       /* Usage Page (generic desktop) */0x09,0x06,        /* Usage (keyboard) */0xA1,0x01,        /* Collection */0x05,0x07,      /*   Usage Page 7 (keyboard/keypad) */0x19,0xE0,        /*   Usage Minimum = 224 */0x29,0xE7,      /*   Usage Maximum = 231 */0x15,0x00,      /*   Logical Minimum = 0 */0x25,0x01,      /*   Logical Maximum = 1 */0x75,0x01,      /*   Report Size = 1 */0x95,0x08,      /*   Report Count = 8 */0x81,0x02,     /*  Input(Data,Variable,Absolute) */0x95,0x01,      /*   Report Count = 1 */0x75,0x08,     /*   Report Size = 8 */0x81,0x01,      /*  Input(Constant) */0x19,0x00,        /*   Usage Minimum = 0 */0x29,0x65,        /*   Usage Maximum = 101 */0x15,0x00,      /*   Logical Minimum = 0 */0x25,0x65,      /*   Logical Maximum = 101 */0x75,0x08,        /*   Report Size = 8 */0x95,0x01,      /*   Report Count = 1 */0x81,0x00,     /*  Input(Data,Variable,Array) */0xC0};         /* End Collection */
#endif

1.本文部分素材来源网络,版权归原作者所有,如涉及作品版权问题,请与我联系删除。

2.未经原作者允许不得转载本文内容,否则将视为侵权;

3.转载或者引用本文内容请注明来源及原作者;

4.对于不遵守此声明或者其他违法使用本文内容者,本人依法保留追究权等。

下面是我的个人微信公众号,关注【一个早起的程序员】精彩系列文章每天不断。

USB协议详解第9讲(USB描述符-HID描述符)相关推荐

  1. USB协议详解第0讲(系列博文介绍)

    目录 1.课程目标 2.简单介绍 3.课程大纲 1.课程目标 USB协议详解旨在为大家通俗理解USB通讯协议,我会带着大家一步一步理解USB通讯中的各种概念及通讯方式,并且会借助于USB Protoc ...

  2. USB协议详解第5讲(USB描述符-接口描述符)

    目录 1.USB描述符 2.接口描述符组成 3.STM32配置描述符集合代码(必须按照顺序) 4.接口描述符组成详解 1.USB描述符 USB描述符有设备描述符.标准配置描述符.接口描述符.端点描述符 ...

  3. USB协议详解第6讲(USB描述符-端点描述符)

    目录 1.USB描述符 2.端点描述符组成 3.STM32配置描述符集合代码(必须按顺序) 4.接口描述符组成详解 1.USB描述符 USB描述符有设备描述符.标准配置描述符.接口描述符.端点描述符. ...

  4. USB协议详解第3讲(USB描述符-设备描述符)

    我们第一个学习要点就是USB描述符,所谓描述符其实就是C语言里面的结构体或者数组,数组包含的信息说明当前的设备具有哪些特征.USB描述符有设备描述符.配置描述符.接口描述符.端点描述符.字符串描述符, ...

  5. USB协议详解第12讲(USB传输-初探)

    目录 1.USB传输.事务.包的关系 2.USB传输类型 2.1控制传输 2.2同步传输 2.3批量传输 2.4中断传输 3.传输总结及后期内容 1.USB传输.事务.包的关系 USB传输.事务.包是 ...

  6. STM32F1 USB外设详解第0讲(系列博文介绍)

    目录 1.课程目标 2.简单介绍 3.读者须知 1.课程目标 STM32 USB外设详解系列博文目的是让大家深入理解STM32 USB外设原理,主要对USB外设功能框图和所有寄存器深度剖析.只有知其然 ...

  7. 通俗易懂的USB协议详解(转…

    原文地址:通俗易懂的USB协议详解(转载) 作者: Branchesss 转自东海的博客http://6xudonghai.blog.163.com/blog/static/3364062920086 ...

  8. 32 usb 配置描述符_USB协议详解第4讲(USB描述符标准配置描述符)

    关注+星标公众号,不错过精彩内容 编排 | 一个早起的程序员 一个早起的程序员 1 USB描述符USB描述符有设备描述符.标准配置描述符.接口描述符.端点描述符.字符串描述符,HID设备有HID描述符 ...

  9. Android USB 开发详解

    Android USB 开发详解 先附上 Android USB 官方文档 Android通过两种模式支持各种 USB 外设和 Android USB 附件(实现Android附件协议的硬件):USB ...

  10. linux usb声卡 submit urb,linux usb urb详解

    linux usb urb详解 谨以此文纪念过往的岁月 一.前言 在前文中看过了hub的驱动以及host的驱动还有usb设备的驱动,在把这些东西关联起来的东东中,一个很重要的urb(usb reque ...

最新文章

  1. DATEIF实例说明3
  2. LeetCode 167. Two Sum II - Input array is sorted--Python解法
  3. 计算机地质应用软件,中国地质大学《质软件应用》作业报告.doc
  4. pythonos模块修改文件名_python如何动态改变文件名
  5. WKWebView get/set cookie小结
  6. 蓝桥杯C++ AB组辅导课 第二讲 二分与前缀和 Acwing
  7. vscode kite插件_微软发布 VS Code Python 插件 7 月更新
  8. 开源虎墩同名电影《小虎墩大英雄》定档大年初一
  9. Mysql 中的SSL 连接
  10. linux访问win10共享文件夹权限,win10共享文件夹无法访问提示“你没有权限访问”怎么办...
  11. python 柱状图和折线图放在一起_一款多条折线与柱状图共存图表
  12. 如何用tomcat模拟集群,要求负载均衡(Nginx),并保持session一致性!
  13. CorelDRAW教程大全集
  14. 信托购买高搜索产品容易推10元[奥运]门槛
  15. C# 高并发获取唯一ID算法
  16. 微信分销商城如何推广比较吸引粉丝
  17. android storagemanager来获取u盘名称,StorageManager获取U盘挂载状态
  18. 线圈绕制中漆包线的简单介绍
  19. PDFObject.js的使用
  20. corenlp分词 stanford_Stanford CoreNLP 入门指南

热门文章

  1. H3CNE,H3CSE知识点,重点汇总。
  2. 数据挖掘技术、方法及应用
  3. 天龙八部稳定服务器,献给天龙八部Online的Fans们--职业玩家及所在服务器
  4. java基础12 IO
  5. hadoop 查看集群的网页监控状态
  6. PHP网页监控系统,实现网页变化监控
  7. Qt 基于Google引擎的拼音输入法
  8. Windows7WithSP1/TeamFoundationServer2012update4/SQLServer2012
  9. AOP与AspectJ的关系
  10. Structs2 总结