前面学习了那么多的概念,这里需要记住一点分层概念即设备 ---> 配置 ---> 接口 ---> 端点,这种分层的概念结构 。 也可以理解为端点构成接口,接口组成配置,配置组成设备。

USB设备的枚举过程

  前面说过了,USB只是一种串行通信总线。也就是说USB是一种物理通信通道。但是实际中我们使用了各种各样的USB设备,如U盘,鼠标、键盘等。这些设备都是使用USB总线和主机(PC)进行通信的,但是主机却可以区分不同的设备,这里靠的就是,前面定义的描述符。当我们将USB设备接入主机后主机很快就能知道设备的属性并为其安装对应的驱动,其实在这之前,设备已经和主机进行了很多次数据交换了,这个过程就是枚举。开始了解枚举之前还有明白一个规则,每个USB设备都至少有一个端点即0,这个端点就是USB的控制端点,用来USB设备自己和主机主机间“协商”交换数据用。如端点地址 0x00表示控制输出端点地址,0x80表示控制输入地址。接下来看枚举过程:

  1. 首先当主机检测到设备插入后就会将USB设备复位,复位后的USB设备默认地址就是0,这样主机就可以用地址0作为设备地址进行通信了。
  2. 然后主机会向端点0发送获取设备描述符的建立过程,然后设备将在数据过程将设备描述符返回给主机,这里注意如果端点0的最大包长小于设备描述符,设备本应该分多次数据过程,但是主机只会读取第一次的数据,因此设备实际这个过程只需要一次数据过程即使一次无法将设备描述符全部传输。同时USB标准还规定端点0的最小包长至少是8,因为设备描述符的第八个字节就包含了端点0的最大包长,主机会根据这里的值,获取设备的端点0的最大包长。
  3. 然后主机会再一次对设备复位,然后发送给设备地址0一个设置地址的命令,地址包含在设置设备的建立过程中的数据包中。注意这个地址是由主机管理的(1~127)。设备收到这个命令后直接到状态过程,并在主机请求状态时返回一个长度为0 的状态给主机,如果主机回应了ACK给设备,设备在此之后就将启用这个地址。
  4. 然后主机使用新地址再次获取设备描述符,这次主机会多次读取设备描述符数据,直到读取完全部的设备描述符。
  5. 主机再获取配置描述符(设备返回配置描述符时需要将 配置描述符、接口描述符,类特殊描述符、端点描述符一起返回回去,而不能单独返回)。
  6. 然后是获取报告描述符(如果是HID设备会有这一步)。
  7. 这一部分不是必然的,设备会根据前面描述符提供的字符串索引获取字符串描述符,从而方便人们阅读设备的相关信息。

以上的这些过程都是使用的USB控制传输。

以上过程忽略了一个概念,就是USB标准请求,即获取描述符是怎么告诉设备的,也有一套标准通信规则如下表:

bRequest的命令码表

具体的请求命令帧组成,可以查阅USB标准文档。这里拿一个不完整的设备枚举过程展示一下设备的枚举过程,数据使用BusHound 软件抓包得到的。

//获取设备描述符
CTL    80 06 00 01  00 00 12 00
//设备返回设备描述符
IN     12 01 00 02  00 00 00 40  93 39 16 14  00 02 01 02  03 01
//先获取设备配置描述符的前9个字节  == 获取知配置描述符的总长度
CTL    80 06 00 02  00 00 09 00
//设备返回配置描述符的前9个字节  == 得知配置描述符的总长度为0x29(41个字节)
IN     09 02 29 00  01 01 00 c0  64
//获取全部配置描述符
CTL    80 06 00 02  00 00 29 00
//设备返回全部配置描述符其中还包括接口配置描述符和断点配置描述符(因为是HID设备还有一个HID设备配置描述符)
IN     09 02 29 00  01 01 00 c0  64 09 04 00  00 02 03 00  00 00 09 21  10 01 00 01  22 21 00 07  05 81 03 40   00 01 07 05  01 03 40 00  01
//设置配置值,配置描述符中有一个位置就是配置这个值的
CTL    00 09 01 00  00 00 00 00
//获取接口
CTL    21 0a 00 00  00 00 00 00
//获取HID设备配置描述符
CTL    81 06 00 22  00 00 61 00
//设备返回全部HID设备报告配置描述符
IN     05 8c 09 01  a1 01 09 03  15 00 26 00  ff 75 08 95  40 81 02 09  04 15 00 26  00 ff 75 08  95 40 91 02  c0   

上面大概说了一下设备的枚举过程,如果以上过程完成了即---在电脑中可以看到一个USB设备了,接下来就是完成对应的用户数据传送过程的应用逻辑代码的实现了,这个根据不同的设备包括自定义设备,这一部分除非是一些标准设备,否则你可以做的很有个性化,只要收发双方约定一个统一的标准规则就可以。但是需要记住的是如果你要使用USB进行数据的收发,配置描述符中应该包含一个非0端点的配置,因为端点0是仅用于控制传输的。具体的实现可以详细参考《圈圈教你玩USB(第二版)》一书。

参考:《圈圈教你玩USB(第二版)》

22:17:11 2019-06-04

转载于:https://www.cnblogs.com/w-smile/p/10970439.html

USB2.0协议学习笔记---USB工作过程(类的方法)相关推荐

  1. Zynq7000 USB2.0协议解析及USB控制器详解

    USB 2.0规范及控制器 文章目录 USB 2.0规范及控制器 USB2.0 Univerasl Serial Bus USB Host USB总线 接口标准 总线信号 USB拓扑结构 数据流模型 ...

  2. OAuth 2.0 协议学习笔记

    协议官网 在传统的客户端-服务器身份验证模型中,客户端通过使用资源所有者的凭据向服务器进行身份验证来请求服务器上的访问受限资源(受保护资源). 为了向第三方应用程序提供对受限资源的访问,资源所有者与第 ...

  3. Nhibernate 3.0 Cookbook学习笔记 利用XML映射类

    本文基于Nhibernate 3.0 Cookbook,下载地址:http://home.cnblogs.com/group/topic/42850.html 准备工作,下载Nhibernate:ht ...

  4. 【学习笔记】28、类的方法及参数介绍

    类的方法及参数介绍 初始化方法 在类被实例化的时候,有一个方法会被自动运行,这个方法就是"__init__(self)" (前后两个下划线). 这个方法主要用于在一个对象被实例化的 ...

  5. BC1.2协议以及QC2.0/3.0快充协议学习笔记

    BC1.2快充协议介绍 BC1.2定义 BC1.2 (Battery Charging v1.2)是USB-IF下属的BC(Battery Charging)小组制定的协议,主要用于规范电池充电的需求 ...

  6. Servlet和HTTP请求协议-学习笔记01【Servlet_快速入门-生命周期方法、Servlet_3.0注解配置、IDEA与tomcat相关配置】

    Java后端 学习路线 笔记汇总表[黑马程序员] Servlet和HTTP请求协议-学习笔记01[Servlet_快速入门-生命周期方法.Servlet_3.0注解配置.IDEA与tomcat相关配置 ...

  7. BGP协议学习笔记——BGP基础

    BGP协议学习笔记--BGP基础(BGP概念.BGP报文.BGP状态机.BGP关系建立.BGP路由通告) 说明:本文学习笔记整理自网络.华为公开产品文档.华为公开PPT及部分的自我理解 一.BGP简介 ...

  8. 极客HTTP协议学习笔记破冰篇(1-7)

    极客HTTP协议学习笔记破冰篇(1-7) 前言 各篇章笔记链接 一.学习笔记 1.HTTP的前世今生 2.HTTP是什么 3.与HTTP相关的各种概念(上) 4.与HTTP相关的各种概念(下) 5.常 ...

  9. AXI 总线协议学习笔记(4)

    引言 前面两篇博文从简单介绍的角度说明了 AXI协议规范. AXI 总线协议学习笔记(2) AXI 总线协议学习笔记(3) 从本篇开始,详细翻译并学习AXI协议的官方发布规范. 文档中的时序图说明: ...

  10. 计算机网络协议学习笔记

    title: "计算机网络协议学习笔记" url: "https://wsk1103.github.io/" tags: 学习笔记 OSI模型 开放式系统互联通 ...

最新文章

  1. python数据结构与算法分析_数据结构与算法(Python版)
  2. ftl不存在为真_FreeMarker 处理不存在的变量
  3. linux中的信号1——信号概述
  4. python 风玫瑰图_python之windrose风向玫瑰图的用法
  5. Java操作Oracle
  6. 机器学习1---基本概念
  7. 产品,是解决问题的载体
  8. 数据抽取oracle_【跟我学】特征抽取算法与应用
  9. 12306一直显示服务器忙,网购春运火车票首日 12306网站又现服务器忙
  10. lnmp安装tpshop
  11. 无法打开虚拟磁盘服务器,win2008R2 修改了带有快照的父虚拟磁盘;导致启动不了...
  12. 竞赛获奖系统解读:远场说话人确认中基于两阶段迁移学习解决域不匹配问题
  13. Hisat2-Stringtie-DESeq2复现Transcript-level expression analysis of RNA-seq experiments with ...
  14. 被迫改变生活方式对少数族群的微生物群和健康的影响
  15. 高中计算机教师专业,高中计算机教师资格证,要计算机专业证书吗
  16. springboot生成PDF文件返回给前台
  17. ProSpec BCA-1人重组 (CXCL13)说明书
  18. undeclared here (not in a function)
  19. 架构师们,怎么走着走着就变“烟囱”了呢? | 文末含福利
  20. Termux安装hydra

热门文章

  1. 铭瑄显卡不支持Linux,铭瑄主板bios设置显卡方法
  2. java和jsp交互 structs_Struts与jsp+javabean+servlet区别
  3. osg动态加载模型不显示_探索未知种族之osg类生物---渲染遍历之Renderer::draw()简介...
  4. 2018-CBAM论文讲解
  5. 无法为jsp编译类_《刺激战场》改名为《和平精英》,有2类玩家或可能无法登陆游戏...
  6. C语言——变量篇(一)变量关键字static、auto、extern、register
  7. 如何判定某个类的职责是否够“单一”?
  8. undefined reference to `sqlite3_column_table_name‘
  9. 实现二叉树的基本操作(Java版)
  10. webpack热更新和常见错误处理