USB协议详解第6讲(USB描述符-端点描述符)
目录
1.USB描述符
2.端点描述符组成
3.STM32配置描述符集合代码(必须按顺序)
4.接口描述符组成详解
1.USB描述符
USB描述符有设备描述符、标准配置描述符、接口描述符、端点描述符、字符串描述符,HID设备有HID描述符、报告描述符和物理描述符。今天主要是学习USB端点描述符的组成。
2.端点描述符组成
前面讲了设备描述符、标准配置描述符、接口描述符,本篇我们讲解端点描述符。首先要明确的一点是端点描述符不能单独返回给USB主机,主机会请求获得配置描述符集合,配置描述符集合主要由标准配置描述符、接口描述符、端点描述符、HID描述符,报告描述符和物理描述符是单独返回给USB主机。端点描述符包含7个字节,组成如下:
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 ********************//* 18 */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.端点描述符组成详解
1.bLength
端点描述符的长度。
2.bDescriptorType
描述符类型,端点描述符为0x05。描述符的结构开头是一样的,都是先说描述符长度,然后说类型,每种描述符的类型是不一样的,如下表格,可速查。
3.bEndpointAddress
Bit 3…0: 端点编号;
Bit 6…4: 保留,默认为0;
Bit 7:如果是控制端点可以忽略,因为控制端点有两个方向,否则一般表示数据传输方向,0 = OUT endpoint 1 = IN endpoint。
4.bmAttributes
Bits 1..0: Transfer Type,表示传输类型(传输类型在后面讲传输一节会详细讲解)
00 = Control-控制传输
01 = Isochronous-同步传输
10 = Bulk-批量传输
11 = Interrupt-中断传输
Bits 7..2: 大家可以查看usb_20.pdf(下面有下载方法)。
5.wMaxPackeSize(双字节)
表示当前配置下此端点能够接收或发送的最大数据包的大小。
对于同步端点,此值用于指示主机在调度中保留的总线时间,这是每(微)帧数据有效负载所需的时间,有效负载时间就是发送一帧数据需要占用的总线时间,在实际数据传输过程中,管道实际使用的带宽可能比保留的带宽少,大家想想,如果实际使用的带宽比保留的还多,那就丢数了;
对于其类型的端点,bit10~bit0指定最大数据包大小(以字节为单位);
bit12~bit11对于高速传输的同步和中断端点有效:bit12~bit11可指定每个微帧的额外通信次数,这里大家一定要知道是在高速传输中,当一个事务超时时,在一个微帧时间内重传的次数,如果设置为00b(None),则表示在一个微帧内只传输一个事务,不进行额外的超时重传,如果设置为01b,则表示在一个微帧内可以传输两次事务,有一次额外的重传机会,从下面可以看出,一个微帧最多可以有两次重传事务的机会,如果微帧结束了还是失败,就需要等到下一个微帧继续发送该事务;
00 = None (1 transaction per microframe)
01 = 1 additional (2 per microframe)
10 = 2 additional (3 per microframe)
11 = Reserved
其它位默认为0,详细信息可参考usb_20文档第5章。
6.bInterval
查询时间,就是主机多久和设备通讯一次,主机在枚举设备的时候会得到端点描述符,然后根据端点描述符这个值和此端点进行对应的数据交互,也就是主机多久给端点发送一次数据请求。根据设备运行速度以帧或微帧表示,低速和全速称为帧,下面的一个值代表1ms,高速称为微帧,一个值代表125us。
对于全速/高速同步端点,此值必须在1到16之间。bInterval值用作2的指数,例如bInterval为4,表示周期为8个单位;
对于全速/低速中断端点,该字段的值可以是1到255,也就是主机多少ms给设备发一次数据请求;
对于高速中断端点,使用bInterval值作为2的指数,例如bInterval为4表示周期为8。这个值必须在1到16之间;
对于高速批量/控制输出端点,bInterval必须指定端点的最大NAK速率。值0表示端点永不NAK。其它值表示每个微帧的bInterval*125us时间最多1个NAK。这个值的范围必须在0到255之间;
对于全速/低速批量/控制输出端点,此值无意义,可以任意指定。
大家根据以上说明对号入座使用,用的时候在详细看usb_20.pdf文档。
注:端点描述符内容还是很多的,我们如果使用USB也没必须要研究的很细,如果想更深入的了解请进入公众号点击下载区,在文档栏下载USB2.0规范文档集合,查看usb_20.pdf文档了解更详细的内容。
1.版权归本作者(一个早起的程序员)所有;
2.未经原作者允许不得转载本文内容,否则将视为侵权;
3.转载或者引用本文内容请注明来源及原作者;
4.对于不遵守此声明或者其他违法使用本文内容者,本人依法保留追究权等。
下面是我的个人微信公众号,关注【一个早起的程序员】精彩系列文章每天不断。
USB协议详解第6讲(USB描述符-端点描述符)相关推荐
- USB协议详解第0讲(系列博文介绍)
目录 1.课程目标 2.简单介绍 3.课程大纲 1.课程目标 USB协议详解旨在为大家通俗理解USB通讯协议,我会带着大家一步一步理解USB通讯中的各种概念及通讯方式,并且会借助于USB Protoc ...
- USB协议详解第5讲(USB描述符-接口描述符)
目录 1.USB描述符 2.接口描述符组成 3.STM32配置描述符集合代码(必须按照顺序) 4.接口描述符组成详解 1.USB描述符 USB描述符有设备描述符.标准配置描述符.接口描述符.端点描述符 ...
- USB协议详解第3讲(USB描述符-设备描述符)
我们第一个学习要点就是USB描述符,所谓描述符其实就是C语言里面的结构体或者数组,数组包含的信息说明当前的设备具有哪些特征.USB描述符有设备描述符.配置描述符.接口描述符.端点描述符.字符串描述符, ...
- USB协议详解第12讲(USB传输-初探)
目录 1.USB传输.事务.包的关系 2.USB传输类型 2.1控制传输 2.2同步传输 2.3批量传输 2.4中断传输 3.传输总结及后期内容 1.USB传输.事务.包的关系 USB传输.事务.包是 ...
- STM32F1 USB外设详解第0讲(系列博文介绍)
目录 1.课程目标 2.简单介绍 3.读者须知 1.课程目标 STM32 USB外设详解系列博文目的是让大家深入理解STM32 USB外设原理,主要对USB外设功能框图和所有寄存器深度剖析.只有知其然 ...
- 通俗易懂的USB协议详解(转…
原文地址:通俗易懂的USB协议详解(转载) 作者: Branchesss 转自东海的博客http://6xudonghai.blog.163.com/blog/static/3364062920086 ...
- 32 usb 配置描述符_USB协议详解第4讲(USB描述符标准配置描述符)
关注+星标公众号,不错过精彩内容 编排 | 一个早起的程序员 一个早起的程序员 1 USB描述符USB描述符有设备描述符.标准配置描述符.接口描述符.端点描述符.字符串描述符,HID设备有HID描述符 ...
- Android USB 开发详解
Android USB 开发详解 先附上 Android USB 官方文档 Android通过两种模式支持各种 USB 外设和 Android USB 附件(实现Android附件协议的硬件):USB ...
- linux usb声卡 submit urb,linux usb urb详解
linux usb urb详解 谨以此文纪念过往的岁月 一.前言 在前文中看过了hub的驱动以及host的驱动还有usb设备的驱动,在把这些东西关联起来的东东中,一个很重要的urb(usb reque ...
最新文章
- python控制结构是_Python之控制结构(if、while、for)
- 静态路由协议的默认管理距离是_距离矢量路由选择协议
- 接口到底是什么(一语道破)
- linux u盘内容乱码,Linux挂载U盘,中文显示为乱码
- 2016/06/11
- android 编译sdk,android编译sdk
- Hdu - 2647 - Reward
- python mysql捕获异常_python mysql无法捕获异常
- QML QtLocation地图应用学习-4:行政区划
- selenium配置Edge 全屏 更改ua 等
- 全国哀悼日,我们也把博客灰一下吧
- xctf-supersqli
- 技术脱盲贴1------WINPE手工制作
- “当高启强遇到陈书婷”与TCP协议
- 抖音如何进行广告的投放
- AI MAX交互式开发使用方法说明(配合xshell)
- ewebeditor漏洞之目录遍历漏洞
- 轻量级网络模型MobileNet发展脉络(V1-V2-V3)
- t5810做虚拟服务器,戴尔Precision T5810工作站选用CPU的问题 | 小迪的生产力工具室...
- java.lang.IllegalStateException: Bindings already cleared.