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

📄 u_device.c

📁 The combined demo is dedicated for S1C33L05, so DMT33L05 should be used to load and run the demo. F
💻 C
📖 第 1 页 / 共 2 页
字号:
/****************************************************************************
 * File name   : device.c
 * Module name : Device module
 * Author	   : Hiromichi Kondo
 *---------------------------------------------------------------------------
 * $Id: device.c,v 1.2 2003/05/13 11:02:05 9551619 Exp $
 ****************************************************************************/

#include "u_ram_data.h"
#include "u_rom_data.h"
#include "u_regNikka.h"
#include "u_value.h"
#include "u_com_fp.h"
#include "u_dev_fp.h"

#include "usbfw_if.h"
#include "drvFS.h"


/*--- Function Prototype ---------------------------------------------------*/
void DeviceProc(void);
void WaitRcvCommand(void);
void CommandCheck(void);
void SetStatus(void);
void WaitCSWCmp(void);
void CBWCheck(void);
void CSWSet(void);
void InitDeviceWorkArea(void);
void MasterDMAStop(void);
void MasterDMAStart(void);
void MasterDMAXferEndProc(void);


extern	STG_MEDIA_INFO  g_StgMediaInfo;
extern	USBFW_IF_ANS	g_UsbIFAns ;

/*****************************************************************************	
 *
 *			: Device
 *				: Device
 *			: 
 *			: 
 *		:device_state			Device
 *
 *****************************************************************************/
void (*const device_tbl[])() = {
	WaitRcvCommand,
	CommandCheck,
	SetStatus,
	WaitCSWCmp
};

void DeviceProc(void)
{
	if( usb_state == CONFIGURED_STATE){
		/* Configured State */
		if (device_state > DEV_WAIT_CSW_CMP) {
			/*  */
			panic(5);
		}
	
		/* device_state  */
		device_tbl[device_state]();
	}
}

/*****************************************************************************	
 *
 *			: 
 *				: 
 *			: 
 *			: 
 *		:device_state			Device
 *				 device_flag			Device
 *				 tran_protocol			
 *				 tran_flag				
 *				 bulk_actual_tran_cnt	Bulk
 *				 bulk_tran_start_addr	Bulk
 *				 bulk_out_state			BulkOUT
 *
 *****************************************************************************/
void WaitRcvCommand(void)
{
	if( device_flag.RcvCommand ){
		/*  */
		
		device_flag.RcvCommand = 0;				/*  */
		
		ControlLED(PORT_TURN_ON);				/* PORTLED */
		
		device_state = DEV_CMD_CHECK;			/*  */
	}else{
		/*  */
		
		if( tran_protocol == BULKONLY ){

			if( device_flag.WaitCBW ){
				/* CBW */

				if( tran_flag.XferCmp ){
					/*  */

					device_flag.WaitCBW = 0;	/* CBW */
					tran_flag.XferCmp = 0;		/*  */
					
					CBWCheck();					/* CBW */
				}
			}else{
				/* CBW */
				
				device_flag.WaitCBW = 1;		/* CBW */

				tran_flag.DMA = 0;				/* DMA */

				bulk_actual_tran_cnt = 31;		/* bulk */
				bulk_tran_start_addr = cbw;		/*  */
				bulk_out_state = BULK_OUT_DATA_GET;
			}
		}
	}
}

/*****************************************************************************	
 *
 *			: 
 *				: 
 *			: 
 *			: 
 *		:device_state			Device
 *				 tran_flag				
 *				 bulk_actual_tran_cnt	Bulk
 *				 bulk_req_tran_cnt		Bulk
 *				 bulk_total_tran_cnt	Bulk
 *				 bulk_out_state			BulkOUT
 *				 bulk_in_state			BulkIN
 *				 protocol_phase			
 *				 cmd_block[]			
 *
 *****************************************************************************/
void CommandCheck(void)
{
	int ret;
	WORD fifo_remain;

	if( cmd_block[0] != 0x00 ){
		test_unit_ready_cnt = 0;
	}
	switch( cmd_block[0] ){
		case 0x00:	/* Test Unit Ready */
			ret = TestUnitReady();
			break;
		case 0x03:	/* Request Sense */
			ret = RequestSense();
			break;
		case 0x12:	/* Inquiry */
			ret = Inquiry();
			break;
		case 0x1B:	/* Start Stop Unit */
			ret = StartStopUnit();
			break;
		case 0x1D:	/* CBI Reset */
			ret = CBIReset();
			break;
		case 0x1E:	/* Prevent/Allow Medium Removal */
			ret = Prevent();
			break;
		case 0x23:	/* Read Format Capacity */
			ret = ReadFormatCapacity();
			break;
		case 0x25:	/* Read Capacity */
			ret = ReadCapacity();
			break;
		case 0x28:	/* Read(10) */
			ret = Read10();
			break;
		case 0x2A:	/* Write(10) */
			ret = Write10();
			break;
		case 0x2B:	/* Seek */
			ret = Seek();
			break;
		case 0x2F:	/* Verify */
			ret = Verify();
			break;
		case 0x55:	/* Mode Select */
			ret = ModeSelect();
			break;
		case 0x5A:	/* Mode Sense */
			ret = ModeSense();
			break;
		default:
			ret = CmdError();
	}

	if( ret == RC_OK ){
		/* OK */

		if( bulk_total_tran_cnt == 0 ){
			/*  */

			protocol_phase = STATUS_PHASE;
			tran_flag.XferCmp = 1;							/* */

		}else{
			/*  */

			protocol_phase = DATA_PHASE;
			bulk_actual_tran_cnt = bulk_total_tran_cnt;		/* Bulk */
			
			if( tran_flag.DMA ){
				/* DMA */

#if 1		/* 03/09/05 Endo :DTQ */

				MasterDMAStart();							/* MasterDMA */

				if( tran_flag.Direction == DIR_IN ){
					/* IN */

					bulk_in_state = BULK_IN_DATA_SET;
				}else{
					/* OUT */
					bulk_out_state = BULK_OUT_DATA_GET;
				}

#else		/* 03/09/05 Endo :DTQ */

				pc_rslt.dir = tran_flag.Direction ;		// no need ?
				pc_rslt.req_wait = 1 ;

#endif		/* 03/09/05 Endo :DTQ */

			}else{
				if( tran_flag.Direction == DIR_IN ){
					/* IN */

					bulk_in_state = BULK_IN_DATA_SET;
				}else{
					/* OUT */
					bulk_out_state = BULK_OUT_DATA_GET;
				}
			}
		}
	}else{
		/* NG */

		if( bulk_req_tran_cnt == 0 ){
			/*  */

			protocol_phase = STATUS_PHASE;
			tran_flag.XferCmp = 1;							/* */
		}else{
			/*  */
			
			bulk_total_tran_cnt = 0;						/* Bulk */
			protocol_phase = DATA_PHASE;
			
			if( tran_flag.Direction == DIR_OUT ){
				/* OUT */

				rEPbControl_BP.ForceNAK = 1;
				
#if 1		/* 03/09/04 Endo :wait  */
				/* 1ms */
				WaitTMStart();
				while(WaitTMCheck(TMOUT_1) != TIMEOUT);
				WaitTMStop();
#endif		/* 03/09/04 Endo :wait  */

				rCPU_JoinRd_BP.JoinEPbRd = 1;
				fifo_remain = MKWORD(rEPnRdRemain_H, rEPnRdRemain_L);
				rCPU_JoinRd_BP.JoinEPbRd = 0;

				if( bulk_req_tran_cnt <= fifo_remain ){
					/*  */
					
					rEPrFIFO_Clr_BP.EPbFIFO_Clr = 1;
					
					protocol_phase = STATUS_PHASE;
					tran_flag.XferCmp = 1;					/*  */
				}else{
					/*  */

					rEPbControl_BP.ForceSTALL = 1;

					bulk_out_state = BULK_OUT_STALL;
				}

			}else{
				/* IN */
				
				rEPaControl_BP.ForceSTALL = 1;
				bulk_in_state = BULK_IN_STALL;
			}
		}
	}
	
	device_state = DEV_SET_STATUS;							/*  */
}

/*****************************************************************************	
 *
 *			: 
 *				: 
 *				  
 *			: 
 *			: 
 *		:device_state			Device
 *				 device_flag			Device
 *				 tran_protocol			
 *				 tran_flag				
 *				 protocol_phase			
 *				 int_int_state			InterruptIN
 *				 cmd_block[]			
 *
 *****************************************************************************/
void SetStatus(void)
{
	if( tran_flag.XferCmp ){
		/*  */
		if( protocol_phase == STATUS_PHASE ){
			/*  */
			
			tran_flag.XferCmp = 0;						/*  */
			rEPbControl_BP.ForceNAK = 1;
			
			if( cmd_block[0] == 0x55 ){
				/* Mode Select */
				ModeSelParaCheck();						/* Mode Select */
			}
			
			if( tran_protocol == BULKONLY ){
				/* BulkOnly */
				
				CSWSet();								/* CSW */
				
				device_state = DEV_WAIT_CSW_CMP;		/* CSW */
				
				ControlLED(PORT_TURN_OFF);				/* PORTLED */
			}else{
				/* CBI */

				int_in_state = INT_IN_DATA_SET;
				device_state = DEV_WAIT_RCV_CMD;		/*  */

⌨️ 快捷键说明

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