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

📄 phc_hcs.c

📁 此為philip 1362 USB DOS下的驅動程式包, 已經共測試並內含有說明文件
💻 C
📖 第 1 页 / 共 3 页
字号:
		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 + -