在OHCI层,主要完成如下功能:
l  通过控制端口读写数据(包含SETUP、DATA、STATUS等3个TD);
l  通过控制端口发送设置命令(没有DATA的TD);
l  通过批量端口读数据;
l  通过批量端口写数据;
l  中断处理程序;
本层将OHCI的ED和TD作为自己内部的对象进行包装,上层对象通过调用本层接口完成所需要的功能,而不必关心ED和TD的细节。
通过OHCI接口进行数据收发,最主要的工作就是确定ED和TD队列。在网上广为流传的周立功公司的相关资料以及该公司出版的《ARM嵌入式系统软件开发实例》(一)、(二)中,关于ED和TD的处理非常复杂,甚至为此建立了一个管理机制,包括队列的建立、插入、删除、释放等一系列操作。
其实对于一般的嵌入式系统来说,没有必要把ED和TD搞得这么复杂。在我们的系统中,ED和TD的管理非常简单:把待处理的命令构建为ED和TD队列,然后执行,等到执行完毕再根据上层代码的需要构建新的队列。也就是说只有等到上一个命令全部执行完毕后,才可以执行下一个命令。这样的处理机制完全可以适应绝大多数的嵌入式系统了。
基本上来说,每个端点使用一个ED,譬如对于控制端口的命令,使用一个ED即可,而对于批量端口,则会使用到两个ED,分别对应批量出和批量入端口。
对于端点来说,代码中需要注意的参数有如下几个:
l  ED的ToggleCarry
用来确定ED使用哪个数据区收发收据,对于控制端点来说,根据USB规范,每个控制命令总是从Data0开始的,后面再进行切换。因此控制端点的ToggleCarry字段随便设置,而批量端点的该字段需要得到上一次传送完毕后的ToggleCarry的值。
l  TD的DataToggle
用来确定TD使用哪个数据区收发数据。该字段有2个比特,高位=0表示使用ED的ToggleCarry字段的值作为要使用的数据区,=1表示自己控制使用哪一个数据区。根据USB规范,对于控制端点收发数据来说,需要TD自己控制使用哪一个数据区。而对于批量端点,不需要TD自己控制,交由ED进行控制。

本文转自 tywali 51CTO博客,原文链接:http://blog.51cto.com/lancelot/243412,如需转载请自行联系原作者

基于OHCI的USB主机 —— OHCI(设计思路)相关推荐

  1. 基于OHCI的USB主机 —— OHCI(端点)

    OHCI (Open Host Controller Interface),是康柏.微软.国家半导体等公司共同制定的一个USB主机接口规范,它提供一个更抽象的接口来完成USB数据传输工作. 在OHCI ...

  2. 基于OHCI的USB主机 —— 前言

    很久以前,大概是前年年底吧,因为公司项目的要求,我做了基于OHCI的USB主机访问U盘的程序,用来把系统中产生的一些数据保存到U盘中.本来做的时候就想把其中的一些经验体会发表的,可是工作实在是太忙,而 ...

  3. 基于OHCI的USB主机 —— 结束语

    从去年11月份开始连载的<基于OHCI的USB主机>系列总算告一段落了,到UFI命令层为止,所有USB主机的底层处理就结束了,再上面就是磁盘读写.文件系统.文件读写和应用系统了.这些上层应 ...

  4. 基于FPGA的USB接口控制器设计(VHDL)(中)

    今天给大侠带来基于 FPGA 的 USB 接口控制器设计(VHDL),由于篇幅较长,分三篇.今天带来第二篇,中篇,USB通信原理.USB 系统开发以及设计实例.话不多说,上货. 之前有关于 Veril ...

  5. 基于FPGA的USB接口控制器设计(VHDL)(上)

    今天给大侠带来基于 FPGA 的 USB 接口控制器设计(VHDL),由于篇幅较长,分三篇.今天带来第一篇,上篇,USB 接口简介 以及 USB 体系结构.话不多说,上货. 之前有关于 Verilio ...

  6. 基于OHCI的USB主机 —— 寄存器(初始化)

    硬件初始化的操作比较简单,主要代码从例程<AT91RM9200-BasicUHP>中抄过来,另外增加了中断向量初始化的部分. 在AM9200中,USB的中断是基于AIC中断的,因此要设置对 ...

  7. 基于OHCI的USB主机 —— UFI命令 USB Mass Storage Class Bulk-Only Transport协议介绍

    USB Mass Storage Class Bulk-Only Transport Microsoft公司至Windows98后,USB主机 都支持Bulk-Only标准,所以现在的大容量存储类设备 ...

  8. 基于OHCI的USB主机 —— 寄存器(其它)

    USB端口关电 对USB端口进行关电处理的目的主要有两个,一是安全拔下U盘,防止带电插拔造成数据丢失或错误,另一个是为了再次开电,对U盘内部程序进行复位. /**  * 断开USB端口的供电  */ ...

  9. 基于OHCI的USB主机 —— USB设备常量定义

    USB设备枚举过程中使用到的常量定义如下: /*-------------------------------------------------------------------------  * ...

最新文章

  1. cufflinks基于dataframe数据绘制股票数据:直方图、时序图
  2. 删除git中无用的大文件
  3. springboot filter and interceptor实战之mdc日志打印
  4. 一种可以穿透还原卡和还原软件的代码
  5. Java对存储过程的调用方法
  6. 噬血代码进不了游戏_玩家认可,二次元魂类游戏,《噬血代码》在三个方面做出了差异化...
  7. 数据库密码过期 怎么修改
  8. 前端学习(3253):vs code中组件化编码
  9. 【CodeForces - 1020B】Badge(模拟,图,环)
  10. plsql 64连接32oracle,32位plsql developer连接64位oracle的方法
  11. 编译开源路由下iNode客户端njit8021xclient
  12. 磷酸铁锂电池BMS系统工作原理
  13. Saber电路仿真软件
  14. win7游戏全屏模式通过注册表修改
  15. 【长篇博文】Docker学习笔记与深度学习环境的搭建和部署(二)
  16. dwm.exe(桌面窗口管理器)占用内存过大解决办法
  17. Oracle 19c Grid Infrastructure安装
  18. Microsoft IIS波浪号目录枚举/IIS短文件名枚举漏洞
  19. 深入浅出Java Object Layout (JOL)
  20. java各历史版本官网下载

热门文章

  1. 通用Windows应用《博客园-开发者的网上家园》开发(1)——MVVM模式
  2. 汇编: mul乘法指令(字乘法结果在dx:ax中,8位乘法:一个乘数默认放在al中)
  3. 一个关于linux文件预读机制问题
  4. JavaScript Set Homepage and Favorite
  5. 深度学习时代的图模型,清华发文综述图网络
  6. 需求分析--12章 过程建模
  7. git merge git pull时候遇到冲突解决办法git stash
  8. php接收ajax转数组
  9. 我也来说说js的事件机制
  10. [JAVA]引入目录下所有jar包等问题