一个USB设备有一个设备描述符,设备描述符里面决定了该设备有多少种配置,
每种配置描述符对应着配置描述符;而在配置描述符中又定义了该配置里面有多少个接口,
每个接口有对应的接口描述符;在接口描述符里面又定义了该接口有多少个端点,
每个端点对应一个端点描述符;端点描述符定义了端点的大小,类型等等。
由此我们可以看出,USB的描述符之间的关系是一层一层的,
最上一层是设备描述符,
下面是配置描述符,再下面是接口描述符,
再下面是端点描述符。在获取描述符时,
先获取设备描述符,
然后再获取配置描述符,
根据配置描述符中的配置集合长度,
一次将配置描述符、接口描述符、端点描述符一起一次读回。
其中可能还会有获取设备序列号,厂商字符串,产品字符串等

usb数据发送方式:

LDDR3中详细介绍了usb数据发送的几种方式为: 控制传输、中断传输、同步传输、批量传输。

1、控制传输:

由主机发起,丛机响应,多用于命令、传输较短的数据。

2、中断传输:

中断可想而知,需要高效实时响应的传输,要求数据简单、精悍,数据传输过程中低延迟等。适用于鼠标类、键盘类。

3、同步传输

传输过程中对数据同步要求交过,所以必须适用定期批量发送或者接收数据的设备,例如媒体播放设备,多考虑数据能定时发送或者接收到,不用考虑

数据的应答机制,即不考虑发起方是否需要知道数据发送是否成功。因此在usb数据发送过程中是不需要握手阶段的
4、批量传输

非周期、批量的传输,在每传输一批包后,需要有握手阶段,所以是稳定、可靠的传输,但是容易出现延时的问题。

usb数据发送流程:

a) 令牌阶段:主机发送请求,USB设备依据请求PID来判断IN或OUT传输
b) 数据传输阶段:依据令牌阶段的IN或OUT传输,来决定数据传输为DATA0或DATA1来进行数据传输
c) 握手阶段:接收信息的一方发送ACK信号以表示接收成功;若为NAK,表示发送失败;STALL表示不可预知的错误

usb枚举过程:需要记住的一点是枚举只能是由主设备端发起

1、usb接口检测到设备插入,通过D+和D-查分电压检测得到,产生一个中断。
  连接了设备的 HUB 在 HOST 查询其状态改变端点 时返回对应的 bitmap,告知HOST 某个PORT状态发生了改变。
  主机向 HUB 查询该PORT的状态,得知有设备连接,并知道了该设备的基本特性。
  主机等待(至少 100mS)设备上电稳定,然后向 HUB 发送请求,复位并使能该PORT。
  HUB执行PORT复位操作,复位完成后该PORT就使能了。现在设备进入到defalut状态,可以从Vbus获取不超过 100mA 的电流。主机可以通过0地址与其通讯。

2、主机通过0地址向该设备发送get_device_descriptor标准请求,获取设备的描述符。目的是取得却缺省控制管道所支持的最大数据包长度,
  该长度包含在设备描述符的bMaxPacketSize0字段中,其地址偏移量为7,主机读取64字节,但实际不一定能读到,
  因为这时候还不知道一次能读取的最大长度,但是肯定能读到前8个字节,因为可能的值为(8,16,32,64).

3、主机再次向 HUB 发送请求,复位该PORT。

4、 主机通过标准请求 set_address给设备分配地址。

5、主机通过新地址向设备发送 get_device_descriptor标准请求,获取设备的描述符。

6、 主机通过新地址向设备发送其他 get_configuration请求,获取设备的配置描述符。

7、 根据配置描述符的wTotalLength字段(地址偏移为2,总共两个字节,即偏移地址3表示高8位,偏移地址2表示低8位),
  表示该配置描述符及其包含的接口描述符、端点描述符和供应商描述等的总长度。
  英文原文:Total length of data returned for thisconfiguration.Includes the combined lengthof all descriptors (configuration, interface,endpoint,
  and class- or vendor-specific)returned for this configuration.再次发送get_configuration请求,获取数据长度为wTotalLength。

8、根据配置信息,主机选择合适配置,通过 set_configuration请求对设备而进行配置。这时设备方可正常使用。

usb基础知识以及枚举过程介绍的更多相关文章

  1. USB基础知识概论(版本:v0.9.2)

    源: USB基础知识概论

  2. C# 基础知识 (四).C#简单介绍及托管代码

            暑假转瞬即逝,从10天的支教生活到1周的江浙沪旅游,在这个漫长的暑假中我经历了非常多东西,也学到了非常多东西,也认识到了非常多不足之处!闲暇之余我准备又一次进一步巩固C#相关知识,包含 ...

  3. Shiro基础知识08----拦截器介绍(转)

    1 拦截器介绍 Shiro使用了与Servlet一样的Filter接口进行扩展:所以如果对Filter不熟悉可以参考<Servlet3.1规范>http://www.iteye.com/b ...

  4. USB基础知识

    Q: USB是什么? A: USB是通用串行总线(Universal Serial Bus)的缩写. Q: USB的优点有哪些? A: ① 支持热插拔:(hot-plugging或Hot Swap)即 ...

  5. Android基础知识之API等级介绍

    原文:http://android.eoe.cn/topic/android_sdk :可以让开发者通过一个表示API级别的整数来描述程序在android平台上的兼容性,系统会将与系统本身提供的API ...

  6. USB2.0学习笔记连载(二):USB基础知识简介

    USB接口分为USB A型.USB B型.USBmini型.USBmicro型.USB3.0其中每种都有相应的插座和插头. 图1 图2 上图是USBA型接口,图1为插座,图2为插头.插座指向下行方向, ...

  7. pl/sql基础知识—pl/sql块介绍

    n  介绍 块(block)是pl/sql的基本成型单元,编写pl/sql程序实际上就是编写pl/sql块.要完成相对简单的应用功能,可能只需要编写一个pl/sql块:但是如果要想实现复杂的功能,可能 ...

  8. java基础知识代码-------枚举类型

    package com.mon10.day22; /** * 类说明 :枚举类型,案例二 * * @author 作者 : chenyanlong * @version 创建时间:2017年10月22 ...

  9. ######【Python】【基础知识】Python的介绍 ######

    Python 是一种面向对象.解释型计算机程序设计语言. Python是什么? Python(英国发音:/ˈpaɪθən/ 美国发音:/ˈpaɪθɑːn/), 是一种面向对象的解释型计算机程序设计语言 ...

随机推荐

  1. 【Luogu】【关卡2-7】深度优先搜索(2017年10月)【AK】【题解没写完】

    任务说明:搜索可以穷举各种情况.很多题目都可以用搜索完成.就算不能,搜索也是骗分神器. P1219 八皇后 直接dfs.对角线怎么判断:同一条对角线的横纵坐标的和或者差相同. #include < ...

  2. hdu 4300 拓展kmp

    题目大意: 输入样例个数,每个样例有两行,第一行是26个字母,分别代表a~z加密后的密文:第二行代表一串密文+明文,密文一定是完整的,但明文可能不完整,让你输出最短的(密文+明文): 基本思路: 拓展 ...

  3. leetcood学习笔记-21**-合并两个有序链表

    题目描述: 方法一: # Definition for singly-linked list. # class ListNode: # def __init__(self, x): # self.va ...

  4. SQL 查询子句

    SQL WHERE Clause(查询子句) WHERE 子句用于过滤记录. SQL WHERE 子句 WHERE子句用于提取满足指定标准的记录. SQL WHERE 语法 SELECT column ...

  5. 搭建单机版spark

    二.下载软件 JDK,Scala,SBT,Maven 版本信息如下: JDK jdk-7u79-linux-x64.gz Scala scala-2.10.5.tgz 三.解压上述文件并进行环境变量配 ...

  6. 杂项-Conda:Conda

    ylbtech-杂项-Conda:Conda 1.返回顶部 1. Conda 是一个开源的软件包管理系统和环境管理系统,用于安装多个版本的软件包及其依赖关系,并在它们之间轻松切换.   外文名:Con ...

  7. Openstack 中的消息总线 & AMQP

    目录 目录 消息总线 消息总线的原理 AMQP 消息总线 Openstack 采用了面向服务的开发模式(有别于面向对象和面向过程),需要我们去考虑各个服务之间和各项目之间是如何传递消息的. Restf ...

  8. 深入理解JAVA虚拟机原理之垃圾回收器机制(一)

    更多Android高级架构进阶视频学习请点击:https://space.bilibili.com/474380680 对于程序计数器.虚拟机栈.本地方法栈这三个部分而言,其生命周期与相关线程有关,随 ...

  9. 装箱与拆箱(TDB)

    装箱:把值类型转换为引用类型 拆箱:把引用类型转换为值类型 只能对之前装箱的变量进行拆箱.需要强制转换.

  10. 磁盘设备在 Linux 下的表示方法

    在 Linux 系统中磁盘设备文件的命名规则为: 主设备号 + 次设备号 + 磁盘分区号 对于目前常见的磁盘,一般表示为: sd[a-z]x 主设备号代表设备的类型,相同的主设备号表示同类型的设备. ...