📄 hcd.c
字号:
__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;
}
return __hcStartSchedule(ucType); /* 启动调度 */
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -