1. 综述
usb2.0协议规定了4中传输(Transfers)类型,分别是:
- 批量传输(Bulk Transfers)
- 控制传输(Control Transfers)
- 中断传输(Interrupt Transfers)
- 同步传输(Isochronous Transfers)
usb2.0中有4种端点类型(端点类型 由 端点描述符 的 bmAttributes 字段决定),分别是 批量端点(bulk endpoint), 控制端点(control endpoint), 中断端点(interrupt endpoint), 同步端点(isochronous endpoint) ,usb的通信可以抽象为主机(host) 与 不同端点间的数据交换,
- 主机(host) 与 批量端点(bulk endpoint) 的数据交换采用批量传输(Bulk Transfers)。
- 主机(host) 与 控制端点(control endpoint) 的数据交换采用控制传输(Control Transfers)。
- 主机(host) 与 中断端点(interrupt endpoint) 的数据交换采用中断传输(Interrupt Transfers)。
- 主机(host) 与 同步端点(isochronous endpoint) 的数据交换采用同步传输(Isochronous Transfers)。
usb2.0上层便是使用这4种传输类型进行传输数据。《Universal Serial Bus Specification Revision 2.0》的5.5,5.6,5.7,5.8 章节对上述4中传输类型的特点和限制进行了详细说明,有兴趣可以参阅一下.
2.事务(Transactions)和传输(Transfers)
《Universal Serial Bus Specification Revision 2.0》第8 章从包(packet) 构成 和事务(Transactions) 的构成,以及 传输(Transfers) 的构成,以及数据的同步与重传机制,错误检测与恢复机制都进行了说明
本文暂不讨论数据的同步与重传机制,错误检测与恢复机制,有关包(packet) 的概念我在
《usb2.0中的包(packet)》进行了介绍。本文着重介绍 事务(Transactions) 和 传输(Transfers) 的概念以及他们的关系。
用一句话总结:传输(Transfers) 是由一个或多个事务(Transactions) 构成,事务(Transactions) 由多个 包(packet) 构成。
2.1 usb2.0中有哪些事务?
先看一下《Universal Serial Bus Specification Revision 2.0》的第8.5章:
从上面目录,我们可以看到了 批量事务(Bulk Transactions) , 中断事务(Interrupt Transactions) , 同步事务(Isochronous Transactions), 但却没有控制事务, 为什么?
- 一个或多个批量事务构成批量传输
- 一个或多个中断事务构成中断传输
- 一个或多个同步事务构成同步传输
- 相较上述几种传输,控制传输是特别的,并没有单独的控制事务,后文继续讨论。
2.2 批量事务(Bulk Transactions)与批量传输(Bulk Transfers)
2.2.1 批量事务(Bulk Transactions)的组成
下图可以很清晰的看出批量事务(Bulk Transactions) 的组成,便不再使用过多笔墨描述。
2.2.2 批量传输(Bulk Transfers)的组成
暂不对ping事务进行讨论,后续文章结合具体场景进行讨论。如下图,批量传输(Bulk Transfers) 就是批量事务(Bulk Transactions) 的简单重复。
注:组成批量传输(Bulk Transfers) 的批量事务(Transactions) 间的时间间隔没有要求,总线空闲时host便会发起传输,当总线中有其他实时性要求较高的传输(如中断传输)时,总线会优先进行实时性要求较高的传输,总线空闲时才会进行批量传输(Bulk Transfers) ,批量传输(Bulk Transfers) 的时效性是不保证的。
2.2.2 批量传输(Bulk Transfers)的特点与限制
- 批量传输(Bulk Transfers) 并不是必须支持的。
- 低速模式 不能支持批量传输,全速/高速模式可以支持批量传输。
- 批量传输适合大量且对速率和传输时间无要求的场景,原因批量传输(Bulk Transfers) 在总线竞争中优先级较低,例如在 批量传输和中断传输产生竞争时,host会优先进行中断传输。
- 批量传输(Bulk Transfers) 对 批量事务(Transactions) 的间隔是没有规定的,在总线空闲时即可发起。
- 一次批量事务传输的字节数:
- 由端点描述符的wMaxPacketSize字段决定。
- 对于全速设备可以是8/16/32/64个字节
- 对于高速设备必须是 512个字节
2.3 中断事务(Interrupt Transactions) 和中断传输(Interrupt Transfers)
2.3.1 中断事务(Interrupt Transactions)的组成
下图描述了中断事务(Interrupt Transactions) 的组成,便不再使用过多笔墨描述。
2.3.2中断传输(Interrupt Transfers)的组成
中断传输(Interrupt Transfers) 即是 周期性(固定时间间隔) 的进行中断事务。也可以理解为一个中断传输包含一个中断事务,关键点在于周期进行,对实时性是有要求的。
因其对“实时性”的要求,总线会对中断传输预留足够的带宽。
2.3.3中断传输(Interrupt Transfers)的特点与限制
- 中断传输(Interrupt Transfers) 并不是必须支持的。
- 低速/全速/高速模式 均支持中断传输(Interrupt Transfers)
- 中断事务 的间隔时间
- 由端点描述符的bInterval字段决定
- 低速端点:bInterval表示最大的间隔时间,单位是ms,取值范围是10-255,即最大间隔时间可配置为10ms - 255ms.
- 全速端点:bInterval表示最大的间隔时间,单位是ms,取值范围是1-255,即最大间隔时间可配置为1ms - 255ms.
- 高速端点:传输间隔由公式 (2bInterval-1) * 125us 表示,bInterval的取值范围是 1 - 16,允许的时间范围是 125us - 4.096s
- 中断事务传输的字节数:
- 由端点描述符的wMaxPacketSize字段决定。
- 低速:小于等于 8 字节
- 全速:小于等于 64 字节
- 高速:小于等于 1024 字节
2.4 同步事务(Isochronous Transactions)
2.4.1 同步事务(Isochronous Transactions)的组成
下图描述了同步事务(Isochronous Transactions)的组成,便不再使用过多笔墨描述。
2.4.2 同步传输(Isochronous Transfers)的组成
同步传输 与 中断传输类似, 区别在于没有握手阶段,也就不支持重传机制。
2.4.3 同步传输(Isochronous Transfers)的特点与限制
- 实时传输(Isochronous Transfers) 并不是必须支持的。
- 低速模式 不能支持实时传输,全速/高速模式可以支持实时传输。
- 实时事务 的间隔时间:
- 由端点描述符的bInterval字段决定
- 全速端点:传输间隔由公式 (2bInterval-1) * 1ms 表示,bInterval的取值范围是 1 - 16,允许的时间范围是 1ms - 32.768s
- 高速端点:传输间隔由公式 (2bInterval-1) * 125us 表示,bInterval的取值范围是 1 - 16,允许的时间范围是 125us - 4.096s
- 实时事务传输的字节数:
- 由端点描述符的wMaxPacketSize字段决定
- 全速:小于等于 1023 字节
- 高速:小于等于 1024 字节
2.5 控制传输(Control Transfers)
控制传输分为3个阶段,分别是:
- 建立阶段(setup phase):usb主机向设备发送特定的请求(request)
- 数据阶段(data phase):主机向设备发送数据或从设备获取数据(不是必须的,有些请求不需要交换数据)
- 状态阶段(status phase):对结果的反馈,由设备向主机反馈。
2.5.1 建立阶段(setup phase)
建立阶段由一个建立事务(setup Transactions) 组成,如下图所示:
建立事务(setup Transactions) 的 数据包,传输的是一个固定格式的请求,请求分为3类:
- 标准请求:usb2.0标准定义的请求,如GetDescriptor(),Set Address(),可参阅《Universal Serial Bus Specification Revision 2.0》第九章
- 类请求:特定类要求支持的请求,如hid cdc等,可参考对应的设备类标准
- 厂商自定义请求:厂商自定义的请求。
注:本文暂不对 请求(Requests) 展开描述,后续会单独对各种请求进行描述,下表是 请求(Requests) 的字段简单描述:
地址偏移量 | 字段名 | 长度(字节) | 说明 |
---|---|---|---|
0 | bmRequestType | 1 | 指明控制请求的特性: D7 数据传输方向: 0 - 主机到设备 1- 设备到主机 D6 ~ D5 类型: 0 - 标准, 1 - 设备类, 2 - 供应商, 3 - 保留 D4~ D0 接收方: 0 - 设备, 1 - 接口,2 - 端点, 3 - 其他, 4~31 - 保留 |
1 | bRequest | 1 | 控制请求的请求号 |
2 | wValue | 2 | 控制请求的参数,其值根据具体请求的不同而不同 |
4 | wIndex | 2 | 控制请求的参数,典型用于传送索引值或偏移量 |
6 | wLength | 2 | 指明该控制事务数据阶段所需传输的字节数 |
2.5.2 数据阶段(data phase)
控制传输的数据阶段是一个批量传输(Bulk Transfers) ,便不过多赘述。
- 数据阶段并不是必须的
- 数据阶段由DATA1开始
2.5.3 状态阶段(status phase)
状态阶段(status phase)是由设备向主机报告状态。
- 如果数据阶段是OUT事务 ,则主机发起IN事务向设备询问状态
- 如果数据阶段是IN事务 ,则主机发起OUT事务向设备询问状态
- 如果没有数据阶段,则主机发起IN事务向设备询问状态
状态阶段(status phase)设备向主机报告状态的方法如下,很好理解:
设备状态 | IN事务报告的方法 | OUT事务报告的方法 |
---|---|---|
usb设备忙 | NAK握手包 | NAK握手包 |
USB设备有错误 | STALL握手包 | STALL握手包 |
USB设备成功处理 | l零长度数据包 | ACK握手包 |