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

📄 u_idle.c

📁 EPSON USB DEVICE MASS-STORAGE CLASS driver, BULK ONLY on Ram disk
💻 C
字号:
/******************************************************************************
 * File name   : idle.c
 * Module name : main polling loop module
 * Author	   : Hiromichi.Kondo
 *-----------------------------------------------------------------------------
 * $Id: idle.c,v 1.2 2003/04/16 10:16:33 9551619 Exp $
 *****************************************************************************/
#include "c33l17.h"
#include "u_value.h"
#include "u_ram_data.h"
#include "u_rom_data.h"
#include "u_regNikka.h"

#include "usbmedia.h"

#ifdef EVENT_ON
#include "evt.h"
#include "system.h"

extern pEvtList sysEvtList;
#endif

int (*fnUSBUserCall)(unsigned int);

/*--- Function Prototype ---------------------------------------------------*/
void USB_MON_Proc(void);
void Attach_ev(void);
void Detach_ev(void);
void SpecialProc(void);
void IntStatusCheck(void);
void EPrIntStatusCheck(void);

/*****************************************************************************
 * USB_MON_Proc
 *****************************************************************************/
void USB_MON_Proc(void)
{

    
	if( VBUSCheck() == VBUS_CONNECT )
	{
		if(vbus_on_1st == 0)
		{
          if ( fnUSBUserCall(VBUS_CONNECT) == 1)  					
		  {
            T_MEDIA_INFO tInfo;

#ifdef EVENT_ON
            Evt evt = { EVT_USB, USB_CONNECTED, 0L };
            list_Append (sysEvtList, evt);
#endif
	        media_GetInfo( &tInfo );
		    last_lba = tInfo.ulSecCnt ;
		    sram_start_addr = (unsigned int)&usb_wk_buf[0];

		    timer3_SetCRxB(0xba0);
		    AttachProc();			        /* USB attach process */
		    vbus_on_1st = 1;
		  }
		}
		
		if(vbus_on_1st == 1)
		{
			SpecialProc();					/* Special process	*/
			USBProc();						/* USB process		*/
			DeviceProc();					/* Device process	*/
			IntStatusCheck();				/* Int status check */
		}
	}
	else
	{
		if(vbus_on_1st == 1)
		{

			if ( fnUSBUserCall(VBUS_NOT_CONNECT) == 1)
            {
#ifdef EVENT_ON
                Evt evt = { EVT_USB, USB_DISCONNECT, 0L };
                list_Append (sysEvtList, evt);
#endif
            }
			timer3_SetCRxB(0x3a20);
			DetachProc();					/* Detach */
			vbus_on_1st = 0;
		}
	}
}

/*****************************************************************************
 * SpecialProc
 *****************************************************************************/
void SpecialProc(void)
{
	if( DIRECT_B(special_flag) )
	{

		if( special_flag.Reset )	/* Reset	*/	
			USBResetProc();
		
		if( special_flag.Suspend )	/* Suspend	*/
			SuspendResumeProc();
	}
}

/*****************************************************************************
 * IntStatusCheck
 *****************************************************************************/
void IntStatusCheck(void)
{
	unsigned char vbus_state;
	
	di();								/* CPU */
	if( main_int_stat.SIE_IntStat )
	{
		/* SIE */
		if( sie_int_stat.VBUS_Changed )
		{
			/* VBUS  */
			vbus_state = VBUSCheck();
			if(vbus_state == VBUS_NOT_CONNECT)
			{
				/* Detach  */
				special_flag.Detach = 1;
				DIRECT_B(main_int_stat) = 0x00;	/* Main */
			}
		}
		else
		{
			if( sie_int_stat.DetectRESET )
			{
				/* USB Reset  */
				special_flag.Reset = 1;
				DIRECT_B(main_int_stat) = 0x00;	/* Main */

			}
			else
			{
				if( sie_int_stat.DetectSUSPEND )
				{
					/*  */
					special_flag.Suspend = 1;
					DIRECT_B(main_int_stat) = 0x00;	/* Main */
				}
			}
		}
		
		if( sie_int_stat.SetAddressCmp )
		{	/* SetAddressCmp */
			if( rUSB_Address_BP.USB_Address == 0x00 )
			{	/* Default State */
				usb_state = DEFAULT_STATE;
			}
			else
			{	/* Address State */
				usb_state = ADDRESS_STATE;
			}
		}
		DIRECT_B(sie_int_stat) = 0x00;
	}

	if( main_int_stat.FIFO_IntStat )
	{	/* FIFO */
		if( fifo_int_stat.DescriptorCmp )
		{	/* DescriptorCmp */
			control_result = DESCRIPTOR_CMP;
		}

		if( fifo_int_stat.FIFO_IN_Cmp )
		{	/* FIFO_IN_Cmp */
			bulk_in_result = FIFO_IN_CMP;
		}

		if( fifo_int_stat.FIFO_OUT_Cmp )
		{	/* FIFO_OUT_Cmp */
			bulk_out_result = FIFO_OUT_CMP;
		}
	}

	if( main_int_stat.EP0IntStat )
	{	/* EP0 */
		DIRECT_B(ep0_int_stat) = DIRECT_B(ep0_int_stat) & rEP0IntEnb;

		if( ep0_int_stat.IN_TranErr )
		{
			control_result = EP0_IN_ERR;
		}
		if( ep0_int_stat.OUT_TranErr )
		{
			control_result = EP0_OUT_ERR;
		}
		if( ep0_int_stat.IN_TranACK )
		{
			control_result = EP0_IN_ACK;
		}
		if( ep0_int_stat.OUT_TranACK )
		{
			control_result = EP0_OUT_ACK;
		}
		DIRECT_B(ep0_int_stat) = 0x00;	/* EP0 */
	}
	
	if( main_int_stat.EPrIntStat )
	{	/* EPr */
		EPrIntStatusCheck();			/* EPr */
	}

	if(rMainIntStat_BP.RcvEP0SETUP)
	{	/* SETUP  */
		usb_flag.USBReqRcvd = 1;
	}
	DIRECT_B(main_int_stat) = 0x00;
	ei();								/* CPU */
}

/*****************************************************************************
 * EPrIntStatusCheck
 *****************************************************************************/
void EPrIntStatusCheck(void)
{
	if( epr_int_stat.EPaIntStat )
	{	/* EPa */
		if( bulk_in_result != FIFO_IN_CMP )
		{
			DIRECT_B(epa_int_stat) = DIRECT_B(epa_int_stat) & rEPaIntEnb;

			if( epa_int_stat.IN_TranErr )
			{
				bulk_in_result = EPX_IN_ERR;
			}
			if( epa_int_stat.OUT_TranErr )
			{
				bulk_in_result = EPX_OUT_ERR;
			}
			if( epa_int_stat.IN_TranACK )
			{
				bulk_in_result = EPX_IN_ACK;
			}
			if( epa_int_stat.OUT_TranACK )
			{
				bulk_in_result = EPX_OUT_ACK;
			}
		}
		DIRECT_B(epa_int_stat) = 0x00;			/* EPa */
	}
	if( epr_int_stat.EPbIntStat )
	{	/* EPb */
		if( bulk_out_result != FIFO_OUT_CMP )
		{
			DIRECT_B(epb_int_stat) = DIRECT_B(epb_int_stat) & rEPbIntEnb;

			if( epb_int_stat.IN_TranErr )
			{
				bulk_out_result = EPX_IN_ERR;
			}
			if( epb_int_stat.OUT_TranErr )
			{
				bulk_out_result = EPX_OUT_ERR;
			}
			if( epb_int_stat.IN_TranACK )
			{
				bulk_out_result = EPX_IN_ACK;
			}
			if( epb_int_stat.OUT_TranACK )
			{
				bulk_out_result = EPX_OUT_ACK;
			}
		}
		DIRECT_B(epb_int_stat) = 0x00;			/* EPb */
	}
	if( epr_int_stat.EPcIntStat )
	{	/* EPc */
		DIRECT_B(epc_int_stat) = DIRECT_B(epc_int_stat) & rEPcIntEnb;

		if( epc_int_stat.IN_TranErr )
		{
			int_in_result = EPX_IN_ERR;
		}
		if( epc_int_stat.OUT_TranErr )
		{
			int_in_result = EPX_OUT_ERR;
		}
		if( epc_int_stat.IN_TranACK )
		{
			int_in_result = EPX_IN_ACK;
		}
		if( epc_int_stat.OUT_TranACK )
		{
			int_in_result = EPX_OUT_ACK;
		}
		DIRECT_B(epc_int_stat) = 0x00;			/* EPc */
	}
	DIRECT_B(epr_int_stat) = 0x00;
}

⌨️ 快捷键说明

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