📄 phc_hcs.c
字号:
else if(Active == 1 &&
CompletionCode == PTD_RETCODE_NOTOUCH || // First Xaction is Naking
CompletionCode == PTD_RETCODE_OK // Rest Xactions are Naking
)
{
// Device Keep NAKing
// Host Retry Forever;
#ifdef USB_SPEC_REQ
TimeOut --;
#endif
RetryCnt = MAX_RETRY-1;
}
else
{
RetryCnt -- ;
}
}
if(bVerboseHCS)
printf("DataOut Stage: Face Error %u times\n",MAX_RETRY-1-RetryCnt);
if(CompletionCode == PTD_RETCODE_OK && Active == 0 )
{
return TRUE;
}
else
{
HcS_PTD_ErrorHandler(CTRLXFER_DATA_IN_STAGE,CompletionCode);
return FALSE;
}
}
BOOLEAN HcS_USBCtrlStatusOutStage(void)
{
UCHAR CompletionCode;
UCHAR Active;
#ifdef USB_SPEC_REQ
USHORT TimeOut = TIMEOUT_50MS;
#endif
USHORT RetryCnt = MAX_RETRY - 1;
while(TRUE){
// Xfer ATL
HcS_UsbDataOutStage.PTD.Active = 1;
HcS_UsbDataOutStage.PTD.CompletionCode = PTD_RETCODE_NOTOUCH;
HcS_DumpATL((PUSHORT) &HcS_UsbDataOutStage, sizeof(PTD_32bitAlign) );
HcS_Wait4ATLDone();
HcS_RetrieveATL((PUSHORT) &HcS_UsbDataOutStage, sizeof(PTD_32bitAlign));
// Analyze ATL
CompletionCode = HcS_UsbDataOutStage.PTD.CompletionCode;
Active = HcS_UsbDataOutStage.PTD.Active;
if( CompletionCode == PTD_RETCODE_STALL ||
RetryCnt == 0 ||
#ifdef USB_SPEC_REQ
TimeOut == 0 ||
#endif
(CompletionCode == PTD_RETCODE_OK && Active == 0)
)
{
break;
}
else if(
(CompletionCode == PTD_RETCODE_NOTOUCH && Active == 1)
)
{
// Device Keep NAKing
// Host Retry Forever;
#ifdef USB_SPEC_REQ
TimeOut --;
#endif
RetryCnt = MAX_RETRY-1;
}
else
{
RetryCnt --;
}
}
if(bVerboseHCS)
printf("StatusOut Stage: Face Error %u times\n",MAX_RETRY-1-RetryCnt);
if(CompletionCode == PTD_RETCODE_OK && Active == 0)
{
return TRUE;
}
else
{
HcS_PTD_ErrorHandler(CTRLXFER_STATUS_IN_STAGE,CompletionCode);
return FALSE;
}
}
BOOLEAN HcS_USBCtrlStatusInStage(void)
{
UCHAR CompletionCode;
UCHAR Active;
#ifdef USB_SPEC_REQ
USHORT TimeOut = TIMEOUT_50MS;
#endif
USHORT RetryCnt = MAX_RETRY-1 ;
while(TRUE)
{
// Xfer ATL
HcS_UsbDataInStage.PTD.Active = 1;
HcS_UsbDataInStage.PTD.CompletionCode = PTD_RETCODE_NOTOUCH;
HcS_DumpATL((PUSHORT) &HcS_UsbDataInStage, sizeof(PTD_32bitAlign) );
HcS_Wait4ATLDone();
HcS_RetrieveATL((PUSHORT) &HcS_UsbDataInStage, sizeof(PTD_32bitAlign) );
CompletionCode = HcS_UsbDataInStage.PTD.CompletionCode;
Active = HcS_UsbDataInStage.PTD.Active;
if( CompletionCode == PTD_RETCODE_STALL ||
CompletionCode == PTD_RETCODE_DATAUNDERUN ||
#ifdef USB_SPEC_REQ
TimeOut == 0 ||
#endif
RetryCnt == 0 ||
(CompletionCode == PTD_RETCODE_OK && Active == 0)
)
{
break;
}
else if(
CompletionCode == PTD_RETCODE_NOTOUCH && Active == 1
)
{
// Device Keep NAKing
// Host Retry Forever; //USB1.1: 50ms
#ifdef USB_SPEC_REQ
TimeOut --;
#endif
RetryCnt = MAX_RETRY-1 ;
}
else
{
RetryCnt -- ;
}
}
if(bVerboseHCS)
printf("StatusIn Stage: Face Error %u times\n",MAX_RETRY-1-RetryCnt);
if((CompletionCode == PTD_RETCODE_OK && Active == 0)|| CompletionCode == PTD_RETCODE_DATAUNDERUN)
{
return TRUE;
}
else
{
HcS_PTD_ErrorHandler(CTRLXFER_STATUS_IN_STAGE,CompletionCode);
return FALSE;
}
}
BOOLEAN HcS_USBCtrlWrite(void)
{
UCHAR retCode;
//SetupStage
retCode = HcS_USBCtrlSetupStage();
if(retCode == FALSE)
return retCode;
//DataOutStage
#ifdef DBG_DELAY
Hal4Sys_WaitinMS(200);
#endif
retCode = HcS_USBCtrlDataOutStage();
if(retCode == FALSE)
return retCode;
//DataInStage as StatusStage
#ifdef DBG_DELAY
Hal4Sys_WaitinMS(200);
#endif
retCode = HcS_USBCtrlStatusInStage();
return retCode;
}
BOOLEAN HcS_USBCtrlRead(void)
{
UCHAR retCode;
//SetupStage
retCode = HcS_USBCtrlSetupStage();
if(retCode == FALSE)
return retCode;
//DataInStage
#ifdef DBG_DELAY
Hal4Sys_WaitinMS(200);
#endif
retCode = HcS_USBCtrlDataInStage();
if(retCode == FALSE)
return retCode;
//DataOutStage as StatusStage
#ifdef DBG_DELAY
Hal4Sys_WaitinMS(200);
#endif
retCode = HcS_USBCtrlStatusOutStage();
return retCode;
}
BOOLEAN HcS_USBCtrlOnly(void)
{
UCHAR retCode;
//SetupStage
retCode = HcS_USBCtrlSetupStage();
if(retCode == FALSE)
return retCode;
//DataInStage as StatusStage
#ifdef DBG_DELAY
Hal4Sys_WaitinMS(200);
#endif
retCode = HcS_USBCtrlStatusInStage();
return retCode;
}
/********************************************************/
/******** Functions - BulkXfer for ATL/ITL Buffer ****/
/********************************************************/
BOOLEAN HcS_USBBulkXferDataIn(void)
{
UCHAR CompletionCode;
UCHAR Active;
USHORT RetryCnt = MAX_RETRY-1 ;
while(TRUE)
{
// Xfer ATL
HcS_UsbDataInStage.PTD.Active = 1;
HcS_UsbDataInStage.PTD.CompletionCode = PTD_RETCODE_NOTOUCH;
HcS_DumpATL((PUSHORT) &HcS_UsbDataInStage, sizeof(PTD_32bitAlign) );
HcS_Wait4ATLDone();
HcS_RetrieveATL((PUSHORT) &HcS_UsbDataInStage, sizeof(PTD_32bitAlign)+MAX_PAYLOAD);
// Analyze ATL
CompletionCode = HcS_UsbDataInStage.PTD.CompletionCode;
Active = HcS_UsbDataInStage.PTD.Active;
if( CompletionCode == PTD_RETCODE_STALL ||
CompletionCode == PTD_RETCODE_DATAUNDERUN ||
RetryCnt == 0 ||
(CompletionCode == PTD_RETCODE_OK && Active == 0)
)
{
break;
}
else if(Active == 1 &&
CompletionCode == PTD_RETCODE_NOTOUCH || // First Xaction is Naking
CompletionCode == PTD_RETCODE_OK // Rest Xactions are Naking
)
{
// Device Keep NAKing
// Host Retry Forever;
RetryCnt = MAX_RETRY-1 ;
}
else
{
RetryCnt -- ;
}
}
if(bVerboseHCS)
printf("Bulk In: Face Error %u times\n",MAX_RETRY-1-RetryCnt);
if((CompletionCode == PTD_RETCODE_OK && Active == 0)|| CompletionCode == PTD_RETCODE_DATAUNDERUN)
{
return TRUE;
}
else
{
HcS_PTD_ErrorHandler(BULKXFER_DATA_IN_STAGE,CompletionCode);
return FALSE;
}
}
BOOLEAN HcS_USBBulkXferDataOut(void)
{
UCHAR CompletionCode;
UCHAR Active;
USHORT RetryCnt = MAX_RETRY-1 ;
while(TRUE)
{
//Xfer ATL
HcS_UsbDataOutStage.PTD.Active = 1;
HcS_UsbDataOutStage.PTD.CompletionCode = PTD_RETCODE_NOTOUCH;
HcS_DumpATL((PUSHORT) &HcS_UsbDataOutStage, sizeof(PTD_32bitAlign)+MAX_PAYLOAD);
HcS_Wait4ATLDone();
HcS_RetrieveATL((PUSHORT) &HcS_UsbDataOutStage, sizeof(PTD_32bitAlign));
//Analyze ATL
CompletionCode = HcS_UsbDataOutStage.PTD.CompletionCode;
Active = HcS_UsbDataOutStage.PTD.Active;
if( CompletionCode == PTD_RETCODE_STALL ||
RetryCnt == 0 ||
(CompletionCode == PTD_RETCODE_OK && Active == 0)
)
{
break;
}
else if(Active == 1 &&
CompletionCode == PTD_RETCODE_NOTOUCH || // First Xaction is Naking
CompletionCode == PTD_RETCODE_OK // Rest Xactions are Naking
)
{
// Device Keep NAKing
// Host Retry Forever;
RetryCnt = MAX_RETRY-1 ;
}
else
{
RetryCnt -- ;
}
}
if(bVerboseHCS)
printf("Bulk Out: Face Error %u times\n",MAX_RETRY-1-RetryCnt);
if(CompletionCode == PTD_RETCODE_OK && Active == 0 )
{
return TRUE;
}
else
{
HcS_PTD_ErrorHandler(BULKXFER_DATA_IN_STAGE,CompletionCode);
return FALSE;
}
}
/********************************************************/
/******** Functions - IsoXfer for ATL/ITL Buffer ****/
/********************************************************/
BOOLEAN HcS_USBIsoXferDataIn(void)
{
UCHAR CompletionCode;
UCHAR Active;
// Xfer ITL
HcS_DumpITL((PUSHORT) &HcS_UsbDataInStage, sizeof(PTD_32bitAlign) );
HcS_Wait4ATLDone();
HcS_RetrieveITL((PUSHORT) &HcS_UsbDataInStage, sizeof(PTD_32bitAlign)+MAX_PAYLOAD);
// Analyze ITL
if((CompletionCode == PTD_RETCODE_OK && Active == 0)|| CompletionCode == PTD_RETCODE_DATAUNDERUN)
{
return TRUE;
}
else
{
HcS_PTD_ErrorHandler(ISOXFER_DATA_IN_STAGE,CompletionCode);
return FALSE;
}
}
BOOLEAN HcS_USBIsoXferDataOut(void)
{
UCHAR CompletionCode;
UCHAR Active;
//Xfer ITL
HcS_DumpITL((PUSHORT) &HcS_UsbDataOutStage, sizeof(PTD_32bitAlign)+MAX_PAYLOAD);
HcS_Wait4ITLDone();
HcS_RetrieveITL((PUSHORT) &HcS_UsbDataOutStage, sizeof(PTD_32bitAlign));
//Analyze ITL
CompletionCode = HcS_UsbDataOutStage.PTD.CompletionCode;
Active = HcS_UsbDataOutStage.PTD.Active;
if(CompletionCode == PTD_RETCODE_OK && Active == 0 )
{
return TRUE;
}
else
{
HcS_PTD_ErrorHandler(ISOXFER_DATA_IN_STAGE,CompletionCode);
return FALSE;
}
}
/********************************************************/
/******** Functions - IntXfer for ATL/ITL Buffer ****/
/********************************************************/
BOOLEAN HcS_USBIntXferDataIn(void)
{
UCHAR CompletionCode;
UCHAR Active;
USHORT RetryCnt = MAX_RETRY-1 ;
while(TRUE)
{
// Xfer ATL
HcS_UsbDataInStage.PTD.Active = 1;
HcS_UsbDataInStage.PTD.CompletionCode = PTD_RETCODE_NOTOUCH;
HcS_DumpATL((PUSHORT) &HcS_UsbDataInStage, sizeof(PTD_32bitAlign) );
HcS_Wait4ATLDone();
HcS_RetrieveATL((PUSHORT) &HcS_UsbDataInStage, sizeof(PTD_32bitAlign)+MAX_PAYLOAD);
// Analyze ATL
CompletionCode = HcS_UsbDataInStage.PTD.CompletionCode;
Active = HcS_UsbDataInStage.PTD.Active;
if( CompletionCode == PTD_RETCODE_STALL ||
CompletionCode == PTD_RETCODE_DATAUNDERUN ||
RetryCnt == 0 ||
(CompletionCode == PTD_RETCODE_OK && Active == 0)
)
{
break;
}
else if(
CompletionCode == PTD_RETCODE_NOTOUCH && Active == 1
)
{
// Device Keep NAKing
// Host Retry Forever;
RetryCnt = MAX_RETRY-1 ;
}
else
{
RetryCnt -- ;
}
}
if(bVerboseHCS)
printf("Int In: Face Error %u times\n",MAX_RETRY-1-RetryCnt);
if((CompletionCode == PTD_RETCODE_OK && Active == 0)|| CompletionCode == PTD_RETCODE_DATAUNDERUN)
{
return TRUE;
}
else
{
HcS_PTD_ErrorHandler(INTXFER_DATA_IN_STAGE,CompletionCode);
return FALSE;
}
}
BOOLEAN HcS_USBIntXferDataOut(void)
{
UCHAR CompletionCode;
UCHAR Active;
USHORT RetryCnt = MAX_RETRY-1 ;
while(TRUE)
{
//Xfer ATL
HcS_UsbDataOutStage.PTD.Active = 1;
HcS_UsbDataOutStage.PTD.CompletionCode = PTD_RETCODE_NOTOUCH;
HcS_DumpATL((PUSHORT) &HcS_UsbDataOutStage, sizeof(PTD_32bitAlign)+MAX_PAYLOAD);
HcS_Wait4ATLDone();
HcS_RetrieveATL((PUSHORT) &HcS_UsbDataOutStage, sizeof(PTD_32bitAlign));
//Analyze ATL
CompletionCode = HcS_UsbDataOutStage.PTD.CompletionCode;
Active = HcS_UsbDataOutStage.PTD.Active;
if( CompletionCode == PTD_RETCODE_STALL ||
RetryCnt == 0 ||
(CompletionCode == PTD_RETCODE_OK && Active == 0)
)
{
break;
}
else if(
CompletionCode == PTD_RETCODE_NOTOUCH && Active == 1
)
{
// Device Keep NAKing
// Host Retry Forever;
RetryCnt = MAX_RETRY-1 ;
}
else
{
RetryCnt -- ;
}
}
if(bVerboseHCS)
printf("Int Out: Face Error %u times\n",MAX_RETRY-1-RetryCnt);
if(CompletionCode == PTD_RETCODE_OK && Active == 0 )
{
return TRUE;
}
else
{
HcS_PTD_ErrorHandler(INTXFER_DATA_IN_STAGE,CompletionCode);
return FALSE;
}
}
/********************************************************/
/******** Functions - Mis Funcs for HostController ******/
/********************************************************/
void HcS_InitPHCInfo(void)
{
UCHAR i;
HcS_CtrlBlock.byDownPortsNum = 2;
HcS_CtrlBlock.byNumOfDevAttached = 0;
HcS_CtrlBlock.bmDevAttached.FlexByte = 0;
for(i = 0; i < MAX_DOWNPORTS; i++)
{
HcS_CtrlBlock.strucDnPortDev[i].byEndp0PktSize = 64;
HcS_CtrlBlock.strucDnPortDev[i].byDevCnfgNum = 1;
HcS_CtrlBlock.strucDnPortDev[i].byDevIFNum = 1;
HcS_CtrlBlock.strucDnPortDev[i].byLanguageIndex = 0;
HcS_CtrlBlock.strucDnPortDev[i].byManufaturerIndex = 0;
HcS_CtrlBlock.strucDnPortDev[i].byProductIndex = 0;
HcS_CtrlBlock.strucDnPortDev[i].bySerialNumberIndex = 0;
HcS_CtrlBlock.strucDnPortDev[i].byConfigurationIndex = 0;
HcS_CtrlBlock.strucDnPortDev[i].byInterfaceIndex = 0;
}
}
UCHAR HcS_GetDevConnectAtDnPort(UCHAR DnPort)
{
UCHAR bitVal;
switch(DnPort)
{
case 1:
bitVal = HcS_CtrlBlock.bmDevAttached.Bits.bmDnPort1;
break;
case 2:
bitVal = HcS_CtrlBlock.bmDevAttached.Bits.bmDnPort2;
break;
case 3:
// bitVal = HcS_CtrlBlock.bmDevAttached.Bits.bmDnPort3;
// break;
case 4:
// bitVal = HcS_CtrlBlock.bmDevAttached.Bits.bmDnPort4;
// break;
default:
break;
}
return bitVal;
}
void HcS_SetConnectBitmap(UCHAR DnPort, UCHAR bitVal)
{
switch(DnPort)
{
case 1:
HcS_CtrlBlock.bmDevAttached.Bits.bmDnPort1 = bitVal;
break;
case 2:
HcS_CtrlBlock.bmDevAttached.Bits.bmDnPort2 = bitVal;
break;
case 3:
HcS_CtrlBlock.bmDevAttached.Bits.bmDnPort3 = bitVal;
break;
case 4:
HcS_CtrlBlock.bmDevAttached.Bits.bmDnPort4 = bitVal;
break;
default:
break;
}
}
UCHAR HcS_GetDevSpeedAtDnPort(UCHAR DnPort)
{
UCHAR bitVal;
switch(DnPort)
{
case 1:
bitVal = HcS_CtrlBlock.bmDevAttached.Bits.bmDnPDev1LS;
break;
case 2:
bitVal = HcS_CtrlBlock.bmDevAttached.Bits.bmDnPDev2LS;
break;
case 3:
bitVal = HcS_CtrlBlock.bmDevAttached.Bits.bmDnPDev3LS;
break;
case 4:
bitVal = HcS_CtrlBlock.bmDevAttached.Bits.bmDnPDev4LS;
break;
default:
break;
}
return bitVal;
}
void HcS_SetSpeedBitmap(UCHAR DnPort,UCHAR bitVal)
{
switch(DnPort)
{
case 1:
HcS_CtrlBlock.bmDevAttached.Bits.bmDnPDev1LS = bitVal;
break;
case 2:
HcS_CtrlBlock.bmDevAttached.Bits.bmDnPDev2LS = bitVal;
break;
case 3:
HcS_CtrlBlock.bmDevAttached.Bits.bmDnPDev3LS = bitVal;
break;
case 4:
HcS_CtrlBlock.bmDevAttached.Bits.bmDnPDev4LS = bitVal;
break;
default:
break;
}
}
void HcS_DisalbeNResetDnPort(UCHAR DnPort)
{
PHC_DisablePort(DnPort);
PHC_ResetPort(DnPort);
}
void HcS_EnableNResetDnPort(UCHAR DnPort)
{
// PHC_EnablePort(DnPort);
// Hal4Sys_WaitinMS(200); // PowerOn > 100 ms
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -