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

📄 usbh_usbds_api.c

📁 epson usb2.0 控制芯片 S1R72V05 固件程序。
💻 C
📖 第 1 页 / 共 5 页
字号:
//
//				  HCD is initialized (release of the memory area used with the stop 
//				  and HCD of the power supply supplied to VBUS of the route hub port
//				  and liberate of the memory used for the device management). 
//				  Moreover, the memory areas of URB and device information etc.
//				  on use with HostStack are released. 
//
// argument 	: none
//
// return		: USBH_USBD_STATUS_SUCCESS			Processing was normally completed.
//				  USBH_USBD_STATUS_UNSCCESSFUL		Host Controller is suspending it.
===============================================================================================*/
long USBH_USBDS_Cleanup( void )
{
	long retValue;

	/* Initialize connected device information. */
	USBH_USBDS_DelALLDev(wURB->psDev);

	/* Initialize HCD. */
	retValue = USBH_HCD_Cleanup();
	if( retValue != USBH_USBD_STATUS_SUCCESS ) {
		return retValue;
	}

	return retValue;
}

/*=============================================================================================
//
// description	: This is call back function to return HCD message.
//
// argument 	: message						Message ( in )
//				: param0						The first native parameter of each message ( in )
//				: vpParam						The second native parameter of each message ( in )
//
// return		: None
===============================================================================================*/
STATIC_T	void USBH_USBDS_HCDCallbackProc ( ULONG message, ULONG param0, void* vpParam )
{
	switch( message ) {
		case USBH_HCD_MSG_INIT_CMP :				/* Initialization ( active setting )	*/
			USBH_USBDS_RootHubActive();
			break ;
		default :
			break ;
	}
}

/*=============================================================================================
// Function_Name: USBH_USBDS_RootHubActive
//
// description	: Carry out root hub initalization ( active setting ).
//
// argument 	: void
//
// return		: USBH_USBD_STATUS_SUCCESS		Normal finish
//				: Others						Abnormal finish
===============================================================================================*/
STATIC_T	long USBH_USBDS_RootHubActive( void )
{
	long retValue;

	switch(USBH_USBD_Mode) {

		case USBH_USBD_MODE_INIT:

			/* Secure memory area for device management use, after receiving HCD active setting finish call back */
			UsbDevInfo = &RootHubDev;
			RootHubDev.sUsbDev.pHCPriv	= NULL ;								/* (out) */
			RootHubDev.sUsbDev.eState	= USBH_USBD_USB_STATE_NOTATTACHED ;		/* USB device state ( in ) */
			RootHubDev.sUsbDev.psParent= NULL ;									/* Set NULL because it is root hub ( in ) */
			RootHubDev.sUsbDev.eSpeed  = USBH_USBD_USB_SPEED_FULL;				/* Set FULL in default ( in ) */
			RootHubDev.sUsbDev.port  = USBH_USBD_HOSTPORTNO;					/* Host port number ( in ) */
			retValue = USBH_HCD_AllocDev((USBH_HCD_USBDEV *)&RootHubDev.sUsbDev);	/* Secure memory area for USB device management use */
			if(retValue != USBH_USBD_STATUS_SUCCESS) {
				return retValue;
			}
			USBH_USBD_Mode = USBH_USBD_MODE_DEVDES8;
		default:
			/* Secure memory area for URB & device management use ( for root hub use ) */

			/* Device recognition ( emulation ) process */
			do{
				retValue = USBH_USBDS_DeviceEnumeration( USBH_USBD_ENUME_ROOTHUB, &RootHubDev, 0 );
				if(retValue != USBH_USBD_STATUS_SUCCESS) {
					return retValue;
				}
			}while( USBH_USBD_Mode != USBH_USBD_MODE_SPORTPWR );
			break;

	}
	return USBH_USBD_STATUS_SUCCESS;
}


/*=============================================================================================================================
// Function_Name: USBH_USBDS_SubmitURB
//
// description	: After checking parameter, pipe of URB passed, carry out registration and execution of URB.
//				  Used when data transfer
//
// argument 	: *psUrb							Pointer to URB structure ( in )
//				: classid							Class ID ( in )
//				: pfnCallback						Pointer to call back function to notify completion ( in )
//
// return		: USBH_USBD_STATUS_SUCCESS			Registration finish normally
//				  USBH_USBD_STATUS_PIPE_ERROR		Case of pipe can't be secured for executing URB
//				  USBH_USBD_STATUS_MEM_ERROR		Memory area can't be secured
//				  USBH_USBD_STATUS_INVALID_PARAMETER There were some error in passed parameter
//				  USBH_USBD_STATUS_UNSUCCESSFUL		 Host Controller on suspension or object device is not found
===============================================================================================================================*/
long USBH_USBDS_SubmitURB( USBH_USBD_URB *psURB, UCHAR	classid, USBH_USBD_CALLBACK pfnCallback )
{
	pfnSubmitURB.Callback = pfnCallback;

	/* Set parameter */
	/* Check URB data contents ( pipe information, transfer type, EP address, USB device address, direction ) -> Carry out in USBH_USBD_SubmitURB() */
	/* Check pipe existence ( based on device management table ) -> Carry out in USBH_HCD_SubmitURB() */
	psURB->pHCPriv = NULL;

	/*** Assume there is no error coming in HCD as presupposition because parameter checking was done in upper task side! ***/
	/*** Return SUBMIT_OK firstly because there is a problem in file system side if HCD call back is called before SUBMIT_OK call back ***/
	USBH_USBDS_ExecCallback(pfnSubmitURB.Callback, USBH_USBD_MSG_SUBMIT_OK, 0, NULL);

	pfnSubmitURB.retValue = USBH_HCD_SubmitURB((USBH_HCD_URB *)psURB);
	return pfnSubmitURB.retValue;
}

/*=============================================================================================================================
// Function_Name: USBH_USBDS_UnlinkURB
//
// description	: Cancel passed URB execution and delete it.
//
// argument 	: *psUrb							URB structure pointer ( in )
//				: classid							Class ID ( in )
//				: pfnCallback						Pointer to call back function to notify completion ( in )
//
// return		: USBH_USBD_STATUS_SUCCESS			 Registration finish normally
//				  USBH_USBD_STATUS_INVALID_PARAMETER There were some errors in passed parameter
//				  USBH_USBD_STATUS_UNSUCCESSFUL		 Host Controller on suspension or object device is not found
===============================================================================================================================*/
long USBH_USBDS_UnlinkURB( USBH_USBD_URB *psURB, UCHAR	classid, USBH_USBD_CALLBACK pfnCallback )
{
	pfnUnlinkURB.Callback = pfnCallback;

	pfnUnlinkURB.retValue = USBH_HCD_UnlinkURB( (USBH_HCD_URB *)psURB );
	if(pfnUnlinkURB.retValue != USBH_USBD_STATUS_SUCCESS) {

		pfnUnlinkURB.retValue = USBH_USBD_STATUS_UNSUCCESSFUL;
		USBH_USBDS_ExecCallback(pfnUnlinkURB.Callback, USBH_USBD_MSG_UNLINK_NG, pfnUnlinkURB.retValue, NULL);
	} else {

		USBH_USBDS_ExecCallback(pfnUnlinkURB.Callback, USBH_USBD_MSG_UNLINK_OK, pfnUnlinkURB.retValue, NULL);
	}

	return pfnUnlinkURB.retValue;
}

/*=============================================================================================
// Function_Name: USBH_USBDS_EntryClass
//
// description	: Register specified class driver.
//
// argument 	: classno							Class driver number ( in )
//				: *classid							Class ID ( out )
//				: pfnCallback						Pointer to call back function to notify completion ( in )
//				: pfnEventCallback					Pointer to the call back function that notifies settlement (in)
//
// return		: USBH_USBD_STATUS_SUCCESS			 Registration finish normally
//				  USBH_USBD_STATUS_INVALID_PARAMETER There were some errors in passed parameter
//				  USBH_USBD_STATUS_UNSUCCESSFUL		 Wrong class ID
===============================================================================================*/
long USBH_USBDS_EntryClass( UCHAR  classno, UCHAR  *classid, USBH_USBD_CALLBACK pfnCallback, USBH_USBD_CALLBACK pfnEventCallback )
{
	USBH_USBD_DEVLIST_HEAD	*Devtmp;
	MSG_USBH_USBD	tmp;


	pfnEntryClass.retValue = USBH_USBD_STATUS_UNSUCCESSFUL;

	/* Confirmation for API abnormal finish */
	if((ClassINFONum >= USBH_USBD_CLASSDRIVERNUM)
	|| (ClassINFO[ClassINFONum].ClassID != 0)) {
		USBH_USBDS_ExecCallback(pfnEventCallback, USBH_USBD_MSG_ENTRYC_NG, 0, NULL);
	} else {

		/* Assign specified class number to class ID */
		*classid = ClassINFO[ClassINFONum].ClassID = ClassINFONum+1;
		ClassINFO[ClassINFONum].ClassNo = classno;

		pfnEntryClass.retValue = USBH_USBD_STATUS_SUCCESS;

		/* Registered call back */
		USBH_USBDS_ExecCallback(pfnEventCallback, USBH_USBD_MSG_ENTRYC_OK, 0, NULL);

		/* Return connecting of un-registered device of class within connected device, in call back function */
		/* Registration of pointer of call back function */
		ClassINFO[ClassINFONum].pfnEntryClassCallback = pfnEventCallback;
		ClassINFONum++;

		Devtmp = DeviceCtlTbl.DevInfo;
		while(Devtmp != NULL) {
			/* Search un-registered device of class ID */
			if(Devtmp->ClassID == 0) {
				/* Notify device connecting message to class. */
				tmp.DevInfo = (USBH_USBD_DEVLIST_HEAD*)Devtmp;
				if(tmp.DevInfo->sUsbDev.devNum != 0) {	/* Judge whether it is device on emulation completion */

					/* Notify connecting to upper class only in case of device besides hub */
					if(*classid != USBH_HSBD_HUB_CLASS_ID) {
						/* Message is returned in call back function */
						/* Class of registration completion or it checks it */
						if( USBH_USBDS_SearchIdentityClass( classno ) != USBH_USBD_STATUS_UNSUCCESSFUL ) {
							Devtmp->ClassID = *classid;
							USBH_USBDS_ExecCallback(pfnEventCallback, USBH_USBD_MSG_CONNECT_OK, tmp.DevInfo->sUsbDev.devNum, Devtmp);
						}
					}
				}
			}
			Devtmp = Devtmp->psNext;
		}
	}

	USBH_USBDS_ExecCallback(pfnCallback, USBH_USBD_MSG_RETURN_VALUE, pfnEntryClass.retValue, NULL);

	return pfnEntryClass.retValue ;
}

/*=============================================================================================
// Function_Name: USBH_USBDS_SetConfiguration
//
// description	: Register pipe based on specified device address, carry out configuration.
//
// argument 	: classid							Class ID ( in )
//				: devaddr							Device address ( in )
//				: *pfnCallback						Pointer to call back function to notify completion ( in )
//
// return		: USBH_USBD_STATUS_SUCCESS			Registration finish normally
//				  USBH_USBD_STATUS_UNSUCCESSFUL		Host Controller on suspension
===============================================================================================*/
long USBH_USBDS_SetConfiguration( UCHAR  classid, UCHAR  devaddr, USBH_USBD_CALLBACK pfnCallback )
{
	USBH_USBD_URB			*TmpUrb ;
	USBH_USBD_DEVLIST_HEAD	*UsbList;
	UCHAR					bConfigurationValue;


	bConfigurationValue = 0;	// Cope with warning for the optimization.


	pfnSetConfiguration.Callback = pfnCallback;

	// Device, configuration check

	// SetConfiguration
	TmpUrb = USBH_USBDS_AddURBList();
	UsbList = SeachDevAddrIDToDevice(classid, devaddr, &pfnSetConfiguration.retValue, &bConfigurationValue);
	if(TmpUrb != (USBH_USBD_URB *)USBH_USBD_STATUS_UNSUCCESSFUL
	&& pfnSetConfiguration.retValue == USBH_USBD_STATUS_SUCCESS) {
		TmpUrb->psDev = &UsbList->sUsbDev;
		if( TmpUrb->psDev->eState == USBH_USBD_USB_STATE_CONFIGURED ) {
			return pfnSetConfiguration.retValue;
		}
		SetMaxPacketSizeToDevice(UsbList);				/* MaxPacketSize setting */

		/* Parameter setting */
		TmpUrb->pipe = USBH_USBD_SetPipeType(USBH_HCD_PIPE_CONTROL, ENUM_EP0, TmpUrb->psDev->devNum, USBH_HCD_DIR_OUT);
		USBH_USBDS_MkSetupPacket((SETUP_REQUEST *)TmpUrb->pSetupPacket, BREQ_SETCONFIGURATION, 0, 0, bConfigurationValue);
		USBH_USBDS_SetTranPara(TmpUrb, 0, 0, 0, USBH_USBDS_SetConfigurationCallbackProc);
		pfnSetConfiguration.retValue = USBH_HCD_SubmitURB((USBH_HCD_URB *)TmpUrb);
	}
	// Update device management table
	// Pipe registration
	return pfnSetConfiguration.retValue;
}

/*=============================================================================================
// Function_Name: USBH_USBDS_Reset
//
// description	: Reset specified device.
//
// argument 	: classid							Class ID ( in )
//				: devaddr							Device address ( in )
//				: *pfnCallback						Pointer to call back function to notify completion ( in )
//
// return		: USBH_USBD_STATUS_SUCCESS			Registration finish normally
//				  USBH_USBD_STATUS_INVALID_PARAMETER There were some errors in passed parameter
//				  USBH_USBD_STATUS_UNSUCCESSFUL		 Host Controller on suspension
===============================================================================================*/
long USBH_USBDS_Reset( UCHAR  classid, UCHAR  devaddr, USBH_USBD_CALLBACK pfnCallback )
{
	USBH_USBD_USBDEV *UsbDev=NULL ;


	UsbDev = USBH_USBDS_SearchDev(devaddr, &pfnReset.retValue);
	if( pfnReset.retValue == STATUS_NO_EXISTENCE_PORT ) {
		return pfnReset.retValue ;
	}
	wURB = USBH_USBDS_AddURBList();

	// Registration of pointer of call back function
	pfnReset.Callback = pfnCallback;

	if(wURB != (USBH_USBD_URB *)USBH_USBD_STATUS_UNSUCCESSFUL) {
		UsbDevInfo = USBH_USBDS_SearchDevList( UsbDev );
		USBH_USBDS_ALLEndpointDisable((USBH_HCD_USBDEV *)&UsbDevInfo->sUsbDev, UsbDevInfo, USBH_USBD_RES);

		// SetPortFeature(PORT_RESET)
		wURB->psDev	= UsbDev->psParent ;							// Search device with same device address based on USB device management structure; /* (in ) */
		wURB->pipe	= USBH_USBD_SetPipeType(USBH_HCD_PIPE_CONTROL, ENUM_EP0, wURB->psDev->devNum, USBH_HCD_DIR_OUT);
		USBH_USBDS_MkSetupPacket((SETUP_REQUEST *)wURB->pSetupPacket, BREQ_SETFEATURE_PORT, 0, UsbDev->port, USBH_USBD_PORT_RESET);
		USBH_USBDS_SetTranPara(wURB, 0, 0, 0, USBH_USBDS_PortResetCallbackProc);
		pfnReset.retValue = USBH_HCD_SubmitURB((USBH_HCD_URB *)wURB);

		connectWaitCount = 0;
		USBH_USBDS_DelListURB(wURB);
	}
	return pfnReset.retValue;
}


/*=============================================================================================
// Function_Name: USBH_USBDS_PortSuspend
//
// description	: Suspend specified device.
//
// argument 	: classid							Class ID ( in )
//				: devaddr							Device address ( in )
//				: *pfnCallback						Pointer to call back function to notify completion ( in )
//
// return		: USBH_USBD_STATUS_SUCCESS			Registration finish normally
//				  USBH_USBD_STATUS_INVALID_PARAMETER There were errors in passed parameter
//				  USBH_USBD_STATUS_UNSUCCESSFUL		 Host Controller on suspension
===============================================================================================*/
long USBH_USBDS_PortSuspend( UCHAR	classid, UCHAR	devaddr, USBH_USBD_CALLBACK pfnCallback )
{
	USBH_USBD_DEVLIST_HEAD	*UsbDevListWK;
	USBH_USBD_USBDEV *UsbDev=NULL ;


⌨️ 快捷键说明

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