背景:

  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. tar.xz文件如何解压

    1. tar.xz介绍 XZ压缩最新压缩率之王 xz这个压缩可能很多都很陌生,不过您可知道xz是绝大数linux默认就带的一个压缩工具. 之前xz使用一直很少,所以几乎没有什么提起. 2. 压缩 ta ...

  2. Guava 集合框架

    在本系列中我们首先来学习一些Guava的集合框架,也就是这个package:com.google.common.collect 在这个包下面有一些通用的集合接口和一些相关的类.   集合类型: BiM ...

  3. 给linux添加yum源。

    在玩linux的过程中,经常会下载一些源码包.软件大多是国外人写的,由于众所周知的原因,网络下载很慢. 所以想到了更新yum源的方法. 我的linux版本是CentOS6.3的. 以下参考百度. 1, ...

  4. 捉襟见肘之UIView中contentMode属性

    UIView.h @property(nonatomic) UIViewContentMode contentMode; // default is UIViewContentModeScaleToF ...

  5. Python 培训之正则表达式

    re 模块 re.math 从头匹配 re.search 结构: re.math(r'^c',a)   不符合返回None 原字符: . 任意字符 [ ] 或者 [A-Z,a-z,b] \d 数字 \ ...

  6. winform的tab跳到下一个

    先设置TabStop=true,再设置TabIndex的顺序

  7. Github for Windows使用介绍

    Git已经变得非常流行,连Codeplex现在也已经主推Git.Github上更是充斥着各种高质量的开源项目,比如ruby on rails,cocos2d等等.对于习惯Windows图形界面的程序员 ...

  8. 虚拟机NUMA和内存KSM

    KSM技术可以合并相同的内存页,即使是不同的NUMA节点,如果需要关闭跨NUMA节点的内存合并,设置/sys/kernel/mm/ksm/merge_across_nodes参数为0.或者可以关闭特定 ...

  9. lazyload.js实现图片异步载入

    所谓图片异步加载,意思是不用一次把图片全部加载完,你可以叫它延迟加载,缓冲加载都行. 看看你有没有这种需求:某篇文章图片很多,如果在载入文章时就载入所有图片,无疑会延缓载入速度,让用户等更久,所以,我 ...

  10. SimPholders Xcode快速访问沙盒

    SimPholders