当前位置:   article > 正文

USB OHCI架构_ohci原理

ohci原理

##简述
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的队列中。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/247046
推荐阅读
相关标签
  

闽ICP备14008679号