您的位置:首页 > 职场人生

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

2009-11-19 17:37 489 查看
硬件初始化的操作比较简单,主要代码从例程《AT91RM9200-BasicUHP》中抄过来,另外增加了中断向量初始化的部分。

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