背景:

  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日

最新文章

  1. ELK——在 CentOS/Linux 把 Kibana 3.0 部署在 Nginx 1.9.12
  2. stack note
  3. Android权限安全(10)应用与设备绑定
  4. 编程之linux与win区别
  5. oracle日期时间函数总结
  6. HTML获取用户输入的几种玩法
  7. 使用MDK将STM32的标准库编译成lib使用
  8. linux下安装QT过程
  9. ASP.NET基础知识汇总之WebConfig各节点介绍
  10. Spring Boot JPA Entity Jackson序列化触发懒加载的解决方案
  11. opensuse 使用xx-net
  12. python笔记24-os模块
  13. mybatis中union可以用if判断连接,但是<select>中第一个select语句不能被if判断,因此可以从dual表中查询null来凑齐。union如果使用order by排序,那么只能放在最后一个查询语句的位置,并且不能带表名。
  14. SQLSERVER数据库调优
  15. 给tomcat配置外部资源路径(应用场景:web项目访问图片视频等资源)
  16. JAVA企业级应用TOMCAT实战
  17. Nginx:413 Request Entity Too Large
  18. C#编程(八十)---------- 异常类
  19. mmu裸机程序
  20. Firemonkey的几个特色属性(一)

热门文章

  1. Sublime Text以及Package Control安装方法
  2. Docker探索系列1之docker入门安装与操作
  3. 修改MySQL的默认数据存储引擎
  4. C#编写滤镜 图片色调取反效果(Invert)
  5. Javascript 与正则表达式
  6. HTML5预学习 长期更新
  7. js005-引用类型
  8. 用css进行布局
  9. tomcat十大安全优化措施
  10. spark geoip