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

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





本文转自 tywali 51CTO博客,原文链接:http://blog.51cto.com/lancelot/229673,如需转载请自行联系原作者
目录
相关文章