USB(四)接口描述符和端点描述符

前面几个章节说了设备描述符、配置描述符和HID特有描述符,接下来继续讲解接口描述符。根据USB协议规定,接口描述符不能单独返回,必须附着在配置描述符后一并返回。

接口描述符

标准的接口描述符的结构如下:

接口描述符
偏移量/字节大小/字节说   明
0bLength1该描述符的长度(9字节)
1bDescriptorType1该描述符类型(0x04)
2bInterfaceNumber1该接口的编号(从0开始)
3bAlternateSetting1该接口的备用编号
4bNumEndpoints1该接口所使用的端点数
5bInterfaceClass1该接口所使用的类
6bInterfaceSubClass1该接口所使用的子类
7bInterfacPtotocol1该接口所使用的协议
8iConfiguration1描述该接口的字符串的索引

bLength:标准描述符的长度。

bDescriptorType:描述符的类型。

/* USB Descriptor Types */
#define USB_DEVICE_DESCRIPTOR_TYPE                  1
#define USB_CONFIGURATION_DESCRIPTOR_TYPE      2
#define USB_STRING_DESCRIPTOR_TYPE             3
#define USB_INTERFACE_DESCRIPTOR_TYPE          4
#define USB_ENDPOINT_DESCRIPTOR_TYPE           5
#define USB_DEVICE_QUALIFIER_DESCRIPTOR_TYPE   6
#define USB_OTHER_SPEED_CONFIG_DESCRIPTOR_TYPE 7
#define USB_INTERFACE_POWER_DESCRIPTOR_TYPE    8
#define USB_OTG_DESCRIPTOR_TYPE                     9
#define USB_DEBUG_DESCRIPTOR_TYPE                  10
#define USB_INTERFACE_ASSOCIATION_DESCRIPTOR_TYPE  11

bInterfaceNumber:接口编号。当一个配置具有多个接口时,每个接口的编号都不相同。从0开始依次递增对一个配置的接口进行编号。

bNumEndpoints:该接口所使用的端点数(不包括0端点)。如果为0,则表示没有非0端点,只使用默认的控制端点。

端点描述符

USB协议规定的标准端点描述符的结构。端点描述符不能单独返回,必须附着在配置描述后一并返回。

标准端点描述符的结构
偏移量/字节大小/字节说明
0bLength1该描述符的长度(7字节)
1bDescriptorType1描述符的类型
2bEndpointAddress1该端点的地址
3bmAttributes1该端点的属性
4wMaxPackeSize2该端点支持的最大包长度
6bInterval1端口的查询时间

bLength:描述符的长度。

bDescriptorType:描述符的类型。

bEndpointAddress:该端点的地址。最高为D7为该端点的传输方向,1为输入,0为输出。D3~D0为端点号。

bmAttributes:端点的属性。最低两位D1~D0表示该端点的传输类型,0为控制传输,1为等时传输,2位批量传输,3为中断传输。如果该端点是非等时传输的端点,那么D7~D2为保留值,设置为0。如果该端点是等时传输的,则D3~D2表示同步的类型,0为无同步,1为异步,2为适配,3为同步;D5~D4表示用途,0为数据端点,1为反馈端点,2位暗含反馈的数据端点,3是保留值。D7~D6保留。
/* bmAttributes in Endpoint Descriptor */
#define USB_ENDPOINT_TYPE_MASK                 0x03
#define USB_ENDPOINT_TYPE_CONTROL              0x00
#define USB_ENDPOINT_TYPE_ISOCHRONOUS          0x01
#define USB_ENDPOINT_TYPE_BULK                 0x02
#define USB_ENDPOINT_TYPE_INTERRUPT            0x03
#define USB_ENDPOINT_SYNC_MASK                 0x0C
#define USB_ENDPOINT_SYNC_NO_SYNCHRONIZATION   0x00
#define USB_ENDPOINT_SYNC_ASYNCHRONOUS         0x04
#define USB_ENDPOINT_SYNC_ADAPTIVE             0x08
#define USB_ENDPOINT_SYNC_SYNCHRONOUS          0x0C
#define USB_ENDPOINT_USAGE_MASK                0x30
#define USB_ENDPOINT_USAGE_DATA                0x00
#define USB_ENDPOINT_USAGE_FEEDBACK            0x10
#define USB_ENDPOINT_USAGE_IMPLICIT_FEEDBACK   0x20
#define USB_ENDPOINT_USAGE_RESERVED            0x30

wMaxPackeSize:该端点所支持的最大包长度。注意低字节在先。对于全速模式和低速模式,D10~D0表示端点的最大包长度,其他保留为0。对于高速模式,D12~D11为每个帧附加的传输次数,具体看USB2.0协议。

bInterval:该端点的查询时间。对于查询的帧间隔数。对于等时传输以及高速模式的中断、批量传输,该字段的意义请参看USB2.0协议。

例如:

/* Endpoint, HID Interrupt In  这个端点用来传状态包*/
  USB_ENDPOINT_DESC_SIZE,                   /* bLength */
  USB_ENDPOINT_DESCRIPTOR_TYPE,    /* bDescriptorType */
  USB_ENDPOINT_IN(1),                               /* bEndpointAddress */
  USB_ENDPOINT_TYPE_INTERRUPT,       /* bmAttributes */
  WBVAL(0x0040),                                          /* wMaxPacketSize 原来是04*/
  2,          /* 2ms */                                           /* bInterval 可控制时间片的长度*/
    //增加一个输出端点,用于接收主机的数据
  USB_ENDPOINT_DESC_SIZE,                     /* bLength */
  USB_ENDPOINT_DESCRIPTOR_TYPE,      /* bDescriptorType */
  USB_ENDPOINT_OUT(1),                             /* bEndpointAddress */
  USB_ENDPOINT_TYPE_INTERRUPT,        /* bmAttributes */
  WBVAL(0x0020),                                           /* wMaxPacketSize 接收数据包大小为32字节*/
  20,                                   /* 20ms */               /* bInterval */

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值