📄 usbh_stacktask.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 + -