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

📄 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 页
字号:
	if(usb_state != CONFIGURED_STATE){
		return REQUEST_ERROR;
	}
	if(rEP0SETUP_3){	/* wValue.h */
		return REQUEST_ERROR;
	}
	if(rEP0SETUP_5){	/* wIndex.h */
		return REQUEST_ERROR;
	}
	if(rEP0SETUP_7 || rEP0SETUP_6){	/* wLength */
		return REQUEST_ERROR;
	}

	if(rEP0SETUP_4){	/* Interface */
		return REQUEST_ERROR;
	}
	/* FS */
	if(rEP0SETUP_2 > NUM_FS_ALT_SET){	/* ? */
		return REQUEST_ERROR;
	}
	current_alt_set = rEP0SETUP_2;
	SetAlternateInterface(rEP0SETUP_2);

	return REQUEST_OK;
}
/*****************************************************************************
 *
 *			: 
 *				  
 *			: 
 *			: REQUEST_OK	
 *				: REQUEST_ERROR	
 *		: 
 *
 *****************************************************************************/
int RequestError(void)
{
	int ret = REQUEST_ERROR;
	
	return ret;
}
/*****************************************************************************
 *
 *			: 
 *				  AlternateSettingInterface
 *			: alternate_valid	AlternateSetting
 *			: 
 *		: fs_interface_table[]	FSInterface
 *										
 *				  hs_interface_table[]	HSInterface
 *										
 *				  max_pkt_size_a		EPaMaxPacketSize
 *				  max_pkt_size_b		EPbMaxPacketSize
 *				  max_pkt_size_c		EPcMaxPacketSize
 *				  bulk_in_state			Bulk IN
 *				  bulk_out_state		Bulk OUT
 *				  int_in_state			Interrupt IN
 *				  tran_protocol			
 *				  usb_state				
 *
 *****************************************************************************/
void SetAlternateInterface(BYTE alternate_valid)
{
	InterfaceDesc *p_i_desc;
	
	/* FS */
	p_i_desc = &fs_interface_desc[alternate_valid];

	max_pkt_size_a = WD(&p_i_desc->p_e_desc[0].wMaxPacketSize);
	max_pkt_size_b = WD(&p_i_desc->p_e_desc[1].wMaxPacketSize);

	/* EPa,EPb */
	ep_number[0] = p_i_desc->p_e_desc[0].bEndpointAddress;	/* bEndPointAddress */
	rEPaConfig_0 = ep_number[0];
	rEPaMaxSize_H = WORD2BYTE_H(max_pkt_size_a);
	rEPaMaxSize_L = WORD2BYTE_L(max_pkt_size_a);

	ep_number[1] = p_i_desc->p_e_desc[1].bEndpointAddress;	/* bEndPointAddress */
	rEPbConfig_0 = ep_number[1];
	rEPbMaxSize_H = WORD2BYTE_H(max_pkt_size_b);
	rEPbMaxSize_L = WORD2BYTE_L(max_pkt_size_b);

	rEPaControl_BP.ForceNAK = 0;
	rEPaControl_BP.ForceSTALL = 0;
	rEPaControl_BP.EnShortPkt = 0;
	rEPaControl_BP.AutoForceNAK = 0;
	rEPaControl_BP.DisAF_NAK_Short = 0;
	rEPaControl_BP.ToggleClr = 1;

	rEPbControl_BP.ForceNAK = 1;
	rEPbControl_BP.ForceSTALL = 0;
	rEPbControl_BP.EnShortPkt = 0;
	rEPbControl_BP.AutoForceNAK = 0;
	rEPbControl_BP.DisAF_NAK_Short = 0;
	rEPbControl_BP.ToggleClr = 1;

	/* EPa,EPb& */

	rEPaIntStat = 0xFF;	/*  */

	/*  */
	rEPaIntEnb_BP.EnOUT_ShortACK = 0;
	rEPaIntEnb_BP.EnIN_TranACK = 0;
	rEPaIntEnb_BP.EnOUT_TranACK = 0;
	rEPaIntEnb_BP.EnIN_TranNAK = 0;
	rEPaIntEnb_BP.EnOUT_TranNAK = 0;
	rEPaIntEnb_BP.EnIN_TranErr = 1;
	rEPaIntEnb_BP.EnOUT_TranErr = 0;

	rEPbIntEnb_BP.EnOUT_ShortACK = 0;
	rEPbIntEnb_BP.EnIN_TranACK = 0;
	rEPbIntEnb_BP.EnOUT_TranACK = 0;
	rEPbIntEnb_BP.EnIN_TranNAK = 0;
	rEPbIntEnb_BP.EnOUT_TranNAK = 0;
	rEPbIntEnb_BP.EnIN_TranErr = 0;
	rEPbIntEnb_BP.EnOUT_TranErr = 1;

	bulk_in_state  = BULK_IN_IDLE;
	bulk_out_state = BULK_OUT_IDLE;
	int_in_state   = INT_IN_IDLE;

	if(p_i_desc->bInterfaceProtocol == 0x50){
		/* BulkOnly */
		tran_protocol = BULKONLY;
		max_pkt_size_c = 0;
		ep_number[2] = 0x00;

		rEPcIntEnb_BP.EnOUT_ShortACK = 0;
		rEPcIntEnb_BP.EnIN_TranACK = 0;
		rEPcIntEnb_BP.EnOUT_TranACK = 0;
		rEPcIntEnb_BP.EnIN_TranNAK = 0;
		rEPcIntEnb_BP.EnOUT_TranNAK = 0;
		rEPcIntEnb_BP.EnIN_TranErr = 0;
		rEPcIntEnb_BP.EnOUT_TranErr = 0;
	}else{
		/* CBI */
		tran_protocol = CBI;

		max_pkt_size_c = WD(&p_i_desc->p_e_desc[2].wMaxPacketSize);

		ep_number[2] = p_i_desc->p_e_desc[2].bEndpointAddress;				/* bEndPointAddress */
		rEPcConfig_0 = ep_number[2];
		rEPcMaxSize_H = WORD2BYTE_H(max_pkt_size_c);
		rEPcMaxSize_L = WORD2BYTE_L(max_pkt_size_c);

		rEPcControl_BP.ForceNAK = 1;
		rEPcControl_BP.ForceSTALL = 0;
		rEPcControl_BP.EnShortPkt = 0;
		rEPcControl_BP.AutoForceNAK = 0;
		rEPcControl_BP.DisAF_NAK_Short = 0;
		rEPcControl_BP.ToggleClr = 1;

		rEPcIntStat = 0xFF;	/*  */

		/*  */
		rEPcIntEnb_BP.EnOUT_ShortACK = 0;
		rEPcIntEnb_BP.EnIN_TranACK = 1;
		rEPcIntEnb_BP.EnOUT_TranACK = 0;
		rEPcIntEnb_BP.EnIN_TranNAK = 0;
		rEPcIntEnb_BP.EnOUT_TranNAK = 0;
		rEPcIntEnb_BP.EnIN_TranErr = 1;
		rEPcIntEnb_BP.EnOUT_TranErr = 0;

	}

	if(usb_state == CONFIGURED_STATE){

		rEPaConfig_0_BP.EnEndPoint = 1;
		rEPbConfig_0_BP.EnEndPoint = 1;

		if(tran_protocol == BULKONLY){
			rEPcConfig_0_BP.EnEndPoint = 0;
		}else{
			rEPcConfig_0_BP.EnEndPoint = 1;
		}

	}
	rEPnControl_BP.AllFIFO_Clr = 1;
}

/*****************************************************************************
 *
 *			: Bulk-Only Mass Storage Reset
 *			: 
 *			: 
 *				: 
 *		: usb_state				
 *				  protocol_phase		
 *				  initial_state			
 *
 *****************************************************************************/
int BulkOnlyMassStorageReset(void)
{
	if((rEP0SETUP_0 & 0x80) != 0x00){	/*  */
		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){	/* wLength */
		return REQUEST_ERROR;
	}

	if(rEP0SETUP_4){	/* Interface */
		return REQUEST_ERROR;
	}

	if(tran_protocol != BULKONLY){
		return REQUEST_ERROR;
	}

	InitDeviceWorkArea();

	ControlLED(PORT_TURN_OFF);					/* PortLED */

	if( rDMA_Control_BP.DMA_Running ){
		/* DMA */

		MasterDMAStop();							/* DMA*/

		di();
		
		rDMA_Control_BP.DMA_Stop = 1;
		while(rDMA_Control_BP.DMA_Running);

		rEPrFIFO_Clr_BP.EPaFIFO_Clr = 1;
		rEPrFIFO_Clr_BP.EPbFIFO_Clr = 1;

		rDMA_IntStat = 0x01;					/* DMA_Cmp,FIFO_IN_Cmp,FIFO_OUT_Cmp
		rFIFO_IntStat = 0x03;					 *  
												 */
		ei();
	}else{
		rEPrFIFO_Clr_BP.EPaFIFO_Clr = 1;
		rEPrFIFO_Clr_BP.EPbFIFO_Clr = 1;
	}
	rEPbControl_BP.ForceNAK = 1;

	bulk_in_state  = BULK_IN_IDLE;
	bulk_out_state = BULK_OUT_IDLE;
	protocol_phase = COMMAND_PHASE;
	return REQUEST_OK;
}
/*****************************************************************************
 *
 *			: Get Max LUN
 *			: 
 *			: 
 *				: 
 *		: usb_state		
 *				  usb_wk_data[]			USB
 *				  total_tran_cnt		
 *				  actual_tran_cnt		
 *				  tran_start_addr		
 *
 *****************************************************************************/
int GetMaxLUN(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;
	}

	if(tran_protocol != BULKONLY) {
		return REQUEST_ERROR;
	}

	usb_wk_data[0] = 0x00;
	total_tran_cnt = actual_tran_cnt = 0x01;
	tran_start_addr = &usb_wk_data[0];
	return REQUEST_OK;
}

/*****************************************************************************
 *
 *			: Accept Device-Specific Command
 *			: 
 *			: 
 *				: 
 *		: usb_state				
 *				  usb_wk_data[]			USB
 *				  total_tran_cnt		
 *				  actual_tran_cnt		
 *				  tran_start_addr		
 *
 *****************************************************************************/
int AcceptDeviceSpecificCmd(void)
{
	if((rEP0SETUP_0 & 0x80) != 0x00){	/*  */
		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 != 0x0C){	/* wLength */
		return REQUEST_ERROR;
	}

	if(rEP0SETUP_4){	/* Interface */
		return REQUEST_ERROR;
	}

	if(tran_protocol != CBI){
		return REQUEST_ERROR;
	}
	
	/*  */
	rEPcControl_BP.EnShortPkt = 0;
	rEPrFIFO_Clr_BP.EPcFIFO_Clr = 1;

	total_tran_cnt = actual_tran_cnt = 0x0C;
	tran_start_addr = &usb_wk_data[0];
	return REQUEST_OK;
}

/*****************************************************************************
 *
 *			: Test EP0 Out
 *			: 
 *			: 
 *				: 
 *		: usb_state				
 *				  usb_wk_data[]			USB
 *				  total_tran_cnt		
 *				  actual_tran_cnt		
 *				  tran_start_addr		
 *
 *****************************************************************************/
int TestEP0Out(void)
{
	if((rEP0SETUP_0 & 0x80) != 0x00){	/*  */
		return REQUEST_ERROR;
	}

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

	if(usb_state != CONFIGURED_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 > 0x01 || (rEP0SETUP_7 == 0x01 && rEP0SETUP_6 != 0x00)){	/* wLength > 0x0100 */
		return REQUEST_ERROR;
	}

	total_tran_cnt = MKWORD(rEP0SETUP_7,rEP0SETUP_6);
	actual_tran_cnt = total_tran_cnt;
	tran_start_addr = &usb_wk_data[0];
	return REQUEST_OK;
}

/*****************************************************************************
 *
 *			: Test EP0 In
 *			: 
 *			: 
 *				: 
 *		: usb_state				
 *				  usb_wk_data[]			USB
 *				  total_tran_cnt		
 *				  actual_tran_cnt		
 *				  tran_start_addr		
 *
 *****************************************************************************/
int TestEP0In(void)
{
	if((rEP0SETUP_0 & 0x80) != 0x80){	/*  */
		return REQUEST_ERROR;
	}

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

	if(usb_state != CONFIGURED_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 > 0x01 || (rEP0SETUP_7 == 0x01 && rEP0SETUP_6 != 0x00)){	/* wLength > 0x0100 */
		return REQUEST_ERROR;
	}

	total_tran_cnt = MKWORD(rEP0SETUP_7,rEP0SETUP_6);
	actual_tran_cnt = total_tran_cnt;
	tran_start_addr = &usb_wk_data[0];
	return REQUEST_OK;
}

⌨️ 快捷键说明

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