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

📄 u_request.c

📁 EPSON USB DEVICE MASS-STORAGE CLASS driver, BULK ONLY on Ram disk
💻 C
📖 第 1 页 / 共 2 页
字号:
		/* 128 */
		return REQUEST_ERROR;
	}

	usb_flag.Address = 1;

	return REQUEST_OK;
}

/*****************************************************************************
 * GetDescriptor
 *****************************************************************************/
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
 *****************************************************************************/
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;
}

/*****************************************************************************
 * SetConfiguration
 *****************************************************************************/
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;
}

/*****************************************************************************
 * GetInterface
 *****************************************************************************/
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;
}

/*****************************************************************************
 * SetInterface
 *****************************************************************************/
int SetInterface(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){	/* 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;
}
/*****************************************************************************
 * RequestError
 *****************************************************************************/
int RequestError(void)
{
	return REQUEST_ERROR;
}

/*****************************************************************************
 *	SetAlternateInterface
 *****************************************************************************/
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;

	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)
	{
		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;
	}
	
	if(usb_state == CONFIGURED_STATE)
	{
		rEPaConfig_0_BP.EnEndPoint = 1;
		rEPbConfig_0_BP.EnEndPoint = 1;
		rEPcConfig_0_BP.EnEndPoint = 0;
	}
	rEPnControl_BP.AllFIFO_Clr = 1;
}

/*****************************************************************************
 *	BulkOnlyMassStorageReset
 *****************************************************************************/
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;
	}

	InitDeviceWorkArea();

	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
 *****************************************************************************/
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;
}

/*****************************************************************************
 * AcceptDeviceSpecificCmd
 *****************************************************************************/
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;
}

/*****************************************************************************
 * TestEP0Out
 *****************************************************************************/
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
 *****************************************************************************/
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 + -