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。

 

USB 传输协议的更多相关文章

  1. USB传输协议。——Arvin

    问题一:USB的传输线结构是如何的呢? 答案一:一条USB的传输线分别由地线.电源线.D+.D-四条线构成,D+和D-是差分输入线,它使用的是3.3V的电压(注意哦,与CMOS的5V电平不同),而电源 ...

  2. USB HID 协议入门

    转载请注明来源:cuixiaolei的技术博客 USB HID设备类的应用场合 USB HID类是USB设备的一个标准设备类,包括的设备非常多.HID类设备定义它属于人机交互操作的设备,用于控制计算机 ...

  3. 基于 USB 传输的针式打印机驱动程序开发

    1.引言 针式打印机曾经在相当长的一段时间占据打印机市场的主导地位,但是近年来由于喷墨.激光等非击打式打印机的冲击,针式打印机的市场份额逐年下降.即便如此,由于针式打印机在票据打印领域的不可取代性,同 ...

  4. Bulk-Only传输协议 UFI命令块规范

    USB设备分为5大类,即显示器.通信设备.音频设备.人机输入和海量存储.通常所用的U盘.移动硬盘均属于海量存储类.海量存储类的规范中包括4个独立的子规范,即CBI传输.Bulk-Only传输.ATA命 ...

  5. SSD的传输总线、传输协议、传输接口

    前言:关于SSD,有众多总线类型.协议类型.接口类型,每个接口还包括不同型号,在这里花点时间全部整理一下,整理日期2017-08-08. 1.传输总线 总线就像一条公路,公路上的车好比总线上的电信号: ...

  6. USB通讯协议

    首先要了解USB枚举过程(自己百度) https://blog.csdn.net/MyArrow/article/details/8270029 USB通讯协议 0. 基本概念 一个[传输](控制.批 ...

  7. QQ传输协议分析

    2015-06-16 16:27:07 一. 实验目的: 在虚拟机下NAT模式下通过Wireshark抓包,分析QQ的传输模式.了解QQ在传输信息过程中用到的协议.分析在Nat模式下,信息传输的穿透性 ...

  8. 【转】安全传输协议SSL和TLS及WTLS的原理

    一.首先要澄清一下名字的混淆 1.SSL(Secure Socket Layer)是Netscape公司设计的主要用于WEB的安全传输协议.这种协议在WEB上获得了广泛的应用. 2.IETF将SSL作 ...

  9. HTTPS----安全超文本传输协议

    HTTPS协议详解HTTPS以保密为目标研发,简单讲是HTTP的安全版.其安全基础是SSL协议,因此加密的详细内容请看SSL.全称Hypertext Transfer Protocol over Se ...

随机推荐

  1. 设置PlaceHolder的颜色

    input::-webkit-input-placeholder{ color:green; } input::-webkit-input-placeholder { color: #999; } i ...

  2. SQL Server 2008空间数据应用系列三:SQL Server 2008空间数据类型

    原文:SQL Server 2008空间数据应用系列三:SQL Server 2008空间数据类型 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft SQL Server ...

  3. HttpWebRequest.Method 属性

    public static void GetHead(string url) { var http = (HttpWebRequest)WebRequest.Create(url); http.Met ...

  4. jquery中使用offset()获得的div的left=0,top=0

    写东西的时候要获取div的left和top,但怎么也取不到值都为0,但在chrome的console下是可以取到值的, 瞬间就纳闷了,于是乎就在网上找各种方法,大家一般的问题可能都是要获取的div被隐 ...

  5. 经典递归算法研究:hanoi塔的理解与实现

    关于hanoi塔的原理以及概念,请Google,访问不了去百度. 主要设计到C中程序设计中递归的实现: 主代码实现如下: void hanoi(int src, int dest, int tmp, ...

  6. What is NicEdit?

    NicEdit - WYSIWYG Content Editor, Inline Rich Text Application   What is NicEdit? NicEdit is a Light ...

  7. 左右HttpClient上传的方法来解决中国的乱码

    二手HttpClient人们都知道通过addTextBody方法来加入要上传的文本信息,可是,假设要上传中文的话.或还有中文名称的文件会出现乱码的问题,解决的方法事实上非常easy: 第一步:设置Mu ...

  8. Android应用程序组件Content Provider的启动过程源代码分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6963418 通过前面的学习,我们知道在Andr ...

  9. Android应用程序请求SurfaceFlinger服务渲染Surface的过程分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/7932268 在前面一篇文章中,我们分析了And ...

  10. 具体解释EBS接口开发之物料导入API

    create_item inv_item_grp.create_item(p_commit => fnd_api.g_true, -- p_item_rec => l_item_rec, ...