1. USB总线结构
usb的总线拓扑结构如下所示:
从USB总线结构可以看出,主要由3部分组成:USB主机(Host)、USB线缆、USB设备(hub/Func等)。
-
USB主机:一般成为USB Host,包含USB主控制器,并且能够完成USB主机和设备之间的数据管理和传输。在整个USB的通信过程中,USB主机处于主导地位,由USB主机发起数据和命令的传输,USB设备被动响应USB主机发起来的请求命令。在USB规范中,仅允许一个USB主机存在于一个USB子系统中,并且USB主机最多只能分配127个地址(1~127).
-
USB线缆:连接USB主机和USB设备的线缆,譬如常见的micro usb线
-
USB设备:USB设备根据自身功能分为USB集线器(USB Hub)和USB功能设备(U盘等)。
尽管USB设备在物理上以各种复杂形式连接到USB主机,但从软件角度看,USB主机在跟连在USB主机上的设备通信时,每个设备就像直接连接到USB主机上的RootHub一样,如下图所示:
2. USB device抽象
USB device一般很复杂,有些设备支持多功能,譬如手机设备,对应一个usb devices来说,这个算是一个功能复杂的设备了,通过同一个usb接口,既可以提共adb调试功能,也可以提供mass storage等,但只能分时复用,不能同一时刻同时使用这两种功能,有些设备确功能很单一,譬如常见的U盘、usb键盘、usb鼠标等,只能使用其特地的功能,因此软件角度对这些进行了抽象,如下所示:
在usb设备的逻辑组织中,包含设备,配置,接口,端点4个层次。
-
设备:就是指USB设备,一个设备包含一个或多个配置,但每次只能使用一个配置
-
配置:每个USB设备提供不同的配置,使用不同的配置,设备表现出不同的功能
-
接口:代表一个基本功能,驱动对应的抽象对象,一个配置中的所有接口都可以同时有效
-
端点:USB数据传输的通道,每个USB设备接口,在USB主机看来,就是一个端点的集合,主机只能通过端点与usb设备通信,每个端点在usb系统中都有唯一地址,一般以端点号编码,且一个端点地址对应一个方向,所以,端点2-IN 与端点2-OUT 完全不同。 每个器件有一个默认的双向控制端点0,因此不存在端点0-IN 和端点0-OUT,且USB设备必须实现端点0
注:端点中的输入(IN)/输出(OUT)都是以主机为参考对象的,向主机发送数据叫做IN,从主机发出数据叫OUT。
3 USB传输概念
先看一张图,了解一下USB传输过程,如下所示:
这张图是使用USB协议分析工具抓包,然后解析得到,从图中,可以看出,usb传输由几部分组成,如下图所示:
下面将对USB传输、USB事务、USB包等概念进行介绍
3.1 USB传输
USB传输:USB协议规定了USB传输是用于完成一组特定目的的事务,一般由一个或者多个事务组成,在USB协议中,规定了4种传输类型,包括控制传输(control transfers)、中断传输(interrupt transfers)、批量传输(bluk transfers)、同步传输(isochronous transfers)。
控制传输是一种特殊的传输方式。当USB设备初次连接主机时,用控制传输传送控制命令等对设备进行配置。同时设备接入主机时,需要通过控制传输去获取USB设备的描述符以及对设备进行识别,在设备的枚举过程中都是使用控制传输进行数据交换。
控制传输相对于其它三个传输方式比较复杂,且具有以下特点:
- 无论低速设备还是高速设备都可以使用控制通道。
- 高速模式的最大包长固定为64个字节;
- 全速模式可在8、16、32、64字节中选择;
- 低速模式的最大包长固定为8个字节。
- 超高速USB3.0控制端点有固定的最大控制传输的数据有效载荷为 512 字节,最大突发大小为 1.
- 控制传输的应用场合:主要应用于设备的枚举过程(如读取设备描述符,设置地址,设置配置等)和对数据准确性要求较高的场合
控制传输的过程,总结如下图所示:
一次控制传输过程抓包如下图所示:
从图可以看出,本次控制传输是用来分配和设置设备地址的,由2个事务构成,一个Setup事务,一个IN事务,Setup事务用于设置设备地址,IN事务用于host向devices请求一个0字节的数据包,用于对上一个事务的数据确认。
中断传输一般用于小批量的和非连续的数据传输,通俗的来说就是用于数据量小的数据不连续的但实时性高的场合的一种传输方式,一般由IN/OUT事务组成,主要应用于人机交互设备(HID)中的USB鼠标和USB键盘等。
USB中断传输和我们传统意义上的中断不一样。它不是由设备主动地发起一个中断请求,主机响应再操作,而是由主机保证在不大于某个时间间隔内按排的一次传输,所以USB的中断实际意义是实时查询操作,即USB的中断传输是主机在一定的时间不断地主动轮询设备检查其是否有数据需要传输,对此有3个重要参数需要在端点描述符中进行配置
- 传输类型
- 每次传输的最大数据包大小
- 轮循时间间隔,中断端点需指定一个范围在1-255毫秒内的询查周期。主机保留足够的带宽以确保在指定频率上直接向中断端点发出IN或OUT事务
中断传输特点:
- 高速设备和低速设备均可使用中断传输,全速模式最大包长上限为64Byte,低速模式最大包长上限为8Byte,高速模式的最大包长上限为1024Byte
- 高速模式下,中断传输端点要指定其可以在超高速总线上接受或传输的最大数据包负载大小。对于支持突发大小大于 1 的中断端点,唯一允许的最大的数据包负载大小为 1024Byte;对于突发大小等于1的中断端点,最大的数据包负载大小可以在1Byte到1024Byte之间任意大小。中断端点的最大突发大小是3
中断传输过程总结如下图所示:
一次中断传输过程抓包如下图所示:
从图中可以看出,该次中断传输只有IN事务构成,对于中断传输,如果传输的数据长度大于端点支持的最大包长度,这时一个中断传输内会有多个事务。在传输数据时,如果最后一个事务的数据长度小于端点支持的最大包长度,则认为数据传输完成。
批量传输一般用于批量的和非实时的数据传输,通俗的来说就是用于数据量大但对时间要求又不高的场合的一种传输方式,类似用于USB打印机和USB扫描仪等等。
批量传输特点:
- 只能用于全速和高速设备,低速模式不支持批量传输
- 全速模式最大包长可在8、16、32、64Byte中选择
- 高速模式最大包长可在8、16、32、64、512Byte中选择
- 超高速设备数据包最大长度为1024字节,批量传输端点应在其端点描述符中设置最大的数据包负载大小为 1024Byte。它还指定端点可以接受或者发送到超高速总线的突发大小。对于批量端点允许的突发大小应在 1 至 16 范围
批量传输过程总结如下图所示:
一次批量传输过程抓包如下图所示:
从图中可以看出,该次批量传输由多个IN事务构成,每个IN事务的DATA包通过DATA1/DATA0交替出现来保证数据包的发送和接收的同步。
等时传输也有"同步传输"的叫法,一般用于要求数据连续、实时且数据量大的场合,其对传输延时十分敏感,类似用于USB摄像设备,USB语音设备等等,同步传输只能用于全速或者高速USB设备。
同步事务没有握手包,当一个同步传输中有多个事务时,最后一个事务之前的事务的数据长度必须是端点所支持的最大包长度。如果最后个事务的数据长度小于端点支持的最大包长度,则认为数据传输完成。对于全速模式的同步传输,USB设备或主机应可能接收DATA0和DATA1包,但只能发送DATA0包。
同步传输特点:
- 高速模式的最大包长上限为1024个字节;
- 全速模式的最大包长上限为1023个字节;
- 低速模式不支持同步传输。
- 超高速等时传输的端点指定所需的最大数据包有效负载大小为1024字节(对于支持大于1的突发大小,可以是0到1024之间的任何大小,以实现同步突发大小等于1的终结点。等时传输突发大小应在 1 至 16 范围。但是,在相同的时间间隔内一个等时端点最多可以请求3个突发事务。参见超高速端点伴随描述符的bmAttributes和bMaxBurst字段。
同步传输过程总结如下图所示:
一次同步传输过程抓包如下图所示:
从图中可以看出,该次批量传输由多个IN事务构成,可以看出,同步传输和批量传输很类似,但是同步传输是没有握手阶段,因此同步传输不能保证每次传输数据的正确性。
3.2 USB事务
USB事务:USB事务是保证usb实现可靠传输的最小单位。单独的包没有错误检测机制,但事务利用各个包实现了一个带有错误反馈机制的通信,保证usb传输的可靠性。
在usb协议种,按照令牌包的类型,对usb事务进行以下分类:
- Setup事务
- IN事务
- OUT事务
- Ping事务
- SOF事务
- SPLIT事务
- PRE事务
一般USB事务都由3个包组成,如抓包所示:
从图中可以看出,USB事务由令牌包(IN包)、数据包(DATA包)(可选)、握手包(ACK)(可选)组成。
USB常见的事务如下所示:
-
Setup事务
从图中可以看出,Setup事务是由令牌包(Setup包)、数据包、握手包(ACK)组成的。Setup事务,必须收到ACK,才能表示这个事务传输成功,否则就是失败。
-
IN事务
从图中可以看出,IN事务是由令牌包(IN包)、数据包、握手包(ACK)组成的。
-
OUT事务
从图中可以看出,OUT事务是由令牌包(OUT包)、数据包、握手包(ACK)组成的。
3.3 USB包
USB 包:包(package)是USB事务处理过程中主机和设备之间数据传输的基本单位,主要有以下类型:
根据包的标识符(PID),又简单为各类包提供了一个PID包名:
- 令牌包,包含Setup包、IN包、OUT包等
- 数据包,包含DATA0包,DATA1包等
- 握手包,包含ACK包,NAK包,STALL包等
- SOF包
各类包格式如下所示:
- 令牌包
如抓到的Setup包,如下所示:
- 数据包
如抓到的data1包,如下所示:
- 握手包
如抓到的ack包,如下所示:
- SOF包
如抓到的sof包,如下所示:
3.4 USB包的域
USB包,都是由各个域组成的,不同类型的包,所包含的域不一样,但所有包都是以同步域(sync)开始,以包结束符EOP结束。USB包的域有包标志符(PID)域、包目的地址(ADDR)域、包目标端点(ENDP)域、数据域、帧号域、循环冗余校验码(CRC)域,下面对重要的的域字段进行介绍:
包PID说明如下图所示:
每个设备都有一个由USB主机管理分配的地址,USB设备在被USB主机分配一个地址之前,都会使用默认的0地址进行通信,在收到USB主机分配的地址后,USB设备会一直使用这个地址和USB主机通信,直到USB设备拨出、掉电或者复位。
这个地址域长度只有7bit,因此USB最大只能管理到127个设备。如果传输的USB包的地址和端点号与USB设备地址不匹配,USB设备会忽略该包。
对USB主机而言,USB设备和USB主机是建立在一个个管道(PIPE)上,在PIPE两端,对应就是USB主机的端点和设备的端点,端点号在包中由4bit表示,因此USB设备最大可以支持16个双向端点,其中端点0为专用的控制端点。
0地址进行通信,在收到USB主机分配的地址后,USB设备会一直使用这个地址和USB主机通信,直到USB设备拨出、掉电或者复位。
这个地址域长度只有7bit,因此USB最大只能管理到127个设备。如果传输的USB包的地址和端点号与USB设备地址不匹配,USB设备会忽略该包。
对USB主机而言,USB设备和USB主机是建立在一个个管道(PIPE)上,在PIPE两端,对应就是USB主机的端点和设备的端点,端点号在包中由4bit表示,因此USB设备最大可以支持16个双向端点,其中端点0为专用的控制端点。
4. 参考链接
usb中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)