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

📄 usbh_hcds_vhub.c

📁 epson usb2.0 控制芯片 S1R72V05 固件程序。
💻 C
📖 第 1 页 / 共 5 页
字号:
Inline long GetConfiguration( DEVICE_REQUEST *psDeviceRequest )
{
	USBH_HCD_URB *psUrb;
	unsigned char *pBufAdrs;


	psUrb = VHUBStatus.psUrb;
	pBufAdrs = (unsigned char *)psUrb->pTransBuf;

	if( (psDeviceRequest->bmRequestType & BMREQ_DIR_MASK) != DIR_DEVICE_TO_HOST ){
		/* Direction of transfer is different */

		return STATUS_INVALID_PARAMETER;
	}

	if( (psDeviceRequest->bmRequestType & BMREQ_RECIPIENT_MASK) != RECIPIENT_DEVICE ){

		return STATUS_INVALID_PARAMETER;
	}

	if( VHUBStatus.bmFlags.usbState == DEFAULT_STATE ){

		return STATUS_INVALID_PARAMETER;
	}
	if( psDeviceRequest->wValueH || psDeviceRequest->wValueL ){
		/* wValue != 0 */

		return STATUS_INVALID_PARAMETER;
	}
	if( psDeviceRequest->wIndexH || psDeviceRequest->wIndexL ){
		/* wIndex != 0 */

		return STATUS_INVALID_PARAMETER;
	}
	if( psDeviceRequest->wLengthH || psDeviceRequest->wLengthL != GET_CONFIG_DATA_LENGTH ){
		/* wLength != GET_CONFIG_DATA_LENGTH */

		return STATUS_INVALID_PARAMETER;
	}

	/*===========================/
	Set the replying data	  /
	/===========================*/
	pBufAdrs[0] = VHUBStatus.configValue;

	psUrb->actualLength = GET_CONFIG_DATA_LENGTH;

	return STATUS_SUCCESS;
}

/*======================================================================
// Function_Name: SetConfiguration
// description	: Set Configuration request
//
//				  Process for Set Configuration request
//
// argument 	: *psDeviceRequest			Pointer of device request
//
// return		: STATUS_SUCCESS			Success
//				  STATUS_INVALID_PARAMETER		Error
// 				  STATUS_NOT_IMPLEMENTED	Not implemented
//				  STATUS_INVALID_PARAMETER	Parameter error
========================================================================*/
Inline long SetConfiguration( DEVICE_REQUEST *psDeviceRequest )
{
	long retValue;


	if( (psDeviceRequest->bmRequestType & BMREQ_DIR_MASK) != DIR_HOST_TO_DEVICE ){
		/* Direction of transfer is different */
		return STATUS_INVALID_PARAMETER;
	}
	if( (psDeviceRequest->bmRequestType & BMREQ_RECIPIENT_MASK) != RECIPIENT_DEVICE ){

		return STATUS_INVALID_PARAMETER;
	}
	if( VHUBStatus.bmFlags.usbState == DEFAULT_STATE ){

		return STATUS_INVALID_PARAMETER;
	}
	if( psDeviceRequest->wValueH ){
		/* wValue.h != 0 */

		return STATUS_INVALID_PARAMETER;
	}
	if( psDeviceRequest->wIndexH || psDeviceRequest->wIndexL ){
		/* wIndex != 0 */

		return STATUS_INVALID_PARAMETER;
	}
	if( psDeviceRequest->wLengthH || psDeviceRequest->wLengthL ){
		/* wLength != 0 */

		return STATUS_INVALID_PARAMETER;
	}

	/*=============================================/
	Check whether the specified ConfigurationValue is effective /
	/=============================================*/
	if( psDeviceRequest->wValueL > StdDevDesc[OFFSET_BNUMCONFIGURATIONS] ){
		/* Invalid ConfigurationValue */

		return STATUS_INVALID_PARAMETER;
	}

	/*==========================/
	Change of Configuration Value/
	/==========================*/
	VHUBStatus.configValue = psDeviceRequest->wValueL;

	/*======================/
	Change of USB state/
	/======================*/
	if( psDeviceRequest->wValueL != 0 ){
		VHUBStatus.bmFlags.usbState = CONFIGURED_STATE;

		/*=====================================/
		The port is put into the state that the power supply is not supplied/
		/=====================================*/
		retValue = USBH_HCDS_PortControl(USBH_HCDS_PORT_ST_POWERED_OFF);
		if( retValue != STATUS_SUCCESS ){
			return retValue;
		}
	} else {
		VHUBStatus.bmFlags.usbState = ADDRESSED_STATE;
	}

	return STATUS_SUCCESS;
}

/*======================================================================
// Function_Name: GetInterface
//
// description	: Get Interface request
//
//				  Process for Interface request
//
// argument 	: *psDeviceRequest			Pointer of device request
//
// return		: STATUS_SUCCESS			Success
//				  STATUS_INVALID_PARAMETER		Error
// 				  STATUS_NOT_IMPLEMENTED	Not implemented
//				  STATUS_INVALID_PARAMETER	Parameter error
========================================================================*/
Inline long GetInterface( DEVICE_REQUEST *psDeviceRequest )
{
	USBH_HCD_URB *psUrb;
	unsigned char *pBufAdrs;


	psUrb = VHUBStatus.psUrb;
	pBufAdrs = (unsigned char *)psUrb->pTransBuf;

	if( (psDeviceRequest->bmRequestType & BMREQ_DIR_MASK) != DIR_DEVICE_TO_HOST ){
		/* Direction of transfer is different */

		return STATUS_INVALID_PARAMETER;
	}
	if( (psDeviceRequest->bmRequestType & BMREQ_RECIPIENT_MASK) != RECIPIENT_INTERFACE ){

		return STATUS_INVALID_PARAMETER;
	}
	if( VHUBStatus.bmFlags.usbState != CONFIGURED_STATE ){

		return STATUS_INVALID_PARAMETER;
	}
	if( psDeviceRequest->wValueH || psDeviceRequest->wValueL ){
		/* wValue != 0 */

		return STATUS_INVALID_PARAMETER;
	}
	if( psDeviceRequest->wIndexH ){
		/* wIndex.h != 0 */

		return STATUS_INVALID_PARAMETER;
	}
	if( psDeviceRequest->wLengthH || psDeviceRequest->wLengthL != GET_INTERFACE_DATA_LENGTH){
		/* wLength != GET_INTERFACE_DATA_LENGTH */

		return STATUS_INVALID_PARAMETER;
	}

	/*===========================================/
	Check whether the specified Interface Number is effective /
	/===========================================*/
	if( psDeviceRequest->wIndexL > (StdConfigDesc[OFFSET_BNUMINTERFACES] - 1) ){
		/* Invalid Interface Number */

		return STATUS_INVALID_PARAMETER;
	}

	/*===========================/
	/Set The replying data	  /
	/===========================*/
	pBufAdrs[0] = 0;

	psUrb->actualLength = GET_INTERFACE_DATA_LENGTH;

	return STATUS_SUCCESS;
}

/*======================================================================
// Function_Name: SetInterface
//
// description	: Set Interface request
//
//				  Process for Set Interface request
//
// argument 	: *psDeviceRequest			Pointer of device request
//
// return		: STATUS_SUCCESS			Success
//				  STATUS_INVALID_PARAMETER		Error
// 				  STATUS_NOT_IMPLEMENTED	Not implemented
//				  STATUS_INVALID_PARAMETER	Parameter error
========================================================================*/
Inline long SetInterface( DEVICE_REQUEST *psDeviceRequest )
{
	if( (psDeviceRequest->bmRequestType & BMREQ_DIR_MASK) != DIR_HOST_TO_DEVICE){
		/* Direction of transfer is different */

		return STATUS_INVALID_PARAMETER;
	}
	if( (psDeviceRequest->bmRequestType & BMREQ_RECIPIENT_MASK) != RECIPIENT_INTERFACE){

		return STATUS_INVALID_PARAMETER;
	}
	if(VHUBStatus.bmFlags.usbState != CONFIGURED_STATE){

		return STATUS_INVALID_PARAMETER;
	}
	if( psDeviceRequest->wValueH ){
		/* wValue.h != 0 */

		return STATUS_INVALID_PARAMETER;
	}
	if( psDeviceRequest->wIndexH ){
		/* wIndex.h != 0 */

		return STATUS_INVALID_PARAMETER;
	}
	if( psDeviceRequest->wLengthH || psDeviceRequest->wLengthL ){
		/* wLength != 0 */

		return STATUS_INVALID_PARAMETER;
	}

	/*===========================================/
	Check whether the specified Interface Number is effective /
	/===========================================*/
	if( psDeviceRequest->wIndexL > (StdConfigDesc[OFFSET_BNUMINTERFACES] - 1) ){
		/* Invalid Interface Number */

		return STATUS_INVALID_PARAMETER;
	}

	if( psDeviceRequest->wValueL != 0 ){
		/* AlternateSetting value doesn't exist */

		return STATUS_INVALID_PARAMETER;
	}

	return STATUS_SUCCESS;
}

/*=============================================================================================
// Function_Name: ClassRequest
//
// description	: Class request process
//
//				  Analyze the passed request data, and process an appropriate class request
//
// argument 	: *psDeviceRequest			(in)Pointer to request data
//
// return		: STATUS_SUCCESS			Processing completed successfully
===============================================================================================*/
Inline long ClassRequest( DEVICE_REQUEST *psDeviceRequest )
{
	long retValue;


	switch( psDeviceRequest->bRequest ){
		case CREQ_GET_STATUS:
			retValue = ClassGetStatus(psDeviceRequest);
			break;
		case CREQ_CLEAR_FEATURE:
			retValue = ClassClearFeature(psDeviceRequest);
			break;
		case CREQ_SET_FEATURE:
			retValue = ClassSetFeature(psDeviceRequest);
			break;
		case CREQ_GET_DESCRIPTOR:
			retValue = ClassGetDescriptor(psDeviceRequest);
			break;
		case CREQ_CLEAR_TT_BUFFER:
			retValue = ClassClearTTBuffer(psDeviceRequest);
			break;
		case CREQ_RESET_TT:
			retValue = ClassResetTT(psDeviceRequest);
			break;
		case CREQ_GET_TT_STATE:
			retValue = ClassGetTTState(psDeviceRequest);
			break;
		case CREQ_STOP_TT:
			retValue = ClassStopTT(psDeviceRequest);
			break;
		default:
			retValue = STATUS_INVALID_PARAMETER;
	}

	return retValue;
}

/*======================================================================
// Function_Name: ClassGetStatus
//
// description	: Class definition Get Status request
//
//				  Process for Get Status request of class definition
//
// argument 	: *psDeviceRequest			Pointer of device request
//
// return		: STATUS_SUCCESS			Success
//				  STATUS_INVALID_PARAMETER		Error
//				  STATUS_INVALID_PARAMETER	Parameter error
========================================================================*/
Inline long ClassGetStatus( DEVICE_REQUEST *psDeviceRequest )
{
	USBH_HCD_URB *psUrb;
	unsigned char *pBufAdrs;


	psUrb = VHUBStatus.psUrb;
	pBufAdrs = (unsigned char *)psUrb->pTransBuf;


	if( VHUBStatus.bmFlags.usbState != CONFIGURED_STATE ){
		/* Except for Configured State */

		return STATUS_INVALID_PARAMETER;
	}

	if( (psDeviceRequest->bmRequestType & BMREQ_DIR_MASK) != DIR_DEVICE_TO_HOST ){
		/* Direction of transfer is different */

		return STATUS_INVALID_PARAMETER;
	}

	if( psDeviceRequest->wValueH || psDeviceRequest->wValueL ){
		/* wValue != 0 */

		return STATUS_INVALID_PARAMETER;
	}

	if( psDeviceRequest->wLengthH || psDeviceRequest->wLengthL != CLASS_GET_STATUS_DATA_LENGTH ){
		/* wLength != GET_STATUS_DATA_LENGTH */

		return STATUS_INVALID_PARAMETER;
	}

	switch( psDeviceRequest->bmRequestType & BMREQ_RECIPIENT_MASK ){
		case RECIPIENT_DEVICE:
			/* Get HUB Status */

			if( psDeviceRequest->wIndexH || psDeviceRequest->wIndexL ){
				/* wIndex != 0*/

				return STATUS_INVALID_PARAMETER;
			}

			/*===========================/
			Set the replying data 	 /
			/===========================*/
			pBufAdrs[0] = LOBYTE(VHUBStatus.sHubStatus.status);
			pBufAdrs[1] = HIBYTE(VHUBStatus.sHubStatus.status);
			pBufAdrs[2] = LOBYTE(VHUBStatus.sHubStatus.changeStatus);
			pBufAdrs[3] = HIBYTE(VHUBStatus.sHubStatus.changeStatus);

			break;
		case RECIPIENT_OTHER:
			/* Get Port Status */

			if( psDeviceRequest->wIndexH ){
				/* wIndex != 0*/

				return STATUS_INVALID_PARAMETER;
			}

			/*=====================================/
			Check whether the specified port number is effective /
			/=====================================*/
			if( psDeviceRequest->wIndexL != 1 ){
				/* Invalid port number */

				return STATUS_INVALID_PARAMETER;
			}

			/*===========================/
			Set the replying data	  /
			/===========================*/
			pBufAdrs[0] = LOBYTE(VHUBStatus.sPortStatus.status);
			pBufAdrs[1] = HIBYTE(VHUBStatus.sPortStatus.status);
			pBufAdrs[2] = LOBYTE(VHUBStatus.sPortStatus.changeStatus);
			pBufAdrs[3] = HIBYTE(VHUBStatus.sPortStatus.changeStatus);
			break;
		default:
			return STATUS_INVALID_PARAMETER;
	}

	psUrb->actualLength = CLASS_GET_STATUS_DATA_LENGTH;

	return STATUS_SUCCESS;
}

/*======================================================================
// Function_Name: ClassClearFeature
//
// description	: Class definition Clear Feature request
//
//				  Process for Clear Feature request of class definition
//
// argument 	: *psDeviceRequest			Pointer of device request
//

⌨️ 快捷键说明

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