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

本文详细介绍了 AT91RM9200 微控制器中 USB 主机的初始化过程,包括时钟配置、寄存器设置及中断处理等关键步骤,并解释了 WDH 中断的作用。
硬件初始化的操作比较简单,主要代码从例程《 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 》里面都有的。

本文出自 “rainman ” 博客,请务必保留此出处http://lancelot.blog.51cto.com/393579/229673

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值