Chinaunix首页 | 论坛 | 博客
  • 博客访问: 136149
  • 博文数量: 41
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 307
  • 用 户 组: 普通用户
  • 注册时间: 2013-08-15 18:48
文章分类

全部博文(41)

文章存档

2015年(5)

2014年(23)

2013年(13)

我的朋友

分类: LINUX

2014-01-08 10:01:20

原文地址:USB 传输协议 作者:BENNYSNAKE

Pipe
USB的pipe的两端分别指的是USB host端的内存区域,和设备端的endpoint。
pipe分为两类,一类是stream pipe, 另一类是message pipe。
两类的主要区别是,message pipe发送的数据,都是usb协议里规定好的结构,而steam pipe发送的数据则没有什么要求。
还有一个重要的概念就是,message pipe要求IN和OUT,而且必须是一个endpoint支持IN,OUT,也就是要求全双工。所以endpoint 0的control transfer就总是message pipe。但是只能是endpoint 0可以使用control transfer么?其实不是,除了endpoint 0之外,其实还可以有其他endpoint支持全双工,这就根据设备的支持了,一般这么用的比较少。下面介绍control transfer的时候会介绍到。

Transfer
USB协议规定了4种transfer,分别为control transfer, isochronous transfer, bulk transfer, interrupt transfer.
一个transfer由多个transaction组成,一个transaction由多个packet组成。

control transfer
一个control transfer由SETUP, DATA, STATUS三种transaction组成,其中SETUP是由host -> device, STATUS是由device -> host。DATA是可有可无的,DATA的传输方向也是由SETUP里去指定的。
control trnasfer属于message pipe, 里面传输的数据都是定义好了的结构体,比如set configuration之类。
一个device必须有一个control transfer,也就是使用的endpoint0,但是device不见得只有一个control transfer,也可以有其他的全双工的endpoint去运作附加的control transfer。

SETUP transaction的数据都是USB协议定义好的结构体,这个结构体允许vendor指定自己的专门设备的一些command。DATA transaction如果有的话,就跟在SETUP后面,其也有一个USB定义好的结构体,除非传输的是vedor指定的信息。最后是STATUS transaction,这个也是有USB协议规定好的。

基于control transfer的endpoint决定了最大的packet大小,full-speed的设备为8, 16, 32, 64个bytes, high-speed设备支持64 bytes, low-speed为8bytes.这个包的最大size决定于wMaxPacketSize。这个wMaxPacketSize是在device descriptor里,所以正确的读取顺序为,先读8个bytes,解析后得到wMaxPacketSize后,再去用真实的size继续操作。

还有一点,这个wMaxPacketSize,也就是max packet大小,指的是DATA transaction里的真实data filed的size。像SETUP,STATUS这些transaction,都是USB定义好的,所以size也是固定的,所以就跟这个最大size没有关系了。如果传输的数据大于packet的max size里,那就分多个packet。


阅读(3397) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~