[OHCI]架构
来源:互联网 发布:科蓝软件java面试题 编辑:程序博客网 时间:2024/06/05 19:49
简述
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的队列中。
- [OHCI]架构
- OHCI(一) - OHCI spec
- uhci ehci ohci及hcdxxx的区别与 usb驱动架构(USB总线分析前奏曲)
- UHCI&OHCI
- usb ohci
- [OHCI]数据结构
- OHCI(二) - OHCI控制器驱动
- 何谓OHCI、UHCI、EHCI?
- 何谓OHCI、UHCI、EHCI
- EHCI、UHCI与OHCI
- 何谓OHCI、UHCI、EHCI?
- EHCI,OHCI,UHCI知识
- usb ohci driver porting
- 何谓OHCI、UHCI、EHCI?
- ohci之usb_submit_urb 一
- ohci之usb_submit_urb 一
- EHCI,OHCI,UHCI
- OHCI UHCI EHCI xHCI
- kexue上网
- 关于Android import-module 和NDK_MODULE_PATH
- 跨平台的WebRTC客户端框架:OpenWebRTC
- leetcode之Search a 2D Matrix II
- jw player去掉logo 二次开发
- [OHCI]架构
- gradle of Andorid(一·)
- 内存管理图解---------页目录表 页表
- Nginx配置相关结构划分的技巧和禁止IP访问
- CentOS6.7配置静态IP
- A022-列表容器之ExpandableListView
- 安装Spark 客户端 提示"the install4j wizard could not find a java(TM) Runntime......“
- Lucene之——搜索实例
- scanf()函数