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

📄 u_control.c

📁 The combined demo is dedicated for S1C33L05, so DMT33L05 should be used to load and run the demo. F
💻 C
📖 第 1 页 / 共 2 页
字号:
				control_state = CTRL_DATA_RCV;
			}else{
				/*  */
				control_state = CTRL_PARA_UPDATE;
			}
		}else{
			/*  */
			control_state = CTRL_STS_START;
		}
	}else{
		/* FIFOEmpty */

		if( actual_tran_cnt < fifo_remain ){
			/*  */

			/*  */
			rEP0ControlIN_BP.ForceSTALL = 1;
			rEP0ControlOUT_BP.ForceSTALL = 1;
			control_state = CTRL_IDLE;
		}else{
			/* FIFO */

			/*
			 * FIFOEmpty
			 * FIFO
			 * 
			 */

			rCPU_JoinRd = 0x00;
			rEnEPnFIFO_Access_BP.EnEPnFIFO_Rd = 1;
			for( i=fifo_remain; i>0; i-- ){
				*tran_start_addr = rEPnFIFOforCPU;
				tran_start_addr++;
			}
			rEnEPnFIFO_Access_BP.EnEPnFIFO_Rd = 0;
			actual_tran_cnt -= fifo_remain;

			if( actual_tran_cnt ){
				/*  */

				rEP0ControlOUT_BP.ForceNAK = 0;
				control_state = CTRL_DATA_RCV;
			}else{
				/*  */

				control_state = CTRL_PARA_UPDATE;
			}
		}
	}
}

/*****************************************************************************	
 *
 *			: 
 *				: 
 *			: 
 *			: 
 *		: actual_tran_cnt		
 *				  control_state			Control
 *				  protocol_phase		
 *				  int_in_state			Interrupt IN
 *				  usb_wk_data[]			USB
 *				  cmd_block[]			
 *				  usb_cmd_tran_cnt		
 *				  device_flag			
 *
 *****************************************************************************/
void ControlParaUpdate(void)
{
	int i;
	
	switch(rEP0SETUP_1){
		case TEST_EP0_OUT:
			/* Test_EP0_Out */

			if( actual_tran_cnt ){
				/*  */

				/*  */
				rEP0ControlIN_BP.ForceSTALL = 1;
				rEP0ControlOUT_BP.ForceSTALL = 1;
				control_state = CTRL_IDLE;
			}else{
				/*  */
				control_state = CTRL_STS_START;
			}
			break;
		case ACCEPT_DEV_SPC_CMD:
			/* Accept Device-Specific Command */

			AcceptDevSpecCmdCheck();
			break;
		default:
			/*  */
			rEP0ControlIN_BP.ForceSTALL = 1;
			rEP0ControlOUT_BP.ForceSTALL = 1;
			control_state = CTRL_IDLE;
	}
}

/*****************************************************************************	
 *
 *			: Accept Device-Specific Command
 *				: 
 *			: 
 *			: 
 *		: protocol_phase		
 *				  control_state			Control
 *				  usb_wk_data[]			USBAREA
 *				  int_in_state			InterruptIN
 *				  cmd_block[]			ATAPI
 *				  device_flag			
 *				  cmd_status			
 *
 *****************************************************************************/
void AcceptDevSpecCmdCheck(void)
{
	int i;

	if( protocol_phase == DATA_PHASE ){
		/*  */

		if( usb_wk_data[0] == 0x1D && usb_wk_data[1] == 0x04 ){
			/* CBI Reset */
			
			rEP0ControlIN_BP.ForceSTALL = 1;
			rEP0ControlOUT_BP.ForceSTALL = 1;
			
			control_state = CTRL_IDLE;
		}else{
			/* CBI Reset */

			protocol_phase = COMMAND_PHASE;		/*  */
			int_in_state = INT_IN_IDLE;			/* InterruptINIDLE */

			/*  */
			for( i=0; i<12; i++ ){
				cmd_block[i] = usb_wk_data[i];
			}

			device_flag.RcvCommand = 1;			/* */

			control_state = CTRL_STS_START;
			
			if( cmd_status == COMMAND_FAILED ){
				/* FAILED */
				rEPaControl_BP.ForceSTALL = 0;
				rEPbControl_BP.ForceSTALL = 0;
			}
		}
	}else{
		/*  */
		
		if( protocol_phase == STATUS_PHASE ){
			/*  */

			protocol_phase = COMMAND_PHASE;
			int_in_state = INT_IN_IDLE;			/* InterruptINIDLE */
		}

		/*  */
		for( i=0; i<12; i++ ){
			cmd_block[i] = usb_wk_data[i];
		}

		device_flag.RcvCommand = 1;			/* */

		control_state = CTRL_STS_START;

		if( cmd_status == COMMAND_FAILED ){
			/* FAILED */
			rEPaControl_BP.ForceSTALL = 0;
			rEPbControl_BP.ForceSTALL = 0;
		}
	}

}

/*****************************************************************************	
 *
 *			: 
 *				: 
 *			: 
 *			: 
 *		: control_result		Control
 *				  control_state			Control
 *				  usb_flag				USB
 *				  ep0_int_stat			EP0
 *
 *****************************************************************************/
void ControlStatusStart(void)
{
	rEP0IntStat = rEP0IntStat;		/*  */

	if( rEP0Control_BP.INxOUT ){
		/* (IN) */
		rEP0Control_BP.INxOUT = 0;
		rEP0ControlOUT_BP.ForceNAK = 0;
	}else{
		/* (OUT) */

		if( usb_flag.Address ){
			/* Address */
			
			usb_flag.Address = 0;				/* Address */
			rUSB_Address_BP.AutoSetAddress = 1;	/* Auton Set Address */
		}
		rEP0Control_BP.INxOUT = 1;
		rEP0ControlIN_BP.ForceNAK = 0;
		rEP0ControlIN_BP.EnShortPkt = 1;
	}

	control_result = NO_RESULT;
	control_state = CTRL_STS_END;
}

/*****************************************************************************	
 *
 *			: 
 *				: 
 *			: 
 *			: 
 *		: control_result		Control
 *				  retry_cnt				
 *				  control_state			Control
 *				  usb_flag				USB
 *				  ep0_int_stat			EP0
 *
 *****************************************************************************/
void ControlStatusEnd(void)
{
	int fifo_remain;

	if( control_result == EP0_IN_ACK || control_result == EP0_OUT_ACK ){
		/* IN_TranACKOUT_TranACK */

		control_result = NO_RESULT;
		retry_cnt_0 = 0;

		rCPU_JoinRd = 0x00;
		fifo_remain = MKWORD(rEPnRdRemain_H, rEPnRdRemain_L);
		
		if( fifo_remain != 0){
			/* FIFOEmpty */

			/*  */
			rEP0ControlIN_BP.ForceSTALL = 1;
			rEP0ControlOUT_BP.ForceSTALL = 1;
			control_state = CTRL_IDLE;
		}else{
			/* FIFOEmpty */

			if( usb_flag.TestMode ){
				/* TestMode */
				
				usb_flag.TestMode = 0;			/* TestMode */

				TestModeProc();					/* TestMode */
			}
		}
		control_state = CTRL_IDLE;
	}else{
		if( control_result == EP0_IN_ERR || control_result == EP0_OUT_ERR ){
			/* IN_TranErrOUT_TranErr */

			control_result = NO_RESULT;

			if( control_result == EP0_IN_ERR ){
				if( rEP0ControlIN_BP.ForceSTALL == 1 ){
					panic(9);
				}
#ifdef DEBUG_PRINT
				EP0INErrorCount++;
#endif
			}else{
				if( rEP0ControlOUT_BP.ForceSTALL == 1 ){
					panic(10);
				}
#ifdef DEBUG_PRINT
				EP0OUTErrorCount++;
#endif
			}
		}else{
			if(usb_flag.USBReqRcvd){
				/* SETUP */
				control_state = CTRL_REQ_CHECK;
			}else{
				if( rEP0Control_BP.INxOUT ){
					/* IN */

					if( rEP0IntStat_BP.OUT_TranNAK ){
						/* OutTranNAK */
						retry_cnt_0 = 0;

						rEP0Control_BP.INxOUT = 0;

						if( req_tran_cnt != 0 && actual_tran_cnt == 0 ){
							/*  */

							/* Zero Length */
							rEP0ControlOUT_BP.ForceNAK = 0;
							control_state = CTRL_DATA_GET;

						}else{
							/*  */

							/* 
							 * 
							 */

							/*  */
							rEP0ControlIN_BP.ForceSTALL = 1;
							rEP0ControlOUT_BP.ForceSTALL = 1;
							control_state = CTRL_IDLE;
						}
					}
				}else{
					/* OUT */

					if( rEP0IntStat_BP.IN_TranNAK ){
						/* INTranNAK */
						retry_cnt_0 = 0;

						rEP0Control_BP.INxOUT = 1;

						if( actual_tran_cnt ){
							/*  */

							/*  */
							rEP0ControlIN_BP.ForceSTALL = 1;
							rEP0ControlOUT_BP.ForceSTALL = 1;
							control_state = CTRL_IDLE;
						}else{
							/*  */

							/* Zero Length */
							rEP0ControlIN_BP.ForceNAK = 0;
							rEP0ControlIN_BP.EnShortPkt = 1;
							control_state = CTRL_DATA_SEND;
						}
					}
				}
			}
		}
	}
}

/*****************************************************************************	
 *
 *			: 
 *			: 
 *			: 
 *		: 
 *
 *****************************************************************************/
void TestModeProc(void)
{
	BYTE temp;


	/*  */
	rMainIntEnb = 0x00;
	rSIE_IntEnb  = 0x00;
	rEPrIntEnb	= 0x00;
	rDMA_IntEnb = 0x00;
	rFIFO_IntEnb = 0x00;

	if( rUSB_Test_BP.Test_J || rUSB_Test_BP.Test_K ){
		/* Test_J  Test_k */
		
		rXcvrControl_BP.OpMode = 0x02;	/* Disable Bitstuffing and NRZI encoding) */
	}
	rUSB_Control_BP.EnAutoNego = 0;		/* AutoNego */
	rUSB_Control_BP.DisBusDetect = 1;	/*  */

	rUSB_Test_BP.EnUSB_Test = 1;		/* TestMode */
	/* VBUS  */
	do{
		if( VBUSCheck() == 0 ) break;
	}while( 1 );
	
	/* VBUS TestModeOFFAttach */

	rUSB_Test_BP.EnUSB_Test = 0;		/* TestMode */
	rXcvrControl_BP.OpMode = 0x01;		/* Non Drive */
	rXcvrControl_BP.RpuEnb = 0;
	rUSB_Control_BP.ActiveUSB = 0;		/* USB */

#ifdef DEBUG_PRINT
	for (;;){
		DebugProc();
	}
#else
	for (;;)
		;
#endif

}

⌨️ 快捷键说明

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