USB 数据流模型
本章介绍如何通过 USB 传输数据的信息。本章中的内容影响所有实现者。所呈现的内容处于系统的信令和协议定义之上的级别。
有关 USB 系统各自部分的更多详细信息,请参阅第 7 章和第 8 章。本章提供了第 9 章至第 11 章中进一步扩展的框架信息。
所有实现者都应阅读本章,以便了解 USB 的关键概念。
5.1 实现者视角
USB 提供主机与连接的 USB 设备之间的通信服务。然而,终端用户看到的将一个或多个 USB 设备连接到主机的简单操作(如图 5-1 所示)实际上比图中显示的实现方式要复杂一些。
虽然用户只需简单地将设备插入主机,但在幕后需要支持许多关键的功能和概念,才能实现现代 PC 所需的可靠性。
从不同实现者的角度看系统需要不同的视角,以解释特定 USB 要求。为了向终端用户提供可靠的操作(这是现代个人电脑所要求的),必须支持几个重要的概念和功能。
为了便于解释,同时让具体 USB 产品的实现者能够专注于与其产品相关的细节,USB 被以分层的方式呈现。
为了解决这种复杂性,USB 的设计采用了分层的架构,这种分层方法不仅便于说明 USB 的原理,还使得不同开发者可以专注于与自己产品相关的部分,而无需理解整个系统的细节。
图5-2展示了USB的深层次概述,标识了系统中不同的层次结构,后续的规范将对这些层次进行更详细的描述。特别地,有四个重点实现区域:
- USB物理设备(USB Physical Device):指的是连接到USB线缆末端的硬件,执行某种有用的用户功能。
- 客户端软件(Client Software):指的是在主机上执行的软件,它与USB设备相对应。通常,这类客户端软件由操作系统提供,或者与USB设备一起提供。
- USB系统软件(USB System Software):指的是在特定操作系统中支持USB的相关软件。USB系统软件通常由操作系统提供,与特定的USB设备或客户端软件无关。
- USB主机控制器(USB Host Controller, Host Side Bus Interface):指的是允许USB设备连接到主机的硬件和软件。
这四个USB系统组件之间有共同的权限和责任。接下来的规范将详细描述如何支持功能和其客户端之间的可靠通信流。
在USB 2.0规范中,USB系统被分为四个主要的组成部分,每个部分在USB的通信和功能实现中扮演着至关重要的角色。这些组成部分分别为:USB物理设备、客户端软件、USB系统软件、USB主机控制器。
-
USB物理设备(USB Physical Device):
- 这是用户通过USB接口进行交互的硬件设备。它通常会执行某种具体功能,如键盘、鼠标、存储设备等。例如,一台USB闪存驱动器就是一个USB物理设备,它通过USB连接到计算机进行数据交换。
- USB物理设备的关键特性是能够通过USB协议与主机进行数据交换,完成设备的连接与通讯。
-
客户端软件(Client Software):
- 客户端软件是指运行在主机(如计算机)上的应用程序或驱动程序,它与USB设备进行交互。客户端软件的作用是向操作系统报告设备状态,并通过设备实现用户所需的功能。例如,USB设备驱动程序就是客户端软件的一种形式。
- 客户端软件通常由操作系统提供,或者作为USB设备的附带软件来安装。没有适当的客户端软件,USB设备可能无法在主机上正常工作。
-
USB系统软件(USB System Software):
- USB系统软件通常指的是操作系统中的内核部分,专门处理USB设备与操作系统之间的通信。它负责设备的识别、资源分配、数据传输等低级操作。
- 系统软件提供了一种统一的接口,使得用户和应用程序不必直接处理硬件细节,而是通过操作系统提供的抽象层来访问USB设备。
- 这部分软件一般由操作系统厂商提供,它支持各种USB设备,而不需要知道具体的设备类型或客户端软件。
-
USB主机控制器(USB Host Controller):
- 主机控制器是硬件和软件的结合体,负责管理USB总线的所有通信。它位于主机端,提供了与USB设备的接口,使得设备能够接入系统。
- USB主机控制器负责管理数据的传输、设备的连接与断开、以及总线上的电源管理。它通常由计算机或其他主机的硬件提供,同时也有相应的软件驱动支持。
- 主机控制器可以分为两种类型:根集线器控制器(Root Hub)和外部集线器控制器(External Hub Controller),这些控制器能够同时管理多个USB设备的连接。
正如图 5-2 所示,主机与设备的简单连接需要多个层和实体之间的交互。
USB总线接口层提供主机(Host)与设备(Device)之间的物理
、信号
和数据包
连接。
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节。
-
USB架构概述
USB(通用串行总线)通信系统由多个层次组成,其中每一层都起着特定的作用。这些层次的相互作用确保数据能够从主机传输到设备,并反向传输。- USB总线接口层:提供物理连接以及信号和数据包的传输。这一层处理USB物理层面的数据传输,包括电气信号、时钟和数据包的传输格式。
- USB设备层:是USB系统软件在与设备进行交互时的抽象视图。USB设备层提供了一些基本的操作和协议,例如设备的初始化、数据交换等,供主机系统调用。
- 功能层:这一层通过设备驱动程序提供给主机更多的功能。功能层通常与特定的硬件功能相关,比如存储设备、输入设备等,它是设备的应用接口。
-
物理与逻辑通信
USB通信的物理层(如电气信号和数据传输)与逻辑通信层(如数据的打包、解析和传输协议)是相互依赖的。两者之间的协调确保了数据的正确传递。 -
主要概念
以下是学习USB相关规范时需要理解的几个关键概念:-
总线拓扑(Bus Topology):USB的物理和逻辑结构,定义了主机和设备的连接方式、如何通过多个设备进行通信等。在USB系统中,主机是中心设备,设备通常连接到主机或通过集线器连接。总线拓扑确保数据流能够在系统中正确传输。
-
通信流模型(Communication Flow Models):USB支持不同类型的数据传输方式,具体包括控制传输、批量传输、同步传输和等时传输。每种类型的传输有不同的特点和适用场景,决定了如何在主机和设备之间交换数据。
- 控制传输:用于发送命令或查询设备状态。
- 批量传输:用于传输大量数据,通常用于存储设备等应用。
- 同步传输:用于实时数据传输,要求数据以固定的速率和时序到达。
- 等时传输:用于对延迟敏感的应用,如音频和视频流。
-
总线访问管理(Bus Access Management):为了确保多个设备能公平地访问总线,总线访问需要管理。这包括在多个设备之间分配带宽、避免冲突等,确保高效的资源利用。
-
对等时传输的特殊考虑(Isochronous Transfers):对于需要等时传输的设备(如音频、视频设备),USB规范对其有特殊的支持。例如,等时传输必须保证数据的及时交付,确保实时流的质量。非等时传输设备不需要特别关注这些细节。
-
5.2 总线拓扑 (Bus Topology)
USB 2.0系统的拓扑结构包括四个主要部分:
-
主机和设备 (Host and Devices):
- 这是USB系统中的基本组成部分。主机(Host)是控制和管理系统的中心,而设备(Device)是连接到主机并提供特定功能的终端。主机和设备通过USB总线进行通信。
-
物理拓扑 (Physical Topology):
- 物理拓扑描述了USB元素如何连接在一起。这包括主机、集线器、设备等如何通过物理连接形成一个网络。它定义了USB端口、连接线和电气标准。
-
逻辑拓扑 (Logical Topology):
- 逻辑拓扑指的是USB各个元素在操作系统中的角色和责任。这是从主机和设备的角度来看USB系统如何组织的。它决定了数据传输和设备管理的方式。
-
客户端软件与功能关系 (Client Software-to-function Relationships):
- 这个部分描述了客户端软件与USB设备之间的交互方式。客户端软件通过USB设备的功能接口进行通信和控制,涉及到操作系统如何识别和处理设备的功能。
5.2.1 USB 主机 (USB Host)
USB主机的逻辑组成在图5-3中有所展示,包含以下部分:
-
USB主机控制器 (USB Host Controller):
-
汇总USB系统软件 (Aggregate USB System Software):
-
客户端 (Client):
主机在USB系统中占据了一个独特的角色,不仅具有特殊的物理位置,还承担着多个关键责任:
-
控制访问权限:USB总线的所有访问权限必须由主机控制。设备只能在主机的允许下才能向总线请求或获得数据传输的机会。主机决定哪些设备能够进行数据通信,以及何时进行通信。
-
监控拓扑结构:主机负责监控USB的拓扑结构,确保设备和连接的管理。拓扑结构的变化(例如设备的插入和移除)会由主机进行管理和响应。
-
设备的管理和协调:主机不仅负责访问控制,还要协调和管理USB设备的工作,确保各个设备按要求正确工作。
5.2.2 USB 设备 (USB Devices)
USB物理设备的逻辑组成如图5-4所示,包含以下几个部分:
- USB总线接口:这是设备与主机连接的物理和逻辑接口。通过这个接口,设备与主机交换数据和命令。
- USB逻辑设备:这是设备在USB协议栈中呈现给主机的抽象层,它包含了设备如何与主机进行通信和交互的定义。
- 功能:这是设备所实现的具体服务或操作。例如,一个USB键盘的功能是输入文本,一个USB存储设备的功能是存储和传输文件。
USB物理设备为主机提供附加功能。USB设备提供的功能种类繁多。然而,所有USB看作逻辑设备后向主机呈现相同的基本接口。这使得主机可以以相同的方式管理不同USB设备的USB相关部分。
为了帮助主机识别和配置USB设备,每个设备都携带并报告与配置相关的信息。一些报告的信息在所有逻辑设备中都是共同的,其他信息则是设备提供的特定功能所特有的。这些信息的详细格式取决于设备的设备类(Device Class)。
有关USB设备的完整讨论,请参考第9章。
5.2.3 物理总线拓扑(Physical Bus Topology)
USB 设备通过层级星型拓扑结构(tiered star topology)与主机(host)连接,正如图 5-5 所示。USB 连接点由一种特殊类别的 USB 设备提供,这种设备称为 集线器(hub)。
集线器提供的附加连接点称为 端口(ports)。主机包含一个嵌入式集线器,称为 根集线器(root hub),并通过根集线器提供一个或多个连接点。提供额外功能的 USB 设备称为 功能设备(functions)。
为了防止出现环形连接(circular attachments),USB 强制规定了层级顺序,这种层级顺序构成了 USB 星型拓扑的树形结构。如图 5-5 所示。
多个功能设备可能被打包成一个看起来像单一物理设备的形式。例如,一个键盘和一个轨迹球可能被组合成一个设备。在这个设备内部,单独的功能设备会永久连接到一个集线器,并且是这个内部集线器通过 USB 连接的。
当多个功能设备与一个集线器组合在一起时,它们被称为 复合设备(compound device)。该集线器和每个连接到集线器的功能设备都会分配独立的设备地址。
但复合设备本身作为一个整体只有一个设备地址。从主机的角度看,复合设备就像是一个有多个功能连接的独立集线器。图 5-5 也展示了复合设备的示例。
-
层级星型拓扑:
- USB 的物理拓扑采用层级星型结构,其中主机通过根集线器(root hub)连接其他设备。每个集线器提供多个端口,可以让多个设备连接到同一个集线器。这种星型结构可以有效地管理多个设备,并且通过树形拓扑结构避免环形连接的问题(即设备之间的循环依赖)。
-
根集线器与集线器:
- 根集线器(Root Hub) 是内嵌在主机中的集线器,提供主机与外部 USB 设备连接的基本接口。根集线器本身就像是一个集线器,连接到更多的设备。
- 集线器(Hub) 是一个 USB 设备,用于扩展连接端口,允许多个设备共享一个 USB 端口。每个集线器有多个端口,用于连接其他设备或更多的集线器。
-
复合设备:
- 复合设备(Compound Device):通常是一个集线器和多个功能设备的组合。集线器和每个功能设备都有独立的设备地址。可以将复合设备看作是一个集线器,提供多个功能设备连接。它包含多个接口,这些接口通常用于提供多个独立的功能。尽管有多个功能,它们共享一个设备地址。常见的复合设备包括带有多个功能的设备,如同一个 USB 设备中包含了键盘、鼠标、扬声器等多个接口。
-
设备地址:
- 在 USB 中,每个设备都需要一个唯一的设备地址。当多个功能设备和一个集线器组合在一起时,复合设备的每个功能设备可能会有单独的地址,而复合设备本身则拥有一个单一的设备地址。
集线器在高速系统中扮演着特殊的角色。集线器将全速/低速信号环境与高速信号环境隔离开来。图5-6展示了一个在高速模式下工作的集线器,它支持一个高速设备的连接。集线器还允许USB 1.1版本的集线器连接并以全速/低速运行,同时也能支持其他仅支持全速/低速的设备。主机控制器也直接支持连接仅支持全速/低速的设备。第11章详细描述了集线器如何实现这两种信号环境的隔离。
每个高速工作中的集线器本质上会增加一个(或多个)额外的全速/低速总线;即每个集线器支持额外的(可选的多个)12 Mbps的USB全速/低速带宽。这允许更多的全速/低速总线连接,而不需要在系统中添加额外的主机控制器。尽管可以有多个12 Mbps的全速/低速总线,但每个主机控制器最多只能连接127个USB设备。
- 集线器的作用:集线器不仅用于连接多个设备,还承担着隔离不同速度信号的责任。具体来说,集线器将高速(480 Mbps)设备的信号与全速(12 Mbps)和低速(1.5 Mbps)设备的信号环境隔离开。
- 支持多种设备类型:一个高速集线器可以同时支持连接高速设备和全速/低速设备,后者通过USB 1.1集线器或者直接由主机控制器来支持。
- 扩展总线带宽:每个高速集线器可以通过增加额外的全速/低速总线来扩展设备连接数量,进而提高系统连接的灵活性。每条全速/低速总线可以支持12 Mbps的带宽。
- 主机控制器的限制:尽管可以有多个全速/低速总线,系统中每个主机控制器最多只能支持127个USB设备。这是USB的设备连接数量上限。
5.2.4 逻辑总线拓扑 (Logical Bus Topology)
虽然设备物理连接到 USB 总线时采用的是分层星形拓扑,主机与每个逻辑设备进行通信时,会将这些设备视为直接连接到根端口。
这样形成了图 5-7 中所示的逻辑视图,图中对应于图 5-5 中所示的物理拓扑。
集线器(Hub)也是逻辑设备,但为了简化图示,在图 5-7 中没有显示。
尽管大多数主机与逻辑设备的交互使用的是逻辑视角,但主机仍然保持对物理拓扑的感知,以支持处理集线器的移除。
当集线器被移除时,所有连接到该集线器的设备也必须从主机的逻辑拓扑视图中移除。关于集线器的更详细讨论可以在第 11 章找到。
5.2.5 客户端软件与功能的关系 (Client Software-to-function Relationship)
即使 USB 的物理和逻辑拓扑反映了总线的共享特性,操作 USB 功能接口的客户端软件(CSw)只会看到它所关心的接口。USB 功能的客户端软件必须通过 USB 软件编程接口(USB Software Programming Interfaces)来操作其功能,而不是像其他总线(如 PCI、EISA、PCMCIA 等)那样直接通过内存或 I/O 操作来访问。
这意味着在运行时,客户端软件应该独立于 USB 上可能连接的其他设备。这样,设备设计师和客户端软件开发者就可以专注于硬件与软件交互的设计细节。
图 5-8 展示了设备设计师在图 5-7 中的逻辑拓扑视图中,客户端软件与 USB 功能之间关系的一个视角。
USB 总线在物理层面上采用的是分层星形拓扑(tiered star topology),这意味着设备通过集线器(Hub)连接到主机,而集线器则将多个设备集中到一个 USB 端口。这是 USB 的物理连接方式。
但在逻辑层面上,主机与每个设备通信时会视它们为直接连接到根端口的设备。即便设备在物理上通过集线器连接,主机并不直接感知到这些集线器的存在。主机只关心每个设备,认为它们与根端口直接连接。
然而,集线器作为逻辑设备并不会显示在主机的逻辑视图中,目的是简化图示。尽管如此,主机仍然保持对物理拓扑的感知。当一个集线器被移除时,所有通过该集线器连接的设备也会从主机的逻辑视图中消失。这种方式确保主机能够正确地处理设备的插拔事件。
关于集线器的处理方式会在后面的章节中进一步讨论。
-
逻辑与物理拓扑的区别
USB 的物理拓扑是分层星形的,而在逻辑拓扑中,主机视设备为直接连接到根端口的设备。
集线器是物理上重要的设备,但在逻辑拓扑中,它们并不显式显示,简化了设备管理。 -
客户端软件的独立性
客户端软件通过 USB 提供的编程接口来操作设备,不需要直接控制硬件。这种设计使得软件与其他设备的连接保持独立,便于开发与维护。 -
集线器的管理
集线器被视为逻辑设备,移除集线器时,所有通过集线器连接的设备也必须从主机的逻辑视图中移除。
这保证了系统在集线器移除时能够正确地处理设备的移除。
5.3 USB 通信流 (Communication flow)
USB提供了主机上的软件和其USB设备之间的通信服务。不同的功能可能在与客户端的交互中有不同的通信流需求。
USB通过允许将不同的通信流分离到USB功能中,从而提供了更好的总线利用率。
每个通信流都需要一些总线访问来完成客户端与功能之间的通信。每个通信流在设备的端点(endpoint)上终止。设备端点用于识别每个通信流的不同方面。
图5-9展示了图5-2的更详细视图。图5-2中的实际通信流的完整定义支持了逻辑设备和功能层的通信流。这些实际的通信流跨越多个接口边界。
第6至第8章描述了USB“线缆”的机械、电气和协议接口定义。第9章描述了USB设备编程接口,该接口允许从主机端操作USB设备。
第10章描述了两个主机端软件接口:
- 主机控制器驱动程序(HCD):是主机控制器与USB系统软件之间的软件接口。该接口允许支持多种主机控制器的实现,而无需要求所有主机软件依赖于特定的实现。一个USB驱动程序可以支持不同的主机控制器,而无需了解主机控制器的具体实现。主机控制器的实现者提供一个HCD实现来支持主机控制器。
- USB驱动程序(USBD):USB系统软件与客户端软件之间的接口。该接口为客户端提供了方便的函数,用于操作USB设备。
一个 USB 逻辑设备对 USB 系统表现为一组端点。端点被分组为端点集合,这些集合实现了一个接口。
接口是对设备功能的一个视图。USB 系统软件通过默认控制通道(Default Control Pipe)来管理设备。
客户端软件通过管道集合(与端点集合关联)来管理接口。客户端软件请求在主机上的缓冲区和 USB 设备上的端点之间通过 USB 移动数据。
主机控制器(或 USB 设备,取决于传输方向)将数据打包成数据包以便在 USB 上传输。主机控制器还协调何时使用总线访问,以便将数据包通过 USB 移动。
USB为主机和USB设备之间的软件提供了通信服务。USB通信通过不同的通信流进行区分,每种通信流通过不同的方式与设备的端点进行交互。
设备的端点用于标识每个通信流的特征。USB设备通常由多个端点组成,每个端点对应一种特定的通信流。
USB系统中,通信流通过USB“线”(USB总线)跨越多个接口边界进行。USB系统软件通过控制管道(Default Control Pipe)管理设备,而客户端软件则通过管道集(Pipe Bundles)管理接口。
每个通信流都与设备上的某个端点进行交互,数据在主机和设备之间传输时需要被分组(packetized)并通过总线进行传输。
在主机端和设备端的软件接口中,有两个关键的组件:
- Host Controller Driver (HCD):主机控制器(主机内嵌的USB设备集成根集线器)与USB系统软件(操作系统提供)之间的接口,提供一种抽象层,使得USB驱动程序可以支持不同的主机控制器,而不依赖于具体的硬件实现。
- USB Driver (USBD):USB系统软件(操作系统提供)和客户端软件(USB物理设备的驱动程序等)之间的接口,提供了管理USB设备的便利函数。
USB设备从逻辑(逻辑拓扑的角度)上看,实际上是由多个端点集合组成,每个端点集实现一个接口。客户端软件通过这些接口来操作USB设备的数据传输。
图5-10说明了如何在端点和主机端内存缓冲区之间的管道上承载通信流。以下部分更详细地描述端点、管道和通信流
主机上的软件通过一组通信流与逻辑设备通信。设备软件/硬件设计者选择通信流集,以有效地将设备的通信要求与USB提供的传输特性相匹配。
5.3.1 设备端点(Device Endpoint)
端点是USB设备中一个独特的可识别部分,负责主机和设备之间通信流的终点。每个USB逻辑设备(从逻辑拓扑的角度看)由一组独立的端点组成(端点集)。
每个逻辑设备在设备连接时由系统分配一个唯一的地址。
设备上的每个端点在设计时都会被分配一个唯一的、由设备决定的标识符,称为端点号
。
每个端点都有一个设备决定的数据流方向。设备地址
、端点号
和数据流方向
的组合可以唯一地引用每个端点。
每个端点是单向连接,支持数据单向流动:即输入(从设备到主机)或输出(从主机到设备)。
端点有一些特性,决定了端点与客户端软件之间所需的传输服务类型。端点通过以下特性来描述自己:
- 总线访问频率/延迟要求
- 带宽要求
- 端点号
- 错误处理行为要求
- 端点能够发送或接收的最大数据包大小
- 端点的传输类型(参见5.4节获取详细信息)
- 数据传输方向(设备与主机之间的方向)
除了端点号为零的端点外,在配置之前,设备上的其他端点处于未知状态,主机在配置之前无法访问这些端点。
-
端点(Endpoint):
- 在USB协议中,端点是数据通信的基本单元。每个USB设备可以有多个端点,这些端点的作用是与主机进行数据交换。
- 每个端点都有一个 端点号(Endpoint Number),这个编号在设备设计时分配,并且设备和主机通过这个编号来识别和管理端点。
-
数据流方向:
- 每个端点都有明确的数据流方向,通常有两种方向:
- 输入端点(IN):数据从设备传输到主机。
- 输出端点(OUT):数据从主机传输到设备。
- 这意味着每个端点要么只接收数据,要么只发送数据。
- 每个端点都有明确的数据流方向,通常有两种方向:
-
端点的特性:
- 访问频率/延迟要求:不同类型的端点可能会有不同的实时数据传输要求。比如某些端点可能需要低延迟的高频访问,而其他端点可能允许较长时间的延迟。
- 带宽需求:每个端点会规定它的带宽需求,例如数据传输速率、每次传输的数据量等。
- 最大数据包大小:端点有最大数据包大小的限制,这取决于设备的设计和端点的类型。超出最大数据包大小的数据需要分多个包进行传输。
- 传输类型:USB端点有不同的传输类型,如控制传输、批量传输、同步传输和中断传输(具体细节请参考5.4节)。
- 错误处理行为:不同类型的端点可能有不同的错误处理策略,例如超时重试、数据丢失处理等。
-
端点配置:
- 在USB设备连接到主机后,设备的端点初始状态是“未知”的,必须先进行 端点配置,才能开始通信。端点0通常用于设备的控制传输,因此它在配置之前是可以被访问的,而其他端点需要配置后才能使用。
-
端点的作用:
- 端点在USB通信中扮演着至关重要的角色,它们负责接收和发送数据,确保数据的有序流动。每个端点只支持单向通信,因此设备和主机之间的通信流是通过多个端点来实现的,主机和设备之间的所有数据交换都依赖于这些端点。
5.3.1.1 端点号为零的端点要求 (Endpoint Zero Requirements)
所有USB设备都必须实现一个默认控制方法,这个方法使用端点号为0的输入和输出端点。
USB系统软件使用这个默认控制方法来初始化并通用地操作逻辑设备(例如,配置逻辑设备),这个控制方法被称为默认控制管道(Default Control Pipe)(参见5.3.2节)。
默认控制管道提供对设备配置的访问,并允许对USB设备进行通用的状态和控制操作。默认控制管道支持按照5.5节定义的控制传输。
端点号为零的端点在设备连接、供电并接收到总线复位后总是可以访问的。
对于能够在高速模式下操作的USB设备,必须至少支持全速模式下的操作。当设备连接到工作在全速模式下的集线器时,设备必须:
- 能够在全速模式下成功复位
- 成功响应标准请求:如
set_address
、set_configuration
、get_descriptor
(获取设备和配置描述符),并返回适当的信息
该设备在全速模式下可能无法支持其高速模式下的预期功能。
5.3.1.2 端点号非零的端点要求 (Non-endpoint Zero Requirements)
设备可以根据其实现需求,额外支持更多的端点。低速设备的端点数量除了实现默认控制管道所需的两个端点外,最多可以有两个可选端点。
全速设备可以拥有更多的端点,这些端点的数量仅受到协议定义的限制(即最多可以有15个额外的输入端点和15个额外的输出端点)。
非默认控制管道的端点必须等到设备配置过程正常完成后,才能使用(详见第9章)。
-
端点零(Endpoint Zero)要求
-
默认控制管道(Default Control Pipe)
所有USB设备必须实现端点号为0的输入和输出端点,这个端点用于设备的初始化、配置和管理。
默认控制管道允许USB系统软件进行设备的通用操作,例如获取设备配置和控制设备的状态。 -
设备复位后,端点零总是可用
设备连接到主机并且总线复位后,端点零会自动启用。USB设备在启动后会通过该管道进行基本的设备识别和初始化工作。 -
全速和高速设备的兼容性:
- 对于支持高速(High-Speed)模式的USB设备,设备在全速(Full-Speed)模式下依然必须能够正常工作,尤其是在连接到全速集线器时。
- 这些设备需要支持一些标准请求,如设置设备地址、设置设备配置、获取设备描述符等。虽然在全速模式下设备可以工作,但其高速模式下的功能可能无法完全支持,主要取决于设备的设计。
-
-
非端点零的要求
-
设备的额外端点:USB设备除了端点零外,还可以有其他端点。这些端点的数量和类型会根据设备的需求和协议的规定来决定。例如,低速设备只能有2个可选端点,而全速设备最多可以有15个输入端点和15个输出端点。
-
配置过程中的端点使用限制:
- 非端点零的端点不能在设备配置完成之前使用。配置过程是指设备和主机之间完成一系列的协商,以使得设备能够正常工作。在这之前,设备的其他端点无法进行数据传输。
-
5.3.2 管道(Pipes)
USB管道是设备端点与主机软件之间的关联。管道表示通过内存缓冲区和设备端点之间传输数据的能力。管道有两种互斥的通信模式:
- 流模式(Stream):通过管道传输的数据没有USB定义的结构。
- 消息模式(Message):通过管道传输的数据具有某种USB定义的结构。
USB本身不会解析通过管道传输的数据内容。即使消息管道要求数据按照USB定义的结构组织,USB仍然不会解析数据的内容。
此外,管道具有以下属性:
- 对USB总线访问和带宽使用的占用。
- 数据传输类型。
- 关联的端点特性,如方向性(数据流向)和最大数据有效负载大小。数据有效负载是指在总线事务的数据包中携带的数据字段(如第8章定义的)。
由两个端点(端点号为0)组成的管道称为“默认控制管道”(Default Control Pipe)。一旦设备上电并收到总线复位,默认控制管道总是可用。
其他管道在USB设备配置时创建。默认控制管道用于USB系统软件确定设备识别和配置要求,并配置设备。设备配置后,设备特定的软件也可以使用默认控制管道。
在USB协议中,“管道”(Pipe)是指主机和USB设备之间的一种数据传输通道。每个管道都与设备的一个端点相关联,通过该管道,数据可以在主机和设备之间传输。
管道的主要作用是提供一个用于数据传输的接口,它连接了主机软件和设备端点。
-
管道的两种通信模式
- 流模式(Stream):这种模式下,通过管道传输的数据是一个连续的字节流,USB协议本身不对数据进行任何结构化的定义。流模式适用于那些不要求数据格式化或结构化的应用。
- 消息模式(Message):这种模式下,数据通过管道传输时,数据需要遵循USB协议规定的结构和格式。虽然USB定义了数据格式,但是USB本身不对数据内容进行解析,只是传输这些已定义格式的数据。消息模式通常用于需要特定数据结构的应用。
-
管道的特点
- 带宽占用和总线访问权:每个管道都占用一定的USB总线带宽。在USB通信中,不同的管道具有不同的带宽要求,这取决于设备和应用的需求。
- 传输类型:管道的传输类型决定了数据传输的方式。USB协议中有不同类型的传输方式,例如控制传输、批量传输、中断传输和等时传输等。
- 端点特性:每个管道都与一个特定的设备端点相关联。端点的方向(数据是从主机到设备,还是从设备到主机)和最大数据有效负载大小(每次数据传输的最大字节数)是管道的重要特性。
-
默认控制管道(Default Control Pipe)
- 默认控制管道是一个特殊的管道,它连接到设备的端点0。每当USB设备上电并经历总线复位后,这个管道会自动可用。
- 该管道用于设备的初始化、配置和识别。USB主机通过这个管道与设备交换信息,确定设备类型、配置要求等。
- 一旦设备配置完成,主机软件可以继续使用默认控制管道与设备进行通信。
- 默认控制管道是每个USB设备都必须支持的,因为它是设备识别和配置的关键部分。
-
USB管道的类型和应用
- 管道的选择与USB设备的功能密切相关。例如,一个USB打印机可能会使用控制管道来进行初始化和配置,而数据传输可能会通过批量管道(Bulk Pipe)或中断管道(Interrupt Pipe)来进行。
- 设备在进行传输时,管道会根据其传输类型选择不同的传输模式。例如,中断管道通常用于低延迟的通信(如鼠标或键盘输入),而批量管道用于大容量的数据传输(如文件传输)。
软件保持“拥有”默认控制管道并调解其他客户端软件使用该管道。
软件客户端通常通过I/O请求包(IRP)请求数据传输到管道,然后等待或在传输完成时接收到通知。IRP的细节在操作系统中有特定的定义。
本规范使用该术语来表示客户端要求在主机和设备端点之间以适当的方向移动数据的可识别请求。软件客户端可以使一个管道返回所有未完成的IRP。
软件客户端在与其关联的总线事务成功完成或由于错误而完成时,会收到IRP已完成的通知。
如果管道没有待处理或正在进行的IRP,则该管道处于空闲状态,主机控制器将不会对该管道采取任何操作;即该管道的端点不会接收到任何指向它的总线事务。
只有在有IRP待处理时,管道才会有总线活动。
如果非等时管道遇到导致它向主机发送STSTALL(参见第8章)或在IRP的任何数据包上遇到三个总线错误的情况,则该IRP会被中止或终止,所有未完成的IRP也会被终止,并且在软件客户端从该情况中恢复并通过USBD调用确认停止或错误条件之前,不再接受新的IRP。
适当的状态将告知软件客户端具体的IRP结果,是错误还是停止(参见第10章)。等时管道的行为在5.6节中有描述。
一个IRP可能需要多个数据负载才能将客户端数据通过总线传输。对于这样的多个数据负载的IRP,数据负载预计为最大数据包大小,直到最后一个数据负载包含整个IRP的剩余部分。
有关更多细节,请参见每种传输类型的描述。对于这样的IRP,输入中的短包(即小于最大大小的数据负载)如果没有完全填充IRP数据缓冲区,可能有两种含义,具体取决于客户端的预期:
- 客户端期望一个可变大小的IRP数据。在这种情况下,未填充完整数据缓冲区的短包仅作为带内分隔符,表示“数据单元结束”。IRP应正常终止,主机控制器应继续处理下一个IRP。
- 客户端期望一个特定大小的IRP数据。在这种情况下,未填充完整数据缓冲区的短包是一个错误的指示。IRP应终止,管道应进入“停止”状态,所有与该管道相关的待处理IRP也应终止。
由于主机控制器必须在这两种情况下采取不同的行为,并且无法自行判断在特定IRP中应该如何处理,因此可以在每个IRP中指示客户端希望的行为。
端点可以通过响应NAK来告知主机它处于繁忙状态。NAK不作为中止IRP返回给软件客户端的条件。在处理特定IRP时,可能会遇到多个NAK。NAK响应一个事务不构成错误,也不计入上述三个错误中的任何一个。
-
IRP(I/O请求包)
软件客户端请求数据传输的基本单位。客户端通过IRP向管道发送数据传输请求,之后根据IRP的完成情况得到通知。 -
管道的状态
如果一个管道没有IRP在进行,它就处于“空闲”状态,主机控制器不会进行任何与这个管道相关的总线事务。只有当管道有IRP待处理时,才会有总线活动。 -
错误和停止状态
- 如果管道遇到错误(例如发送STSTALL响应或发生多个总线错误),所有待处理的IRP会被终止。
- 错误或停止状态会导致管道停止接收新的IRP,直到软件客户端通过某种方式恢复并处理错误。
-
数据负载的大小
- IRP的数据负载通常会尽可能填充到最大包大小,直到最后一个数据包可能包含剩余数据。
- 如果传输的实际数据少于预期的大小,可以有两种情况:一种是客户端接受数据量变化并认为短包是正常的,另一种则是客户端期望固定的数据量并且短包视为错误。
-
NAK响应
- NAK是USB传输中的一种常见响应,表示端点忙碌,可以忽略不计错误。这意味着管道可以多次返回NAK响应,但不会中断IRP的处理。
5.3.2.1 流管道 (Stream Pipes)
流管道通过总线事务的数据包部分传输数据,但数据内容没有USB要求的特定结构。数据从流管道的一端流入,从另一端流出,并且数据顺序保持一致。
流管道始终是单向的,即通信流动方向是单向的。
流经流管道的数据预期与USB认为的单一客户端进行交互。USB系统软件不需要为可能使用同一流管道的多个客户端提供同步机制。
数据呈现给流管道时,会按顺序通过管道:先进先出(FIFO)。
到设备的流管道绑定到设备的单一端点号,并且方向正确(即,与协议层定义的IN或OUT令牌相对应)。设备的相反方向的端点号可以用于其他流管道。
流管道支持批量、同步和中断传输类型,这些将在后面的部分中解释。
-
流管道的单向通信:
流管道是USB中用于数据传输的一种通道,每个流管道只会传输数据的一个方向,通常是输入(IN)或输出(OUT),这意味着数据要么是从主机流向设备(OUT),要么是从设备流向主机(IN)。流管道始终是单向的,因此如果需要双向通信,主机和设备必须使用两个不同的流管道。 -
没有结构要求的数据:
与传统的USB传输模式(例如控制传输、批量传输等)不同,流管道传输的数据没有特定的协议要求或格式。这意味着传输的数据内容不需要符合USB协议中的规定结构,可以是任意数据流。这使得流管道特别适合于那些需要快速传输大量数据但不需要复杂协议控制的应用场景。 -
FIFO(先进先出)数据传输:
流管道采用FIFO模式,即先进入管道的数据会最先离开管道。这是一种常见的队列方式,确保了数据传输的顺序性,避免了乱序问题。FIFO传输方式对流管道的设计和实现简化了许多,因为它不需要复杂的同步机制或数据排序。 -
流管道和端点绑定:
每个流管道都是与设备的某个端点号绑定的。端点号是USB设备用来标识不同数据流方向的关键。流管道的方向与该端点号的方向一致,通常为IN或OUT。例如,如果设备的端点是IN方向,则流管道也将是IN方向,用于主机向设备传输数据。如果设备的端点是OUT方向,则流管道是OUT方向,用于设备向主机传输数据。 -
不需要同步机制:
这部分强调了流管道的简单性:USB系统软件不要求对流管道的数据传输进行多客户端同步。换句话说,如果多个应用程序或客户端共享一个流管道,它们不需要协调或同步其操作,流管道只是简单地按顺序传输数据。
5.3.2.2 消息管道 (Message Pipes)
消息管道(Message Pipes)与端点的交互方式与流管道(Stream Pipes)有所不同。首先,主机向USB设备发送请求。
接着,按照适当的方向进行数据传输。最后,在稍后的某个时间,状态阶段(Status stage)会跟随请求。
为了适应请求/数据/状态的传输模式,消息管道在通信流中施加了一个结构,使得命令可以可靠地识别和传达。
消息管道支持双向通信流,尽管通常是单向的。默认控制管道始终是一个消息管道。
USB系统软件确保不会向消息管道同时发送多个请求。
设备每次只能处理一个消息请求,每个消息管道只允许一次处理一个请求。
主机上的多个软件客户端可以通过默认控制管道发出请求,但请求会按“先来先服务”(FIFO)的顺序发送到设备。
在数据和状态阶段,设备可以根据其响应主机事务的能力来控制信息流(详细信息请参见第8章)。
消息管道在处理当前消息的过程中,通常不会发送下一个消息。
然而,在某些错误情况下,主机可以中止当前消息传输,并且在设备还未完全处理当前消息时,可能会向设备发送新消息。
对于操作消息管道的软件来说,如果IRP(I/O请求包)的某个部分出现错误,当前IRP及所有排队的IRP都会被撤销,软件客户端会收到适当的错误指示,通知IRP操作完成。
消息管道要求在双向(IN和OUT)方向上都使用单个设备端点号。USB不允许消息管道为每个方向使用不同的端点号。
消息管道支持控制传输类型,详见5.5节。
-
消息管道的通信流程:
- 消息管道通过请求-数据-状态的三阶段流程与USB设备进行交互:
- 请求阶段:主机向设备发出请求。
- 数据阶段:数据在主机与设备之间传输,方向可能是单向的,但消息管道本身是双向的。
- 状态阶段:在数据传输完成后,设备向主机返回状态信息。
- 消息管道通过请求-数据-状态的三阶段流程与USB设备进行交互:
-
消息管道的独占性:
- 设备一次只能处理一个消息请求,即消息管道在同一时刻只能处理一个请求。
- 虽然主机上的多个软件客户端可以通过默认控制管道发出请求,但这些请求是按“先来先服务”方式逐个处理的。
-
错误处理:
- 如果在消息管道的某个阶段(如IRP处理阶段)发生错误,当前IRP及其所有后续的IRP会被取消,软件客户端会收到错误通知。
- 在某些错误情况下,主机可以提前终止当前的消息传输,发送新的消息。
-
设备端点要求:
- 每个消息管道必须在双向通信中使用单一的端点号。即一个消息管道的IN和OUT方向不能使用不同的端点号。
-
控制传输:
- 消息管道支持控制传输类型,控制传输通常用于设备配置和命令传输等。
5.3.3 帧与微帧 (Frames and Microframes)
USB 在全速/低速总线中建立了一个1毫秒的时间基准,称为“帧”,而在高速总线中则建立了一个125微秒的时间基准,称为“微帧”。
一个(微)帧可以包含多个事务。每种传输类型定义了在一个(微)帧内对于一个端点允许的事务。
等时传输(Isochronous)和中断传输(Interrupt)端点在每隔 N 个(微)帧的周期内才会获得总线使用机会。
关于等时和中断传输的 N 值以及其他细节,在第 5.6 和 5.7 节中有描述。
USB 协议在数据传输中使用了“帧”和“微帧”这两个概念来进行时间上的组织管理。不同速率的 USB 总线使用不同的时间基准:
- 全速/低速总线: 每 1 毫秒为一个“帧”(frame)。
- 高速总线: 每 125 微秒为一个“微帧”(microframe)。
每个帧或微帧可以包含多个数据传输事务。而对于不同类型的端点(例如等时传输和中断传输端点),系统会在特定的周期内分配其传输机会。这些周期由“每 N 帧”或“每 N 微帧”来控制,具体的 N 值以及如何分配传输机会,详细描述可以在文档的第 5.6 和 5.7 节找到。
-
帧与微帧概念:
在 USB 传输中,时间是通过帧(frame)或微帧(microframe)来管理的。帧和微帧是用于同步数据传输的时间片段,可以看作是 USB 数据传输的时间结构单位。
- 帧 (Frame): 在全速(12 Mbps)和低速(1.5 Mbps)模式下,USB 使用一个 1 毫秒(ms)的时间段作为一个帧。这意味着,每 1 毫秒会进行一次新的帧周期。
- 微帧 (Microframe): 在高速(480 Mbps)模式下,USB 使用一个更短的时间段,称为微帧,每 125 微秒为一个周期。因此,高速 USB 每秒会划分出 8000 个微帧(1 秒 / 125 微秒 = 8000 微帧)。
-
事务与传输类型:
每个帧或微帧可以包含多个数据传输“事务”(transaction),而每种不同类型的传输(如控制传输、批量传输、等时传输、以及中断传输)对事务的时间安排和使用有所不同。
端点是 USB 通信中的数据传输单元,而事务则是端点之间实际的数据传输操作。- 等时传输 (Isochronous Transfer): 这种传输类型对时间敏感,要求数据必须在固定的时间点进行传输。等时传输常用于需要实时数据的应用,如音频或视频传输。USB 会为这些端点预留时间窗口,每隔一定数量的微帧(N 个微帧)就会分配一次传输机会。
- 中断传输 (Interrupt Transfer): 中断传输用于低延迟、高优先级的设备通信,比如鼠标、键盘等输入设备。中断端点也会在每隔 N 个微帧的周期内被分配一次时间来传输数据。
-
N 的值与分配:
关于等时传输和中断传输,系统需要根据设备的需求在时间上做出合理分配。因此,USB 系统为这些类型的端点定义了一个周期性的时间间隔 N。N 表示在每多少个微帧之后,设备才会获得一次数据传输的机会。
- 在高速 USB 中,N 的值和端点的需求会影响具体的传输安排。
- N 值较小的设备(例如要求高带宽的音频设备)会在更短的周期内获得传输机会,而 N 值较大的设备(例如键盘、鼠标)则会在较长的周期内进行传输。