USB 2.0 规范摘录2

简介: USB 2.0 规范摘录

USB 2.0 规范摘录1:https://developer.aliyun.com/article/1598584

5、USB 框架

  在 USB 框架中,规范主要定义了 USB 设备的各种状态、常用操作、USB 设备请求、描述符、设备类等。

下图为 USB 设备的状态转移图:


 这里重点介绍下枚举的过程。当设备连接到主机时,按照以下顺序进行枚举:


连接了设备的 HUB 在 HOST 查询其 状态改变端点 时返回对应的 bitmap,告知 HOST 某个 PORT 状态发生了改变。

主机向 HUB 查询该 PORT 的状态,得知有设备连接,并知道了该设备的基本特性。

主机等待(至少 100mS)设备上电稳定,然后向 HUB 发送请求,复位并使能该 PORT。

HUB 执行 PORT 复位操作,复位完成后该 PORT 就使能了。现在设备进入到 defalut 状态,可以从 Vbus 获取不超过 100mA 的电流。主机可以通过 0 地址与其通讯。

主机通过 0 地址向该设备发送 get_device_descriptor 标准请求,获取设备的描述符。

主机再次向 HUB 发送请求,复位该 PORT。

主机通过标准请求 set_address 给设备分配地址。

主机通过新地址向设备发送 get_device_descriptor 标准请求,获取设备的描述符。

主机通过新地址向设备发送其他 get_configuration 请求,获取设备的配置描述符。

根据配置信息,主机选择合适配置,通过 set_configuration 请求对设备而进行配置。这时设备方可正常使用。

 USB 设备的常用操作包括:设备连接、设备移除、设备配置、地址分配、数据传输、设备挂起、设备唤醒等。


 USB 的请求包括标准请求、类请求以及厂商请求三类。所有的请求都通过默认管道发送,按照控制传输的三个阶段进行。首先 HOST 通过一次控制事务传输向 Device 发送一个 8 字节的 Setup 包,这个包说明了请求的具体信息,如请求类型、数据传输方向、接收目标(Device/Interface/Endpoint 等)。具体定义参考 USB2.0 Spec p248。


 USB 标准请求共包括 11 个请求,如清除特性( Clear_Feature )、得到配置(Get_Configuration)、得到描述(Get_Descriptor)、设置地址(Set_Address)等。具体参考 USB 2.0 Spec p250。

6、USB 主机:硬件和软件

  该章节主要定义了 USB 主机的硬件和软件组成及其在 USB 传输中的行为,这部分的硬件设计主要指 EHCI 的设计,软件的设计主要是设备驱动程序和 USB 系统软件的设计。其中 USB 系统软件一般由操作系统提供。 由于跟项目关联不大,故略去,如有需要请参考 USB 2.0 Spec Chapter10。

7、USB HUB 规范

 这一章描述了 USB HUB 的架构,主要从 HUB Repeater、HUB Controller 以及 Transaction Translator 三个方面展开。另外还包括 USB HUB 类的请求及描述符。


 从功能上来说,HUB 必须支持连接行为、电源管理、设备连接/移除检测、总线错误检测和恢复、高/全/低速设备支持。

 下图为 USB HUB 的架构图:


 USB HUB 自身的工作速度由上行 PORT 的连接速度决定。从结构上分,USB HUB 由 HUB Repeater 、 HUB Controller 及 Transaction Translator 三部分组成。其中 HUB Repeater 主要负责连接的建立和撤销,即完成上行 PORT 和下行 PORT 工作在相同速度的连接管理。同时还支持错误的检测与恢复以及设备连接/移除的检测。HUB Controller 负责与 HOST 通讯,完成与 HOST 的交互(请求的响应)、HUB 的控制及管理。Transaction Translator 主要负责高速的分离传输,并把它们分发到连接了全/低速设备的下行 PORT。Routing Logic 负责将下行 PORT 连接到 HUB Repeater 或者 Transaction Translator(以后简称 TT)。


 当 USB HUB 的上行 PORT 连接在全速/低速时,TT 不工作,HUB Repeater 工作在全速/低速模式。当 USB HUB 的上行 PORT 连接在高速时,TT 工作,HUB Repeater 工作在高速模式。

数据的转发

  下行方向上:USB HUB 采用广播的方式向所有使能的、工作与上行 PORT 相同速度的下行 PORT 转发来自上行 PORT 的数据包。

 上行方向上:USB HUB 将在下行 PORT 接收到的数据包,递交到上行 PORT,而不向其他 PORT 转发。

唤醒信号的转发

  唤醒信号(Resume)的转发采用完全广播的方式,在任何 PORT 收到的唤醒信号 USB HUB 都会向其他 PORT 转发。

USB HUB 的帧同步

 USB HUB 必须与 HOST 保持同步,拥有和 HOST 相同的帧周期,这是通过帧同步的操作来实现的。在 USB HUB 内有两个计数器一个寄存器,计数器都是用 USB HUB 的本地时钟驱动的。其中一个计数器向上计数,用来测量来自上行 PORT 连续两个 SOF 包的时间间隔;寄存器用来存储此时间间隔,每次 SOF 包到来都会被更新;另一个计数器从测得的时间间隔开始向下计数,计到 0 时即认为新的一帧开始了。然后加载寄存器中存储的值,重新计数。


由于 USB HUB 检测 SOF 包也是需要时间的,所以实际发现 SOF 包的时间要比该 SOF 包在总线上出现的时间稍晚,如果不加以处理,USB HUB 内部的帧时间会整体比总线上的帧时间推迟一些。该延迟由 USB HUB 本身决定,所以对于 USB HUB 来说是已经的,为了排除此延迟,USB HUB 需要采取一定的方法来处理,如 EOF 提前。即在向下计数器尚未计到 0 时,提前认为当前帧结束。该提前量应恰好等于 USB HUB 检测 SOF 包的延迟。从而保证了在整个 USB 系统中,所有部件的帧时间(帧头和帧尾到来的时刻)除了在 USB 传输线传播带来的传播延迟之外都是一样的。


 数字系统的时钟抖动、计数器量化误差都会带来帧周期的抖动,为防止该抖动引起传输错误,USB 规范规定系统中所有部件引起的抖动必须在一定限制范围内,并采取了一定的措施来预防该问题,如 EOF1 和 EOF2 时刻的引入。


EOF1 和 EOF2 是两个安全时间,比实际的 EOF 时间稍早。USB HUB 在转发数据包时需要参考这两个时间,晚于这两个时间发送的包有可能因为抖动而产生 EOF 期间的干扰。

HUB Repeater

  顾名思义,HUB Repeater 将接收到数据 Repeat 出去,这个 repeat 是双向的,既包括从上行 PORT 到下行 PORT 的 repeat,又包括型下行 PORT 到上行 PORT 的 repeat。 需要用 USB HUB 的本地时钟从 PORT 上接收数据,然后再用本地时钟将数据放到 PORT 上去。下图为 HUB Repeater 的框图。

 在我们的项目中,USB PHY 芯片完成了 HUB Repeater 大部分的电气层功能,如数据恢复、包检测等。在高速连接中,USB 规范要求从上行 PORT 到下行 PORT 的连接在 SOP(Start of Packet)到来时建立,且延迟不超过 36bit time。实际实验过程中发现即使 USB HUB 的 Repeater 延迟超过 40bit time 也未导致功能失败。


 HUB Repeater 的行为受到 EOF1 和 EOF2 时间的影响,具体参考 USB 2.0 Spec P330。

HUB Controller

下图为 HUB Controller 的逻辑结构。



 图中右上方是端点 0,即默认的控制端点,HOST 通过向该端点发送标准请求和 HUB 类请求完成 USB HUB 的枚举和控制。如复位某个下行 PORT、使能某个下行 PORT、给某个下行 PORT 上电等。


 图中左上方是一个中断型的状态改变端点,HOST 通过以固定的时间间隔向该端点发起IN的中断传输查询该 HUB 自身和各下行 PORT 的状态是否改变。当没有状态改变时,该端点返回 NAK 的握手包;当有状态改变时返回一个反应了 HUB 自身和各下行 PORT 状态改变信息的 Bitmap。每个 PORT 映射到该 Bitmap 中的一位,当该 PORT 的状态有改变时,对应的位置 1,这是由 USB HUB 硬件完成的。


所谓状态改变包括:设备连接、复位完成、设备移除、电流过流等,USB HUB 的硬件负责检测这些事件的发生,并痛过置位反应到 Bitmap 中来。

Transaction Translator

  TT 是 USB HUB 中最复杂的一部分,这里我并不准备详细描述它,而只是从结构和基本操作逻辑上展开介绍,更多的细节请在有必要时参考 USB 2.0 Spec。

  前面已经说过:TT 在 USB HUB 中主要负责从高速到全/低速传输事务的转发,完成速度的匹配。从传输的角度来说,主要就是完成分离事务传输(Split Transaction)。下图为 TT 的基本结构。

 和大部分速度匹配逻辑一样,TT 也采用 Buffer 的方 式来完成速度匹配。Buffer 的一端是一个高速 Handler,处理高速数据收发;另一端是全速/低速 Handler 处理全速/低速数据的收发。针对传输类型的不同,TT 采用多个 Buffer 来缓存数据。其中同步传输和中断传输的 Start-Split(S-Split)阶段和 Complete-Split(C-Split)阶段分别用一个 Buffer,批量传输和中断传输的 S-Split 和 C-Split 不分开存储,但是在一个 TT 中至少有 2 个用于批量传输和中断传输的 Buffer。


 分离传输仅在 HOST 和 HUB 之间发生,对于设备全速/低速设备来说是透明的。一个 USB HUB 可以有多个 TT,这在 USB 协议中是允许的。


 按照处理方式的区别,TT 中的分离传输可以分为两类——周期分离传输和非周期分离传输。周期分离传输指的是同步分离传输和中断分离传输,非周期分离传输指的是批量分离传输和控制分离传输。


同步传输和中断传输被归为周期传输是因为它们的传输是有周期的,HOST 以固定的间隔向同步端点和中断端点发起传输。相对应的,批量传输和控制传输没有固定的周期。

OUT 型批量/中断分离传输流程

  先来看 OUT 型批量/中断分离传输的流程,如下图所示:


 HOST 知道某个 HUB 的某个下行 PORT 上连接的是全速/低速设备(通过查询 HUB 的端口状态得知)。当 HOST 要向该设备传送数据时,它必须启动一次 OUT 型的分离传输。首先 HOST 发送一个 SSPLIT 包,表明:下面我要进行分离传输了。SSPLIT 包中指明了该分离传输所对应的 HUB 地址和 PORT 编号,同时也指明了端点的类型(具体定义参考 Start-Split 包的定义)。然后按照普通批量/中断传输的顺序,先发送一个 OUT/SETUP 的令牌包,然后发送一个数据包,并等待来自 HUB 的握手包。如果没问题,HUB 的 TT 会在 Buffer 开辟一片缓存保存以上接收到的三个包后,并 ACK 主机,表明已经接收到 Start-Split 阶段的数据包。然后 TT 根据 SSPLIT 包中的信息,通过全速/低速 Handler 向指定的下行 PORT 转发令牌包和数据包,并接收来自设备的握手响应,同样保存在 Buffer 中,并更新此次分离传输的状态信息。


 主机在完成 Start-Split 阶段一段时间后,向 HUB 发起 Complete-Split 传输,查询此次传输的状态。具体过程为,先发送一个 CSPLIT 包,然后是 OUT/SETUP 包,TT 根据这两个包可以查询到已经存储在 Buffer 中的分离传输,如果查询不到,则认为传输错误,返回 STALL 握手包。如果查询到了,但设备还没有响应,则返回 NYET 握手包,让主机等待一段时间后重新查询。如果传输已经完成,则 TT 向 HOST 转发来自设备的握手包(STALL/ACK/NAK)。这时一次完整的分离传输完成。


 IN 型的批量/控制分离传输有相似的过程,只不过数据包的传输在 C-Split 阶段,下图为其流程图。

  周期型的分离传输基本过程和非周期的分离传输大致相同,但在细节上有很多不一样的地方。如周期性的分离传输使用两个 Buffer 分别存放 S-Split 和 C-Split 阶段的数据,主机在安排 S-Split 和 C-Split 也和非周期分离传输有些不同,有较多的限制。

 TT 采用流水的方式处理周期型的分离传输,一次周期型的分离传输在 TT 中共有四种状态:New、Pending、Ready 以及 Old。一次分离传输依次经历这四种状态。其中 New 态为这次分离传输在 TT 中建立的状态,是一个暂态、最长不能超过 1 个微帧的时间;Pending 为等待传输完成的状态,最长不能超过 4 个微帧;Ready 为传输已经完成,等待 Host 取回结果的状态,最长不能超过 2 个微帧;Old 表示传输已经全部完成,TT 中该传输所占用的 Buffer 可以重新利用。


 由于速度不匹配,在一个微帧里,最多可以在全速总线上传输 188 字节的数据,在传输的数据量较大的情况下,例如同步传输的最大包长度为 1023 字节,如果等到整个包传完再响应 HOST 的 C-Split,不但要求 TT 有更多的 Buffer,并且会使 HOST 浪费较多的时间在等待数据传输完成。因此 TT 采用了如下的处理方式:


 上行方向上,即 IN 型的传输:无论何时,只要 TT 收到超过 2 个字节的数据,就响应 HOST 的 C-Split,向 HOST 发回数据,并在 PID 中以 MDATA,DATA1/0 表明还有没有未传完的数据。如果还有数据,则以 MDATA 发送,否则以 DATA1/0 发送。HOST 在收到 MDATA 后,应继续在下一个微帧里发起 C-Split 传输,向 HUB 请求数据,知道收到一个 DATA0/1 的数据包。


 下行方向上,即 OUT 型的传输:HOST 把一个大的数据包拆成最大 188 字节的若干个小包,在连续的多个微帧里用 S-Split 向 TT 发送数据。

 如下图所示:

OUT 型中断分离传输


OUT 型的同步分离传输

  OUT 型的同步分离传输只有 S-Split 阶段,而没有 C-Split 阶段,因为同步传输是不可靠的传输,HOST 不需要确认传输是否成功完成。





IN 型的同步分离传输

    By Hevry Email: hevry.jon@hotmail.com

目录
相关文章
|
4月前
|
Linux API SoC
设备树知识小全(十一):OF是什么?
设备树知识小全(十一):OF是什么?
76 0
|
21天前
|
监控
USB 2.0 规范摘录1
USB 2.0 规范摘录
33 1
|
21天前
|
存储 缓存 算法
USB3.2 摘录(一)(下)
USB3.2 摘录(一)
40 12
|
21天前
|
机器学习/深度学习 流计算
USB3.2 摘录(五)(上)
USB3.2 摘录(五)
41 1
|
21天前
USB3.2 摘录(五)(下)
USB3.2 摘录(五)
27 1
|
21天前
|
安全 索引
USB3.2 摘录(11)
USB3.2 摘录(11)
30 1
|
21天前
USB3.2 摘录(八)
USB3.2 摘录(八)
29 2
|
21天前
|
缓存
USB3.2 摘录(一)(上)
USB3.2 摘录(一)
29 0
USB3.2 摘录(一)(上)
|
21天前
|
存储 算法
USB3.2 摘录(10)
USB3.2 摘录(10)
25 1
|
21天前
|
存储 运维
USB3.2 摘录(七)
USB3.2 摘录(七)
25 1