本文对应usb2.0协议的第八章Protocol Layer。
数据是由二进制数字串构成的,首先数字串构成域(有七种),域再构成包,包再构成事务(IN、OUT、SETUP),事务最后构成传输(中断传输、并行传输、批量传输和控制传输)。

(一)域:是USB数据最小的单位,由若干位组成(至于是多少位由具体的域决定),域可分为七个类型:
  1、同步域(SYNC),是用来告诉USB的串行接口引擎数据要开始传输了,请做好准备。除此之外,同步域还可以用来同步主机端和设备端的数据时钟,因为同步域是以一串0开始的,而0在USB总线上就是被编码为电平翻转,结果就是每个数据位都发生电平变化,这让串行接口引擎很容易就能够恢复出采样时钟信号;对于全速设备和低速设备,同步域使用的是00000001(二进制数,总线上的发送顺序);对于高速设备,同步域使用的是31个0,后面跟1个1(需要注意的是,这是对发送端的要求,接收端解码时,0的个数可以少于这个数)。
  2、标识域(PID),由四位标识符+四位标识符反码构成,表明包的类型和格式,这是一个很重要的部分,这里可以计算出,USB的标识码有16种;

3、地址域(ADDR):七位地址,代表了设备在主机上的地址,地址000 0000被命名为零地址,是任何一个设备第一次连接到主机时,在被主机配置、枚举前的默认地址,由此可以知道为什么一个USB主机只能接127个设备的原因。
  4、端点域(ENDP),四位,由此可知一个USB设备有的端点数量最大为16个。
  5、帧号域(FRAM),11位,每一个帧都有一个特定的帧号,帧号域最大容量0x800,对于同步传输有重要意义(同步传输为四种传输类型之一)。
  6、数据域(DATA):长度为0~1023字节,在不同的传输类型中,数据域的长度各不相同,但必须为整数个字节的长度
  7、校验域(CRC):对令牌包和数据包(对于包的分类请看下面)中非PID域进行校验的一种方法,CRC校验在通讯中应用很泛,是一种很好的校验方法,至于具体的校验方法这里就不多说,请查阅相关资料,只须注意CRC码的除法是模2运算,不同于10进制中的除法。

二)包:由域构成的包有四种类型,分别是令牌包、数据包、握手包和特殊包,前面三种是重要的包,不同的包的域结构不同,介绍如下
  1、令牌包:可分为输入包、输出包、设置包和帧起始包(注意这里的输入包是用于设置输入命令的,输出包是用来设置输出命令的,而不是放据数的) 其中输入包、输出包和设置包的格式都是一样的:
  SYNC+PID+ADDR+ENDP+CRC5(五位的校验码)
  帧起始包的格式:
  SYNC+PID+11位FRAM+CRC5(五位的校验码)
  2、数据包:分为DATA0包和DATA1包,当USB发送数据的时候,当一次发送的数据长度大于相应端点的容量时,就需要把数据包分为好几个包,分批发送,DATA0包和DATA1包交替发送,即如果第一个数据包是 DATA0,那第二个数据包就是DATA1。但也有例外情况,在同步传输中(四类传输类型中之一),所有的数据包都是为DATA0,格式如下:
  SYNC+PID+0~1023字节+CRC16
 3、握手包:结构最为简单的包,格式如下 SYNC+PID
每包数据的最后都会有一个包结束符EOP(End-of-Packet),对于高速设备和全速/低速设备也是不一样的。全速/低速设备的EOF是一个大约为2个数据位宽度的单端0(SE0)信号。SE0的意思就是,D+和D-同时都保持为低电平。由于USB使用的是差分数据线,通常都是一高一低的,而SE0不同,是一种都为低的特殊状态。SE0用来表示一些特殊的意义,例如包结束、复位信号灯。USB集线器对USB设备进行复位的操作,就是通过将总线设置为SE0状态大约10ms来实现的。对于高速设备的EOF,使用故意的位填充错误来表示。那么如何判断一个位填充错误是真的位错误还是包结束呢?这个由CRC校验来判断。如果CRC校验正确,则说明这个位填充错误是EOP;否则,说明传输出错。

(三)事务:分别有IN事务、OUT事务和SETUP事务三大事务,每一种事务都由令牌包、数据包、握手包三个阶段构成,这里用阶段的意思是因为这些包的发送是有一定的时间先后顺序的,事务的三个阶段如下:
  1、令牌包阶段:启动一个输入、输出或设置的事务
  2、数据包阶段:按输入、输出发送相应的数据
  3、握手包阶段:返回数据接收情况,在同步传输的IN和OUT事务中没有这个阶段,这是比较特殊的。
事务的三种类型如下(以下按三个阶段来说明一个事务):
1、 IN事务:
  令牌包阶段——主机发送一个PID为IN的输入包给设备,通知设备要往主机发送数据;
  数据包阶段——设备根据情况会作出三种反应(要注意:数据包阶段也不总是传送数据的,根据传输情况还会提前进入握手包阶段)
1) 设备端点正常,设备往入主机里面发出数据包(DATA0与DATA1交替);
2) 设备正在忙,无法往主机发出数据包就发送NAK无效包,IN事务提前结束,到了下一个IN事务才继续;
3) 相应设备端点被禁止,发送错误包STALL包,事务也就提前结束了,总线进入空闲状态。
握手包阶段——主机正确接收到数据之后就会向设备发送ACK包。
2、 OUT事务:
令牌包阶段——主机发送一个PID为OUT的输出包给设备,通知设备要接收数据;
数据包阶段——比较简单,就是主机会给设备送数据,DATA0与DATA1交替
握手包阶段——设备根据情况会作出三种反应
1)设备端点接收正确,设备往入主机返回ACK,通知主机可以发送新的数据,如果数据包发生了CRC校验错误,将不返回任何握手信息;
2)设备正在忙,无法接收主机发出数据包就发送NAK无效包,通知主机再次发送数据;
3)相应设备端点被禁止,发送错误包STALL包,事务提前结束,总线直接进入空闲状态。
3、SETUT事务:
令牌包阶段——主机发送一个PID为SETUP的输出包给设备,通知设备要接收数据;
数据包阶段——比较简单,就是主机会设备送数据,注意,这里只有一个固定为8个字节的DATA0包,这8个字节的内容就是标准的USB设备请求命令(共有11条)
握手包阶段——设备接收到主机的命令信息后,返回ACK,此后总线进入空闲状态,并准备下一个传输(在SETUP事务后通常是一个IN或OUT事务构成的传输)

(四)传输:传输由OUT、IN、SETUP事务其中的事务构成,传输有四种类型,中断传输、批量传输、同步传输、控制传输,其中中断传输和批量转输的结构一样,同步传输有最简单的结构,而控制传输是最重要的也是最复杂的传输。
1、中断传输:由OUT事务和IN事务构成,用于键盘、鼠标等HID设备的数据传输中
2、批量传输:由OUT事务和IN事务构成,用于大容量数据传输,没有固定的传输速率,也不占用带宽,当总线忙时,USB会优先进行其他类型的数据传输,而暂时停止批量转输。
3、同步传输:由OUT事务和IN事务构成,有两个特殊地方,第一,在同步传输的IN和OUT事务中是没有返回包阶段的;第二,在数据包阶段所有的数据包都为DATA0
4、控制传输:最重要的也是最复杂的传输,控制传输由三个阶段构成(初始设置阶段、可选数据阶段、状态信息步骤),每一个阶段可以看成一个的传输,也就是说控制传输其实是由三个传输构成的,用来于USB设备初次加接到主机之后,主机通过控制传输来交换信息,设备地址和读取设备的描述符,使得主机识别设备,并安装相应的驱动程序,这是每一个USB开发者都要关心的问题。
1)、初始设置步骤:就是一个由SETUP事务构成的传输;
2)、可选数据步骤:就是一个由IN或OUT事务构成的传输,这个步骤是可选的,要看初始设置步骤有没有要求读/写数据(由SET事务的数据包阶段发送的标准请求命令决定);
3)、状态信息步骤:顾名思义,这个步骤就是要获取状态信息,由IN或OUT事务构成构成的传输,但是要注意这里的IN和OUT事务和之前的INT和OUT事务有两点不同:
  (1) 传输方向相反,通常IN表示设备往主机送数据,OUT表示主机往设备送数据;在这里,IN表示主机往设备送数据,而OUT表示设备往主机送数据,这是为了和可选数据步骤相结合;
  (2) 在这个步骤里,数据包阶段的数据包都是0长度的,即SYNC+PID+CRC16
  
(五)实例解析

(1)设置事务:
令牌包:Sync(同步域00000001B)+ADDR(地址域0000000B,设备地址7位,地址0为缺省地址,要保留,所以总线最多可以挂挂载127个设备)+ENDP(端点域0000B,端点号4位,最多16个端点)+CRC5(校验域0x08);
后边跟上一个EOP(End-of-Packet)包结束符
数据包:Sync(同步域)+DATA0(标识域,表示偶数据包,下一次发数据就会用DATA1,表示奇数据包,也是usb的一种纠错机制,如果两次数据包的这个标识域相同,那肯定出错了)+DATA(数据域,0x00 0x05表示设置地址请求,0x02就是设置的地址,后边的数据在设置地址时全都没有意义)+CRC16(0xD768);
握手包:Sync(00000001B同步域)+Ack(0x4B标识域)
注意包前面的DIR表示方向,方向都是相对主机的。令牌包都是输出方向 ->,即不管什么事务,令牌包都是由主机发出的,也就是说所有的事务都由主机发起。
设置事务是主机发送数据给设备,所以数据包DIR是输出;握手包是设备收到数据后对主机的响应,DIR是输入。
(2)输入事务:
令牌包 Sync(00000001同步域)+In(0x96标识域,通知设备输入,可以查看前面的表格看到1001表示IN,后面四位是前面四位取反,所以是0110)+Addr(0000000B地址域)+Endp(0000B端点域)+CRC5(0x08校验域)
数据包 Sync(00000001同步域)+DATA1(0xD2标识域)+DATA(无,数据域为空,无数据发送)+CRC16(0x0000校验域)
握手包:Sync(00000001B同步域)+Ack(0x4B标识域)
可以看到,主机通过令牌包发送了一个In标识域,要求设备发送数据给主机,虽然设备并无数据要发送,但还是发送了一个空数据(数据域为空)的数据包给主机,主机随后发了个握手包响应设备,表示正确收到数据。
(3)本次传输是一次控制传输,设置usb设备地址为2.本次传输由设置事务和输入事务组成,没有输出事务,也就是说一次传输不必三种事务全包含。但是不管是设置事务、输入事务还是输出事务,任何事务都必须由三个顺序的令牌包、数据包和握手包组成。一个包则有7种域的各种可能组合而成。
---------------------
作者:ToureYaya
来源:CSDN
原文:https://blog.csdn.net/charliewangg12/article/details/77896762

USB包格式解析(转)的更多相关文章

  1. IM通信协议逆向分析、Wireshark自定义数据包格式解析插件编程学习

    相关学习资料 http://hi.baidu.com/hucyuansheng/item/bf2bfddefd1ee70ad68ed04d http://en.wikipedia.org/wiki/I ...

  2. WebSocket协议理解-数据包格式解析

    WebSocket 的诞生 做客户端开发时,接触最多的应用层网络协议,就是 HTTP 协议,而今天介绍的 WebSocket,下层和 HTTP 一样也是基于 TCP 协议,这是一种轻量级网络通信协议, ...

  3. GPS数据包格式解析

    四种定位系统:1.美国的全球定位系统(Global Positioning System,GPS)2.俄罗斯的格罗拉斯(Global Nabigation Satellite System,GLONA ...

  4. EasyPusher RTSP直播之RTP数据包格式解析

    -本篇由团队成员Fantasy供稿! RTP包头格式 码流总体结构 h264的功能分为两层,视频编码层(VCL)和网络提取层(NAL).H.264 的编码视频序列包括一系列的NAL 单元,每个NAL ...

  5. MIPI CSI-2 像素打包格式解析

    背景 MIPI CSI-2支持YUV.RGB和RAW data三种数据格式,这里是个笼统的叫法,具体又根据不同的像素打包方式细分为具体的格式,打包是什么概念?就是把Sensor采样得到的RGB三个通道 ...

  6. 详解BLE 空中包格式—兼BLE Link layer协议解析

    BLE有几种空中包格式?常见的PDU命令有哪些?PDU和MTU的区别是什么?DLE又是什么?BLE怎么实现重传的?BLE ACK机制原理是什么?希望这篇文章能帮你回答以上问题. 虽然BLE空中包(pa ...

  7. GPS数据包格式及数据包解析

    GPS数据包解析 GPS数据包解析 目的 GPS数据类型及格式 数据格式 数据解释 解析代码 结构体定义 GPRMC解析函数 GPGGA解析函数 测试样例输出 gps数据包格式 gps数据解析 车联网 ...

  8. 蓝牙Beacon广播数据包格式以及解析

    目录 1. 获取原始蓝牙广播包 2. 安装WireShark软件 3. 分析Beacon广播包数据 3.1 第一个数据包格式 3.2 第二个数据包格式 3.3 Android程序开发中的蓝牙广播包 4 ...

  9. RTP 包格式 详细解析

    H.264 视频 RTP 负载格式 1. 网络抽象层单元类型 (NALU) NALU 头由一个字节组成, 它的语法如下: +---------------+      |0|1|2|3|4|5|6|7 ...

随机推荐

  1. 部署自己的服务器ubuntu

    一直都是在公司的服务器上工作,想搞点自己的idea比较不方便,所以近期租了要给自己的阿里云服务器. 以下为必要的软件的安装流程: jdk+jre: 1.去官网下载 jdk-linux版本: 2.解压压 ...

  2. UE4 AR开发笔记

    1.基础使用 ArToolKit:生成图片特征,可以用彩图.(图片先灰化)    genTexData效准相机.由于有的相机照相有弧度.  calib_camera 2.使用UE4ARPlugins做 ...

  3. HEAD FILE

    心血来潮做的沙雕Head,喜欢就拿去用吧,Explosion! HEAD //#pragma comment(linker, "/STACK:1024000000,1024000000&qu ...

  4. 利用pyinstaller 打包Python文件

    1.下载安装pyinstaller模块 cmd 命令: pip install pyinstaller cmd命令: pip list 查看自己安装的模块 2.建议把要大包的Python文件单独放到新 ...

  5. XSS闯关游戏准备阶段及XSS构造方法

    请下载好XSS闯关文件后,解压后放在服务器的对应文件夹即可 在该闯关中,会在网页提示一个payload数值 payload,翻译过来是有效载荷 通常在传输数据时,为了使数据传输更可靠,要把原始数据分批 ...

  6. codeforces 1082G - Petya and Graph 最大权闭合子图 网络流

    题意: 让你选一些边,选边的前提是端点都被选了,求所有的边集中,边权和-点权和最大的一个. 题解: 对于每个边建一个点,然后就是裸的最大权闭合子图, 结果比赛的时候我的板子太丑,一直T,(不会当前弧优 ...

  7. 九.LNMP网站架构实践部署

    期中集群架构-第九章-期中架构LNMP章节====================================================================== 01. LNMP ...

  8. 阿里云服务器Ubuntu 14.04.2和centos7.5实现nfs挂载

    前提条件,确保两个ip可以正常通信 确认服务端是否安装nfs-utils和rpcbind[root@localhost /]# rpm -qa|grep "nfs"nfs4-acl ...

  9. SpringMvc+Hibernate+Mysql保存表情字符(昵称)到数据库报错的问题?

    背景: 一个中小型H5游戏 描述: 游戏通过微信授权登入, 获取到用户昵称并将用户信息保存至Mysql数据库, 当遇到有些用户微信昵称中带有表情(特殊字符)时, 保存至数据库出错! 核心错误: Cau ...

  10. dynamic不能使用扩展方法

    一.方法中传入的参数为dynamic,则返回的也是dynamic类型 例如: public string Test(string str) { return str + "aa"; ...