您的位置:首页 > 其它

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

2010-12-19 17:45 295 查看
3.4

令牌

(token)

3.4.1
协议层的介绍



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

EOF
是包开始和结束的标志。

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


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

a)
令牌包
(
定义了目标设备,终点号,传输方向
)

OUT IN SOF
SETUP
四种。

令牌包格式

SOF
包格式

b)
数据包
DATA0,DATA1

一般情况下有
2
种类型的数据包:
DATA0

DATA1
。设计成
2
种数据包
PID
是为了支持数据切换同步
(Data Toggle
Synchronization)


数据包格式

3
握手应答包
ACK NAK STALL

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

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

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

OUT
事务中发出。

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 Type

type
不为
0
时有新的含义,这里我们只讨论
type

0
的标准请求。

标准的设备请求

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

wValue
:当前请求的参数。

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

Direction

0
代表端点为
OUT
端点,
1

IN
端点。不过这个值目前基本没有到。端点为
0
时该值被忽略。

wLength
:表示下个包的数据传输长度。传输方向由
bmRequstType
中的
Direction
位指出。
wLength

0
则表明无数据传输。在
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
家族成员的看家本领有了初步的认识,在后面的使用过程中,会对他们进一步的了解,直到将这些东西了然于胸,不用特意感受他的存在。掌握知识点的最好方式是在使用过程中,所以有时我更喜欢“好读书不求甚解”这句话,因为在后面的使用过程中,以前没理解的可能会突然间就理解了。前前后后的知识点,互相照应,形成网状。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐