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

📄 handler.c

📁 epson usb2.0 控制芯片 S1R72V05 固件程序。
💻 C
字号:
/*
 * description: Interrupt Handler
 * Maker	  : Shuichi.Yanagihara
 * Copyright  : (C)2004,SEIKO EPSON Corp. All Rights Reserved.
 */

#include "SPRDEF.h"
#include "SPRSTS.h"
#include "OSCall.h"

#include "Reg72V05.h"
#include "Handler.h"
#include "usbh_SampleTask.h"
#include "IDETask.h"
#include <usbh_hcd.h>
#include <DeviceTask.h>
#include <USBDTask.h>

#ifdef TOYA2_C
#include "reg_mx21.h"
#endif	// TOYA2_C

/*****************************************
 * Define definition
 *****************************************/
#define DEVICE_MODE			(0)				/* HOSTxDEVICE bit Device Mode */
#define HOST_MODE			(1)				/* HOSTxDEVICE bit Host Mode */


/*----------------------------------------------------------------------*/
/* Interrupt factor enable setting variable							*/
/* ( Bit which interrupt handler prohibited Enb register become 1.	*/
/* Please carry out Enb register operation by referring this variable*/
/* after interrupt process in each task. and, clear this variable after process finishing */
/*----------------------------------------------------------------------*/

/* Host Sample use */
UCHAR						main_int_enb_usbh_sample;
UCHAR						device_int_enb_usbh_sample;
UCHAR						host_int_enb_usbh_sample;
UCHAR						cpu_int_enb_usbh_sample;
UCHAR						ide_int_enb_usbh_sample;
UCHAR						mediafifo_int_enb_usbh_sample;

/* Host USB use */
UCHAR						main_int_enb_usbh_usb;
UCHAR						device_int_enb_usbh_usb;
UCHAR						host_int_enb_usbh_usb;
UCHAR						cpu_int_enb_usbh_usb;
UCHAR						ide_int_enb_usbh_usb;
UCHAR						mediafifo_int_enb_usbh_usb;

/* Device Task use */
UCHAR						device_int_enb_usb;
UCHAR						sie_int_enb_usb;
UCHAR						fifo_int_enb_usb;

UCHAR						main_int_enb_device_task;
UCHAR						cpu_int_enb_device_task;
UCHAR						fifo_int_enb_device_task;

UCHAR						mediafifo_int_enb_device_task;

/* IDE use */
UCHAR						main_int_enb_ide;
UCHAR						device_int_enb_ide;
UCHAR						host_int_enb_ide;
UCHAR						cpu_int_enb_ide;
UCHAR						ide_int_enb_ide;
UCHAR						mediafifo_int_enb_ide;

/*----------------------------------------------------------------------*/
/* Variable with handler												*/
/*----------------------------------------------------------------------*/

static UCHAR main_int_stat_sv;
static UCHAR device_int_stat_sv;
static UCHAR cpu_int_stat_sv;
static UCHAR mediafifo_int_stat_sv;
static UCHAR device_int_stat_sv;
static UCHAR sie_int_stat_sv;
static UCHAR fifo_int_stat_sv;

#ifdef DEBUG_C
extern ULONG	USBResetCount;
extern ULONG	EP0InErrorCount;
extern ULONG	EP0OutErrorCount;
extern ULONG	BulkInErrorCount;
extern ULONG	BulkOutErrorCount;
extern ULONG	CBWErrorCount;
extern ULONG	CSWErrorCount;
#endif

/*
//=============================================================================
// Function_Name: handler1
// description	: Interrupt handler
// argument		:
// return		:
// flag			:
// global		:
//=============================================================================
*/
void handler1( void )
{
	main_int_stat_sv = RegRead(REG08_MainIntStat);		/* Save main interrupt status*/

	/*----------------------------------------------------------------------*/
	/* Host Mode															*/
	/*----------------------------------------------------------------------*/
	if((RegRead(REG08_HostDeviceSel) & MASK_HOSTxDEVICE) == BIT_HOSTxDEVICE_HOST) {

		/*------------------------------------------------------------------*/
		/* HostSample Task related										*/
		/*------------------------------------------------------------------*/
		/* Interrupt of mediaFIFO related */
		if((main_int_stat_sv & MASK_MediaFIFO_IntStat)) {
			main_int_enb_usbh_sample |= BIT_EnMediaFIFO_IntStat;
			/* Event notification to HostSample Task */
			OS_ISetFlg( FLGID_USBH_SAMPLE, FLG_EVENT_INT_USBH_SAMPLE );
		}

		/*------------------------------------------------------------------*/
		/* Host USB Task related											*/
		/*------------------------------------------------------------------*/

		USBH_HCD_Interrupt();

		/*------------------------------------------------------------------*/
		/* IDE Task related												*/
		/*------------------------------------------------------------------*/
		if((main_int_stat_sv & MASK_IDE_IntStat)){
			main_int_enb_ide |= BIT_EnIDE_IntStat;

			/* Event notification to IDETask */
			OS_ISetFlg( FLGID_IDE, FLG_EVENT_INT_IDE );
		}

		/* Prohibit interrupt signal assert of MainIntStat interrupt factor	*/
		RegClear(REG08_MainIntEnb,( main_int_enb_ide | main_int_enb_usbh_sample) );

	} else {
	/*----------------------------------------------------------------------*/
	/* Device Mode															*/
	/*----------------------------------------------------------------------*/

#ifdef DEBUG_C
		if ((RegRead(REG08_D_EP0IntStat) & MASK_IN_TranErr)) {
			RegWrite(REG08_D_EP0IntStat,BIT_IN_TranErr);
			if ((RegRead(REG08_D_EP0ControlIN) & MASK_ForceSTALL) != BIT_ForceSTALL) {
				EP0InErrorCount++;
			}
		}
		if ((RegRead(REG08_D_EP0IntStat) & MASK_OUT_TranErr)) {
			RegWrite(REG08_D_EP0IntStat,BIT_OUT_TranErr);
			if ((RegRead(REG08_D_EP0ControlOUT) & MASK_ForceSTALL) != BIT_ForceSTALL) {
				EP0OutErrorCount++;
			}
		}
		if ((RegRead(REG08_D_EPbIntStat) & MASK_IN_TranErr)) {
			RegWrite(REG08_D_EPbIntStat,BIT_IN_TranErr);
			if ((RegRead(REG08_D_EPbControl) & MASK_ForceSTALL) != BIT_ForceSTALL) {
				BulkInErrorCount++;
			}
		}
		if ((RegRead(REG08_D_EPbIntStat) & MASK_OUT_TranErr)) {
			RegWrite(REG08_D_EPbIntStat,BIT_OUT_TranErr);
			if ((RegRead(REG08_D_EPbControl) & MASK_ForceSTALL) != BIT_ForceSTALL) {
				BulkOutErrorCount++;
			}
		}
		if ((RegRead(REG08_D_EPcIntStat) & MASK_IN_TranErr)) {
			RegWrite(REG08_D_EPcIntStat,BIT_IN_TranErr);
			if ((RegRead(REG08_D_EPcControl) & MASK_ForceSTALL) != BIT_ForceSTALL) {
				BulkInErrorCount++;
			}
		}
		if ((RegRead(REG08_D_EPcIntStat) & MASK_OUT_TranErr)) {
			RegWrite(REG08_D_EPcIntStat,BIT_OUT_TranErr);
			if ((RegRead(REG08_D_EPcControl) & MASK_ForceSTALL) != BIT_ForceSTALL) {
				BulkOutErrorCount++;
			}
		}
		if ((RegRead(REG08_D_BulkIntStat) & MASK_CBW_Err)) {
			RegWrite(REG08_D_BulkIntStat,BIT_CBW_Err);
			if ((RegRead(REG08_D_EPbControl) & MASK_ForceSTALL) != BIT_ForceSTALL
				&& (RegRead(REG08_D_EPcControl) & MASK_ForceSTALL) != BIT_ForceSTALL) {
				CBWErrorCount++;
			}
		}
		if ((RegRead(REG08_D_BulkIntStat) & MASK_CSW_Err)) {
			RegWrite(REG08_D_BulkIntStat,BIT_CSW_Err);
			if ((RegRead(REG08_D_EPbControl) & MASK_ForceSTALL) != BIT_ForceSTALL
				&& (RegRead(REG08_D_EPcControl) & MASK_ForceSTALL) != BIT_ForceSTALL) {
				CSWErrorCount++;
			}
		}
#endif
		device_int_stat_sv = RegRead(REG08_DeviceIntStat);	/* Save Device interrupt status*/
		cpu_int_stat_sv    = RegRead(REG08_CPU_IntStat);	/* Save interrupt status of CPU related */
		sie_int_stat_sv    = RegRead(REG08_D_SIE_IntStat);	/* Save interrupt status of SIE related */
		fifo_int_stat_sv   = RegRead(REG08_D_FIFO_IntStat);	/* Save interrupt status of FIFO related */
		mediafifo_int_stat_sv = RegRead(REG08_MediaFIFO_IntStat);	/* Save interrupt status of FIFO related */
		/*----------------------------------------------------------------------*/
		/* USBTask related													*/
		/*----------------------------------------------------------------------*/
		/* Interrupt of SIE related */
		if ((main_int_stat_sv & MASK_DeviceIntStat)) {                    /*if device interrupt*/
			if((device_int_stat_sv & MASK_VBUS_Changed)){          /*if bus power is changed*/
				device_int_enb_usb |= BIT_EnVBUS_Changed;      /*set the flag of bus power interrupt*/
			}
			if((device_int_stat_sv & MASK_D_SIE_IntStat)) {         /*if serial interface engine  interrupt*/
				if((sie_int_stat_sv & MASK_NonJ)){                      /* interrupt of not attack?*/
					sie_int_enb_usb |= BIT_EnNonJ;
				}
				if((sie_int_stat_sv & MASK_DetectRESET)){         /* detect reset*/
					sie_int_enb_usb |= BIT_EnDetectRESET;
				}
				if((sie_int_stat_sv & MASK_DetectSUSPEND)){    /*suspend*/
					sie_int_enb_usb |= BIT_EnDetectSUSPEND;
				}
				if((sie_int_stat_sv & MASK_ChirpCmp)){            /* handshake with host computer interrupt*/
					sie_int_enb_usb |= BIT_EnChirpCmp;
				}
				if((sie_int_stat_sv & MASK_RestoreCmp)){
					sie_int_enb_usb |= BIT_EnRestoreCmp;      /*restore by host computer interrupt*/
				}
				if((sie_int_stat_sv & MASK_SetAddressCmp)){   /*set address by host computer*/
					sie_int_enb_usb |= BIT_EnSetAddressCmp;
				}
			}

			/* Interrupt of endpoint EPr */
			if((device_int_stat_sv & MASK_D_EPrIntStat)){
				device_int_enb_usb |= BIT_EnD_EPrIntStat;
			}

			/* Interrupt of FIFO related */
			if((device_int_stat_sv & MASK_D_FIFO_IntStat)){
				if((fifo_int_stat_sv & MASK_DescriptorCmp)){
					fifo_int_enb_usb |= BIT_EnDescriptorCmp;
				}
			}

			/* Interrupt of Bulk transfer function related */
			if((device_int_stat_sv & MASK_D_BulkIntStat)){
				device_int_enb_usb |= BIT_EnD_BulkIntStat;
			}

			/* Interrupt of endpoint EP0 */
			if((device_int_stat_sv & MASK_D_EP0IntStat)){
				device_int_enb_usb |= BIT_EnD_EP0IntStat;
			}

			/* Interrupt of setup stage of control transfer */
			if((device_int_stat_sv & MASK_RcvEP0SETUP)){
				device_int_enb_usb |= BIT_EnRcvEP0SETUP;
			}

		}

		if( device_int_enb_usb || sie_int_enb_usb || fifo_int_enb_usb ){
			/* Event notification to USBTask */
			OS_ISetFlg( FLGID_USBD, FLG_EVENT_INT_USBD );     /*set flag to the system to call application*/ 
		}

		/*----------------------------------------------------------------------*/
		/* DeviceTask related												*/
		/*----------------------------------------------------------------------*/
		/* Interrupt of SIE related */
		if((main_int_stat_sv & MASK_FinishedPM))
		{
			main_int_enb_device_task |= BIT_EnFinishedPM;
		}

// Judge position change
		/* Interrupt of FIFO related */
		if((main_int_stat_sv & MASK_MediaFIFO_IntStat)) {
			if((mediafifo_int_stat_sv & MASK_MediaIDE_Cmp)){
				mediafifo_int_enb_device_task |= BIT_EnMediaIDE_Cmp;
			}
			if((mediafifo_int_stat_sv & MASK_FIFO_Full)){
				mediafifo_int_enb_device_task |= BIT_EnFIFO_Full;
			}
			if((mediafifo_int_stat_sv & MASK_FIFO_Empty)){
				mediafifo_int_enb_device_task |= BIT_EnFIFO_Empty;
			}
		}

		/* Interrupt of CPU interface related */
		if((main_int_stat_sv & MASK_CPU_IntStat)){
			if((cpu_int_stat_sv & MASK_DMA1_CountUp)){
				cpu_int_enb_device_task |= BIT_EnDMA1_CountUp;
			}
			if((cpu_int_stat_sv & MASK_DMA1_Cmp)){
				cpu_int_enb_device_task |= BIT_EnDMA1_Cmp;
			}
			if((cpu_int_stat_sv & MASK_DMA0_CountUp)){
				cpu_int_enb_device_task |= BIT_EnDMA0_CountUp;
			}
			if((cpu_int_stat_sv & MASK_DMA0_Cmp)){
				cpu_int_enb_device_task |= BIT_EnDMA0_Cmp;
			}
		}

		/* Interrupt of FIFO related */
		if((main_int_stat_sv & MASK_DeviceIntStat)) {
			if((device_int_stat_sv & MASK_D_FIFO_IntStat)){
				if((fifo_int_stat_sv & MASK_FIFO_IDE_Cmp)){
					fifo_int_enb_device_task |= BIT_EnFIFO_IDE_Cmp;
				}
				if(( fifo_int_stat_sv & MASK_FIFO1_Cmp)){
					fifo_int_enb_device_task |= BIT_EnFIFO1_Cmp;
				}
				if(( fifo_int_stat_sv & MASK_FIFO_Full)){
					fifo_int_enb_device_task |= BIT_EnFIFO_Full;
				}
				if(( fifo_int_stat_sv & MASK_FIFO_Empty)){
					fifo_int_enb_device_task |= BIT_EnFIFO_Empty;
				}
				if((fifo_int_stat_sv & MASK_FIFO0_Cmp)){
					fifo_int_enb_device_task |= BIT_EnFIFO0_Cmp;
				}
			}
		}

// Judge position change
		if( main_int_enb_device_task || cpu_int_enb_device_task || fifo_int_enb_device_task || mediafifo_int_enb_device_task ){
			/* Event notification to DeviceTask */
			OS_ISetFlg( FLGID_DEVICE, FLG_EVENT_INT_DEVICE );
		}

		/*----------------------------------------------------------------------*/
		/* IDETask related															*/
		/*----------------------------------------------------------------------*/
		/* Interrupt of IDE related */
		if((main_int_stat_sv & MASK_IDE_IntStat)){
			main_int_enb_ide |= BIT_EnIDE_IntStat;

			/* Event notification to IDETask */
			OS_ISetFlg( FLGID_IDE, FLG_EVENT_INT_IDE );
		}

		/* Prohibit interrupt signal assert of MainIntStat interrupt factor	*/
		RegClear(REG08_MainIntEnb,(main_int_enb_device_task | main_int_enb_ide));

		/* Prohibit interrupt signal assert of DeviceIntStat interrupt factor	*/
		RegClear(REG08_DeviceIntEnb,device_int_enb_usb);

		/* Prohibit interrupt signal assert of SIE_IntStat interrupt factor	*/
		RegClear(REG08_D_SIE_IntEnb,sie_int_enb_usb);

		/* Prohibit interrupt signal assert of CPU_IntStat interrupt factor	*/
		RegClear(REG08_CPU_IntEnb,cpu_int_enb_device_task);

		/* Prohibit interrupt signal assert of FIFO_IntStat interrupt factor	*/
		RegClear(REG08_D_FIFO_IntEnb,(fifo_int_enb_usb | fifo_int_enb_device_task));

		/* Prohibit interrupt signal assert of FIFO_IntStat interrupt factor	*/
		RegClear(REG08_MediaFIFO_IntEnb,mediafifo_int_enb_device_task);

	}

#ifdef TOYA2_C
	rlMX21_PTA_ISR		|= 0x00800000;	/* PTA23 Interrupt Clear */
#endif	// TOYA2_C

}

⌨️ 快捷键说明

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