基于Linux的USB子系统学习 --- ing


一、参考资料


  1.《USB基础知识概论》 

    http://www.crifan.com/files/doc/docbook/usb_basic/release/html/usb_basic.html

  2.《USB in a NutShell》

    http://www.beyondlogic.org/usbnutshell/usb1.shtml

  3.《USB开发大全(第四版)》

    http://download.csdn.net/download/qqqq419276485/7839403


二、USB基础知识


2.1 USB硬件知识


  从物理上的逻辑结构来说,USB设备包含了主机Host端设备Device端。其中,主机Host端,有对应的硬件的USB的主机控制器Host Controller;而设备端,连接的是对应的USB设备USB的主机控制器有四种类型,分别是OHCIUHCIEHCI,和xHCI,它们之间的区别和联系如下表所示。

基于Linux的USB子系统学习 --- ing_第1张图片

  USB2.0的标准接口引脚定义如下,包含一根电源线,一根地线,两根信号线。USB3.0的接口引脚较多,在此不再展开,可参考文章《USB 2.0 A型、B型、Mini和Micro接口定义及封装》 和《USB 3.0连接器引脚、接口定义及封装尺寸》。值得一提的是,目前多数手机厂商已宣布统一使用Micro USB接口作为手机充电器标准接口

基于Linux的USB子系统学习 --- ing_第2张图片


2.2 USB软件知识


  要使USB设备正常工作,除了硬件之外,还需要软件的支持。对于USB设备端来说,内部是需要有对应的设备端驱动,称其为固件Firmware,它实现了设备端USB所要做的事情,主要是相应一些标准的请求,完成对应的数据读取和写入等。对应的,在主机Host端,也需要对应的驱动,此部分驱动,不论是Linux下,还是Windows下,都已经实现了常见的驱动了,所以一般来说,很少需要驱动开发者再去写相关的驱动。

  在设备驱动开发阶段或者USB出现问题,需要调试的时候,往往就需要一些USB调试工具了。一般来说,都包含了对应的USB硬件测试工具,加上对应的软件工具,去捕获对应USB总线上的数据,即所谓的USB抓包,然后再去分析抓取出来的数据,是否是期望的,是否符合USB协议的规范定义。另外,当然也有一些USB开发相关的工具,具体工具可在网上查询。


三、USB协议概览


  关于USB 2.0和USB 3.0等USB的协议规范,可以去官网下载:

http://www.usb.org/developers/docs/

USB协议的文档页数很多,没必要看完整个USB标准。此处,就来简单以USB 2.0规范为例,分析一下,具体其都主要包含哪些内容。你会发现,其实和USB协议本身相关的内容,相对则不会那么多,大概只有97页左右的内容,是我们所要关心的。



附录1:USB 2.0标准协议规范笔记


第4章 架构概述


  本章显示了通用串行总线(Universal Serial Bus, USB)架构和重要概念的概述。USB是一种有线总线,支持主机计算机和大范围同时可访问的外设之间数据交互。附属的外设通过一种主机调度和基于令牌的协议共享USB带宽。总线允许外设在主机和其它外设在操作时依附,配置,使用和分离。

4.1 USB系统描述

  USB系统被描述为三种定义域:
 USB互连
 USB设备
 USB主机

  USB互连是USB设备和主机之间连接与通信的方式。包括下列部分:
 总线拓扑:USB设备与主机之间的连接模型。
 内层联系:In terms of a capability stack, the USB tasks that are performed at each layer in the system.
 数据流模型:系统中数据通过USB在产生者与消费者之间移动的方式。
 USB调度:USB提供了共享的内部连接。访问内部连接是被调度的,为的是支持同步数据传输并消除仲裁开销。

4.1.1 总线拓扑

  USB物理层内部连接是一种分层的星状拓扑。USB hub位于每个星的中心。图4-1阐述了USB的拓扑。

基于Linux的USB子系统学习 --- ing_第3张图片
  由于对于hub和线缆传播时间的所允许时间的约束,所允许最大的层次数是七层(包括root层)。由于七层的约束,主机和任何设备之间的一条通信线路中最多支持5个非root hub。如图4-1中的组合设备,占据了两层,因此如果依附在第七层,它不能被使能。在第七层,只有功能(即图中所表示的Func)可以被使能。



第5章 USB数据流模型


5.1 实现者视角

  图5-2显示了一个较深的USB视图,特别的,有四个重点实现区域:
 > USB物理设备:USB线尾端的一小块硬件,执行一些有用的终端用户功能。
 客户端软件:在主机端执行的软件,响应USB设备。这个客户端软件典型地由操作系统提供或伴随USB设备提供。
 USB系统软件:在特定操作系统中支持USB的软件。USB系统软件典型地由操作系统提供,独立于特定的USB设备或客户端软件。
 USB主机控制器(主机端总线接口):使得USB设备可以被连接到主机的硬件和软件。

基于Linux的USB子系统学习 --- ing_第4张图片
  如图5-2所示,主机到设备的简单连接需要许多层与实体之间的交互。USB总线接口层提供主机与设备间的物理/信号/数据包的连接性。USB设备层是USB系统软件具有的视角,为的是与设备间执行通常的USB操作。功能层通过一个恰当匹配的客户端软件层,向主机提供附加的能力。从层内视角来看,USB设备层和功能层都有一个逻辑上的通信,而实际上使用的是USB总线接口层来完成数据传输。


  物理视角的USB通信如章节6、7和8中所描述,与章节9和10所讲述的逻辑视角通信有关联。本章讲述这些影响USB实现者的关键概念,应该被所有人阅读。


  为了描述和管理USB通信,下列概念是重要的:
 > 总线拓扑:5.2讲述了USB主要的物理和逻辑组件,以及它们如何相互关连。
 > 通信流模型:5.3到5.8讲述了主机与设备间通过USB是如何通信的,定义了四种USB传输类型。
 > 总线访问管理:5.11讲述了主机内的总线访问是如何被管理的,以支持USB设备大范围的通信流。
 > 等时传输的特殊考虑:5.12讲述了USB对于需要等时数据传输设备的特殊性。对于非等时传输的设备实现着不需要阅读5.12。

5.2 总线拓扑


  USB拓扑有四个主要部分:
 > 主机与设备:USB系统的主要组件
 > 物理拓扑:USB单元如何连接
 > 逻辑拓扑:多种USB单元的角色和职责,从主机和设备视角来看USB如何呈现
 > 客户端软件到功能的关联:客户端软件同与它相关的USB设备上的功能接口之间的如何看待彼此

5.2.1 USB主机


  USB逻辑组成如图5-3所示,包含下列部分:
 USB主机控制器
 集成的USB系统软件(USB驱动,主机控制器驱动和主机软件)
 客户端

基于Linux的USB子系统学习 --- ing_第5张图片
   USB主机作为USB的协调实体占据了一个独特的位置。除了它特殊的物理层位置,主机对于USB以及他所附属的设备具有专门职责。主机控制所有对USB的访问。USB设备仅当被主句准许访问时才能获得对总线的访问。主机也负责监视USB的拓扑。主机以及职责的完整讨论,参考章节10。

5.2.2 USB设备


  USB物理设备的逻辑构成如图5-4所示,包含下列部分:
 > USB总线接口
 USB逻辑设备
 功能

基于Linux的USB子系统学习 --- ing_第6张图片
   USB物理设备对主机提供附加功能。USB设备提供的功能类型非常广泛。然而,所有的USB逻辑设备对主机呈现了相同的基本接口。这允许主机以相同的方式管理不同USB设备的USB相关方面。


  为帮助主机识别和配置USB设备,每个设备携带并报告配置相关信息。所报告信息的一部分对于所有逻辑设备是相同的。其它信息与设备提供的功能相关。这种信息的详细格式非常多,取决于设备的设备类。USB设备的完整讨论参考章节9。

5.2.3 物理总线拓扑


  USB上的设备物理上通过一个分层的星状拓扑连接,如图5-5中所阐述。USB依附点由一种被称为集线器(hub)的特殊USB设备类所提供。集线器提供的附加依附点被称为端口(port)。主机中嵌入的集线器被称为根集线器(root hub)。主机通过根集线器提供一个或多个依附点。提供给主机附加功能的USB设备被称为功能(function)。为了防止循环依附,分层的顺序被施加在USB的星形拓扑。

基于Linux的USB子系统学习 --- ing_第7张图片


5.2.4 逻辑总线拓扑


  当设备物理上依附到分层、星状拓扑的USB,主机与每个逻辑设备通信有如它是被直接连接到根端口的,如图5-7所示,对应于图5-5中所示的物理拓扑。集线器也是逻辑设备,但为了简化图没有在图5-7中显示。尽管绝大多数主机/逻辑设备活动使用这一逻辑视图,主机维护一个物理拓扑来支持移除集线器时的处理。当一个集线器被移除,所有依附于该集线器的设备必须从主机视角的逻辑拓扑中被移除。

基于Linux的USB子系统学习 --- ing_第8张图片

5.2.5 客户端软件到功能的关联


  尽管USB的物理和逻辑拓扑反映了总线的共享本性,但是客户端软件(CSw)操作USB功能接口被呈现为它只处理它感兴趣的接口。图5-8阐述了设备设计者视角的客户端软件与USB功能之间的关系。

基于Linux的USB子系统学习 --- ing_第9张图片

5.3 USB通信流

  USB提供了主机上软件与它的USB功能之间的通信服务。功能可以有针对不同的客户端到功能交互的不同的通信流需求。USB提供了更好的总体总线利用率,通过允许不同的通信流到USB功能的分隔。每个通信流利用一些访问的总线来完成客户端与功能之间的通信。每个通信流在设备上的一个端点被终止。设备端点被用于识别通信流。


  图5-9显示了图5-2的一个更为详细的视图。图5-2所支持的逻辑设备和功能层通信流的实际通信流的完整定义。这些实际通信流跨越几个接口边界。两个主机端的软件接口如下:
 > 主机控制器驱动(Host Controller Driver, HCD):USB主机控制器与USB系统软件之间的软件接口。这个接口允许一定范围内的主机控制器实现,而不需要所有的主机软件依赖于任何特定实现。一个USB驱动可以支持不同的主机控制器,而不需要主机控制器实现的特定知识。主机控制器是实现者提供一个HCD实现来支持主机控制器。
 > USB驱动(USB Driver, USBD):USB系统软件与客户端软件之间的接口。这个接口提供给客户端方便的函数来操作USB设备。

基于Linux的USB子系统学习 --- ing_第10张图片

  USB逻辑设备对于USB系统来讲是端点的集合。端点分组成端点集来实现一个接口。接口被视为功能。USB系统软件使用默认控制管道来管理设备。客户端软件使用管道束(与一个端点集相关联)操作一个接口。客户端软件请求数据通过USB在主机上的缓存和USB设备上的端点之间移动。主机控制器(或者是USB设备,取决于传输方向)打包数据通过USB移动数据。


  图5-10阐述了端点与主机端内存缓冲之间如何通过管道传递通信流的。

基于Linux的USB子系统学习 --- ing_第11张图片
   主机上的软件通过一个通信流集合与逻辑设备进行通信。通信流的集合被设备软件/硬件设计者选择来高效匹配设备的通信需求。


你可能感兴趣的:(USB)