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

📄 u_main.c

📁 EPSON USB DEVICE MASS-STORAGE CLASS driver, BULK ONLY on Ram disk
💻 C
字号:
/******************************************************************************
 * File name   : main.c
 * Module name : main module
 * Author	   : Hiromichi.Kondo
 *-----------------------------------------------------------------------------
 * $Id: main.c,v 1.6 2003/05/26 02:34:45 9551619 Exp $
 *****************************************************************************/

/*--- Include ---------------------------------------------------------------*/
#include "u_value.h"
#include "u_macro.h"
#include "u_regNikka.h"

#include "u_ram_data.h"
#include "u_rom_data.h"

/*--- Function Prototype ---------------------------------------------------*/
void PowerOnProc(void);
static void InitTargetIC(void);
static int	Diagnostic(int loop);
static void SetReplyDescriptorData(void);
void InitWorkArea(void);

void InterruptProc(void);
void Timer0IntProc(void);

/* Global Variable */
S_rMainIntStat	main_int_stat_sv;	/* Main */
S_rSIE_IntStat	sie_int_stat_sv;	/* SIE */
S_rEPrIntStat	epr_int_stat_sv;	/* EPr */
S_rDMA_IntStat	dma_int_stat_sv;	/* DMA */
S_rFIFO_IntStat	fifo_int_stat_sv;	/* FIFO */
S_rEP0IntStat	ep0_int_stat_sv;	/* EP0 */
S_rEPaIntStat	epa_int_stat_sv;	/* EPa */
S_rEPbIntStat	epb_int_stat_sv;	/* EPb */
S_rEPcIntStat	epc_int_stat_sv;	/* EPc */

/*****************************************************************************
 *	PowerOnProc
 *****************************************************************************/
void PowerOnProc(void)
{
	InitWorkArea();
	InitTargetIC();

	special_flag.Attach = 1 ;
}

/*****************************************************************************
 * InitTargetIC
 *****************************************************************************/
void InitTargetIC(void)
{
	if (Diagnostic(0) == FALSE_U)
		panic(2);
	
	rEP0IntStat = 0xFF;
	rEPaIntStat = 0xFF;
	rEPbIntStat = 0xFF;
	rEPcIntStat = 0xFF;
	rEPrIntStat = 0xFF;
	rDMA_IntStat = 0xFF;
	rFIFO_IntStat = 0xFF;
	rSIE_IntStat = 0xFF;
	rMainIntStat = 0xFF;

	rMainIntEnb_BP.EnSIE_IntStat = 1;
	rMainIntEnb_BP.EnEPrIntStat = 1;
	rMainIntEnb_BP.EnDMA_IntStat = 1;
	rMainIntEnb_BP.EnFIFO_IntStat = 1;
	rMainIntEnb_BP.EnEP0IntStat = 1;

	rSIE_IntEnb_BP.EnVBUS_Changed = 1;
	rSIE_IntEnb_BP.EnSetAddressCmp = 1;

	rEPrIntEnb_BP.EnEPaIntStat = 1;
	rEPrIntEnb_BP.EnEPbIntStat = 1;
	rEPrIntEnb_BP.EnEPcIntStat = 1;

	rFIFO_IntEnb_BP.EnFIFO_IN_Cmp = 1;
	rFIFO_IntEnb_BP.EnFIFO_OUT_Cmp = 1;
	rFIFO_IntEnb_BP.EnDescriptorCmp = 1;

	/* USB Configuration */
	rUSB_Control = 0x00;
	rXcvrControl = 0x01;
	rUSB_Test = 0x00;

	/* Bus Configuration */
	rDMA_Config_0_BP.PDREQ_Level = 0;			/* Active-High  */
	rDMA_Config_0_BP.PDACK_Level = 0;			/* Active-High  */
	rDMA_Config_0_BP.PDRDWR_Level = 0;			/* Active-Low  */
	rDMA_Config_0_BP.ActivePort = 1;
	rDMA_Config_1_BP.SingleWord = 1;
	rDMA_Config_1_BP.CountMode = 1;				/* CountMode */
//	rDMA_Latency = 0xf;

	SetReplyDescriptorData();

	/* FIFO */
	rEPaStartAdrs_H = 0x02;						/* EPa = 0x200-0x27F(128Byte) */
	rEPaStartAdrs_L = 0x00;
	rEPbStartAdrs_H = 0x02;						/* EPb = 0x280-0x2FF(128Byte) */
	rEPbStartAdrs_L = 0x80;
	
	rEPcStartAdrs_H = 0x03;						/* EPc = 0x300-0x300(0Byte) */
	rEPcStartAdrs_L = 0x00;
	rEPdStartAdrs_H = 0x03;						/* EPd = 0x300-0x300(0Byte) */
	rEPdStartAdrs_L = 0x00;
	rEPeStartAdrs_H = 0x03;						/* EPe = 0x300-0x300(0Byte) */
	rEPeStartAdrs_L = 0x00;
	rEPfStartAdrs_H = 0x03;						/* EPf = 0x300-0x300(0Byte) */
	rEPfStartAdrs_L = 0x00;
	rEPgStartAdrs_H = 0x03;						/* EPg = 0x300-0x300(0Byte) */
	rEPgStartAdrs_L = 0x00;
	rEPhStartAdrs_H = 0x03;						/* EPh = 0x300-0x300(0Byte) */
	rEPhStartAdrs_L = 0x00;
}

/*****************************************************************************
 * Diagnostic
 *****************************************************************************/
int Diagnostic(int loop)
{
	int fifo_remain;
	int RegErr,FIFOErr;

	do
	{
		rEPnControl_BP.AllFIFO_Clr = 1;			/* All FIFO Clear */

		rDMA_Control_BP.DMA_Stop = 1;			/* DMA Stop */
		while(rDMA_Control_BP.DMA_Running == 1);

		RegErr	= 1;
		FIFOErr = 1;

		do
		{
			rEPaIntEnb = 0x7F; if( rEPaIntEnb != 0x7F ) break;
			rEPaIntEnb = 0x55; if( rEPaIntEnb != 0x55 ) break;
			rEPaIntEnb = 0x2A; if( rEPaIntEnb != 0x2A ) break;
			rEPaIntEnb = 0x00; if( rEPaIntEnb != 0x00 ) break;

			rUSB_Address = 0x7F; if( rUSB_Address != 0x7F ) break;
			rUSB_Address = 0x55; if( rUSB_Address != 0x55 ) break;
			rUSB_Address = 0x2A; if( rUSB_Address != 0x2A ) break;
			rUSB_Address = 0x00; if( rUSB_Address != 0x00 ) break;

			rDMA_Count_HH = 0xFF; if( rDMA_Count_HH != 0xFF ) break;
			rDMA_Count_HH = 0x55; if( rDMA_Count_HH != 0x55 ) break;
			rDMA_Count_HH = 0xAA; if( rDMA_Count_HH != 0xAA ) break;
			rDMA_Count_HH = 0x00; if( rDMA_Count_HH != 0x00 ) break;

			rDMA_Latency = 0x0F; if( rDMA_Latency != 0x0F ) break;
			rDMA_Latency = 0x05; if( rDMA_Latency != 0x05 ) break;
			rDMA_Latency = 0x0A; if( rDMA_Latency != 0x0A ) break;
			rDMA_Latency = 0x00; if( rDMA_Latency != 0x00 ) break;

			rEPaMaxSize_L = 0xFF; if( rEPaMaxSize_L != 0xFF ) break;
			rEPaMaxSize_L = 0x55; if( rEPaMaxSize_L != 0x55 ) break;
			rEPaMaxSize_L = 0xAA; if( rEPaMaxSize_L != 0xAA ) break;
			rEPaMaxSize_L = 0x00; if( rEPaMaxSize_L != 0x00 ) break;

			RegErr = 0;
			
			/* FIFO  */
			rEP0MaxSize = 0x08;							/* EP0 MaxPacketSize = 8Byte */
			rEPnControl_BP.AllFIFO_Clr = 1;				/* All FIFO Clear */

			rCPU_JoinRd = 0x00;
			rCPU_JoinWr = 0x00;
			rEnEPnFIFO_Access_BP.EnEPnFIFO_Wr = 1;

			rEPnFIFOforCPU = 0x00;
			rEPnFIFOforCPU = 0xFF;
			rEPnFIFOforCPU = 0x55;
			rEPnFIFOforCPU = 0xAA;
			rEnEPnFIFO_Access_BP.EnEPnFIFO_Wr = 0;

			fifo_remain = MKWORD( rEPnRdRemain_H,rEPnRdRemain_L );
			if( fifo_remain != 0x04 ) break;
			
			fifo_remain = MKWORD( rEPnRdRemain_H,rEPnRdRemain_L );
			if( fifo_remain != 0x04 ) break;
			
			rEnEPnFIFO_Access_BP.EnEPnFIFO_Rd = 1;
			if( rEPnFIFOforCPU != 0x00 ) break;
			if( rEPnFIFOforCPU != 0xFF ) break;
			if( rEPnFIFOforCPU != 0x55 ) break;
			if( rEPnFIFOforCPU != 0xAA ) break;
			rEnEPnFIFO_Access_BP.EnEPnFIFO_Rd = 0;

			fifo_remain = MKWORD( rEPnRdRemain_H,rEPnRdRemain_L );
			
			if( fifo_remain != 0x00 ) break;
			
			FIFOErr = 0;

		} while (0);
		
		if (RegErr)
			DiagRegErrorCount++;

		if (FIFOErr)
			DiagFIFOErrorCount++;

	} while (loop);
	
	if( RegErr == 0 && FIFOErr == 0 )
		return TRUE_U;
	else
		return FALSE_U;
}

/*****************************************************************************
 *	SetReplyDescriptorData
 *****************************************************************************/
void SetReplyDescriptorData(void)
{
	BYTE *temp_ptr, num_alt_set;
	WORD i, j, k, l, len;
	ConfigDesc *p_c_desc;
	InterfaceDesc *p_i_desc;
	
	rDescAdrs_H = 0x00;
	rDescAdrs_L = 0x40;

	/* FSDevice Descriptor */
	desc_addr_fs_device = MKWORD( rDescAdrs_H,rDescAdrs_L );

	/* FSDevice Descriptor */
	temp_ptr = (BYTE *)&fs_device_desc;
	for( i=0; i<fs_device_desc.bLength; i++)
		rDescDoor = temp_ptr[i];

	/* FSConfiguration Descriptor */
	desc_addr_fs_config = MKWORD( rDescAdrs_H,rDescAdrs_L );

	p_c_desc = &fs_config_desc;
	p_i_desc = &fs_interface_desc[0];
	num_alt_set = NUM_FS_ALT_SET;

	len = p_c_desc->bLength;

	/* Configuration Descriptor */
	temp_ptr = (BYTE *)p_c_desc;
	for( j=0; j<len; j++ )
		rDescDoor = temp_ptr[j];

	for( j=0; ; j++ )
	{
		len = p_i_desc->bLength;

		/* Interface Descriptor */
		temp_ptr = (BYTE *)&p_i_desc[j];
		for( k=0; k<len; k++ )
			rDescDoor = temp_ptr[k];
		
		for( k=0; k<p_i_desc[j].bNumEndpoints; k++ )
		{
			len = p_i_desc[j].p_e_desc[k].bLength;
			temp_ptr = (BYTE *)&(p_i_desc[j].p_e_desc[k]);
			for( l=0; l<len; l++ )
				rDescDoor = temp_ptr[l];
		}
		if( j >= num_alt_set )
			break;
	}

	for( i=0; i<NUM_STRING; i++ )
	{
		/* String Descriptor */
		desc_addr_string[i] = MKWORD( rDescAdrs_H, rDescAdrs_L );

		temp_ptr = (BYTE *)string_table[i];
		len = temp_ptr[0];
		for( j=0; j<len; j++ )
			rDescDoor = temp_ptr[j];
	}
}

/*****************************************************************************
 *	InitWorkArea
 *****************************************************************************/
void InitWorkArea(void)
{
	DIRECT_B(main_int_stat) = 0x00;		/* main_int_stat  */
	DIRECT_B(sie_int_stat)	= 0x00;		/* sie_int_stat  */
	DIRECT_B(epr_int_stat)	= 0x00;		/* epr_int_stat  */
	DIRECT_B(dma_int_stat)	= 0x00;		/* dma_int_stat  */
	DIRECT_B(fifo_int_stat)	= 0x00;		/* fifo_int_stat  */
	DIRECT_B(ep0_int_stat)	= 0x00;		/* ep0_int_stat  */
	DIRECT_B(epa_int_stat)	= 0x00;		/* epa_int_stat  */
	DIRECT_B(epb_int_stat)	= 0x00;		/* epb_int_stat  */
	DIRECT_B(epc_int_stat)	= 0x00;		/* epc_int_stat  */

	/* Timer */
	timer0_cnt = timer1_cnt = 0x00;

	cmd_status = 0x00;
	DIRECT_B(device_flag)	= 0x00;
	wk_lba = wk_cnt = 0x00;
	wk_ptr = 0x00;

	control_state  = CTRL_IDLE;
	bulk_in_state  = BULK_IN_IDLE;
	bulk_out_state = BULK_OUT_IDLE;
	int_in_state   = INT_IN_IDLE;
	device_state   = DEV_WAIT_RCV_CMD;

	protocol_phase = COMMAND_PHASE;

	DiagRegErrorCount  = 0;
	DiagFIFOErrorCount = 0;

	/* USB */
	InitUSBWorkArea();
	/* Device */
	InitDeviceWorkArea();
}

/*****************************************************************************
 *	InterruptProc
 *****************************************************************************/
void InterruptProc(void)
{
	DIRECT_B(main_int_stat_sv) = rMainIntStat;
	DIRECT_B(main_int_stat) |= DIRECT_B(main_int_stat_sv);

	if(main_int_stat_sv.SIE_IntStat)
	{
		/* SIE */
		DIRECT_B(sie_int_stat_sv) = rSIE_IntStat;
#ifdef DIS_AUTONEGO
		if(sie_int_stat_sv.DetectJ)
		{
			rSIE_IntEnb_BP.EnDetectJ = 0;	/* DetectJ */
			rUSB_Control_BP.StartDetectJ = 0;	/* J */
			rUSB_Control_BP.DisBusDetect = 0;	/* ResetSuspend */
		}
#endif /* DIS_AUTONEGO */

		if(sie_int_stat_sv.NonJ)
		{
			rSIE_IntEnb_BP.EnNonJ = 0;		/* NonJ */
		}

#ifdef DIS_AUTONEGO
		if(sie_int_stat_sv.DetectRESET)
		{
			rUSB_Control_BP.DisBusDetect = 1;		/*  ->  */
		}
#endif /* DIS_AUTONEGO */

		DIRECT_B(sie_int_stat) |= DIRECT_B(sie_int_stat_sv);
		rSIE_IntStat = DIRECT_B(sie_int_stat_sv);
	}
	
	if(main_int_stat_sv.EPrIntStat)
	{
		/* EPr */
		DIRECT_B(epr_int_stat_sv) = rEPrIntStat;	/* EPx */
		rEPrIntStat = DIRECT_B(epr_int_stat_sv);
		DIRECT_B(epr_int_stat) |= DIRECT_B(epr_int_stat_sv);

		if(epr_int_stat_sv.EPaIntStat)
		{
			/* EPa */
			DIRECT_B(epa_int_stat_sv) = rEPaIntStat;
			rEPaIntStat = DIRECT_B(epa_int_stat_sv);
			DIRECT_B(epa_int_stat) |= DIRECT_B(epa_int_stat_sv);
		}
		if(epr_int_stat_sv.EPbIntStat)
		{
			/* EPb */
			DIRECT_B(epb_int_stat_sv) = rEPbIntStat;
			rEPbIntStat = DIRECT_B(epb_int_stat_sv);
			DIRECT_B(epb_int_stat) |= DIRECT_B(epb_int_stat_sv);
		}
		if(epr_int_stat_sv.EPcIntStat)
		{
			/* EPc */
			DIRECT_B(epc_int_stat_sv) = rEPcIntStat;
			rEPcIntStat = DIRECT_B(epc_int_stat_sv);
			DIRECT_B(epc_int_stat) |= DIRECT_B(epc_int_stat_sv);
		}
	}
	
	if( main_int_stat_sv.DMA_IntStat )
	{
		DIRECT_B(dma_int_stat_sv) = rDMA_IntStat;	/* DMA */
		rDMA_IntStat = DIRECT_B(dma_int_stat_sv);
		DIRECT_B(dma_int_stat) |= DIRECT_B(dma_int_stat_sv);
	}
	
	if( main_int_stat_sv.FIFO_IntStat )
	{
		DIRECT_B(fifo_int_stat_sv) = rFIFO_IntStat;	/* FIFO */
		rFIFO_IntStat = DIRECT_B(fifo_int_stat_sv);
		DIRECT_B(fifo_int_stat) |= DIRECT_B(fifo_int_stat_sv);
	}
	
	if( main_int_stat_sv.EP0IntStat )
	{
		/* EP0 */
		DIRECT_B(ep0_int_stat_sv) = rEP0IntStat;
		DIRECT_B(ep0_int_stat) |= DIRECT_B(ep0_int_stat_sv);
		rEP0IntStat = DIRECT_B(ep0_int_stat_sv);
	}
	rMainIntStat = DIRECT_B(main_int_stat_sv) & 0xFE;
}

/*****************************************************************************
 * Timer0IntProc
 *****************************************************************************/
void Timer0IntProc(void)
{
	timer0_cnt++;
}

⌨️ 快捷键说明

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