USB 2.0 与USB EHCI 硬件接口

USB 2.0

总线枚举 (bus enumeration)

数据流

usb 数据传输发生在主机软件和usb 设备上特定的端点(endpoint)之间。这种主机软件和usb设备端点之间的逻辑通路叫做pipe. pipe 的两端是主机usb device driver的一块buffer和usb device的一个endpoint。pipe之间是独立的,一个USB device工作的过程中可能会存在多个pipe.一个pipe在形成的时候就进行一种数据传输。软件一般通过传输类型+设备号+端点号+传输方向产生pipe的唯一标示号。

pipe 根据是否规定事务阶段(transaction)分为两种类型:
stream pipe
控制传输、块传输、中断传输建立起来的都是stream pipe。
message pipe
message pipe 只有控制传输。
几个名词

  • 事务(transaction): 由packet构成,一个事务由令牌包,数据包和握手包构成。根据令牌包的类型会有SETUP事务,IN事务,OUT事务和其他事务等。
  • 阶段(stage):在控制传输中,构成message pipe, 分为三个阶段,setup阶段,数据阶段和状态阶段。每个阶段会有多个事务构成。
  • 传输(transfer): 一系列的事务构成传输。

控制传输(control transfers)


在setup阶段中由data阶段的数据方向和长度,因为0号端点支持双向,从setup当中获取到方向后准备相应的buffer。

块传输(bulk data transfers)

中断传输(interrupt data transfers)

有延迟要求的数据传输被称作中断数据。这类数据由usb device在不确定的时间产生,由usb在不低于指定的速率下传输。
最典型的中断数据是事件通知、字符、坐标这些若干字节的数据。典型的例子是鼠标点击是发送的坐标数据,这种数据需要usb限制响应时间(在指定时间内做出响应)。

同步数据传输(isochronous data transfers)

占据一个预先协商好的usb带宽,也被称作实时流传输。同步数据是以稳定的速率传输的数据,比如音频和视频数据,usb分配专用的一部分带宽来传输同步数据以保证数据的稳定速率。


usb 系统数据流模型如上图,相关的部分有

  • usb device: usb 设备实现具体功能的部分,需要与usb 主机连接。
  • client software(usb device 驱动): 运行在主机上,跟usb device 一一对应。
  • usb system software: usb系统软件,usb host驱动,是操作系统用来支持usb总线用的。跟usb device和client software 独立。
  • usb host controller

USB全速和低速标准以1ms间隔划分时间为帧(frame), 高速标准以125us间隔划分时间为小帧(micro-frame).
ehci 硬件接口是usb2.0硬件接口标准。规定了echi主机基本寄存器和列表和工作方式。

寄存器接口

内存映射USB主机控制器寄存器

主机控制器寄存器包括两部分

  • 能力(capability)寄存器组
  • 操作(operational)寄存器组

周期调度

通过ITD管理isochronous 传输

通过Queue Head 管理control/bulk/interrupt 传输

Queue Head Horizontal Link Pointer指向下一个QH.Current qTD Pointer 指向当前的QTD.
这里最重要的一部分是transfer overlay区域,这部分区域跟QTD完全一样,是当前处理QTD的一份cache.

Queue Head 与QTD一起完成传输数据的管理。一个Queue Head管理对应一个endpoint的数据流。Queue head中包含端点的属性和能力信息。一个QTD管理一个或多个总线事务(transaction), 表示一个传输(transfer).
QueueHead处理的步骤如下:

  1. 读取一个Queuehead
  2. 从overlay area 中执行一次transaction
  3. 将事务的结果写会到overlay area
  4. 移动到下一个Queue head

工作模式

初始化

  1. 写入USBINTR使能相应的中断
  2. 将周期传输TABLE基地址写入PERIODILISTBASE. 如果每个元素中不指向传输单元,T标记位为1.
  3. 设置控制器中断门限,设置USBCMD中的run/stop标记,开启控制器
  4. 在CONFIGFLAG中写1将所有的port路由到ECHI

可以通过USBCMD中的相应位控制开启异步传输和周期传输控制。控制器开始工作,port register开始响应设备的插入。并且在使能的高速设备端口发出SOF帧起始信号。

端口路由和控制

host 集成根集线器(root hub), roothub是没有TT模块的。 usb 主机控制器由一个ehci 和多个xhci构成,如上图是一个echi和一个伴随的USB1.1 host control, 每一个物理端口对应一个Transceiver, echi 控制器中有对应与每一个port的状态和控制寄存器。伴随USB1.1 host controller中有它所选定的port的状态和控制寄存器。每一个transceiver 都可以由echi 或者1.1控制器所控制。
在复位时,port 默认由1.1控制器控制,如果系统没有ECHI,并且有1.1伴随控制器的情况下,端口会一直保持在全速/低速模式下。当echi 控制器拥有端口时,xhci 不会知道port transceiver的存在,同样xhci拥有端口时,ehci 也不会知道端口的存在。
端口路由的控制由功能寄存器中的configure flag 和portsc 中的port owner bit 控制,HCSPARAMS寄存器中的N_CC bit 说明硬件中是否有xhci。有configure flag 和 port owner 配合控制端口路由逻辑的状态转换图如下。

挂起和恢复

通过USBCMD run/stop bit 挂起EHCI, 通过PORTSC挂起相应的端口连接的设备。恢复时相反的过程。
设备的挂起和回复过程中,包括主机主动挂起和恢复port,以及主机检测到wake up event后回复。
主机挂起端口后,恢复指定port时,port必须处在挂起状态,否则设备的动作未定义。主机恢复设备的状态,端口的port change bit并不会改变。
主机检测到wake up事件时,端口的force port resume 置为1,USBSTS中的port change bit 置为1,如果此时USBINTR中的port change interrupt enable 为1的话,EHCI会上报中断。

传输策略

usb2.0 最大传输速度480Mb/s, 分为125us长度的小帧,每个小帧能传60kb.

在每一小帧当中,ECHI首先根据PERIODICLISTBASE + FRINDEX选中一个周期table中的指针开始执行这个元素管理下的链表,知道遇到next link pointer当中的Tbit为1. 此时主机立即释放周期传输结构开始传输异步链表中的数据,知道这个小帧的结尾。

周期帧链表(periodic frame list)
周期帧链表是同步传输和中断传输的实现基础。
同步传输描述符ITD管理同步传输数据,queue head(QH)在同步链表、异步链表管理中断传输,块传输、控制传输数据。

异步链表(asynchronous list)

异步链表是用来支持块传输(bulk transfer)和控制传输(control transfer)的。
host controller 优先遍历周期帧链表,遇到周期帧链表中的结束标志时,才会处理异步链表。所以同步传输和中断传输这两种受时间限制的数据优先级是高的,块传输控制传输在异步链表中处理的传输优先级低。

小帧完整性

usb2.0 一小帧中能够传送的最大bit数为60kbit, 也就是7500byte. 这里存在的一个问题是如何确定在一个小帧中能够发送的事务的数量。小帧的结束点由于2.0的物理限制定义有EOF1和EOF2, 所以能够利用的有效带宽是SOF到EOF1, 在接近EOF1时的时间区间内,对于不同的包长,在保证事务完整的情况下的最晚发送时间点不同。最后截止时间点的计算非常重要,它影响到带宽的利用率。

上图所示的图中f(x)是一种近似逼近最后开始时间点曲线的方法。y轴是距离EOF的字节时间,x轴是发送事务的最大包长。对于最大包长1的包来说,小帧开头就是位于7500的点,80%带宽曲线是小帧中能发送事务数量的80%的时间点,最后开始时间位置是EOF1之前可以启动一个包长为1的事务的时间点。
这个近似曲线的算法通过一些经验值进行了近似。如下

Alorithm CheckTransactionWillFit (MaximumPacketSize, HC_BytesLeftInFrame)
Begin
Local Temp
= MaximumPacketSize + 192
Local rvalue = TRUE
If MaximumPacketSize >= 128 then
Temp += 128
End If
If Temp > HC_BytesLeftInFrame then
Rvalue = FALSE
End If
Return rvalue
End

这个算法有两个输入,当前最大的包长度和硬件的当前小帧还剩余可传输字节数的计数器。它无条件的加192,用来估计事务的overhead和bit stuffing. 在包长大于128时,加上一个128来估计大包长带来的附加bit stuffing. 用这种方法可以更好的逼近最后开始时间曲线。

USB Device

设备状态

set configuration request

address state:
usb device收到set confiugration request
If the specified configuration value is zero, then the device remains in the Address state. If the specified configuration value matches the configuration value from a configuration descriptor, then that configuration is selected and the device enters the Configured state. Otherwise, the device responds with a Request Error.
configured state:
usb device收到set configuration request
If the specified configuration value is zero, then the device enters the Address state. If the specified configuration value matches the configuration value from a
configuration descriptor, then that configuration is selected and the device remains in the Configured state. Otherwise, the device responds with a Request Error.

Bus Enumeration (总线枚举)##

当USB设备连接或者从USB总线上移除时,主机使用被称为总线枚举的过程来识别和管理USB设备的状态变化。当USB设备链接到USB供电端口时,将会进行下面的动作:

  1. USB设备接入的hub(root hub)相应port的状态位改变给主机上报一个中断。这时,USB设备处在powered state, 相应的port是disabled的。
  2. 主机处理终端查看此时port接入的设备的状态。
  3. 此时主机获知设备连接到的port,主机会等待至少100ms等待插入动作完成和电源供电稳定,接下来,主机发出port enable 和reset command,(集成root hub的ECHI完成这两个动作是设置相应的寄存器)
  4. hub执行需要的复位动作。当reset 信号结束时,port就被enable。此时USB device 处在default状态,会从vbus中获取不超过100mA的电流。USB device所有的寄存器都被复位,并处在默认address。
  5. 主机分配一个默认的地址给USB device,USB device的状态转换到address state。
  6. 在USBdevice获得唯一的地址之前,他的默认control pipe还是通过default address来访问。主机获取设备device descriptor 来决定usbdevice default pipe的最大数据payload。
  7. 主机从设备读取configuration information通过获取设备的configuration 0 ~n-1,这里的n是configuration的数目。这个过程大概需要几毫秒的时间。
  8. host获取配置信息后,基于这些信息,host决定如何使用device,host会向device发送一个configuration value选择指定的congfiguration。 现在设备会处在configured state,所有在configuration 中的端点都一描述的属性特征就位。此时USBdevice 现在会以configuration中描述的电流值获取电流。从设备的角度看现在设备处于可用状态。

当USB 设备被移除时,hub向host发出通知。移除设备时会disable掉指定的port,主机获取通知后会更新它的本地拓扑信息。

USB 2.0 与USB EHCI 硬件接口相关推荐

  1. USB 3.0、USB 3.1到底什么区别?

    十多年前,USB总线进入主流视野,提供了一个全新的存储方向,并用一个统一的标准把众多外设都全部拉入自己的阵营.这是他们为整个行业带来的巨大贡献,没有人会否认.但是推广USB的组织有着特殊的取名技巧,让 ...

  2. 用什么软件测试usb速度,什么是usb 3.0?实测usb 3.0与usb 2.0传输速度对比

    数码产品更新速度之快,是我们有目共睹的,不管是处理器还是硬盘等硬件,产品更新非常快,随着电脑硬盘标配容量逐渐趋于以T为电脑,电脑游戏软件越来越大,逐渐以G为单位,导致目前主流的USB 2.0接口传输速 ...

  3. 高通平台USB 2.0和USB 3.0接口充电器识别原理

    1 BC 1.2 1.1 充电器类型探测 1)DCD:DP上有150mV(= 10uA x 15K欧姆下拉电阻)的电压,DM上电压为0 2)Primary Det(DP发起检测DM): - DP上加载 ...

  4. 如何区分USB 2.0 和USB 3.0插口

    USB3.0的速度是USB2.0的十倍,并且比USB2.0更加节能,同时,还能向下兼容USB2.0.那么,我们怎么区分USB2.0 和 USB 3.0呢. 电脑(有USB2.0和USB3.0的插口) ...

  5. linux查看usb3.0还是2.0,Linux分辨电脑是否有USB 3.0接口的命令行 怎么看电脑用独立显卡还是集成显卡...

    延伸:怎么看电脑用独立显卡还是集成显卡 描述:方法一.通过接口来判断我们在主机箱后面的接口上,看你的链接数据线的接口接上了哪个接口,如果是连接集成显卡的话那就是连接到竖的的接口上,因为集成显卡的VGA ...

  6. USB 3.0 Rx Detect之超速U盘的识别

    1 USB超速SerDes原理介绍 1.1 SerDes Rx.Detect SerDes Rx.Detect的原理比较简单,就是通过一个逻辑电路比较RC时间常数的大小. - 当Rx不存在时,RC时间 ...

  7. USB总线虚拟示波器,用高性能硬件模块,组合成多种仪器

    虚拟示波器HS系列是利用高性能的模块化硬件,结合高效灵活的软件来完成各种测试.测量和自动化的应用,并通过现有的计算机组合成多种测量仪器,完成你想要的各种测试. HS6 虚拟示波器 HS5 虚拟示波器 ...

  8. USB 3.0规范中译本 第2章 术语及缩略语

    原文链接 https://www.cnblogs.com/coryxie/p/3956211.html 本文为CoryXie原创译文,转载及有任何问题请联系cory.xie#gmail.com. 本章 ...

  9. USB 3.0规范中译本 第3章 USB 3.0体系结构概览

    原文链接 https://www.cnblogs.com/coryxie/p/3956220.html 本文为CoryXie原创译文,转载及有任何问题请联系cory.xie#gmail.com. 本章 ...

最新文章

  1. iOS网络缓存扫盲篇--使用两行代码就能完成80%的缓存需求
  2. HDU1042(高精度模拟乘法)
  3. oracle数据库风险链接,数据库的风险主要来源
  4. JavaMail邮件别名和主题乱码解决[转]
  5. torch The “freeze_support()” line can be omitted if the programis not going to be frozen to produce
  6. 200米外遥测心跳定身份,五角大楼全新黑科技,人脸伪装也没用
  7. c语言前置函数,C语言高级编程-函数前置与后置调用
  8. [ZJOI2010] 贪吃的老鼠(二分+差分+神仙建图网络流)
  9. 通过分区在Kafka中实现订单保证人
  10. 60-10-050-命令-kafka-broker-api-versions.sh
  11. 网络安全工程师毕业答辩杂记
  12. 从零开始配置 vim(3)—— 键盘映射进阶
  13. android镜子app,Android镜子应用 一面可编程的镜子
  14. ps cc2019版为什么做图一复制图层就卡死_彻底明白PS的智能对象,它和普通图层到底有啥区别?详细讲解...
  15. 图像处理中关于矩的解释
  16. VMware安装ubantu系统
  17. uni-app 背景图片处理
  18. HTML+CSS整理大全
  19. ORACLE sql 高级查询
  20. linux+目录+配额,Linux磁盘配额管理

热门文章

  1. python socketio例子_Flask-SocketIO服务端安装及使用代码示例
  2. ViewBag(动态视图)、ViewData、ViewDataDictionary区分
  3. android电影app开发,如何使用Flutter开发一款电影APP详解
  4. 智能设备,环保人士的新宠?智能家居如何体现节能环保?
  5. python 实现将图像转化为位图数组
  6. 李群(Lie Group)
  7. Python爬虫突破封禁的6种常见方法
  8. 与XMLHTTP对象相关的名称
  9. 建筑CAD制图教程:什么是双跑楼梯?
  10. 摸爬滚打DirectX11_day03——如何获取每秒帧数(FPS)