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

📄 u_request.c

📁 The combined demo is dedicated for S1C33L05, so DMT33L05 should be used to load and run the demo. F
💻 C
📖 第 1 页 / 共 3 页
字号:

#ifndef TEST_MODE_ON
						break;
#endif /* TEST_MODE_ON */

						if(rEP0SETUP_4){	/* wIndex.l */
							break;
						}
						if(rEP0SETUP_7 || rEP0SETUP_6){	/* wLength */
							break;
						}
						switch(rEP0SETUP_5){
							case TEST_J_MODE:
								rUSB_Test_BP.Test_J = 1;
								usb_flag.TestMode = 1;		/* TestMode */
								ret = REQUEST_OK;
								break;
							case TEST_K_MODE:
								rUSB_Test_BP.Test_K = 1;
								usb_flag.TestMode = 1;		/* TestMode */
								ret = REQUEST_OK;
								break;
							case TEST_SE0_NAK_MODE:
								rUSB_Test_BP.Test_SE0_NAK = 1;
								usb_flag.TestMode = 1;		/* TestMode */
								ret = REQUEST_OK;
								break;
							case TEST_PACKET_MODE:

								/* TestPacket  */
								rEPcMaxSize_H = 0x00;		/* MaxPacketSize = 64Byte */
								rEPcMaxSize_L = 0x40;		
								rEPcConfig_0_BP.INxOUT = 1;
								rEPaConfig_0_BP.EnEndPoint = 0;
								rEPbConfig_0_BP.EnEndPoint = 0;
								rEPcConfig_0_BP.EnEndPoint = 1;
								rEPcConfig_0_BP.EndPointNumber = 0x0F;

								rEPcStartAdrs_H = 0x03;		/*  - 64 */
								rEPcStartAdrs_L = 0xC0;
								rEPdStartAdrs_H = 0x04;		/*  */
								rEPdStartAdrs_L = 0x00;
								rEPeStartAdrs_H = 0x04;		/*  */
								rEPeStartAdrs_L = 0x00;
								rEPfStartAdrs_H = 0x04;		/*  */
								rEPfStartAdrs_L = 0x00;
								rEPgStartAdrs_H = 0x04;		/*  */
								rEPgStartAdrs_L = 0x00;
								rEPhStartAdrs_H = 0x04;		/*  */
								rEPhStartAdrs_L = 0x00;
							
								rEPcIntEnb_BP.EnIN_TranErr = 0;
								rEPnControl_BP.AllFIFO_Clr = 1;

								rCPU_JoinWr_BP.JoinEPcWr = 1;
								rEnEPnFIFO_Access_BP.EnEPnFIFO_Wr = 1;
								for(i=0; i<53; i++){
									rEPnFIFOforCPU = test_packet[i];
								}
								rEnEPnFIFO_Access_BP.EnEPnFIFO_Wr = 0;
								rCPU_JoinWr_BP.JoinEPcWr = 0;

								rUSB_Test_BP.Test_Packet = 1;
								usb_flag.TestMode = 1;		/* TestMode */
								ret = REQUEST_OK;
								break;
							default:
								break;
						}
					}else{
						ret = REQUEST_ERROR;
					}
				}
				break;
			case RECIPIENT_ENDPOINT:
				if(usb_state == DEFAULT_STATE){
					break;
				}
				if(rEP0SETUP_3){	/* wValue.h */
					break;
				}
				if(rEP0SETUP_2 != ENDPOINT_HALT){
					break;
				}
				if(rEP0SETUP_5){	/* wIndex.h */
					break;
				}
				if(rEP0SETUP_7 || rEP0SETUP_6){	/* wLength */
					break;
				}
				if(rEP0SETUP_4 != 0){
					/* EndPoint 0 */

					if(usb_state == ADDRESS_STATE){
						break;
					}
					for( i=0; i<NUM_ENDPOINT; i++ ){
						if( rEP0SETUP_4 == ep_number[i] ){
							if( i == 0 ){
								/* EndPoint a */
								if(rEPaControl_BP.ForceSTALL == 0){
									rEPaControl_BP.ForceSTALL = 1;
									bulk_in_state = BULK_IN_STALL;
								}
							}else{
								if( i == 1 ){
									/* EndPoint b */
									if(rEPbControl_BP.ForceSTALL == 0){
										rEPbControl_BP.ForceSTALL = 1;
										bulk_out_state = BULK_OUT_STALL;
									}
								}else{
									if( i == 2 ){
										/* EndPoint c */
										if(rEPcControl_BP.ForceSTALL == 0){
											rEPcControl_BP.ForceSTALL = 1;
											int_in_state = INT_IN_STALL;
										}
									}
								}
							}
							ret = REQUEST_OK;
						}
					}
				}
				break;
			default:
				ret = REQUEST_ERROR;
		}
	}
	return ret;
}

/*****************************************************************************
 *
 *			: Set Address
 *			: 
 *			: 
 *				: 
 *		: usb_state				
 *				  assigned_addr			
 *				  usb_flag				USB
 *
 *****************************************************************************/
int SetAddress(void)
{
	int ret;
	
	if(usb_state == CONFIGURED_STATE){
		return REQUEST_ERROR;
	}

	if((rEP0SETUP_0 & 0x80) != 0x00){	/*  */
		return REQUEST_ERROR;
	}

	if((rEP0SETUP_0 & 0x1F) != RECIPIENT_DEVICE){
		return REQUEST_ERROR;
	}

	if(rEP0SETUP_3){	/* wValue.h */
		return REQUEST_ERROR;
	}
	if(rEP0SETUP_5 || rEP0SETUP_4){	/* wIndex */
		return REQUEST_ERROR;
	}
	if(rEP0SETUP_7 || rEP0SETUP_6){	/* wLength */
		return REQUEST_ERROR;
	}
	if(rEP0SETUP_2 > 0x7F){
		/* 128 */
		return REQUEST_ERROR;
	}

	usb_flag.Address = 1;

	return REQUEST_OK;
}

/*****************************************************************************
 *
 *			: Get Descriptor
 *			: 
 *			: 
 *				: 
 *		: req_tran_cnt			
 *				  tran_start_addr		
 *				  total_tran_cnt		1
 *				  actual_tran_cnt		
 *				  device_desc[]			Device
 *				  fs_config_desc[]		FSConfiguration
 *				  hs_config_desc[]		HSConfiguration
 *				  string1_desc[]		String
 *										
 *				  qualifier_desc[]		Device Qualifier
 *
 *****************************************************************************/
int GetDescriptor(void)
{
	int i,j,cnt,len;
	BYTE *p;
	InterfaceDesc *p_i_desc;	/* Interface Descriptor  */
	ConfigDesc	  *p_c_desc;	/* Config Descriptor  */
	
	if((rEP0SETUP_0 & 0x80) != 0x80){	/*  */
		return REQUEST_ERROR;
	}

	if((rEP0SETUP_0 & 0x1F) != RECIPIENT_DEVICE){
		return REQUEST_ERROR;
	}

	switch(rEP0SETUP_3){
		case DEVICE:
			if(rEP0SETUP_2){	/* wValue.l */
				return REQUEST_ERROR;
			}
			if(rEP0SETUP_5 || rEP0SETUP_4){	/* wIndex */
				return REQUEST_ERROR;
			}
			if(req_tran_cnt != 0){

				/* FS */
				tran_start_addr = (BYTE *)((DWORD)desc_addr_fs_device);
				total_tran_cnt	= fs_device_desc.bLength;

				if(req_tran_cnt < total_tran_cnt){
					/*  <  */
					total_tran_cnt = req_tran_cnt;
				}
				actual_tran_cnt = total_tran_cnt;
				usb_flag.ReplyDescriptor = 1;			/* Descriptor */
			}
			break;
		case CONFIGURATION:
			if(rEP0SETUP_2){	/* wValue.l */
				return REQUEST_ERROR;
			}
			if(rEP0SETUP_5 || rEP0SETUP_4){	/* wIndex */
				return REQUEST_ERROR;
			}
			if(req_tran_cnt != 0){
				/* FS */
				tran_start_addr = (BYTE *)((DWORD)desc_addr_fs_config);
				total_tran_cnt	= WD(&(fs_config_desc.wTotalLength));
				if(req_tran_cnt < total_tran_cnt){
					/*  <  */
					total_tran_cnt = req_tran_cnt;
				}
				actual_tran_cnt = total_tran_cnt;
				usb_flag.ReplyDescriptor = 1;			/* Descriptor */
			}
			break;
		case STRING:
			if(rEP0SETUP_2 > NUM_STRING){	/* wValue.l */
				return REQUEST_ERROR;
			}
			if(req_tran_cnt != 0){
				tran_start_addr = (BYTE *)((DWORD)desc_addr_string[rEP0SETUP_2]);
				total_tran_cnt = *((BYTE *)string_table[rEP0SETUP_2]);

				if(req_tran_cnt < total_tran_cnt){
					/*  <  */
					total_tran_cnt = req_tran_cnt;
				}
				actual_tran_cnt = total_tran_cnt;
				usb_flag.ReplyDescriptor = 1;			/* Descriptor */
			}
			break;
		case INTERFACE_POWER:
		default:
			return REQUEST_ERROR;
	}

	return REQUEST_OK;
}

/*****************************************************************************
 *
 *			: Get Configuration
 *			: 
 *			: 
 *				: 
 *		: usb_state				
 *				  usb_wk_data[]			USB
 *				  total_tran_cnt		
 *				  actual_tran_cnt		
 *				  tran_start_addr		
 *
 *****************************************************************************/
int GetConfiguration(void)
{
	if((rEP0SETUP_0 & 0x80) != 0x80){	/*  */
		return REQUEST_ERROR;
	}

	if((rEP0SETUP_0 & 0x1F) != RECIPIENT_DEVICE){
		return REQUEST_ERROR;
	}

	if(usb_state == DEFAULT_STATE){
		return REQUEST_ERROR;
	}
	if(rEP0SETUP_3 || rEP0SETUP_2){	/* wValue */
		return REQUEST_ERROR;
	}
	if(rEP0SETUP_5 || rEP0SETUP_4){	/* wIndex */
		return REQUEST_ERROR;
	}
	if(rEP0SETUP_7 || rEP0SETUP_6 != 0x01){	/* wLength */
		return REQUEST_ERROR;
	}
	if(usb_state == CONFIGURED_STATE){
		usb_wk_data[0] = 0x01;
	}else{
		usb_wk_data[0] = 0x00;
	}
	total_tran_cnt = actual_tran_cnt = 0x01;
	tran_start_addr = &usb_wk_data[0];

	return REQUEST_OK;
}

/*****************************************************************************
 *
 *			: Set Configuration
 *			: 
 *			: 
 *				: 
 *		: usb_state				
 *				  current_alt_set		AlternateSetting
 *
 *****************************************************************************/
int SetConfiguration(void)
{

	if((rEP0SETUP_0 & 0x80) != 0x00){	/*  */
		return REQUEST_ERROR;
	}

	if((rEP0SETUP_0 & 0x1F) != RECIPIENT_DEVICE){
		return REQUEST_ERROR;
	}

	if(usb_state == DEFAULT_STATE){
		return REQUEST_ERROR;
	}
	if(rEP0SETUP_3){	/* wValue.h */
		return REQUEST_ERROR;
	}
	if(rEP0SETUP_5 || rEP0SETUP_4){	/* wIndex */
		return REQUEST_ERROR;
	}
	if(rEP0SETUP_7 || rEP0SETUP_6){	/* wLength */
		return REQUEST_ERROR;
	}
	if(rEP0SETUP_2 > 0x01){
		return REQUEST_ERROR;
	}
	if(rEP0SETUP_2){
		/* Configured State */
		usb_state = CONFIGURED_STATE;
		current_alt_set = 0;
		SetAlternateInterface(current_alt_set);
	}else{
		/* Address State */
		usb_state = ADDRESS_STATE;
		/*  */
		rEPaConfig_0_BP.EnEndPoint = 0;
		rEPbConfig_0_BP.EnEndPoint = 0;
		rEPcConfig_0_BP.EnEndPoint = 0;
	}

	return REQUEST_OK;
}

/*****************************************************************************
 *
 *			: Get Interface
 *			: 
 *			: 
 *				: 
 *		: usb_state				
 *				  current_alt_set		AlternateSetting
 *				  usb_wk_data[]			USB
 *				  total_tran_cnt		
 *				  actual_tran_cnt		
 *				  tran_start_addr		
 *
 *****************************************************************************/
int GetInterface(void)
{
	if((rEP0SETUP_0 & 0x80) != 0x80){	/*  */
		return REQUEST_ERROR;
	}

	if((rEP0SETUP_0 & 0x1F) != RECIPIENT_INTERFACE){
		return REQUEST_ERROR;
	}

	if(usb_state != CONFIGURED_STATE){
		return REQUEST_ERROR;
	}
	if(rEP0SETUP_3 || rEP0SETUP_2){	/* wValue */
		return REQUEST_ERROR;
	}
	if(rEP0SETUP_5){	/* wIndex.h */
		return REQUEST_ERROR;
	}
	if(rEP0SETUP_7 || rEP0SETUP_6 != 0x01){	/* wLength */
		return REQUEST_ERROR;
	}

	if(rEP0SETUP_4){	/* Interface */
		return REQUEST_ERROR;
	}
	usb_wk_data[0] = current_alt_set;
	total_tran_cnt = actual_tran_cnt = 0x01;
	tran_start_addr = &usb_wk_data[0];

	return REQUEST_OK;
}

/*****************************************************************************
 *
 *			: Set Interface
 *			: 
 *			: 
 *				: 
 *		: usb_state				
 *				  current_alt_set		AlternateSetting
 *
 *****************************************************************************/
int SetInterface(void)
{
	if((rEP0SETUP_0 & 0x80) != 0x00){	/*  */
		return REQUEST_ERROR;
	}

	if((rEP0SETUP_0 & 0x1F) != RECIPIENT_INTERFACE){
		return REQUEST_ERROR;
	}

⌨️ 快捷键说明

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