硬件初始化的操作比较简单,主要代码从例程《AT91RM9200-BasicUHP》中抄过来,另外增加了中断向量初始化的部分。
在AM9200中,USB的中断是基于AIC中断的,因此要设置对应的AIC中断。在此之前要设置OHCI的中断寄存器,代码如下:
/**
 * USB主机初始化
 * @return 0 - 成功
 */
short ohciHardInit(void)
{
    unsigned int reg;
   
    //打开USB主机所使用的时钟
    AT91F_UHP_CfgPMC();
    AT91C_BASE_PMC->PMC_SCER |= (AT91C_PMC_UHP);
   
    // Forcing UHP_Hc to reset
    pUhp->UHP_HcControl = 0;
    // Writing the UHP_HCCA
    pUhp->UHP_HcHCCA = (unsigned int) &HCCA;
    // Enabling list processing
    pUhp->UHP_HcControl = 0;
    // Set the frame interval
    pUhp->UHP_HcFmInterval = AT91C_FMINTERVAL;
    pUhp->UHP_HcPeriodicStart = AT91C_PRDSTRT;
   
    // Initializing the UHP_HcDoneHead
    pUhp->UHP_HcBulkDoneHead   = 0x00;
    HCCA.UHP_HccaDoneHead = 0x0000;
    // Forcing UHP_Hc to Operational State
    reg = pUhp->UHP_HcControl;
    pUhp->UHP_HcControl = 0x80;
    // Enabling port power
    pUhp->UHP_HcRhPortStatus[0] = 0x00000100;
    pUhp->UHP_HcRhPortStatus[1] = 0x00000100;
    pUhp->UHP_HcRhDescriptorA = OHCI_HC_RHDESCRIPTORA_NPS;
    pUhp->UHP_HcRhStatus = 0x00010000;
   
    // UDP: Connect a pull-up
    //调试时发现不设置此寄存器则返回的数据有问题
    AT91F_PIO_SetOutput(AT91C_BASE_PIOD, AT91C_PIO_PD5);
   
    //设置USB Host中断寄存器
    pUhp->UHP_HcInterruptEnable =   OHCI_HC_INTR_MIE |
                                OHCI_HC_INTR_RHSC |
                                OHCI_HC_INTR_UE |
                                OHCI_HC_INTR_WDH |
                                OHCI_HC_INTR_FNO;
    pUhp->UHP_HcInterruptStatus =   OHCI_HC_INTR_RHSC |
                                OHCI_HC_INTR_UE |
                                OHCI_HC_INTR_WDH |
                                OHCI_HC_INTR_FNO;
    //设置AIC中断信息
    AT91F_AIC_ConfigureIt(   AT91C_BASE_AIC,
                         AT91C_ID_UHP,
                         AT91C_AIC_PRIOR_HIGHEST,
                         AT91C_AIC_SRCTYPE_INT_EDGE_TRIGGERED,                                     AT91F_ASM_UHP_Handler);
    AT91F_AIC_EnableIt(AT91C_BASE_AIC,AT91C_ID_UHP);
   
    return 0;
}
OHCI中的中断寄存器设置了若干中断,实际上有用的就是WDH中断,该中断是TD传输完毕后产生的。通过判断该中断的产生以及配合HCCA判断是否到达TD队列尾,可以确定数据是否传输完毕。
代码中的相关常量定义可以在"AT91RM9200.h"、"lib_AT91RM9200.h"、 "ohci.h"这几个头文件中找到,例程《AT91RM9200-BasicUHP》里面都有的。

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

基于OHCI的USB主机 —— 寄存器(初始化)相关推荐

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

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

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

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

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

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

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

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

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

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

  6. 基于OHCI的USB主机 —— OHCI(设计思路)

    在OHCI层,主要完成如下功能: l  通过控制端口读写数据(包含SETUP.DATA.STATUS等3个TD): l  通过控制端口发送设置命令(没有DATA的TD): l  通过批量端口读数据: ...

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

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

  8. 基于OHCI的USB主机 —— UFI命令监视代码

    在调用完上面的UFI命令后,ufiCmdRunning.state就被设置为UFI_STATE_BEGIN态,在主循环中调用本函数,用来判断UFI命令是否执行完毕,以及是否执行成功. /**  * U ...

  9. 基于OHCI的USB主机——UFI查询命令(Inquiry)

    查询命令(INQUIRY)请求获取UFI设备参数的信息.他被用作主机上的驱动器访问FUI设备的配置,特别是在接通电源和硬件复位之后使用.命令内容如下表:  位 字节 7 6 5 4 3 2 1 0 0 ...

最新文章

  1. hdu4861 找规律了
  2. C++普通引用和常引用
  3. MySQL前缀索引与覆盖索引:前缀索引对于索引精简 覆盖索引对于查询数据索引化
  4. LeetCode 121:买卖股票的最佳时机 思考分析
  5. docker 2376端口 CA 认证,并不能阻止服务器成为肉鸡
  6. Python编程高手之路——第一章:用户交互
  7. 使用OGR创建弧形图形
  8. B站韩顺平java学习笔记(二十)-- 网络编程 章节
  9. 项目管理软件浮出水面(转)
  10. 51CTO微职位一次通过PMP之经验浅谈
  11. c语言实现按键的抖动与消除,7.3 按键消抖
  12. 关于惠普打印机可以打印但是无法扫描的问题
  13. Windows 8如何关闭自动维护_-Chaz-_新浪博客
  14. c语言保龄球计分程序,保龄球规则-保龄球比赛计分方法是怎样的? 爱问知识人...
  15. uniapp地图轨迹回放
  16. 学习淘宝分享出来的链接web检测打开原生App
  17. 《从0开始做运营》(有感)
  18. Linux操作系统基础之文件传输
  19. 英语读书笔记-Book Lovers Day 11
  20. 项目中使用过的Soc

热门文章

  1. python语言入门w-Python 基础教程
  2. python毕业设计开题报告-基于Python的教学互动系统的设计与实现开题报告
  3. 使用python hashlib模块给明文字符串加密,以及如何撞库破解密码
  4. octotree的安装
  5. C 语言Hello world
  6. 使用字符流 创建文件 写入文件 复制文件
  7. 使用chardet判断编码方式
  8. Android webservice的用法详细讲解
  9. block 实现原理详解(一)
  10. [00028]-[2015-09-23]-[00]-[VC 关于Excel操作的测试]