原创作品,允许转载,转载时请务必以超链接形式标明文章
原始出处 、作者信息和本声明。否则将追究法律责任。
http://lancelot.blog.51cto.com/393579/229673
硬件初始化的操作比较简单,主要代码从例程《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》里面都有的。