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

📄 usbh_stacktask.c

📁 epson usb2.0 控制芯片 S1R72V05 固件程序。
💻 C
字号:
/*
 * description: USB Stack Task
 * Maker	  : Toshiyuki Sakai
 * Copyright  : (C)2005,SEIKO EPSON Corp. All Rights Reserved.
 */

#include <string.h>
#include <SPRDEF.h>
#include <SPRSTS.h>
#include <OSCall.h>
#include <kernel_id.h>

#include <usbh_stacktask.h>
#include <usbh_usbds_api.h>


#ifdef DEBUG_C
	#include "DebugTask.h"
#endif


//-------------------------------------------------------------------------
// Define declaration
//-------------------------------------------------------------------------
//---------------------------------------
// Macro
//---------------------------------------

//---------------------------------------
// Structure declaration
//---------------------------------------

//---------------------------------------
// Variable declaration
//---------------------------------------

//---------------------------------------
// Static functions */
//---------------------------------------
STATIC_T	void UsbTaskForceCancelEvent( void );		// Forced finish of event
STATIC_T	void UsbTaskMsgEvent( USB_MSG * pUsbMsg );
STATIC_T	void UsbTaskMailDataCancel( void );
STATIC_T	void UsbTaskPanic ( void );

/*
//=============================================================================
// Function_Name: USBTask
// description: Control task.
// argument		: none
// return		: none
//=============================================================================
*/
void USBH_USBDTask( void )
{
	OS_FLGPTN	flgPtn;
	USB_MSG*	pUsbMsg;
	OS_ER		errCode;


	//------------------------------------------------------------------------
	// Usb Task main loop
	//------------------------------------------------------------------------
	while( 1 )
	{
		// Waiting for event information
		OS_WaiFlg( FLGID_USBH_USBD, FLG_WAIT_PTN_USBH_USBD, OS_TWF_ORW, &flgPtn );

		//------------------------------------------------------------------------
		// Check event flag, carry out process corresponding to each flags.
		//------------------------------------------------------------------------
		if ( flgPtn & FLG_EVENT_FORCE_USBH_USBD )
		{
			OS_ClrFlg( FLGID_USBH_USBD, ~(FLG_EVENT_FORCE_USBH_USBD) );/* Flag clearence */

			//------------------------------------------------------------------------
			// Forced process event
			// Clear task synchronization mechanism which is used, in this task.
			//------------------------------------------------------------------------
			UsbTaskForceCancelEvent();							// Event cancel

		}
		else if ( flgPtn & FLG_EVENT_MSG_USBH_USBD )
		{
			//------------------------------------------------------------------------
			// Message process event
			//------------------------------------------------------------------------
			// Message receiving from mail box
			errCode = OS_PRcvMbx( MBXID_USBH_USBD, ( T_MSG** )&pUsbMsg );

			if ( errCode == E_OK )
			{
				// There is message.
				UsbTaskMsgEvent( pUsbMsg );			  // Message event process
			}
			else if ( errCode == E_TMOUT )
			{
				// No message
				OS_ClrFlg( FLGID_USBH_USBD, ~(FLG_EVENT_MSG_USBH_USBD));	// Flag clearence
			}
			else
			{
				// Message receiving error
				UsbTaskPanic();
			}
			OS_ClrFlg( FLGID_USBH_USBD, ~(FLG_EVENT_MSG_USBH_USBD) );/* Flag clearence	*/
		}
		else
		{
			// Clear flag in case of non-supported event received.
			OS_ClrFlg( FLGID_USBH_USBD, FLG_WAIT_PTN_USBH_USBD );
		}
	}
}

/*
//=============================================================================
description: Event cancel process
// argument		: void
// return		: void
// flag			:
// global		:
//=============================================================================
*/
STATIC_T	void UsbTaskForceCancelEvent ( void )
{
	//---------------------------------------------------------
	// Clear all of test event
	//---------------------------------------------------------
	UsbTaskMailDataCancel();								// Message data destruction
	OS_ClrFlg( FLGID_USBH_USBD, ~(FLG_EVENT_FORCE_USBH_USBD));		// Flag clearence

	return;
}

/*
//=============================================================================
// Function_Name: UsbTaskTestMsgEvent
// description	: Message event process
// argument		: USB_MSG* pUsbMsg Receiving mail
// return		: none
//=============================================================================
*/
STATIC_T	void UsbTaskMsgEvent( USB_MSG* pMsg )
{
	MSG_USBH_USBD	tmp;
	volatile long retValue;


	memcpy(&tmp ,&pMsg->msgData, sizeof(MSG_USBH_USBD));
	switch(pMsg->msgHead.msgNo) {
		case MSG_USBH_USBD_INIT:
			retValue = USBH_USBDS_Init( tmp.pfnCallback, 0 );
			break;
		case MSG_USBH_USBD_CLEANUP:
			retValue = USBH_USBDS_Cleanup();
			break;
		case MSG_USBH_USBD_SUBMITURB:
			retValue = USBH_USBDS_SubmitURB( tmp.psURB, tmp.classid, tmp.pfnCallback );
			break;
		case MSG_USBH_USBD_UNLINKURB:
			retValue = USBH_USBDS_UnlinkURB( tmp.psURB, tmp.classid, tmp.pfnCallback );
			break;
		case MSG_USBH_USBD_ENTRYCLASS:
			retValue = USBH_USBDS_EntryClass( tmp.classno, tmp.psClassid, tmp.pfnCallback, tmp.pfnEventCallback );
			break;
		case MSG_USBH_USBD_SETCONFIGURATION:
			retValue = USBH_USBDS_SetConfiguration( tmp.classid, tmp.devaddr,  tmp.pfnCallback );
			break;
		case MSG_USBH_USBD_RESET:
			retValue = USBH_USBDS_Reset( tmp.classid, tmp.devaddr, tmp.pfnCallback );
			break;
		case MSG_USBH_USBD_PORTSUSPEND:
			retValue = USBH_USBDS_PortSuspend( tmp.classid, tmp.devaddr, tmp.pfnCallback );
			break;
		case MSG_USBH_USBD_PORTRESUME:
			retValue = USBH_USBDS_PortResume( tmp.classid, tmp.devaddr, tmp.pfnCallback );
			break;
		default:
			break;
	}

	// Free memory pool with fixed size
	OS_RelMpf(pMsg->msgHead.useMpfId, pMsg);
	return;
}

/*
//=============================================================================
// Function_Name: UsbTaskMailDataCancel
// description	: Usb mail box status destruction
// argument		: none
// return		: none
//=============================================================================
*/
STATIC_T	void UsbTaskMailDataCancel( void )
{
	OS_T_MSG*	pMsg;
	OS_ID		mpfId;
	OS_ER		errCode;

	do {
		// Receive message from mail box.
		errCode = OS_PRcvMbx( MBXID_USBH_USBD, &pMsg );

		if ( errCode == E_OK )
		{
			// Data destruction in case of there is message.
			mpfId = (( USBH_PMSGHEAD )pMsg )->useMpfId;
			OS_RelMpf( mpfId, (VP)pMsg );				// Free message buffer
		}
	} while( errCode == E_OK );
}

/*
//=============================================================================
// description	: Error function
// argument		:
// return		:
//=============================================================================
*/
STATIC_T	void UsbTaskPanic ( void )
{
	while(1)
	{
		OS_DlyTsk( 10 );
	}
}

⌨️ 快捷键说明

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