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

📄 u_usb.c

📁 EPSON USB DEVICE MASS-STORAGE CLASS driver, BULK ONLY on Ram disk
💻 C
字号:
/******************************************************************************
 * File name   : usb.c
 * Module name : usb common module
 * Author	   : Hiromichi.Kondo
 *----------------------------------------------------------------------------
 * $Id: usb.c,v 1.3 2003/05/16 06:51:07 9551619 Exp $
 *****************************************************************************/
#include "u_value.h"
#include "u_macro.h"
#include "u_ram_data.h"
#include "u_rom_data.h"
#include "u_regNikka.h"

/*--- Function Prototype ---------------------------------------------------*/
int	VBUSCheck(void);
int	LineStateCheck(void);
void AttachProc(void);
void DetachProc(void);
void USBResetProc(void);
void SuspendResumeProc(void);
void USBProc(void);
void InitUSBWorkArea(void);

//---------------------------------------------------------------------------------
//  Function name	 		:VBUSCheck	
// 	Function description	:Check VBUS state
//		 
//      Parameters
//         Input  			:void  
//         Output 			:void
//         I/O    			:void
//      
//      Return value 		:VBUS state 	
//
//	Global variable 		:void	
//---------------------------------------------------------------------------------
int VBUSCheck(void)
{
	return rUSB_Status_BP.VBUS;
}

//---------------------------------------------------------------------------------
//  Function name	 		:LineStateCheck	
// 	Function description	:Check line state
//		 
//      Parameters
//         Input  			:void  
//         Output 			:void
//         I/O    			:void
//      
//      Return value 		:line state 	
//
//	Global variable 		:void	
//---------------------------------------------------------------------------------
int LineStateCheck(void)
{
	return rUSB_Status_BP.LineState;
}

//---------------------------------------------------------------------------------
//  Function name	 		:Attach Process	
// 	Function description	:
//		 
//      Parameters
//         Input  			:void  
//         Output 			:void
//         I/O    			:void
//      
//      Return value 		:void
//
//	Global variable 		:void	
//---------------------------------------------------------------------------------
void AttachProc(void)
{
	unsigned char line_state;

	rUSB_Control_BP.ActiveUSB = 1; 		/* USB */
	rUSB_Control_BP.EnAutoNego	   = 0;	//fukaya
	rUSB_Control_BP.DisBusDetect = 1;	/* ResetSuspend */
	rXcvrControl_BP.RpuEnb = 1;			/* Enable D+ pull up */	
	rXcvrControl_BP.OpMode = 0x02;		/* Disable bitstuffing & NRZI Encoding */

	while( 1 )
	{
		line_state = LineStateCheck();	/* LineState */
		if( line_state == J_STATE )
			break;
	}
	
	rSIE_IntEnb_BP.EnDetectRESET   = 1;
	rSIE_IntEnb_BP.EnDetectSUSPEND = 1;

#ifdef DIS_AUTONEGO
	rUSB_Control_BP.DisBusDetect   = 0;		/* ResetSuspend */
#else /* DIS_AUTONEGO */
	rUSB_Control_BP.EnAutoNego	   = 1;		/* Auto Nego */
#endif /* DIS_AUTONEGO */
	special_flag.Attach = 0;
}

//---------------------------------------------------------------------------------
//  Function name	 		:Detach Process	
// 	Function description	:
//		 
//      Parameters
//         Input  			:void  
//         Output 			:void
//         I/O    			:void
//      
//      Return value 		:void
//
//	Global variable 		:void	
//---------------------------------------------------------------------------------
void DetachProc(void)
{
	rXcvrControl_BP.OpMode = 0x01;		/* Non Drive */
	rXcvrControl_BP.RpuEnb = 0;
	rUSB_Control_BP.EnAutoNego = 0;		/* Auto Nego */
	rUSB_Control_BP.ActiveUSB = 0;		/* USB */

	special_flag.Detach = 0;
	special_flag.Attach = 1;
}

//---------------------------------------------------------------------------------
//  Function name	 		:Reset Process	
// 	Function description	:
//		 
//      Parameters
//         Input  			:void  
//         Output 			:void
//         I/O    			:void
//      
//      Return value 		:void
//
//	Global variable 		:void	
//---------------------------------------------------------------------------------
void USBResetProc(void)
{
	special_flag.Reset = 0;

	rXcvrControl_BP.OpMode = 0x00;		/* Normal */

#ifdef DIS_AUTONEGO
	rUSB_Control_BP.EnAutoNego	   = 0;	//fukaya
	rUSB_Control_BP.DisBusDetect = 1;	/*  ->  */
#endif /* DIS_AUTONEGO */

	/* Endpoint 0 */
	if(usb_flag.Init == 0){
		/* USB */

		rEP0ControlOUT_BP.AutoForceNAK = 1;
		rEP0Control_BP.ReplyDescriptor = 0;

		/* EP0 */
		rEP0IntEnb_BP.EnIN_TranACK = 1;
		rEP0IntEnb_BP.EnOUT_TranACK = 1;
		rEP0IntEnb_BP.EnIN_TranErr = 1;
		rEP0IntEnb_BP.EnOUT_TranErr = 1;


		/* EP0Endpoint */
		rEPaConfig_0_BP.EnEndPoint = 0;
		rEPbConfig_0_BP.EnEndPoint = 0;
		rEPcConfig_0_BP.EnEndPoint = 0;

		/* RcvEPSETUP */
		rMainIntStat = 0x01;					/* RcvEP0SETUP = 0 */

		/*  */
		DIRECT_B(main_int_stat) = 0x00;
		DIRECT_B(sie_int_stat) &= 0x84;
		DIRECT_B(epr_int_stat)	= 0x00;
		DIRECT_B(dma_int_stat)	= 0x00;
		DIRECT_B(fifo_int_stat)	= 0x00;
		DIRECT_B(ep0_int_stat)	= 0x00;
		DIRECT_B(epa_int_stat)	= 0x00;
		DIRECT_B(epb_int_stat)	= 0x00;
		DIRECT_B(epc_int_stat)	= 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;

		InitUSBWorkArea();
		InitDeviceWorkArea();
		protocol_phase = COMMAND_PHASE;

		/* EP0 */
		max_pkt_size_0 = fs_device_desc.bMaxPacketSize0;
		rEP0MaxSize = max_pkt_size_0;		/* EP0 MaxPacketSize */
		rEPnControl_BP.AllFIFO_Clr = 1;		/* All FIFO Clear */

		usb_flag.Init = 1;
	}

#ifdef DIS_AUTONEGO
	rSIE_IntStat = 0x04;	/* DetectJ */
	rSIE_IntEnb_BP.EnDetectJ = 1;	/* DetectJ */
	rUSB_Control_BP.StartDetectJ = 1;	/* J */
#endif /* DIS_AUTONEGO */

}

//---------------------------------------------------------------------------------
//  Function name	 		:SuspendResumeProc	
// 	Function description	:
//		 
//      Parameters
//         Input  			:void  
//         Output 			:void
//         I/O    			:void
//      
//      Return value 		:void
//
//	Global variable 		:void	
//---------------------------------------------------------------------------------
void SuspendResumeProc(void)
{
	unsigned char vbus_state,line_state;
	special_flag.Suspend = 0;

#ifdef DIS_AUTONEGO
	rUSB_Control_BP.InSUSPEND = 1; 			/* NonJ */
#endif /* DIS_AUTONEGO */

	rSIE_IntStat = 0x40;					/* NonJ */
	rSIE_IntEnb_BP.EnNonJ = 1;				/* NonJ */

#ifdef DIS_AUTONEGO
	rUSB_Control_BP.EnAutoNego	   = 0;	//fukaya
	rUSB_Control_BP.DisBusDetect = 1;
#endif

	while(1){
#ifdef	REMOTE_WAKEUP_SW
		if( usb_flag.EnbRemoteWakeup && WAKEUP_SW == 0){
			/* RemoteWakeup */
			usb_flag.RemoteWakeup = 1;
			timer0_Run();
			while(timer0_Chk(TMOUT_5) != TMOUT_5){
				if(sie_int_stat.VBUS_Changed || sie_int_stat.NonJ){
					usb_flag.RemoteWakeup = 0;
					break;
				}
			}
			timer0_Stop();
		}
#endif
		if(usb_flag.RemoteWakeup){
			usb_flag.RemoteWakeup = 0;

			rSIE_IntEnb_BP.EnNonJ = 0;	/* Non_J */

			/* LineStateK1ms */
			rUSB_Control_BP.SendWakeup = 1;
            soft_Wait(1);
			rUSB_Control_BP.SendWakeup = 0;

			di();
			sie_int_stat.NonJ = 1;					/* Non_J */
			ei();
		}
		if(sie_int_stat.VBUS_Changed){
			/* VBUS */
			vbus_state = VBUSCheck();
			di();
			sie_int_stat.VBUS_Changed = 0;
			ei();
			if(vbus_state == VBUS_NOT_CONNECT){

				rUSB_Control_BP.InSUSPEND = 0;		/* NonJ */

				rSIE_IntEnb_BP.EnNonJ = 0;			/* Non_J */

				DetachProc();						/* Detach */
				return;
			}
			/* VBUS */
			break;
		}
		if(sie_int_stat.NonJ){
			/* J */
			line_state = LineStateCheck();
			di();
			sie_int_stat.NonJ = 0;
			ei();
			if(line_state != J_STATE && line_state != SE1_STATE){

				rUSB_Control_BP.InSUSPEND = 0;			/* NonJ */

#ifdef DIS_AUTONEGO
				if( line_state == SE0_STATE ){
					special_flag.Reset = 1;				/* USBReset */
					USBResetProc();						/* USB Reset */
				}

				if(line_state == K_STATE){
					/* USB Resume */
					rSIE_IntStat = 0x04;
					rSIE_IntEnb_BP.EnDetectJ = 1;
					rUSB_Control_BP.StartDetectJ = 1;
				}

#endif /* DIS_AUTONEGO */
				break;
			}
			/* J */
			rSIE_IntEnb_BP.EnNonJ = 1;			/* Non_J */
		}
	}
}

//---------------------------------------------------------------------------------
//  Function name	 		:USBProc	
// 	Function description	:
//		 
//      Parameters
//         Input  			:void  
//         Output 			:void
//         I/O    			:void
//      
//      Return value 		:void
//
//	Global variable 		:void	
//---------------------------------------------------------------------------------
void USBProc(void)
{
	if(usb_flag.USBReqRcvd){
		if(control_state == CTRL_IDLE){
			control_state = CTRL_REQ_CHECK;
		}
	}
	if(bulk_in_state < BULK_IN_IDLE){
		/* IDLE,STALL */
		BulkInTransfer();
	}
	if(bulk_out_state < BULK_OUT_IDLE){
		/* IDLE,STALL */
		BulkOutTransfer();
	}
	if(int_in_state < INT_IN_IDLE){
		/* IDLE,STALL */
		IntInTransfer();
	}
	if(control_state != CTRL_IDLE){
		/* IDLE,STALL */
		ControlTransfer();
	}

}

//---------------------------------------------------------------------------------
//  Function name	 		:InitUSBWorkArea	
// 	Function description	:
//		 
//      Parameters
//         Input  			:void  
//         Output 			:void
//         I/O    			:void
//      
//      Return value 		:void
//
//	Global variable 		:void	
//---------------------------------------------------------------------------------
void InitUSBWorkArea(void)
{
	int i;

	usb_state = DEFAULT_STATE;
	tran_protocol = BULKONLY;

	assigned_addr = 0x00;

	DIRECT_B(usb_flag) = 0x00;
	DIRECT_B(special_flag) = 0x00;
	retry_cnt_0 = 0;
	retry_cnt_a = 0;
	retry_cnt_b = 0;
	retry_cnt_c = 0;
	current_alt_set = 0x00;
	
	tran_start_addr = 0x00;
	req_tran_cnt = total_tran_cnt = actual_tran_cnt = 0x00;
	max_pkt_size_0 = max_pkt_size_a = max_pkt_size_b = max_pkt_size_c = 0x00;

	control_result = bulk_in_result = NO_RESULT;
	bulk_out_result = int_in_result = NO_RESULT;

	for (i = 0;i < sizeof(usb_wk_data); i++) {
		usb_wk_data[i] = 0x00;
	}

}

/***** End of file *****/

⌨️ 快捷键说明

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