背景:

  USB理论知识光看着空想总觉着丢三落四,好像哪里没法理解到位,自己做个总结。

正文:

1、 USB通信的最基本单位是“包”。如果把“包”肢解的话,可以分为各种“域”(7类,即一串二进制数。每类域均有具体的位数规定)。

包有三种:令牌包,数据包,握手包

a)      令牌包:输入包,输出包,设置包,帧起始包。(通俗理解为,主机要求设备做什么)

b)      数据包:Data0 / Data1。

c)      握手包:ACK正确应答包,NAK无效包,STALL延时包。

2、 USB是一个数据传输过程,那么根据传输的的方式不同,人为的可以将他命名为,同步传输,中断传输,批量传输,控制传输四种。这四种传输肯定是由一包一包数据组成。就拿U盘存储用的批量传输举个例子:

主机需要U盘内的一张.jpg图片,过程如下,主机先发个令牌包给设备,告诉设备,把图片准备好,我要来取图片了,然后设备将图片填充到USB的端点buf内,由USB设备芯片打包成数据包发送给主机,主机接收成功后就发一个握手包告诉设备我有没有成功接收,未成功则重新来过。

OK,若是要传一部占用空间的很大.avi格式电影怎么办?USB的端点buf可是大小有限制的,所以就会分批次多次进行以上传输过程,而每次这种过程就又被人为的取了一个名字“事务”,换种说法,即此次传输由多比事务组成。

“事务”也分三种“IN事务”、“OUT事务”、“SETUP事务”。

此处的IN与OUT是站在主机的角度而言。顾名思义,“IN事务”:主机请求设备发送数据给主机。“OUT事务”:主机请求发送数据给设备。

事务介绍完了,继续来说说USB的四种传输方式:

a)      批量传输:

此传输只包含:“IN事务”、“OUT事务”。

传输特点:若总线上有其它传输,其会优先让位带宽给其它位。

b)      中断传输:

此传输亦只包含:“IN事务”、“OUT事务”。

传输特点:此中断非硬件意义上的中断,主机实际上在轮训,当设备状态发送改变,才会发生一次中断,然后主机将状态读走。轮训周期(全速设备:1~255ms, 低速设备:10~255ms)。

c)      同步传输:(只针对全速设备)

此传输亦只包含:“IN事务”、“OUT事务”。但注意的是!该传输的每笔事务内,不会发送握手包,即不纠错。

传输特点:常用于音频流、视频流。且数据包只使用DATA0 发数据。

d)      控制传输:

此传输包含:“IN事务”、“OUT事务”、“SETUP事务”,最复杂的传输,核心在“SETUP事务”。其包含三个步骤:

l  初始设置步骤

由一个“SETUP事务”(令牌包,数据包,握手包)组成。其中数据包(8个字节的DATA0包,分配给5种命令信息bmRequestType、bRequest、wValue、wIndex、wLength)。

l  可选数据步骤

由上一步骤确定是否收发数据,由“IN事务”、“OUT事务”组成。

l  状态信息步骤

由“IN事务”、“OUT事务”组成,注意!此处的IN,OUT是相对于设备而言。其主要是返回设备设置完以后的状态信息吧?(此句暂属联想)

以上既是USB传输的基本数据结构,现在知道了数据是通过何种方式传的,那就该去说道说道这些传输方式里传输的具体内容是什么。USB设备连接上主机后,需要提供一大串信息告诉主机,我能做什么,需要多少USB资源等等,而这一大串信息就保存在USB描述符当中。

3、 标准的USB描述符

描述符其实就是C语言实现的USB数据栈,USB设备基于USB通信协议将其打包发送给USB主机,USB主机再基于USB通信协议对设备上传来的每一包每一位数据进行解析,从而获得USB的详细信息。

暂不论这些USB标识符的具体意义,先了解下设备枚举的过程:

标准的USB描述符有:

l  设备描述符

一个USB设备只能有一个设备描述符,最主要的作用既是报告设备的类别,配置的数量等。

其中包含:设备类别(标准的USB设备类型由此处定义,但有的是基于接口在接口描述符内定义,如HID),USB版本号,端点0的最大报大小,厂商、商品、设备出厂编号,描述厂商、产品、设备的字符串索引(无则写0)。可能的配置数量。

l  配置描述符

一个设备可拥有好几个配置描述符,由于在设备描述符阶段已经规定了设备类别,所以多个配置描述符只能描述同一类别,譬如ISDN就有64KB/s、128KB/s两种配置。选取哪种配置由其内字段“bConfigurationVale”来决定。但一个配置只能有一个配置描述符。

其中包含:配置返回所有描述符大小(设备描述符除外),接口数量,供电模式,最大电流等等。

l  接口描述符

接口是一系列端点的集合,每个接口都有一个唯一的标号,但可多个接口描述符描述同一个接口。USB可通过字段“bAlternateSetting”来切换。其可在配置完成后进行任意切换。就USB例子来说,其只有一个实现MassStorage类的接口,在该接口下使用了批量输入Bulk_IN,批量输出Bulk_OUT2个非0端点来传输文件。

其中包含:接口/备用接口编号,使用端点数(不含端点0),接口类型等等。

l  端点描述符

其内定义了端点属性(输入\输出、传输类型、最大包,主机查询端点时间间隔)。

其作为配置描述符的一部分返回给主机,本身并不能直接被主机访问。

l  字符串描述符

以上4类描述符内均有字符串描述符索引,用于对前面描述符的补充,此即字符串描述符作用。

记录地点:深圳WZ

记录时间:2016年3月10日

自己总结的USB数据结构及其描述符的更多相关文章

  1. USB系列之二:读取USB设备的描述符

    在前面的文章中,我们已经给出了USB协议的链接地址,从这篇文章起,我们会涉及到许多USB 1.1的内容,我们的指导思想是先从熟悉USB 1.1协议入手,先使用现成的HCD和USBD,直接面对客户端驱动 ...

  2. usb协议分析-设备描述符配置包-描述符

    /* usb协议分析仅供大家参考---设备描述符配置包,设备描述符, 地址设置, 配置描述符, 字符串描述符 */ /* -1- usb设备描述符配置包 */ typedef struct _USB_ ...

  3. usb驱动开发8之配置描述符

    前面分析了usb的四大描述符之端点描述符,接口描述符(每一个接口对应一个功能,与之配备相应驱动),下面是看配置描述符还是看设备描述符呢??我们知道,设备大于配置,配置大于接口,接口可以有多种设置. 我 ...

  4. USB HID报告及报告描述符简介

    在USB中,USB HOST是通过各种描述符来识别设备的,有设备描述符,配置描述符,接口描述符,端点描述符,字符串描述符,报告描述符等等.USB报告描述符(Report Descriptor)是HID ...

  5. USB描述符解析-->枚举.

    枚举可以理解为主机按不定的顺序向USB设备讨要设备信息,好给它分配资源,若枚举不成功,就放弃分配资源,免得浪费资源.一般都是使用中断传输方式通信. 常用的描述符有以下几种:01H.设备描述符  02H ...

  6. 2.7 usb摄像头之usb摄像头描述符打印

    学习目标:参考lsusb源码,打印USB摄像头的设备描述符.配置描述符.接口联合描述符.端点描述符: 一.lsusb命令和源码 使用命令lsusb可以看看设备的id,并执行 # lsusb -v -d ...

  7. USB描述符【整理】

    USB描述符 USB描述符信息存储在USB设备中,在枚举过程中,USB主机会向USB设备发送GetDescriptor请求,USB设备在收到这个请求之后,会将USB描述符信息返回给USB主机,USB主 ...

  8. HID 报告描述符精细说明.

    1,报告描述符概述    1.1) 报表描述符        报表描述符和USB的其他描述符是不一样的,它不是一个简单的表格,报表描述符是USB所有描述符中最复杂的.报表描述符非常复杂而有弹性,因为它 ...

  9. Linux kernel的中断子系统之(三):IRQ number和中断描述符

    返回目录:<ARM-Linux中断系统>. 总结: 二描述了中断处理示意图,以及关中断.开中断,和IRQ number重要概念. 三介绍了三个重要的结构体,irq_desc.irq_dat ...

随机推荐

  1. 【问题】R文件报错原因及解决办法 (转)

    错误如图.下面是几种解决方法(网上搜集的). 1.如果是导入项目出现这个问题,一般是R文件没有更新造成(据说导入项目,R不会自动更新).可以Project——clean以下,R文件会重新生成. 2.选 ...

  2. MVC5-5 Razor引擎及视图结构

    View结构 其实给我们提供了官方的MvcDemo,就是在我们直接去新建一个不为空的MVC项目. 这里就是一个MVC的Demo了,可以看一下这个Demo中View的结构是什么 上图可以发现,有一个Sh ...

  3. Code笔记之:CSS+HTML display 属性

    display属性值:none 此元素不会被显示. block 此元素将显示为块级元素,此元素前后会带有换行符. inline 默认.此元素会被显示为内联元素,元素前后没有换行符. inline-bl ...

  4. 64位centos下安装python的PIL模块

    http://blog.csdn.net/xiaojun1288/article/details/8673529

  5. BZOJ4445: [Scoi2015]小凸想跑步

    裸半平面交. 记得把P0P1表示的半平面加进去,否则点可能在多边形外. #include<bits/stdc++.h> #define N 100009 using namespace s ...

  6. boolean 和 Boolean 类型数据的差别

    工作中遇到页面传递布尔类型的数据问题,需要在代码中判断不能为null,就此思考一下,boolean和Boolean之间的区别?boolean是基本数据类型Boolean是它的封装类,和其他类一样,有属 ...

  7. nginx主备配置

    添加配置: proxy_next_upstream error timeout invalid_header http_500 http_503 http_502; upstream http.wea ...

  8. easyUI中tree的简单使用

    一.在JS中的代码 $('#tt').tree({ url: baseCtx + 'lib/easyui-1.4/demo/tree/tree_data1.json',//tree数据的来源,json ...

  9. 10月17日下午MySQl数据库CRUD高级查询

    高级查询:1.连接查询 #适用于有外键关系的  没有任何关系没法用select * from Info,Nation #同时查询这俩表并把两表每个数据相互组合,形成笛卡尔积 select * from ...

  10. TortoiseSVN的相关问题

    图标覆盖问题: 创建一个保存文档的目录,创建一个工作目录,工作目录创建后,没有显示覆盖图标.解决办法如下: 找到设置,在工作目录下右键 打开界面如下: 从包含路径中设置就可以. 目录检出后把它从检出状 ...