硬件初始化的操作比较简单,主要代码从例程《
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
》里面都有的。