内容原创,未经本人同意请勿转载。联系本人:jianshu_kevin@126.com
初次接触USB的同学,可能会被里面各种名词给搞晕,没关系我们下面就来梳理一下这些知识,希望能帮助大家理解USB。
一,从最常见的名词说起
1.1 什么是USB
这个我就不多解释了,直译就是通用串行总线。再不明白的就百度。
1.2 USB协议版本
- USB 1.0/1.1(low/full speed),传输速率最大为12Mbps
- USB 2.0(high speed),传输速率最大480Mbps
- USB 3.0(super speed),传输速率最大5Gbps
协议版本向下兼容
1.3 USB接口分类
- Type A,即使我们电脑上的那种接口。
- Type B,不太常见,比较方正的T型接口,有的嵌入式开发板会用。
- Type C,现在开始流行起来了,最大的好处就是可以盲插,而不用区分正反。
- Micro/mini,手机上比较常见。
不管哪种接口,用的线都是4根,只是形状不同而已。
二. 协议相关的名词解析
2.1 描述符(description)
谈到USB描述符,不得不说USB最强悍的地方就在这里。一个口可以插很多的设备,可以插U盘、上网卡、音频设备、还有的是复合设备,一个设备插上后可以虚拟出多个设备出来,太强了。
主设备之所以能区分不同的从设备,靠的就是描述符。 于是USB协议里就规定了各种不同的USB描述符。让我们先看一下USB协议里四大描述符之间的关系
+------设备描述符
+----------配置描述符1
+----------接口描述符1
+----------端点描述符1
+----------端点描述符2
+....
+----------接口描述符2
+----------端点描述符1
+....
+....
+----------配置描述符2
+----------接口描述符1
+----------端点描述符1
+----------端点描述符2
+....
+....
+....
2.1.1 设备描述(device description)
故名思意用来描述USB设备的,一个设备只有一个设备描述符,包含了设备类型、设备遵循的协议、厂商ID、产品id、序列号等,一个完整的设备描述符如下:
DEVICE DESCRIPTOR
bLength: 18
bDescriptorType: 0x01 (DEVICE)
bcdUSB: 0x0200
bDeviceClass: Vendor Specific (0xff)
bDeviceSubClass: 255
bDeviceProtocol: 255
bMaxPacketSize0: 64
idVendor: Marvell Semiconductor, Inc. (0x1286)
idProduct: Unknown (0x812a)
bcdDevice: 0x0000
iManufacturer: 3
iProduct: 2
iSerialNumber: 0
bNumConfigurations: 1
2.1.2 配置描述符(configrue description)
配置描述就是用来配置设备的,没错,就是这么简单。但是要记住一点:一个设备同一时刻只能有一种配置生效,而且要区分配置和设置的区别。还是来看一下配置描述符的内容
CONFIGURATION DESCRIPTOR
bLength: 9
bDescriptorType: 0x02 (CONFIGURATION)
wTotalLength: 121
bNumInterfaces: 4
bConfigurationValue: 1
iConfiguration: 0
Configuration bmAttributes: 0xc0 SELF-POWERED NO REMOTE-WAKEUP
1... .... = Must be 1: Must be 1 for USB 1.1 and higher
.1.. .... = Self-Powered: This device is SELF-POWERED
..0. .... = Remote Wakeup: This device does NOT support remote wakeup
bMaxPower: 250 (500mA)
设置是什么,暂时不多解释,后面再谈。
2.1.3 接口描述符(interface description)
一个interface就代表一个设备。USB interface用来处理一类 USB 逻辑连接, 例如一个鼠标, 一个键盘, 或者一个音频流. 一些 USB 设备有多个接口。也就是复合设备,例如一个 USB 扬声器可能有 2 个接口: 一个 USB 键盘给按钮和一个 USB 音频流。
INTERFACE DESCRIPTOR (2.0): class Vendor Specific
bLength: 9
bDescriptorType: 0x04 (INTERFACE)
bInterfaceNumber: 2
bAlternateSetting: 0
bNumEndpoints: 2
bInterfaceClass: Vendor Specific (0xff)
bInterfaceSubClass: 0x00
bInterfaceProtocol: 0x00
iInterface: 8
**一个interface包含多个endpoint
2.1.4 端点描述符(endpoint description)
USB通信的基本物理单位,一个endpiont只能承载一个方向的数据。endpiont分为如下几种:
- CONTROL
控制端点被用来允许对 USB 设备的不同部分存取. 通常用作配置设备, 获取关于设备的信息, 发送命令到设备, 或者获取关于设备的状态报告. 这些端点在尺寸上常常较小. 每个 USB 设备有一个控制端点称为"端点 0", 被 USB 核用来在插入时配置设备. 这些传送由 USB 协议保证来总有足够的带宽使它到达设备.
- INTERRUPT
中断端点传送小量的数据, 以固定的速率在每次 USB 主请求设备数据时. 这些端点对 USB 键盘和鼠标来说是主要的传送方法. 它们还用来传送数据到 USB 设备来控制设备, 但通常不用来传送大量数据. 这些传送由 USB 协议保证来总有足够的带宽使它到达设备.
- BULK
块端点传送大量的数据. 这些端点常常比中断端点大(它们一次可持有更多的字符). 它们是普遍的, 对于需要传送不能有任何数据丢失的数据. 这些传送不被 USB 协议保证来一直使它在特定时间范围内完成. 如果总线上没有足够的空间来发送整个 BULK 报文, 它被分为多次传送到或者从设备. 这些端点普遍在打印机, 存储器, 和网络设备上.
- ISOCHRONOUS
同步端点也传送大量数据, 但是这个数据常常不被保证它完成. 这些端点用在可以处理数据丢失的设备中, 并且更多依赖于保持持续的数据流. 实时数据收集, 例如音频和视频设备, 一直都使用这些端点.
BULK端点描述符数据内容如下:
ENDPOINT DESCRIPTOR
bLength: 7
bDescriptorType: 0x05 (ENDPOINT)
bEndpointAddress: 0x86 IN Endpoint:6
1... .... = Direction: IN Endpoint
.... 0110 = Endpoint Number: 0x6
bmAttributes: 0x02
.... ..10 = Transfertype: Bulk-Transfer (0x2)
wMaxPacketSize: 512
.... ..10 0000 0000 = Maximum Packet Size: 512
bInterval: 0
2.2 class
class用来描述设备属于哪种设备,例如音频、键盘、U盘等。设备通过class来确认和加载相应的驱动。class分为device class 和interface class。具体的class值以及含义,参考define class。
- class 包含
- class
- subclass
- protocol
组合在一起,用来指出设备具体功能。
device class举例
DEVICE DESCRIPTOR
bLength: 18
bDescriptorType: 0x01 (DEVICE)
bcdUSB: 0x0200
bDeviceClass: Miscellaneous (0xef)
bDeviceSubClass: 2
bDeviceProtocol: 1 (Interface Association Descriptor)
bMaxPacketSize0: 64
idVendor: Marvell Semiconductor, Inc. (0x1286)
idProduct: Unknown (0x4e31)
bcdDevice: 0x0100
iManufacturer: 1
iProduct: 2
iSerialNumber: 3
bNumConfigurations: 1
interface class举例
INTERFACE DESCRIPTOR (1.0): class CDC-Data
bLength: 9
bDescriptorType: 0x04 (INTERFACE)
bInterfaceNumber: 1
bAlternateSetting: 0
bNumEndpoints: 2
bInterfaceClass: CDC-Data (0x0a)
bInterfaceSubClass: 0x00
bInterfaceProtocol: No class specific protocol required (0x00)
iInterface: 5