usb在江湖系列之一家族系统(3) 2010/12/18

来源:互联网 发布:可发说说的软件 编辑:程序博客网 时间:2024/05/17 22:33

 

 

 

3.4 令牌(token)
       3.4.1 协议层的介绍

令牌是在前面枚举时引出的,有点命令的意思,可以理解为命令的标识,就是告诉对方这次的行为。在USB协议中,我们经常会说令牌包。那么什么是包呢?packet,是指一次数据传输所组织的整体形式。数据传输的基本单元是包。每个包是有一定结构的,包括起始符,结束符,包的id(身份证,包的标识),要传递的数据,以及CRC校验信息。SOFEOF是包开始和结束的标志。

       下面是各种USB数据传输过程中涉及到的包标识符PID

可见除了令牌包,还有其他几种格式的包,每一种包分别负责不同场景下的传输。

a) 令牌包(定义了目标设备,终点号,传输方向)OUT IN SOFSETUP四种。

令牌包格式

                                                     SOF包格式

b)数据包 DATA0,DATA1

一般情况下有2种类型的数据包:DATA0DATA1。设计成2种数据包PID是为了支持数据切换同步(Data ToggleSynchronization)

数据包格式

3 握手应答包 ACK NAK STALL

握手包仅由PID构成。握手包用来报告数据事务的状态,表示数据成功接收,命令的接收或拒绝等信息。

ACK:用来表示成功接收,对于IN事务,ACK由主机返回,而对于OUT或者SETUP事务则由USB设备返回。

NAK:在IN事务过程中表示USB设备不会从主机接收数据,OUT事务中表示USB设备没有传输到主机的数据,NAK通常发生在USB设备并没有准备好和host做数据通讯的场景下。NAK只能有USB设备在INOUT事务中发出。

STALL:表示USB设备不支持该项请求或者不具备这个功能。

 

4 特殊包 PRE

                         还没有遇到过,略过。

 


 

3.4.2 现实中的packet

下面是使用工具抓到的USB设备枚举过程中的一个环节,这是获取设备描述符的一个完整过程。从下面这个过程可以直观的看到各种包的是如何配合的,一次行为的流程是什么样的。这个图中蕴含着大量的信息,最好滞留一下然后慢慢来欣赏她。

Packet包是传输的最小单位,几个packet组成一个transzaction,几个transzaction组成一个transfer

比如host想获取设备描述符,这是一件完完整整的事情,就是一个transfer。首先要发送setup(这是一个transzaction,其中又包含了几个packet),告诉设备要干什么,然后发送in包读取数据,最后发送握手信息。

同样是上面的获取设备描述符的过程,我们用transzaction来表示:

我们在用transfer来表示:

着重看一下packet那张图,理解一下通讯的整个过程。


这部分的详细内容在USB协议第八章有详细的讲解。

3.5 Setup

枚举过程中使用最频繁的就是令牌包,而令牌包中最重要的就是Setup包,因为Setup是建立一次传输的开始,需要包含大量的信息,如传输方向、具体要做什么、地址信息、端点信息等等,都在Setup过程中告知USB设备。

那么我们看一下Setup包的格式,我们通常说的Setup包是指Setup这次数据传输过程中的数据部分。

       下面是一次Setup传输:


       Setup包指的就是下面这次data传输的数据部分:

Setup包是一个固定的数据格式,包含8个字节。


bmRequest Type:表明此次请求的特性,第二阶段控制传输方向。如果wLength域被设作0的话,表明没有数据传送阶段,那Direction位就会被忽略。同时指定了接收者,当接收者是接口或端点(endpoint)时,wIndex域指出是哪个接口或端点。

bRequest:说明进行的是哪种请求,注意这个位会在bmRequest Typetype不为0时有新的含义,这里我们只讨论type0的标准请求。

                                                 标准的设备请求

       关于这些请求的具体意思和使用方法可以参考标准的USB协议。

wValue:当前请求的参数。

wIndex:用来表明是哪一个接口或端点。下面是wIndex的格式:

       Direction0代表端点为OUT端点,1IN端点。不过这个值目前基本没有到。端点为0时该值被忽略。

wLength:表示下个包的数据传输长度。传输方向由bmRequstType中的Direction位指出。wLength0则表明无数据传输。在IN传输请求下,设备返回的数据长度不应多于wLength,但可以少于。在OUT请求下,wLength指出主机发出的确切数据量。如果主机发送了多于wLength的数据,设备做出的响应是没有定义的。设备千差万别,我们无法预知。USB协议为什么不加以定义呢?标准化这个行为。

       关于USB的最基本的知识,我们先介绍到这里,这些东西在以后还会经常见面。结合上面那个获取设备描述符的抓图,进一步理解消化上面的知识点。

精彩人生的资本

       当我们遇到机会时,才会感到自己能力的匮乏,后悔自己平时没有足够的积累。USB协议经过上面的准备,有能力进行各种情况下的数据传输了。他为我们准备了四种数据传输方式,分别应用在不同的环境下,技术的本质是服务,如果服务不好,迟早要被淘汰。所以做技术要考虑客户的感受。USB的四种传输基本上是够用的:控制传输(control)、批量传输(bulk)、中断传输(interrupt)、同步传输(iso)

四种传输是usb立足江湖不可或缺的,不同的应用场合,设备可以使用不同的传输方式,也因此诞生了各式各样、丰富多彩的USB设备。

4.1 控制传输

控制就是命令,数据量短小精悍、目标明确。

控制传输只能在消息管道进行,因此传输的数据流必须依附于USB数据结构上。

1)数据格式

Setup包命令集

具有USB定义的格式

保证主机和设备之间正常通信

允许一些销售商对设备命令进行扩展

2)传输方向——双向(一般为端点0

3)最大的包长度为64字节

 

4.2 批量传输

数据量大,还要求准确。打印机、U盘。

1)数据格式——无要求

2)传输方向——单向

3)包长度限制

低速设备不支持批量传输

全速设备:64字节

高速设备:512字节

4)支持错误检测和恢复

 

4.3 中断传输

              鼠标、键盘,数据量不是很大,周期性的会有新数据。

            1)用于定时查询设备是否有中断数据要传送

            2)根据设备的要求进行周期性调度

全速设备最快每1ms、最慢每255ms发生一次

低速设备最快每10ms、最慢每255ms发生一次

高速设备最快每125us、最慢每4096ms发生一次

3)数据格式——无要求

4)传输方向——单向

5)包长度限制

低速设备:8字节

全速设备:64字节

高速设备:1024字节

6)支持错误检测和恢复

 

4.4 同步传输

          数据的实时性,而非正确性,带宽要求很高啊。典型应用摄像头!

            1)速率恒定,容错的传输

因错误使传输失败,不再重新发送数据

全速设备最大带宽的90%、高速设备最大带宽的80%可以分配给周期性传输(同步传输和中断传输)

            2)数据格式——无要求(流管道)

            3)传输方向——单向

            4)服务周期——在相连的帧时隙中被定期调度

            5)包长度限制

低速设备不支持同步传输

全速情况下,最大包值为1023字节

高速情况下,最大包值为1024字节

            6)不支持错误检测和恢复

 

       到此,我们对USB家族成员的看家本领有了初步的认识,在后面的使用过程中,会对他们进一步的了解,直到将这些东西了然于胸,不用特意感受他的存在。掌握知识点的最好方式是在使用过程中,所以有时我更喜欢“好读书不求甚解”这句话,因为在后面的使用过程中,以前没理解的可能会突然间就理解了。前前后后的知识点,互相照应,形成网状。

 

原创粉丝点击