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

📄 usbd_protenum.c

📁 epson usb2.0 控制芯片 S1R72V05 固件程序。
💻 C
📖 第 1 页 / 共 5 页
字号:
/*======================================================================
// Function_Name: GetPowerSaveMode
//
// description	: Return the setting value of Power saving mode
//
//				  Inquire value of Power saving mode from lower module, return data to specified pointer
//
// argument 	: *pParamData	  			 Pointer of parameter data
//
// return		: STATUS_SUCCESS			Success
//				  STATUS_UNSUCCESSFUL		Error
//				  STATUS_NOT_OPENED			Not opened
// 				  STATUS_NOT_IMPLEMENTED	Not implemented
========================================================================*/
LONG GetPowerSaveMode( void *pParamData )
{
	USBD_FUNC_POWER	sPower;
	UCHAR	*pPowerSaveMode;
	LONG	dwAPIStatus;


	/********************************/
	/* Get parameter from lower module */
	/********************************/
	dwAPIStatus = USBD_FuncGetParameter(USBD_FUNC_POWER_PARAM, &sPower, sizeof(sPower));
	if( dwAPIStatus != STATUS_SUCCESS){
		/* Unable to get */

		return dwAPIStatus;
	}

	pPowerSaveMode = (UCHAR *)pParamData;
	*pPowerSaveMode = sPower.bDetach | sPower.bSuspend;

	return STATUS_SUCCESS;
}


/*======================================================================
// Function_Name: GetHWFeatureMode
//
// description	: Return the setting value of H/W function mode
//
//				  Inquire value of H/W function mode from lower module, return data to specified pointer
//
// argument 	: *pParamData	  			 Pointer of parameter data
//
// return		: STATUS_SUCCESS			Success
//				  STATUS_UNSUCCESSFUL		Error
//				  STATUS_NOT_OPENED			Not opened
// 				  STATUS_NOT_IMPLEMENTED	Not implemented
========================================================================*/
LONG GetHWFeatureMode( void *pParamData )
{
	USBD_FUNC_HWFEATURE	sHWFeature;
	USHORT	*pwHWFeatureMode;
	LONG	dwAPIStatus;


	/********************************/
	/* Get parameter from lower module */
	/********************************/
	dwAPIStatus = USBD_FuncGetParameter(USBD_FUNC_HWFEATURE_PARAM, &sHWFeature, sizeof(sHWFeature));
	if( dwAPIStatus != STATUS_SUCCESS){
		/* Unable to get */

		return dwAPIStatus;
	}

	pwHWFeatureMode = (USHORT *)pParamData;
	*pwHWFeatureMode = 0;
	if( sHWFeature.bHwAutoNego == 1 ){
		/* Enable Auto Negotiation */

		*pwHWFeatureMode |= USBD_PROT_ENUM_AUTO_NEGOTIATION;
	}
	if( sHWFeature.bHwReplyDescriptor == 1 ){
		/* Enable Auto Reply Descriptor */

		*pwHWFeatureMode |= USBD_PROT_ENUM_AUTO_REPLY_DESCRIPTOR;
	}
	if( sHWFeature.bHwSetAddress == 1 ){
		/* Enable Auto Set Address */

		*pwHWFeatureMode |= USBD_PROT_ENUM_AUTO_SET_ADDRESS;
	}

	return STATUS_SUCCESS;
}

/*======================================================================
// Function_Name: SetHWFeatureMode
//
// description	: Set H/W function mode
//
//				  Set H/W function mode to lower module
//
// argument 	: *pParamData	  			 Pointer of parameter data
//
// return		: STATUS_SUCCESS			Success
//				  STATUS_UNSUCCESSFUL		Error
//				  STATUS_NOT_OPENED			Not opened
// 				  STATUS_NOT_IMPLEMENTED	Not implemented
//				  STATUS_INVALID_PARAMETER	Parameter error
========================================================================*/
LONG SetHWFeatureMode( const void *pParamData )
{
	USBD_FUNC_HWFEATURE	sHWFeature;
	USHORT	*pwHWFeatureMode;
	LONG	dwAPIStatus;


	/**********************/
	/* Process for individual Power saving mode */
	/**********************/
	memset( &sHWFeature, 0, sizeof(sHWFeature));
	pwHWFeatureMode = (USHORT *)pParamData;
	if( *pwHWFeatureMode & USBD_PROT_ENUM_AUTO_NEGOTIATION ){
		/* Enable Auto Negotiation */

		sHWFeature.bHwAutoNego = 1;
		*pwHWFeatureMode &= ~USBD_PROT_ENUM_AUTO_NEGOTIATION;
	}
	if( *pwHWFeatureMode & USBD_PROT_ENUM_AUTO_REPLY_DESCRIPTOR ) {
		/* Enable Auto Reply Descriptor */

		sHWFeature.bHwReplyDescriptor = 1;
		*pwHWFeatureMode &= ~USBD_PROT_ENUM_AUTO_REPLY_DESCRIPTOR;
	}
	if( *pwHWFeatureMode & USBD_PROT_ENUM_AUTO_SET_ADDRESS ) {
		/* Enable Auto Set Address */

		sHWFeature.bHwSetAddress = 1;
		*pwHWFeatureMode &= ~USBD_PROT_ENUM_AUTO_SET_ADDRESS;
	}
	if( *pwHWFeatureMode != 0 ){
		/* Mode not supported */

		return STATUS_INVALID_PARAMETER;
	}
	/******************************/
	/* Set parameter to lower module */
	/******************************/
	sHWFeature.bLength = 5;
	sHWFeature.bType = USBD_FUNC_HWFEATURE_PARAM;

	dwAPIStatus = USBD_FuncSetParameter(&sHWFeature);
	if( dwAPIStatus != STATUS_SUCCESS){
		/* Unable to get */

		return dwAPIStatus;
	}

	if( sHWFeature.bHwAutoNego == 1 ){
		ModuleStatus.sControlFlag.bit.wEnableAutoNegotiation = 1;
	}
	if( sHWFeature.bHwReplyDescriptor == 1 ){
		ModuleStatus.sControlFlag.bit.wEnableReplyDescriptor = 1;
	}
	if( sHWFeature.bHwSetAddress == 1 ){
		ModuleStatus.sControlFlag.bit.wEnableAutoSetAddress = 1;
	}
	return STATUS_SUCCESS;
}


/*======================================================================
// Function_Name: StandardRequest
//
// description	: Process of standard device request
//
//				  Get SETUP packet from lower module, let it transit to process of each standard device request
//
// argument 	: None
//
// return		: STATUS_SUCCESS			Success
//				  STATUS_UNSUCCESSFUL		Error
// 				  STATUS_NOT_IMPLEMENTED	Not implemented
//				  STATUS_INVALID_PARAMETER	Parameter error
========================================================================*/
LONG StandardRequest( void )
{
	DEVICE_REQUEST	*psDeviceRequest;
	LONG	dwAPIStatus;
	psDeviceRequest = &ModuleStatus.sUSBStatus.sDeviceRequest;

	/***********************************/
	/* Get SETUP packet from lower module */
	/***********************************/
	dwAPIStatus = USBD_FuncGetSETUPPacket((USBD_FUNC_REQUEST *)psDeviceRequest);
	if( dwAPIStatus != STATUS_SUCCESS ){
		/* Unable to get */

		return STATUS_UNSUCCESSFUL;
	}

	/****************************/
	/* Process for individual device request */
	/****************************/
	if( psDeviceRequest->bRequest > SREQ_SYNCH_FRAME ){
		/* Request not supported */
		dwAPIStatus = STATUS_UNSUCCESSFUL;
	} else {
		dwAPIStatus = StandardRequestTable[psDeviceRequest->bRequest](psDeviceRequest);
	}

	/***************************************/
	/* If request error has occurred, return STALL */
	/***************************************/
	if( dwAPIStatus == STATUS_UNSUCCESSFUL ){
		/* Request error */

		USBD_FuncSetEPxControl(EP0_IN, USBD_FUNC_CE_STALLMODE, USBD_FUNC_FLAG_SET);
		USBD_FuncSetEPxControl(EP0_OUT, USBD_FUNC_CE_STALLMODE, USBD_FUNC_FLAG_SET);
	}

	return STATUS_SUCCESS;
}

/*======================================================================
// Function_Name: GetStatus
//
// description	: Request of Get Status
//
//				  Process for request of Get Status
//
// argument 	: *psDeviceRequest			Pointer of device request
//
// return		: STATUS_SUCCESS			Success
//				  STATUS_UNSUCCESSFUL		Error
// 				  STATUS_NOT_IMPLEMENTED	Not implemented
//				  STATUS_INVALID_PARAMETER	Parameter error
========================================================================*/
LONG GetStatus( DEVICE_REQUEST *psDeviceRequest )
{
	UCHAR	*pbWorkData, bDescSpeed, bmAttributes, bEPxControl, bConfigurationIndex;
	USHORT	wDescType;
	LONG	dwAPIStatus;
	UCHAR	*pbDescAdr;

	if( ModuleStatus.sUSBStatus.bUSBState == DEFAULT_STATE ){

		return STATUS_UNSUCCESSFUL;
	}

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

		return STATUS_UNSUCCESSFUL;
	}

	switch( psDeviceRequest->bmRequestType & BMREQ_RECIPIENT_MASK ){
		case RECIPIENT_DEVICE:
			if( psDeviceRequest->wValueH || psDeviceRequest->wValueL ){
				/* wValue != 0 */

				return STATUS_UNSUCCESSFUL;
			}

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

				return STATUS_UNSUCCESSFUL;
			}

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

				return STATUS_UNSUCCESSFUL;
			}

			/******************************/
			/* Set data of reply */
			/******************************/
			pbWorkData = ModuleStatus.pDataBuf;

			/* Bit of RemoteWakeup Enable/Disable + Bit of Self Powered */
			if( ModuleStatus.sUSBStatus.bHSMode == 1 ){
				/* HS mode */
				bDescSpeed = USBD_FUNC_SPEEDHS;
			} else {
				/* FS mode */
				bDescSpeed = USBD_FUNC_SPEEDFS;
			}
			if( ModuleStatus.sUSBStatus.bConfigurationValue == 0 ){
				/* Before Configured State */

				bConfigurationIndex = 0x00;
			} else {
				/* After Configured State */

				bConfigurationIndex = ModuleStatus.sUSBStatus.bConfigurationValue - 1;
			}
			wDescType = MAKEWORD(bConfigurationIndex, USBD_FUNC_DT_CONFIG);
			if( (dwAPIStatus = USBD_FuncGetDescriptorInfoAddress(bDescSpeed, wDescType,&pbDescAdr))
					!= STATUS_SUCCESS ){
				/* Error occurred in lower module */
				return STATUS_UNSUCCESSFUL;
			}
			bmAttributes = pbDescAdr[OFFSET_BMATTRIBUTES];
			pbWorkData[0] = (ModuleStatus.sUSBStatus.bEnableRemoteWakeup << 1)
								+ ((bmAttributes & ATTRIB_SELF_POWERED) >> 6);
			pbWorkData[1] = 0x00;
			break;
		case RECIPIENT_INTERFACE:
			if( ModuleStatus.sUSBStatus.bUSBState == ADDRESSED_STATE ){

				return STATUS_UNSUCCESSFUL;
			}

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

				return STATUS_UNSUCCESSFUL;
			}

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

				return STATUS_UNSUCCESSFUL;
			}

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

				return STATUS_UNSUCCESSFUL;
			}

			/**********************************************/
			/* Check if specified Interface Number is enabled */
			/**********************************************/
			if( (dwAPIStatus = CheckInterfaceNumber(psDeviceRequest->wIndexL)) != STATUS_SUCCESS ){
				/* Invalid Interface Number, or error occurred in lower module */

				return STATUS_UNSUCCESSFUL;
			}

			/******************************/
			/* Set data of reply */
			/******************************/
			pbWorkData = ModuleStatus.pDataBuf;
			pbWorkData[0] = pbWorkData[1] = 0x00;
			break;
		case RECIPIENT_ENDPOINT:
			if( psDeviceRequest->wValueH || psDeviceRequest->wValueL ){
				/* wValue != 0 */

				return STATUS_UNSUCCESSFUL;
			}
			if( psDeviceRequest->wIndexH ){
				/* wIndex.h != 0 */
				return STATUS_UNSUCCESSFUL;
			}
			if(ModuleStatus.sUSBStatus.bUSBState == ADDRESSED_STATE && psDeviceRequest->wIndexL != 0x00){

				return STATUS_UNSUCCESSFUL;
			}

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

				return STATUS_UNSUCCESSFUL;
			}

			/******************************/
			/* Set data of reply */
			/******************************/
			pbWorkData = ModuleStatus.pDataBuf;
			if( (dwAPIStatus = USBD_FuncGetEPxControl(psDeviceRequest->wIndexL, &bEPxControl)) != STATUS_SUCCESS ){
				/* Error occurred in lower module */

				return STATUS_UNSUCCESSFUL;
			}
			if( (bEPxControl & USBD_FUNC_CE_STALLMODE) != 0 ){
				/* Mode of STALL reply */

				pbWorkData[0] = ENDPOINT_STALL;
			} else {
				pbWorkData[0] = ENDPOINT_NOT_STALL;
			}
			if( psDeviceRequest->wIndexL == 0 ){
				/* Also check IN direction in EP0 */

				if( (dwAPIStatus = USBD_FuncGetEPxControl(EP0_IN, &bEPxControl)) != STATUS_SUCCESS ){
					/* Error occurred in lower module */
					return STATUS_UNSUCCESSFUL;
				}
				if( (bEPxControl & USBD_FUNC_CE_STALLMODE) != 0 ){
					/* Mode of STALL reply */
					pbWorkData[0] = ENDPOINT_STALL;
				}
			}

			pbWorkData[1] = 0x00;

			break;
		default:
			return STATUS_UNSUCCESSFUL;
	}

	/******************/
	/* Start data transfer */
	/

⌨️ 快捷键说明

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