程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 基於OHCI的USB主機 —— 寄存器(初始化)

基於OHCI的USB主機 —— 寄存器(初始化)

編輯:關於C語言

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved