自己总结的USB数据结构及其描述符
背景:
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数据结构及其描述符的更多相关文章
- USB系列之二:读取USB设备的描述符
在前面的文章中,我们已经给出了USB协议的链接地址,从这篇文章起,我们会涉及到许多USB 1.1的内容,我们的指导思想是先从熟悉USB 1.1协议入手,先使用现成的HCD和USBD,直接面对客户端驱动 ...
- usb协议分析-设备描述符配置包-描述符
/* usb协议分析仅供大家参考---设备描述符配置包,设备描述符, 地址设置, 配置描述符, 字符串描述符 */ /* -1- usb设备描述符配置包 */ typedef struct _USB_ ...
- usb驱动开发8之配置描述符
前面分析了usb的四大描述符之端点描述符,接口描述符(每一个接口对应一个功能,与之配备相应驱动),下面是看配置描述符还是看设备描述符呢??我们知道,设备大于配置,配置大于接口,接口可以有多种设置. 我 ...
- USB HID报告及报告描述符简介
在USB中,USB HOST是通过各种描述符来识别设备的,有设备描述符,配置描述符,接口描述符,端点描述符,字符串描述符,报告描述符等等.USB报告描述符(Report Descriptor)是HID ...
- USB描述符解析-->枚举.
枚举可以理解为主机按不定的顺序向USB设备讨要设备信息,好给它分配资源,若枚举不成功,就放弃分配资源,免得浪费资源.一般都是使用中断传输方式通信. 常用的描述符有以下几种:01H.设备描述符 02H ...
- 2.7 usb摄像头之usb摄像头描述符打印
学习目标:参考lsusb源码,打印USB摄像头的设备描述符.配置描述符.接口联合描述符.端点描述符: 一.lsusb命令和源码 使用命令lsusb可以看看设备的id,并执行 # lsusb -v -d ...
- USB描述符【整理】
USB描述符 USB描述符信息存储在USB设备中,在枚举过程中,USB主机会向USB设备发送GetDescriptor请求,USB设备在收到这个请求之后,会将USB描述符信息返回给USB主机,USB主 ...
- HID 报告描述符精细说明.
1,报告描述符概述 1.1) 报表描述符 报表描述符和USB的其他描述符是不一样的,它不是一个简单的表格,报表描述符是USB所有描述符中最复杂的.报表描述符非常复杂而有弹性,因为它 ...
- Linux kernel的中断子系统之(三):IRQ number和中断描述符
返回目录:<ARM-Linux中断系统>. 总结: 二描述了中断处理示意图,以及关中断.开中断,和IRQ number重要概念. 三介绍了三个重要的结构体,irq_desc.irq_dat ...
随机推荐
- 遵循PSR-4的自动加载
一.简介 首先这里要了解PSR,Proposing a Standards Recommendation(提出标准建议)的缩写,就是一种PHP开发规范,让我们研发出来的代码更合理.更好维护.可读性更高 ...
- C#12种顺序排序
这篇主要写关于顺序排序的十二种算法,也是我有关算法的第一帖.主要是写,对每种算法的理解与测试. 速度测试,主要根据一千.一万.五万.百万这 四种.速度纪录还是用Stopwatch 这个类.使用随机数R ...
- Always review
Data structures A data structure is a way to store and organize data in order to facilitate access a ...
- STL之deque用法详解
C++ Deque(双向队列): Deque是一种优化了的.对序列两端元素进行添加和删除操作的基本序列容器.它允许较为快速地随机访问,但它不像vector 把所有的对象保存在一块连续的内存块,而是采用 ...
- 高性能JavaScript(您值得一看)
众所周知浏览器是使用单进程处理UI更新和JavaScript运行等多个任务的,而同一时间只能有一个任务被执行,如此说来,JavaScript运行了多长时间就意味着用户得等待浏览器响应需要花多久时间. ...
- 01C语言基础知识
C语言知识要点总结 1在C语言中,关系运算的结果为“真”,就返回1,"假"就返回0 printf("input value is %d" , 5 > 4) ...
- Docker探索系列1之docker入门安装与操作
preface docker这种时髦的技术我接触的比较晚,如果不是公司在使用这项技术,估计还得会更晚接触.好了,说下我司现在docker使用的情况.docker在我司是用来跑web服务的,里面的web ...
- C#--API
C#中调用API 介绍 API( Application Programming Interface ),我想大家不会陌生,它是我们Windows编程的常客,虽然基于.Net平台的C#有了强大的类库, ...
- C++中dynamic_cas操作符的工作原理
http://stackoverflow.com/questions/13783312/how-does-dynamic-cast-work http://publib.boulder.ibm.com ...
- Java并发编程核心方法与框架-CountDownLatch的使用
Java多线程编程中经常会碰到这样一种场景:某个线程需要等待一个或多个线程操作结束(或达到某种状态)才开始执行.比如裁判员需要等待运动员准备好后才发送开始指令,运动员要等裁判员发送开始指令后才开始比赛 ...