您的位置:首页 > 运维架构 > 网站架构

[OHCI]架构

2015-10-21 00:20 323 查看

简述

OHCI是嵌入式使用较多的一种USB的Host Control架构。其硬件实现了许多符合USB规范的功能,因此软件上,特别是嵌入式领域,通过对其register进行一些初始化,以及相对较少的操作,就能实现USB通信。

OHCI所处位置



数据传输类别

这里和usb协议的是一样的:



Interrupt和Isochronous传输都是周期性的,而Control和Bulk都是非周期性的。这里的周期性的,觉得是数据在bus上,固定时间内进行数据传输。

Control和Bulk好理解,就是传输一些信息,只是Bulk一次传输的数据块要大。

Interrupt方式,其实也是Host在周期性的侦听来自某Device的数据传送请求。而Isochronous应当是类似于基于连接的传输,不停的传送数据。

数据结构

接口的通信的基本构建块,是ED(Endpoint Descriptor)和TD(Transfer Descriptor)。

- Endpoint Descriptor:包含了Host Controller要与之通信的Endpoint的必要信息;

- Transfer Descriptor:包含了要传输的data packet的必要信息。

可以用一个list结构来表示其ED, TD:



Head Ptr的管理

看来对于4种Transfer Type,也分为四种Endpoint,对不同类型的Endpoint,是在不同的List中进行管理的。

Bulk和Control的ED List的Head Ptr由HC寄存器来维护。

Interrupt的ED List的Head Ptr在HCCA中来维护。

Isochronous的ED List是没有单独的Head Ptr的,下一个Isochronous的ED直接链接在上一个Interrupt ED的后面。

Interrupt ED的Head Ptr看来特殊点,下面说明下:

Interrupt ED List的Head Ptr

有32个interrupt Head Ptr,使用哪个interrupt Head Ptr是由Frame Counter的最后5 bits的值来决定HCCA中的interrupt数组的某个interrupt Head Ptr的。有32个interrupt ED的框架如下:



树形结构组织interrupt ED,而Head Ptr则作为叶子节点,越靠近上部polling interval越小。

如下是一个interrupt ED调度的例子:



这个图根据不同的polling interval将ED分在不同层。不过依据前面的Typical List Structure的图,Head Ptr在叶子节点,而Head Ptr又是List的Head,spec只说将会把下一个存在的ED添加到List,但是如何添加呢,就这个例子来看,应当是0–31的Head Ptr每个都维护一个List才对,而其后的ED排列顺序应当都不一样,具体如何做?另外维护这么多是否会浪费,好处是什么?

Host Controller Driver(HCD)

主要用来管理Host Controller的操作。直接操作Host Controller的寄存器,在HCCA中建立interrupt ED list。

带宽分配

对于periodic endpoint,HCD会分配可用的带宽,若没有足够的带宽了,那就会拒绝新的periodic endpoint的接入。

另外在每个Frame都预留带宽给Buld和Control传输。其机制如下图:



List管理

HCD将ED添加到对应的List,或从中移除。HCD也负责TD添加到对应的ED queue,不过移除一般由Host Controller来做,除非有错误发生时,才由HCD来移除。

Host Controller(HC)

USB状态

UsbOperational;

UsbReset;

UsbSuspend;

UsbResume.

Frame管理

HC会跟踪目前的Frame Counter和Frame period,如前面的带宽分配所示,那些时机都是由HC来决定的。

List处理

前面的HCD已经创建好ED List, TD queue。

对于Interrupt和Isochonous传输,HC根据当前的Frame选择一个Head Ptr开始,然后会遍历所有ED,直到每个ED的从第一个TD开始的发送都被试过了一遍(有点拗口,后续再确认具体做法)。

对于Bulk和Control传输,HC从其单独的Head Ptr开始,接着上次的地方继续,如果到达list末尾,再回到Head去找。

当一个TD传输完成,不管成功或失败,这个TD都会被移到一个叫Done Queue的队列中。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: