⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hcd.c

📁 smartARM2400 USB OTG例程
💻 C
📖 第 1 页 / 共 4 页
字号:

    __GpsOhciReg->uiHcInterruptDisable = 0x7F | (0x03U << 30);          /*  禁止所有中断, 并禁止 MIE 位 */
    __GpsOhciReg->uiHcRhStatus = (0x01 << 16) | (1 << 15);              /*  使能全局电源及LPSC位        */
  
    OSTimeDlyHMSM(0, 0, 0, 200);

    /*
     *  检查有无设备插入
     */
    for (i = 0; i < USB_MAX_PORTS; i++) {
        if (__GpsOhciReg->uiHcRhPortStatus[i] & (1 << 0)) {
            uiTmp = (0x10 << 24) | ((i + 1) << 8) | (__GpsOhciReg->uiHcRhPortStatus[i] & 0x01);
            OSQPost(__GevtUsbMsgQeue, (void *)uiTmp);
            break;
        }
    }

    __GpsOhciReg->uiHcInterruptStatus = 0xC000007F;                     /*  清除所有中断标志            */
    __ohciEnableInt(__USB_INT_RHSC);
    
    return TRUE;
}

/*********************************************************************************************************
** Function name:       __ohciInit2
** Descriptions:        OHCI初始化,检测到设备插入时调用
** input parameters:    None
** output parameters:   None
** Returned value:      TRUE : 成功  FALSE : 失败
*********************************************************************************************************/
USB_BOOL __ohciInit2 (USB_INT8U ucPort)
{
    USB_INT32U  uiTmp;
    USB_INT32U *puiTmp = NULL;

    puiTmp = (USB_INT32U *)__OHCI_HCCA_BASE_ADDR;
    for (uiTmp = 0; uiTmp < 100; uiTmp++) {
        *(puiTmp + uiTmp) = 0;
    }
    
    for (uiTmp = 0; uiTmp < 32; uiTmp++) {
        *(puiTmp + uiTmp) = (USB_INT32U)&__GpohciEd->edsIntrOut;
    }

    __GpsOhciReg->uiHcControl = 0;                                      /*  复位                        */
    OSTimeDly(1);
    
    uiTmp = 0x0000ffff;
    __GpsOhciReg->uiHcCommandStatus = 0x01;                             /*  复位 HC                     */
    while ((__GpsOhciReg->uiHcCommandStatus & 0x01) && --uiTmp);
    if (uiTmp == 0) {
        return FALSE;
    }
    
    __GpsOhciReg->uiHcInterruptDisable = 0x7F | (0x03U << 30);          /*  禁止所有中断, 并禁止 MIE 位 */
	
	__GpsOhciReg->uiHcBulkHeadED    = (USB_INT32U)&(__GpohciEd->edsBulkOut);
    __GpsOhciReg->uiHcControlHeadED = (USB_INT32U)&(__GpohciEd->edsControl);
    
    __GpsOhciReg->uiHcControlCurrentED = 0;
    __GpsOhciReg->uiHcBulkCurrentED    = 0;
    
    __GpsOhciReg->uiHcPeriodCurrentED  = 0;


    __GpsOhciReg->uiHcHCCA = __OHCI_HCCA_BASE_ADDR;

    __GpsOhciReg->uiHcFmInterval = (__OHCI_FM_INTERVAL_FSMPS << 16) | __OHCI_FM_INTERVAL_FI;

    __GpsOhciReg->uiHcPeriodicStart = __OHCI_FM_INTERVAL_FI / 5;
    __GpsOhciReg->uiHcLSThreshold   = __OHCI_LS_THRESHOLD;

    uiTmp = (__OHCI_PWRON_TO_PWRGOOD << 24) & 0xFF000000;	
    __GpsOhciReg->uiHcRhDescriptorA = uiTmp;
    
    uiTmp = (uiTmp >> 24) << 1;		
    OSTimeDlyHMSM(0, 0, 0, (USB_INT16U)uiTmp);
    __GpsOhciReg->uiHcRhDescriptorB = 0x0000;

    __GpsOhciReg->uiHcRhStatus = (0x01 << 16) | (1 << 15);              /*  使能全局电源及LPSC位        */
  
    OSTimeDlyHMSM(0, 0, 0, 200);
	__ohciPortOpen(ucPort);
	      
    /*
     *  使 HC 进入 Operational 状态,CBSR = 3 (即 4 : 1)
     */
    __GpsOhciReg->uiHcControl = (0x02 << 6) | (0x03 << 0);
    
    __GpsOhciReg->uiHcInterruptStatus = 0xC000007F;                     /*  清除所有中断标志            */
    __GpsOhciReg->uiHcInterruptEnable = ((1U << 31) | (1 << 6) |(1 << 4) |(1 << 3) | \
                                         (1 << 1) | (1 << 1) | (1 << 0));
    
    return TRUE;
}

/*********************************************************************************************************
** Function name:       __ohciEnableInt
** Descriptions:        使能中断
** input parameters:    uiIntIndex 中断索引
** output parameters:   None
** Returned value:      TRUE : 成功  FALSE : 失败
*********************************************************************************************************/
USB_BOOL __ohciEnableInt (USB_INT32U uiIntIndex)
{
    INT32U i, j;
    
    __GpsOhciReg->uiHcInterruptStatus |= uiIntIndex;
    
    /*
     *  使能中断, 并在使能完后将寄存器值读回进行校验,如果校验失败则重试
     */
    i = 0;
    do {
        __GpsOhciReg->uiHcInterruptEnable |= __USB_INT_MIE | uiIntIndex;
        if ((__GpsOhciReg->uiHcInterruptEnable & __USB_INT_MIE | uiIntIndex) == __USB_INT_MIE | uiIntIndex) {
            break;
        }
        USBDEBUG_SENDSTR("\r\n!!Enable Interrupt failed!\r\n");
        for (j = 0; j < 0x200; j++);
    } while (++i <= 3);
    
    if (i <= 3) {
        return TRUE;
    } else {
        USBDEBUG_SENDSTR("\r\n!!Enable Interrupt failed!\r\n");
        return FALSE;
    }
}

/*********************************************************************************************************
** Function name:       __ohciDisEnInt
** Descriptions:        禁止中断
** input parameters:    uiIntIndex 中断索引
** output parameters:   None
** Returned value:      None
*********************************************************************************************************/
void __ohciDisEnInt (USB_INT32U uiIntIndex)
{
    __GpsOhciReg->uiHcInterruptDisable = uiIntIndex;
}

/*********************************************************************************************************
** Function name:       __ohciDisEnIntAll
** Descriptions:        禁止所有中断
** input parameters:    None
** output parameters:   None
** Returned value:      None
*********************************************************************************************************/
void __ohciDisEnIntAll (void)
{
    __GpsOhciReg->uiHcInterruptDisable = 0x80000000;
}

/*********************************************************************************************************
** Function name:       __hcEnableSchedule
** Descriptions:        使能调度
** input parameters:    ucType : 类型: 控制传输, 块传输, 中断传输, 同步传输
** output parameters:   None
** Returned value:      TRUE : 成功  FALSE : 失败
*********************************************************************************************************/
USB_BOOL __hcEnableSchedule (USB_INT8U ucType)
{
    if (ucType == USB_TRAN_TYPE_CONTROL) {
        __GpsOhciReg->uiHcControl |= 1 << 4;
        return TRUE;
    } else if ((ucType == USB_TRAN_TYPE_BULK_OUT) || (ucType == USB_TRAN_TYPE_BULK_IN)) {
        __GpsOhciReg->uiHcControl |= 1 << 5;
        return TRUE;
    } else if ((ucType == USB_TRAN_TYPE_INTR_OUT) || (ucType == USB_TRAN_TYPE_INTR_IN)) {
        __GpsOhciReg->uiHcControl |= 1 << 2;
        return TRUE;
    } else if (ucType == USB_TRAN_TYPE_ISO) {
        __GpsOhciReg->uiHcControl |= (1 << 2) | (1 << 3);
        return TRUE;
    }
        
    return FALSE;
}

/*********************************************************************************************************
** Function name:       __hcDisEnSchedule
** Descriptions:        禁止调度
** input parameters:    ucType : 类型: 控制传输, 块传输, 中断传输, 同步传输
** output parameters:   None
** Returned value:      TRUE : 成功  FALSE : 失败
*********************************************************************************************************/
USB_BOOL __hcDisEnSchedule (USB_INT8U ucType)
{
    if (ucType == USB_TRAN_TYPE_CONTROL) {
        __GpsOhciReg->uiHcControl &= ~(1 << 4);
        return TRUE;
    } else if ((ucType == USB_TRAN_TYPE_BULK_OUT) || (ucType == USB_TRAN_TYPE_BULK_IN)) {
        __GpsOhciReg->uiHcControl &= ~(1 << 5);
        return TRUE;
    } else if ((ucType == USB_TRAN_TYPE_INTR_OUT) || (ucType == USB_TRAN_TYPE_INTR_IN)) {
        __GpsOhciReg->uiHcControl &= ~(1 << 2);
        return TRUE;
    } else if (ucType == USB_TRAN_TYPE_ISO) {
        __GpsOhciReg->uiHcControl &= ~((1 << 2) | (1 << 3));
        return TRUE;
    }
    
    return FALSE;
}

/*********************************************************************************************************
** Function name:       __hcWaitNextFrame
** Descriptions:        等待下一帧开始
** input parameters:    None
** output parameters:   None
** Returned value:      TRUE : 成功  FALSE : 失败
*********************************************************************************************************/
void __hcWaitNextFrame (void)
{
    USB_INT32U uiTmp     = 0x0000ffff;
    USB_INT16U usFrameNum;
    
    usFrameNum = __usbGetFrameNumber();                                 /*  获取当前帧号                */
    while ((usFrameNum == __usbGetFrameNumber()) && (--uiTmp));         /*  等待下一帧开始              */
}

/*********************************************************************************************************
** Function name:       __hcDisEnSchedAndWaitNextFrame
** Descriptions:        禁止调度并等待下一帧开始
** input parameters:    ucType : 类型: 控制传输, 块传输, 中断传输, 同步传输
** output parameters:   None
** Returned value:      TRUE : 成功  FALSE : 失败
*********************************************************************************************************/
USB_BOOL __hcDisEnSchedAndWaitNextFrame (USB_INT8U ucType)
{
    if (!__hcDisEnSchedule(ucType)) {
        return FALSE;
    }
    __hcWaitNextFrame();
    return TRUE;
}

/*********************************************************************************************************
** Function name:       __hcStartSchedule
** Descriptions:        启动调度
** input parameters:    ucType : 类型: 控制传输, 块传输, 中断传输, 同步传输
** output parameters:   None
** Returned value:      TRUE : 成功  FALSE : 失败
*********************************************************************************************************/
USB_BOOL __hcStartSchedule (USB_INT8U ucType)
{
    if (ucType == USB_TRAN_TYPE_CONTROL) {
        __GpsOhciReg->uiHcCommandStatus |= 1 << 1;
        return TRUE;
    } else if ((ucType == USB_TRAN_TYPE_BULK_OUT) || (ucType == USB_TRAN_TYPE_BULK_IN)) {
        __GpsOhciReg->uiHcCommandStatus |= 1 << 2;
        return TRUE;
    } else if ((ucType == USB_TRAN_TYPE_INTR_OUT) || (ucType == USB_TRAN_TYPE_INTR_IN)) {
        return TRUE;
    }
    return FALSE;
}

/*********************************************************************************************************
** Function name:       __hcEnableAndStartSchedule
** Descriptions:        使能并启动调度
** input parameters:    ucType : 类型: 控制传输, 块传输, 中断传输, 同步传输
** output parameters:   None
** Returned value:      TRUE : 成功  FALSE : 失败
*********************************************************************************************************/
USB_BOOL __hcEnableAndStartSchedule (USB_INT8U ucType)
{
    if (!__hcEnableSchedule(ucType)) {                                  /*  使能调度                    */
        return FALSE;
    }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -