USB概述

USB主控制器负责数据处理,USB根集线器(ROOT HUB)提供一个连接USB主控制器与USB设备之间的接口和通路。USB集线器(USB HUB)可以对原有的USB端口在数量上进行扩展。一个USB主控制器下面一定有一个USB根集线器,而USB根集线器下面可以有0个或多个USB集线器或USB设备。多个USB设备共享一个USB主控制器的带宽。所以一个USB根集线器下面连接了多个USB设备的系统,与一个USB根集线器下面只连接了一个USB设备的系统相比,后者USB设备将工作地更快。USB集线器中包括上行端口和下行端口(也称上游端口和下游端口),上行端口连接主机或集线器的下行端口,下行端口连接USB设备或集线器的上行端口。USB设备地址是7位,理论上一个USB主控制器下面可以接128个USB设备,地址范围为0~127,其中地址0作为刚接入系统的USB设备的默认地址。

一个具体的端点,只能工作在一种传输模式下。通常把工作在什么模式下的端点,叫做什么端点。例如,控制端点,批量(bulk)传输端点等。

USB一次传输(如一次bulk读)包括1个或多个事务,1个事务包括3个包:令牌包、数据包、握手包(等时传输没有)。USB传输包括控制传输、批量(bulk)传输、中断传输、等时传输。一次控制传输分为3个过程:建立过程、可选的数据过程、状态过程。这里只提建立过程和状态过程。建立过程为一个事务,其令牌包的类型为SETUP,数据包类型为DATA0,握手包类型为ACK(出错则不应答,而不能使用NAK或STALL来应答)。状态过程为一个事务,其令牌包类型为IN或OUT,其数据包类型为DATA1。低速和全速USB每隔1ms传输一帧,高速USB每隔125us传输一帧。每个帧以PID为SOF的令牌包作为起始包。每个帧可以容纳多个事务,注意事务中的令牌包的PID只能是IN、OUT或SETUP。

Windows USB设备驱动程序

USB设备驱动程序高度依赖USB总线驱动程序(在Windows系统中USB总线驱动程序是USBD.sys),而不直接使用HAL函数与硬件通信。USB设备驱动程序为了向其硬件设备发送一个请求,首先创建一个USB请求块(URB),然后把URB提交到USB总线驱动程序。例如,为了配置一个USB设备,USB设备驱动程序需要提交几个URB来读取各种描述符或发送命令,最后由总线驱动程序把请求送到总线上。

USB主控制器与其它I/O设备接口一样直接连接到系统总线(PCI总线)上。操作系统与USB主控制器通信使用I/O口或内存寄存器(即USB主控制器映射到I/O空间或内存空间,CPU通过I/O指令或内存访问指令与USB主控制器通信),通过普通的中断信号,系统可以接受USB主控制器的事件通知。USB主控制器连接一棵USB设备树。一种称为hub的设备作为其它设备的连接点。多个hub能以菊链方式连接,可以连接到USB规范中定义的最大深度。其它设备,如照相机、麦克风、键盘等等,直接连到hub上。为了精确地表达概念,USB使用术语function来描述非hub设备。

当一个USB设备第一次接入时,它使用默认的设备地址(为0)。然后,某个电子信号通知USB总线驱动程序有一个新设备插入总线,于是USB总线驱动程序找出一个未用的设备地址并发送一个控制事务告诉“0号设备”什么才是它的真实地址。这之后,设备就放弃使用默认地址0,而用真实地址来应答。

当客户程序通过USB管道发送或接收数据时,它首先调用Win32 API,调用最终将使function的驱动程序(即USB设备驱动程序)收到一个IRP。而驱动程序的工作就是把客户的请求引导到有正确端点的管道上。它把请求提交到总线驱动程序,总线驱动程序再把请求分解成多个事务(transaction),然后这些事务被送往总线。

与传统PC总线(如PCI总线)设备的驱动程序相比,USB设备驱动程序从不直接与硬件对话。相反,它仅靠创建URB(USB请求块)并把URB提交到USB总线驱动程序就可完成硬件操作。因而,在USB设备驱动程序的IRP_MN_START_DEVICE处理函数中,我们不需要写与硬件资源有关的代码,而只需要配置USB设备。

USB配置提供一个或多个接口,每个接口具有零个或多个端点描述符。接口描述符和端点描述符始终作为配置描述符的一部分返回,无法使用GET_DESCRIPTOR或SET_DESCRIPTOR请求直接访问接口描述符或端点描述符。接口可以包括备用设置(Alternate Setting),接口描述符中的bAlternateSetting字段用于在同一个接口中的多个描述符中进行切换,以实现在配置设备之后改变端点或它们的特性。接口的默认设置始终为备用设置0。

如果一个接口具有两个备用设置,则具有两个接口描述符。配置描述符后面是一个接口描述符,其中bInterfaceNumber和bAlternateSetting字段为0,然后是该设置的端点描述符,后跟另一个接口描述符及其关联的端点描述。第二个接口描述符的bInterfaceNumber字段也为0,但第二个接口描述符的bAlternateSetting字段为1。如下图所示:

如果接口仅使用端点0,则接口描述符后面不会紧接有端点描述符。在这种情况下,接口描述符中的bNumEndpoints字段必须设置为0。接口描述符永远不包括端点数量中的端点0。

USB协议与Windows USB设备驱动程序笔记相关推荐

  1. USB 协议分析之 HID 设备(转)

    USB 协议分析之 HID 设备 转载于:https://www.cnblogs.com/LittleTiger/p/10764891.html

  2. USB 协议分析之 HID 设备

    1. 简述 USB HID类是USB设备的一个标准设备类,包括的设备非常多.HID类设备定义它属于人机交互操作的设备,用于控制计算机操作的一些方面,如USB鼠标.USB键盘.USB游戏操纵杆等.但HI ...

  3. 5、USB协议学习:USB的枚举过程

    文章目录 枚举顺序 枚举过程 标准请求 bmRequestType bReqest 请求类型 GetDescriptor 设备描述符 设备描述符定义 获取设备描述符 返回设备描述符 配置描述符 配置描 ...

  4. 转-用Driver Studio工具包开发WDM型的USB设备驱动程序

    前文所提及的WDM驱动程序开发方法,笔者都曾尝试过.个人认为用DriverStudio开发工具包来开发USB驱动程序行之有效.其中的Driver Wizard是创建WDM驱动程序框架的一个很好的工具, ...

  5. USB U盘Linux mass_storage驱动学习笔记(1)

    学习博客地址:https://blog.csdn.net/fudan_abc 学习书名:<Linux那些事之我是USB> 看代码之前,我曾经认真的思考过这么一个问题,我需要关注的仅仅是dr ...

  6. 《Win7设备驱动程序开发》学习笔记

    <Windows 7 设备驱动程序开发>是美国Ronald D. Reeves著的一本关于WDF模型的Windows 驱动程序开发教程,适用于Win7和Win10.本文我学习该书的一些笔记 ...

  7. 通俗易懂的USB协议详解(转…

    原文地址:通俗易懂的USB协议详解(转载) 作者: Branchesss 转自东海的博客http://6xudonghai.blog.163.com/blog/static/3364062920086 ...

  8. 【Android车载系列】第8章 车载通信-USB协议代码实现

    1 USB协议 1.1 USB协议分层   上一篇已经简单介绍了USB协议的相关知识,其中的描述符较为重要,描述符成功返回,USB通信已经成功了一大半,具体描述符的知识点可以翻阅上一篇来了解.下面我们 ...

  9. 嵌入式USB开发系列(1):USB简介

    嵌入式USB开发系列(1):USB简介 文章目录 嵌入式USB开发系列(1):USB简介 1. USB的优势 2. USB协议标准 3. USB通信接口 声明 声明:USB资料网站 链接,相关协议和文 ...

最新文章

  1. 德勤发布《中国智能制造分析报告》
  2. [读书] Computer Vision: Algorithms and Applications
  3. TensorFlow模型持久化
  4. 牛客 - 牛妹的考验(AC自动机+dp)
  5. Linux压缩那些事
  6. 讲100个科学道理,不如做这些有趣的理科实验!
  7. 【VS开发】CTimeSpan类
  8. 去除NSLog时间戳及其他输出信息
  9. Cadence Orcad Capture CIS原理图数据库的基本使用方法与技巧图文教程
  10. 2021年国内四大 IoT 物联网平台选型对比综合评估报告
  11. 360粉碎文件可以恢复吗,如何恢复360强力删除的文件
  12. 他把科学,放进几代人的中二梦
  13. 被食者与食者系统matlab,捕食者与被捕食者模型——Logistic-Volterra
  14. 【数据结构】线性表之单向链表的八大基操
  15. HTML设置网站标题前的logo
  16. 渗透测试实战3——bulldog2靶机入侵
  17. 计算机组成原理简单模型机实验,CPU 与简单模型机设计实验
  18. 数据湖与数据仓库:主要差异
  19. Verilog初级教程(5)Verilog中的多维数组和存储器
  20. (更新时间)2021年5月18日 ASP.NET Core 笔试题

热门文章

  1. SWUST OJ916:吉姆的发现
  2. 领导又让我做可视化报告,找了几天,终于让我找到神器了
  3. 设计模式-Christopher Alexander说:
  4. 教你在文件夹名称插入文字重命名
  5. 【华为机试真题详解】小兔子繁殖详解
  6. 盛大陈天桥回首创业路:半夜醒来一身冷汗
  7. Leetcode每日一题386. 字典序排数
  8. 百度API提交Java版,让你的网站快速收录提高排名
  9. 黑暗之光(一)场景制作和素材的导入
  10. Web通用型漏洞简介