基于OHCI的USB主机 —— 寄存器(初始化) 推荐
2009-11-19 17:37
489 查看
硬件初始化的操作比较简单,主要代码从例程《AT91RM9200-BasicUHP》中抄过来,另外增加了中断向量初始化的部分。
在AM9200中,USB的中断是基于AIC中断的,因此要设置对应的AIC中断。在此之前要设置OHCI的中断寄存器,代码如下:
OHCI中的中断寄存器设置了若干中断,实际上有用的就是WDH中断,该中断是TD传输完毕后产生的。通过判断该中断的产生以及配合HCCA判断是否到达TD队列尾,可以确定数据是否传输完毕。
代码中的相关常量定义可以在"AT91RM9200.h"、"lib_AT91RM9200.h"、 "ohci.h"这几个头文件中找到,例程《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] |
代码中的相关常量定义可以在"AT91RM9200.h"、"lib_AT91RM9200.h"、 "ohci.h"这几个头文件中找到,例程《AT91RM9200-BasicUHP》里面都有的。
相关文章推荐
- 基于OHCI的USB主机 —— 中断寄存器初始化
- 基于OHCI的USB主机 —— 寄存器(初始化)
- 3.15 基于OHCI的USB主机 —— 中断寄存器初始化
- 2.2 基于OHCI的USB主机 —— 寄存器(初始化)
- 基于OHCI的USB主机 —— 寄存器(复位)
- 基于OHCI的USB主机 —— 寄存器(其它)
- 2.4基于OHCI的USB主机 —— 寄存器(复位)
- 基于OHCI的USB主机 —— 寄存器层(说明)
- 基于OHCI的USB主机 —— 背景介绍 推荐
- 基于OHCI的USB主机 —— 寄存器层(说明)
- 基于OHCI的USB主机 —— UFI写扇区代码 推荐
- 基于OHCI的USB主机 —— UFI数据结构1 推荐
- 2.5 基于OHCI的USB主机 —— 寄存器(设备连接)
- 基于OHCI的USB主机 —— 寄存器(传输)
- 基于OHCI的USB主机 —— 寄存器层(说明)
- 基于OHCI的USB主机 —— 寄存器(复位)
- 2.6 基于OHCI的USB主机 —— 寄存器(其它)
- 基于OHCI的USB主机 —— OHCI(端点) 推荐
- 基于OHCI的USB主机 —— 寄存器(设备连接)
- 基于OHCI的USB主机开发 —— OHCI(批量端口写数据) 推荐