usb2.0介绍-1、概述

 日常生活中我们经常接触usb设备,比如键盘、鼠标、u盘等等,都是通过usb接口连接主机。
Usb规范的版本现在有3.0 2.0 1.0 等,不同版本的区别主要在于传输速率不同,usb2.0支持高速、全速、低速模式,接下来的介绍都是基于usb2.0规范。

  • 主机和设备

按照职能,usb分为两种角色,主机和设备。
usb协议的特性是,建立连接之后,主机和设备之间的通信,都是由主机主动发起的,设备只能接收和响应主机的请求。
而按照速度划分,usb主机又分为:高速主机和全速主机。usb设备分为:高速、全速和低速的设备。

  • 接口信号和总线状态

Usb2.0接口只用到了4根信号,从上到下是电源线,DP/DM,地线。
电源线适用于主机给usb设备供电。
而DP/DM是一组差分信号线,它们的大小相等但是极性相反,目的是防止数据传输时受到干扰,这两根线主要用于数据传输。

不同速度模式的设备不仅在传输速率上有不同,对总线上状态的定义也有一些不同。

比如在低速模式下,差分信号1表示总线状态k,但是在全速和高速模式下,这种状态被定义为总线状态J。 协议定义了这一些总线状态,有助于我们去理解一些更加抽象的设备行为。
接下来,就以高速主机和高速设备的连接为例,介绍和梳理一下协议的主要内容。

  • 建立连接

现在假设一个usb设备插入了主机,这时,设备与主机之间会先确认设备的连接:
设备插入后,主机会通过Vbus给设备供电。
设备检测到Vbus上的变化后,会拉高DP信号让总线产生状态J。
主机从而检测到DP/DM的变化,确定有设备接入,随即向设备发出reset信号,现象是使总线处于SE0的状态,至少保持10ms。
设备检测到总线SE0状态后开始复位。

  • 高速握手

 建立连接的过程中,如果设备属于高速设备,设备会进一步尝试进行高速握手。
高速设备在检测到主机发出的reset(总线SE0状态)后,会在不少于2.5μs且不超过3ms时间内发起握手。
设备发起握手的标志是驱动总线到Chirp k状态,保持至少1ms,并在reset7ms内结束。
主机检测到chirp k状态保持超过2.5us后,认为chirp k状态有效,随后主机主动开始发出交替的chirp k/j信号。
设备如果检测到3对chirpk/j后,认为握手成功,进入hs状态。
而主机会在复位结束之前,继续发送chirp k/j对,来保持总线活跃,不进入suspend状态。
(chirp j/k是一种电压差的状态,他们比普通的j/k状态有更高的电压差。)

  •  枚举过程

  如图是一个设备的状态转移图,可以看到设备在连接、复位结束之后,会处于一个default状态。这时虽然设备与主机已经建立了链接,但还需要经过枚举来了解设备的信息,进而给设备合适的配置。
介绍枚举过程前,需要先了解usb传输数据的方式。

    • 数据传输——包

usb接口虽然只有DPDM用于数据传输,但是在usb内部的控制器间,会使用UTMI接口并行地传输数据。

usb之间的数据传输,最小的单位是包,不同的包组成事务,不同的事务组成不同的传输。
每种包都包含PID字段,表示具体的功能。
包按照功能类型,可以分为三种:令牌包、数据包、握手包。


令牌包的组成如图所示,它由主机发送,包含特殊的指令信息。IN包是通知设备返回一些数据,out包是通知设备接收一些数据,SOF是帧起始包,在每帧开始的时候广播发送,SETUP建立包只在控制传输中,它发出后,主机随后会发出一个data0数据包,指示更加详细的请求。


常用的令牌包根据结构如下,SOF包括PID和帧编号,其他如IN包、out包SETUP包则包括了pid、目的地址、目的EP号。

 

 

数据包的组成如中间图所示,既可以由主机用来发送设置信息,也可以由设备发送描述符等信息给主机,结构上都是由PID和若干个字节数据组成。

 

最后是握手包,如右图所示,主机设备都能发送,用于反馈数据包的接收状态。结构上只由pid组成。

    • 数据传输 —— 事务

 事务可以分成三类 :
Setup transaction:主机用来向设备发送控制命令
Data IN transaction:主机用来从设备读取数据
Data OUT transaction:主机用来向设备发送数据
每次事务一般由:令牌包、数据包、可选的握手包组成。

In事务是主机用来向设备请求数据的事务
正常的In事务有三个阶段:PID=In Token – Data – handshake

第一个阶段由主机发送一个In包,第二个阶段设备返回一组数据,第三个阶段就是主机确认收到返回ack。
不正常的In事务有两个阶段:

 首先主机发送一个In包通知设备发送数据,但由于设备没有数据返回或者处于停滞状态,设备就会直接返回NAK或者STALL握手包。

 

out事务是主机向设备发送数据的事务
out事务也有三个阶段:Out Token – Data – handshake

 

第一个阶段主机发送一个Out令牌包,第二个阶段主机会向设备发送一组数据包,第三个阶段中,如果设备正确接收数据则返回ack。如果设备停止或者无法接收数据,则返回NAK或STALL。

 

Setup事务等同于控制传输,它一般发生在设备连接之初,用于获取设备描述符、配置描述符等特殊请求操作。是带有控制命令的传输。
setup事务会由setup阶段、可选的data阶段(可选)、status阶段组成
在setup阶段中,主机先发送一个setup令牌包,紧接着发送一个8字节长度的data0包,这个data0包中会包括一个特殊请求信息(req)。设备必须接受并返回一个握手包。

这个8字节的data0包结构如下图,第一个字节是reqtype,包含数据方向、接收结构等信息。第2个字节是request,不同的值对应不同的请求,请求包括获取、设置描述符、获取、设置端口状态等等。具体请求对应的值,可以在协议中找到。第3-6个字节会根据请求的不同,做不同的解释。第7-8个字节,表示下一个阶段即data阶段将传输数据的长度,长度为0,即表示不需要数据阶段。

 然后如果这次的控制传输是不需要数据交换的,那在setup阶段结束后,会直接进入status阶段,由一个数据长度为0的In事务作为传输的结束。

而如果这次的传输需要数据阶段,则数据阶段会是一个或多个的IN事务(或者Out事务)。
再在status阶段,如果有数据阶段且数据阶段都是In事务,则status事务由一个数据长度为0的Out事务作为结束。
如果有数据阶段且数据阶段都是out事务,则status事务会由一个数据长度为0的In事务作为结束.

 

 

    •  数据传输 —— 传输

不同的事务组成不同的传输:控制传输(SETUP事务)、中断传输、同步传输、批量传输。
控制传输:即之前介绍的SETUP事务,用于完成特定的请求,特别是枚举过程,全部都由控制传输完成
批量传输:用于传输数据量大、要求传输不出错,但对实时性没有要求的数据,适用于打印机、存储设备等。
中断传输:一般用于传输数据量小、具有周期性且要求响应速度较快的数据,和批量传输的区别仅在于事务传输发生的端点不一样、支持的最大包长度不一样、优先级不一样等,组成上是一样的。
同步传输:没有握手机制的传输,在传输数据时不考虑数据出错的情况,没有错误重传机制,适用于周期性、低延时性但不需要保证传输质量的数据,比如麦克风、喇叭等音频视频数据。

    • 枚举过程

知道了数据的传输方法,枚举就可以简单理解为一些特定请求的控制传输的集合。
主机对设备进行枚举,主要目的是获取设备描述符,掌握设备信息,然后对设备进行一些基本的配置。所以枚举的一般过程就是:
1.获取设备描述符
2.设置地址
3.获取完整的设备描述符
4.获取配置描述符
5.获取字符描述符,如果有的话
6.设置配置描述符(描述符的值是根据配置描述符得到的)
主机完成对设备的枚举之后,就可以根据需要,进行各类数据传输了。

  • 挂起与唤醒

为了降低usb设备的功耗,协议规定了挂起和唤醒两种事件。
和设备连接时类似,挂起和唤醒事件也需要判断总线状态情况。
当总线上保持空闲状态超过3ms时,设备就会将其视为一个挂起信号。
挂起的情况又分为两种:全局总线挂起和部分总线挂起
全局总线挂起是指,主机停止总线上的所有传输,每个设备在收到挂起信号后,各自进入挂起状态
部分总线挂起,则是主机向对应hub发送SetPortFeature(PORT_SUSPEND)请求(通过控制传输),使端口停止转发数据,下行端口总线即进入空闲状态,下面的设备就会进入挂起状态了

设备处于挂起状态时,任何总线上的活动(非空闲状态)都可以把设备唤醒/恢复,从而退出挂起状态。对于全局挂起事件,主机可以主动发出恢复信号将设备唤醒;对于部分挂起事件,主机可以向对应端口发送ClearPortFeature(PORT_SUSPEND)将其唤醒。当然,具备远程唤醒功能的主机和设备还可以通过设备驱动总线产生恢复信号的方法,主动进行唤醒。

  • 总结

usb规范中对于DMDP信号及它们的变化定义了很多总线状态。
在处理与电源管理、速度配置相关的事件时,需要清楚地掌握这些状态及它们在特定时间内的变化,有很多细节上的内容需要注意。(这也是自己还没有了解全面的地方)
另一方面USB规范也定义的各种事务及传输,在处理数据交换、枚举、端点停止等事件的时候,需要掌握这些事务和传输的特点。

 

posted @ 2021-06-29 15:25  西瓜郎太文  阅读(2536)  评论(0编辑  收藏  举报