硬件初始化的操作比較簡單,主要代碼從例程《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