USB协议分析(二)

1. 原文链接:https://blog.csdn.net/hao507/article/details/4934964

2.原文链接:https://blog.csdn.net/weiaipan1314/article/details/113530649

3.原文链接:https://blog.csdn.net/qq_40088639/article/details/109463239

4. 转载于:https://www.cnblogs.com/newjiang/p/9511331.html

https://blog.csdn.net/weixin_30933531/article/details/97532497

5.  https://www.cnblogs.com/uiojhi/p/9466597 .html

6.USB协议详解第14讲(USB传输-同步传输及事务组成)_一个早起的程序员-CSDN博客_usb同步传输

7.(1条消息) USB 协议分析(含基本协议和 USB 请求和设备枚举)_StephenZhou-CSDN博客_usb协议分析

 

8.《圈圈教你玩USB》

   8.1.第一章 :https://blog.csdn.net/sz189981/article/details/62072621

   8.2.第二章:https://blog.csdn.net/sz189981/article/details/62238094

   8.3.第三章:https://blog.csdn.net/sz189981/article/details/65029809

 

 1.USB传输实现过程(枚举过程)

           当USB设备连接到或从USB中移除时,主机使用总线枚举过程来识别和管理接入的设备。当USB设备连接到一个已经被上电的端口,采取以下顺序行动:

1.设备上电

                     用户把USB设备插入USB端口(主机下的根hub或主机下行端口上的hub端口)或系统启动时设备上电。此时,USB设备处于加电状态,它所连接的端口是无效的。

2.Hub检测电压变化,报告主机

                    hub会实时监测端口的电平变化,一旦HUB检测到端口有电压变化,hub将利用自己的中断端点将信息反馈给主控制器,告诉主机有设备连接。

3.主机了解连接设备

                   如果有连接/断开事件发生,那么主机会发送一个 Get_Port_Status请求给hub以了解此次状态改变的确切含义。Get_Port_Status等请求属于所有hub都要求支持的hub类标准请求,hub相关的标准我们暂时不研究,大家知道这一点就好。

4.主机检测所插入的设备是全速还是低速

                   hub通过检测USB总线空闲时的差分线的高低电压来判断所连接设备的速度类型,当host发来Get_Port_Status请求时,hub就可以将此设备的速度类型信息回复给host。USB 2.0规范要求速度检测要先于复位(Reset)操作。

                  根据是D+还是D-被拉高来判断到底是什么设备(全速/低速)插入端口。

5.主机通过hub复位设备

                  主机一旦得知新设备已连上以后,它至少等待100ms以使得插入操作的完成以及设备电源稳定工作。然后主机控制器就向hub发出一个 Set_Port_Feature请求让hub复位刚才设备插上的端口。

          hub通过驱动数据线到复位状态(D+和D-全为低电平 ),并持续至少10ms。当然,hub不会把这样的复位信号发送给其他已有设备连接的端口,所以其他连在该hub上的设备自然看不到复位信号,不会受影响。

          hub集线器具体电路实现原理大家可以进行搜索查看。

 6. 主机进一步检测全速设备是否是支持高速模式

                   因为根据USB 2.0协议,高速(High Speed)设备在初始时是默认全速(Full Speed )状态运行,所以对于一个支持USB 2.0的高速hub,当它发现它的端口连接的是一个全速设备时,会进行高速检测,

          看看目前这个设备是否还支持高速传输,如果是,那就切到高速信号模式,否则就一直在全速状态下工作。同样的,从设备的角度来看,如果是一个高速设备,在刚连接到hub时或上电只能用全速模式运行。

          随后hub会进行高速检测,之后这个设备才会切换到高速模式下工作。假如所连接的hub不支持USB 2.0,即不是高速hub,不能进行高速检测,设备将一直以全速工作。

7.通过Hub建立主机和设备之间的信息通道

                   主机不停地向hub发送Get_Port_Status请求,以查询设备是否复位成功。Hub返回的报告信息中有专门的一位用来标志设备的复位状态。当hub撤销了复位信号,设备就处于默认/空闲状态(Default state),

          准备接收主机发来的请求。设备和主机之间的通信通过控制传输管道,默认管道为地址0、端点0。此时,设备能从总线上得到的最大电流是100mA。此后主机就可以通过默认控制管道和设备进行控制传输。

8.主机获取默认控制管道的最大数据包长度

                   默认管道其实连接到设备一端其实就是端点0。主机此时发送的请求是默认地址0,端点0,虽然所有未分配地址的设备都是通过地址0来获取主机发来的请求,但由于枚举过程不是多个设备并行处理,

          而是一次枚举一个设备的方式进行,所以不会发生多个设备同时响应主机发来的请求。

          主机会发送Get_Descriptor获取设备描述符,设备描述符的第8字节代表设备端点0的最大包大小,只有知道端点0 的最大包长度,才知道一次控制传输要从设备请求多少字节数据。

9.主机请求hub再次复位设备

                   当Get_Descriptor获取设备描述符请求成功,系统会要求hub对设备进行再一次的复位操作(USB规范里面可没这要求),再次复位的目的是使设备进入一个确定的状态。

10.主机给设备分配一个新地址

                    主机控制器通过Set_Address请求向设备分配一个唯一的地址。在完成这次传输之后,设备进入地址状态,之后就启用新地址与主机通信。这个地址对于设备来说是终生制的,

           设备在,地址在;设备消失(被拔出,复位,系统重启),地址被收回。同一个设备当再次被枚举后得到的地址不一定是上次那个了。

11.主机获取并解析设备描述符信息

                     主机发送Get_Descriptor请求读取设备描述符,这次主机发送Get_Descriptor请求使用新地址,它会解析设备描述符的每一项内容。设备描述符内信息包括端点0的最大包长度、设备所支持的配置个数、设备类型、VID、 PID、字符串索引等信息。

12.主机获取字符串描述符

                     根据如果有字符串描述符,主机会获取语言ID描述符和字符串描述符。

13.主机获取标准配置描述符

                    主机发送Get_Descriptor_Configuration请求并解析标准配置描述符,标准配置描述符内信息包括配置描述符集合长度、接口数、设备属性、设备所需电流。如下图所示。

14.主机获取配置描述符集合

                   配置描述符集合包括标准配置描述符、接口描述符、端点描述符,如果是HID设备还会包括HID描述符,主机会根据上面得到的标准配置描述符的wTotalLength,发送了一个Get_Descriptor_Configuration请求获取到配置描述集合并解析所有描述符,

         从而知道设备到底是什么样的设备。

15.主机为设备挂载驱动并选择一个配置

                  主机通过解析描述符后对设备有了足够的了解,会选择一个最合适的驱动给设备,现在就将控制权交到设备驱动了。对于复合设备,通常应该是不同的接口配置给不同的驱动。

          主机发送Set_Configuration请求来正式确定选择设备的哪个配置作为工作配置(对于大多数设备来说,一般只有一个配置被定义)。至此,设备处于配置状态(Configured)。

 

2.速度识别

            集线器通过测定哪根信号线(D+或D-)在空闲时有更高的电压来检测设备是低速设备还是全速设备。全速和高速设备D+有上拉电阻,低速设备D-有上拉电阻。

                                                     

3.包组成,包标识符(PID)

USB 数据是由二进制数字串构成的,首先数字串组成域(有七种),域再组成包 ,包再组成事务(IN、OUT、SETUP),事务最后组成传输(中断传输、并行传输、批量传输和控制传输) 。

       3.1包(Package)

            包是USB传输的基本单元,USB协议规定了三种类型的包:令牌(Token)包、数据(DATAx)包、握手(Ack)包。其中,令牌包只能是从主机发出。数据包和握手包可由主机发出,也可是设备发出。

            包由各个不同的域组成,所有的包都以同步域SYNC开始,以包结束信号EOP作为结束。

      EOP

不同类型的包,组成位域是不相同的,主要有这几个域:

          (1) 包标识符(PID)

                       包标识符主要表明当前的包是属于哪种类型的包。包标识符总共有8个位,其中USB协议使用的只有4个位[3:0],另外的4个位[7:4]是对应的前面的4个位的取反。

                                                 

 

 

说明:

①USB是串行总线(使用串行方式进行传输),数据是一位接着一位在总线上进行传输的,并且使用的是LSB在前的传输方式,也就是最低位先传输,接着是次低位,最后是最高位。

           以传输SETUP包的PID为例,总线上的数据应该是:1011 0010,所以使用协议分析仪抓到的数据就是0xB4。       

            (2) 包目标地址(ADDR)

                        是主机分配给设备的一个非0地址。USB主机发送的包会在总线上进行广播,所有接在总线上的设备根据自己的设备地址对令牌包以及跟在令牌包后面的数据包进行过滤。

                        包目标地址只有7个位(共2的7次方=128个地址),即地址范围是:0~127。0地址是主机分配地址给设备之前,设备的默认地址,除去0地址不算,设备的通信地址就是1~127。

                        也就是说,一个USB主机最多只能管理127个USB设备(理论上,一个Host,最多能接入127个Device,再多接入一个,地址就重合了)。

          (3) 包目标端点(ENDP)

                         USB设备和USB主机之间是通过端点来发送数据的。因此在总线上传输的每一个数据包都要指定,发送数据包的目标端点(数据包要发到哪一个设备的哪一个端点上)。

        (4) 数据域

                        数据长度的范围:0~1024字节,不同的传输类型在不同模式下的数据域长度都不相同。

                       该值与传输类型以及端点支持的最大包长、数据对象都有关系(比如主机请求获取不同的设备描述符,指定的长度是不同的)。

        (5) 循环冗余校验码(CRC)

                       USB协议规定,只有令牌包和数据包有循环冗余校验码,令牌包使用5位的CRC5,数据包使用的是16位的CRC16校验。

        3.2令牌(Token Packet)包

                      令牌包是第一个数据包,表示一次传输即将开始。共有4种令牌包:SETUP令牌包、IN令牌包、OUT令牌包、SOF令牌包。

                     其中SETUP、IN、OUT令牌包的结构是一样的,共有6个域

说明:

①设备枚举阶段使用的是控制传输,控制传输的建立事务(建立过程)使用的是SETUP令牌包(只有控制传输才会有SETUP令牌包),设备的端点0是专门用于控制传输的,所以包目标端点ENDP为0,包目标地址ADDR可以是0或者非0值[1~127]。

②设备使用地址0时,CRC5的值是0x08;设置地址阶段过后,CRC5的值根据具体的地址值来进行计算,CRC5的计算由USB控制器自动完成。

③ SETUP令牌包中包含了紧跟在其后面的数据包的目标地址和包目标端点信息。

④ 4个令牌包中,只有SOF令牌包之后不跟随数据传输。

⑤对于低速/全速设备,SYNC为:0000 0001;而对于高速设备,SYNC中有31个0,最后一个位是1。

        3.3数据(DATAx)包           

                      USB1.1协议中,只有两种数据包:DATA0 和 DATA1。USB2.0新增了两个数据包:DATA2和MDATA分别用于高速分裂事务(split)事务和高速带宽同步传输中,DATA0和DATA1是需要关注的重点。

                      DATA0数据包结构(DATA0数据包的PID是0xc3)

说明:

对于控制传输

①建立事务的数据过程使用的是DATA0数据包(SETUP事务的数据过程只能使用DATA0),DATA0数据包是8字节的请求数据。

② IN事务或者OUT事务的数据过程使用的是DATA1数据包,是实际要交互的数据。

③端点0传输的数据包就在DATA0和DATA1之间进行切换,这是实现设备栈时,为什么配置USB控制芯片端点的toggle功能的原因。

④数据包是跟随在令牌包后面的,数据包传输的目标地址和端点信息已经在令牌中指明

           3.4握手(ACK)包             

握手包只有三个域,结构如下:

SYNC

ACK

EOP

00000001

0x4B

说明:

①握手包跟随在令牌包或者数据包之后,组成一次完整的事务。

②握手包可以由设备发出也可以由主机发出。

③握手包的方向和数据包的方向是相反的。

 

4.传输、事务、包关系

             4.1. 事务(Transaction)

                               一个事务通常由两个或者三个包来组成:令牌包+数据包+握手包

                               1)令牌包:启动一个事务,总是由主机发出。

                               2)数据包:用于传输数据,可以从主机发到设备,也可以从设备发到主机,数据包的方向由令牌包来指定。

                               3)握手包:握手包的发送者就是数据包的接收者。所以说,握手包的方向和数据包的方向是相反的。当数据被正确接收后,接收者就发出握手包。

                        4.1.1 事务的分类

                                    事务总是以令牌包开始,所以令牌包的类型决定事务的类型,因此事务可分为:SETUP事务、IN事务、OUT事务。

            4.2. 传输(Transfer)

                             USB总共有四种传输类型:批量传输、中断传输、等时传输、控制传输。不同的传输类型都有各自的数据流模型。

                             在设备枚举阶段,设备的主机之间的数据交互使用的是控制传输,首先了解控制传输,对于其他类型的传输及其数据流模型,后面介绍不同的类设备开发的时候,再逐一研究。

                                              

4.1同步传输

             同步传输是一种实时的、不可靠的传输,不支持错误重发机制。只有高速和全速端点支持同步传输,高速同步端点的最大包长度为1024,低速的为1023。

      由OUT事务和IN事务构成。有两个特殊地方,第一,在同步传输的IN和OUT事务中是没有返回包阶段的;第二,在数据包阶段所有的数据包都为DATA0。
      除高速高带宽同步端点外,一个微帧内仅允许一次同步事务传输,高速高带宽端点最多可以在一个微帧内进行三次同步事务传输,传输高达 3072 字节的数据。

            全速同步传输不得占用超过 80%的帧时间,高速同步传输不得占用超过90%的微帧时间。同步端点的访问也和中断端点一样,有固定的时间间隔限制。

      同步传输是不可靠的传输,所以它没有握手包,也不支持PID翻转。主机在排定事务传输时,同步传输有最高的优先级

4.2控制传输

             控制传输是四种传输类型中最复杂的一种,控制传输过程分为三个阶段:

                                           第一个阶段是建立阶段;

                                           第二个阶段是可选的数据阶段;

                                           第三个过程是状态阶段。

             这三个阶段也称为建立过程、数据过程、状态过程。

             建立过程就是一个建立事务,事务里面的第一个包是SETUP令牌包,其次是DATA0数据包(8字节的请求数据),最后是握手包(只能是ACK握手包)。

             数据阶段是可选的,也就是说控制传输可以没有数据过程(SETUP包的数据域会指定为0),

             数据过程又分为:控制读传输,数据事务是输入的;控制写传输,数据事务是输出的(读/写是相对主机来说的)。而且数据过程的第一个数据包必须是DATA1数据包。

说明:

①控制传输一般用来实现一条USB协议定义的请求

② SETUP事务用来将一条请求命令发送到设备

③ IN事务用于USB设备向主机返回主机所请求的数据

④ OUT事务使用握手机制对之前的数据事务的正常结束进行确认

4.3大量传输

             批量传输由OUT事务和IN事务构成,是一种可靠的单向传输,但延迟没有保证,它尽量利用可以利用的带宽来完成传输,适合数据量比较大的传输。

      低速USB设备不支持批量传输,高速批量端点的最大包长度为512,全速批量端点的最大包长度可以为8、16、32、64。
             批量传输在访问USB总线时,相对其他传输类型具有最低的优先级,USB HOST总是优先安排其他类型的传输,当总线带宽有富余时才安排批量传输。

      高速的批量端点必须支持PING操作,向主机报告端点的状态。NYET表示否定应答,没有准备好接收下一个数据包,ACK 表示肯定应答,已经准备好接收下一个数据包。

4.4中断传输

                 中断传输是一种轮询的传输方式,是一种单向的传输。HOST通过固定的间隔对中断端点进行查询,若有数据传输或可以接收数据则返回数据或发送数据。否则返回NAK,表示尚未准备好。

         中断传输的延迟有保证,但并非实时传输,它是一种延迟有限的可靠传输,支持错误重传。对于高速/全速/低速端点,最大包长度分别可以达到1024/64/8 Bytes。

                 高速中断传输不得占用超过 80%的微帧时间,全速和低速不得超过90%。

        中断端点的轮询间隔由在端点描述符中定义,全速端点的轮询间隔可以是1~255mS。低速端点为10~255mS,高速端点为(2interval-1)*125uS,其中 interval 取 1到 16 之间的值。

5.高速识别,USB Chirp信号

                                                     

                                        

6.实例:host请求 设备描述符

 

posted @ 2021-08-09 10:16  湖畔清风  阅读(1001)  评论(0编辑  收藏  举报