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

📄 transfer.c

📁 基于ARM的读U盘
💻 C
字号:
/****************************************************************************/
/*	includes																*/
/****************************************************************************/
#include "HostStack.h"

/****************************************************************************/
/*	constants																*/
/****************************************************************************/

/****************************************************************************/
/*	global vars																*/
/****************************************************************************/

/****************************************************************************/
/*	function prototypes														*/
/****************************************************************************/
void 	callback_control_transaction( transfer_instance *hTrInstance );
void 	callback_interrupt_transaction( transfer_instance *hTrInstance);
void 	callback_bulk_transaction( transfer_instance *hTrInstance);

/****************************************************************************/
/*	function definitions													*/
/****************************************************************************/
	
//******************************************************************************************
// 函数名称:control_transfer
// 输入参数:dev_req,设备请求数据结构指针
//		   dvi_ptr,设备描述结构指针
//		   data_ptr,	数据传输指针
// 输出参数:正常返回0,出错返回:
//		   error @ SETUP	  0x-0--
//		   error @ DataStage	  0x-1--
//		   error @ StatusStage  0x-2--
//		   error @ CC		  0x--CC	(CC=value 0x01-0x0D)
//		   retry over		  0x--FF
//		   data short		  0x8000 | (0x7FFF & DataLength)
// 功能描述:处理控制传输。
//*******************************************************************************************
unsigned short control_transfer(  USB_Device_Request	*dev_req, 
						device_instance *dvi_ptr, 
						unsigned char *data_ptr )
{
	endpoint_info	*epi_ptr;
	unsigned short	err;
	unsigned char	device_to_host_transfer;
	unsigned char	*ds_data_ptr;
	unsigned short	ds_size;
	unsigned short	total_ds_done_size;
	unsigned char	ss_data_ptr[ 1 ];	
	unsigned short	ss_size;
	unsigned short	transfer_size;
	epi_ptr			   = dvi_ptr->epi_ptr[ 0 ];			// 获取默认端点描述信息结构指针
	device_to_host_transfer  = dev_req->bmRequestType >> 7;	// 请求数据传输方向
	transfer_size		   = dev_req->wLength;			// 请求数据长度
	/*********  建立阶段 *********/
	ds_size = 8;									// SETUP包的有效数据总是8字节
	if ( 0 != (err = control_transaction( SETUP,  										
							(unsigned char *)dev_req, 
							&ds_size, epi_ptr )) )
		return ( err | 0x0000 );
	/*********  数据阶段  *********/
	if ( transfer_size )
	{	epi_ptr->toggle 	= 1;							// 数据位强制为1
		ds_data_ptr	   	= data_ptr;
		total_ds_done_size	= 0;
		do
		{	ds_size = transfer_size - total_ds_done_size;
			err	= control_transaction( (device_to_host_transfer ? IN : OUT), 				
								ds_data_ptr, &ds_size, epi_ptr );
			if ( err == 0x9 )							// 接收到短包
			{	err = 0x8000 | total_ds_done_size;			// 设置短包标志位并
				break;							// 退出循环进入状态阶段
			}
			if ( err )								// 其它错误
				return ( err | 0x0100 );
			total_ds_done_size += ds_size;
			ds_data_ptr		  += ds_size;
		}while ( total_ds_done_size < transfer_size );
	}
	/*********  状态阶段  *********/
	epi_ptr->toggle	= 1;								// 强制为1
	ss_size		= 0;								// 必须为0
	err	= control_transaction( (device_to_host_transfer ? OUT : IN), 
						 ss_data_ptr, &ss_size, epi_ptr );
	if ( err )
		return ( err | 0x0200 );
	return ( 0 );
}
                              
//**********************************************************************************
// 函数名称:control_transaction
// 输入参数:direction,传输方向(IN/OUT)
//				   data_ptr,数据缓冲区指针
//				   size_ptr,数据长度变量指针
//				   epi_ptr,端点描述结构指针
// 输出参数:正常返回0,
//				   出错返回非0,如:completion_code,完成代码
// 功能描述:控制传输处理函数
//***********************************************************************************
unsigned char control_transaction( unsigned char direction, 
								   unsigned char *data_ptr, 
								   unsigned short *size_ptr, 
								   endpoint_info_ptr epi_ptr )
{
	transfer_instance	*tr_instance_ptr;
	unsigned char	err;		
	unsigned char	message;
	if ( (NO_OPEN_ATL_TRANSFER == 
		(tr_instance_ptr = atl_open_transfer_instance( epi_ptr ))) )	// 创建传输描述符
		return (0xff);
														
	err = atl_set_transfer( 	tr_instance_ptr,						// 设置传输描述符(开始传输)
						data_ptr, 
						*size_ptr, direction, 
					 	callback_control_transaction );

	if( err == FALSE)
		return 0xff;
	message = *(unsigned char *)OSMboxPend(tr_instance_ptr->os_event_ptr, 	// 等特传输完成
										TRANSFER_TIMEOUT_LIMIT,&err);
	if(OS_EVENT_DELETE == message) 		
	{
		OSMboxDel( tr_instance_ptr->os_event_ptr, 		// 删除传输描述符使用的事件
				    OS_DEL_ALWAYS , &err  );
		tr_instance_ptr->os_event_ptr = NULL;
		return TR_OS_EVENT_ERR;
	}

	if(err != OS_NO_ERR)										// 传输出错
	{	*size_ptr	= 0;											
		tr_instance_ptr->data_ptr_start = NULL; 
		atl_close_transfer_instance(tr_instance_ptr );				// 撤销传输描述符		
		if(err == OS_TIMEOUT)									// 超时出错
			return TR_TIMEOUT;
		return TR_OS_EVENT_ERR;
	}
	*size_ptr	= tr_instance_ptr->transferred_size;					// 已传输的字节数
	atl_close_transfer_instance( tr_instance_ptr);					// 撤销传输描述符	
	
	return ( tr_instance_ptr->completion_code );
}

//**********************************************************************************
// 函数名称:callback_control_transaction
// 输入参数:hTrInstance,传输描述符数据结构指针
// 输出参数:无
// 功能描述:控制传输回调函数
//**********************************************************************************
void callback_control_transaction( transfer_instance *hTrInstance )
{	
	OSMboxPost(hTrInstance->os_event_ptr, &hTrInstance->completion_code);
}




//**********************************************************************************
// 函数名称:interrupt_transaction
// 输入参数:direction,传输方向
//				    data_ptr,传输数据缓冲区指针
//				    size_ptr,传输数据长度变量指针
//				    hTrInstance,传输描述符数据结构指针
// 输出参数:正常返回0,
//				   出错返回非0,如:completion_code,完成代码
// 功能描述:中断传输处理函数
//**********************************************************************************
unsigned char interrupt_transaction( 	unsigned char direction, 
									unsigned char *data_ptr, 
									unsigned short *size_ptr, 
									transfer_instance *hTrInstance )
{
	unsigned char err;
	unsigned char message;
	err = atl_set_transfer( hTrInstance, 			// 传输描述符批针
					 data_ptr, 						// 传输数字缓冲区指针
					 *size_ptr, 						// 传输的数据长茺
					 direction, 						// 传输方向IN、OUT
					 callback_interrupt_transaction );	// 回传函数
	if( err == FALSE)
		return 0xff;
	message = *(unsigned char*)OSMboxPend( hTrInstance->os_event_ptr, 
									   TRANSFER_TIMEOUT_LIMIT,&err); // 等特传输完成
	if(OS_EVENT_DELETE== message )
	{
		OSMboxDel( hTrInstance->os_event_ptr, 		// 删除传输描述符使用的事件
				    OS_DEL_ALWAYS , &err  );
		hTrInstance->os_event_ptr = NULL;
		return TR_OS_EVENT_ERR;
	}
	if(err != OS_NO_ERR)
	{
		hTrInstance->data_ptr_start = NULL; 			// 禁止传输
		if(err == OS_TIMEOUT)
			return TR_TIMEOUT;						// 超时出错
		return TR_OS_EVENT_ERR;
	}
	*size_ptr=hTrInstance->transferred_size ;			// 已传输字节数
	return hTrInstance->completion_code;
}

//**********************************************************************************
// 函数名称:callback_interrupt_transaction
// 输入参数:hTrInstance,传输描述符数据结构指针
// 输出参数:无
// 功能描述:中断传输回调函数
//**********************************************************************************
void callback_interrupt_transaction( transfer_instance *hTrInstance )
{
	OSMboxPost(hTrInstance->os_event_ptr, &hTrInstance->completion_code);
}


//**********************************************************************************
// 函数名称:bulk_transaction
// 输入参数:direction,传输方向
//				    data_ptr,传输数据缓冲区指针
//				    size_ptr,传输数据长度变量指针
//				    hTrInstance,传输描述符数据结构指针
// 输出参数:正常返回0,
//				   出错返回非0,如:completion_code,完成代码
// 功能描述:批量传输处理函数
//**********************************************************************************
unsigned char bulk_transaction(  unsigned char direction, 
								unsigned char *data_ptr, 
								unsigned short *size_ptr, 
								transfer_instance *hTrInstance )
{
	unsigned char err;
	unsigned char message;
	err = atl_set_transfer( hTrInstance, 			// 传输描述符批针
					 data_ptr, 						// 传输数字缓冲区指针
					 *size_ptr, 						// 传输的数据长茺
					 direction, 						// 传输方向IN、OUT
					 callback_interrupt_transaction );	// 回传函数
	if( err == FALSE)
		return 0xff;
	
	message = *(unsigned char *)OSMboxPend( hTrInstance->os_event_ptr,	 // 等特传输完成
									TRANSFER_TIMEOUT_LIMIT,&err);
	
	if(OS_EVENT_DELETE == message) 		
	{
		OSMboxDel( hTrInstance->os_event_ptr, 		// 删除传输描述符使用的事件
				    OS_DEL_ALWAYS , &err  );
		hTrInstance->os_event_ptr = NULL;
		return TR_OS_EVENT_ERR;
	}
	
	if(err != OS_NO_ERR)
	{
		hTrInstance->data_ptr_start = NULL; 			// 禁止传输
		if(err == OS_TIMEOUT)
			return TR_TIMEOUT;					// 超时出错
		return TR_OS_EVENT_ERR;
	}
	*size_ptr=hTrInstance->transferred_size ;			// 已传输字节数
	return hTrInstance->completion_code;
}


//**********************************************************************************
// 函数名称:callback_bulk_transaction
// 输入参数:hTrInstance,传输描述符数据结构指针
// 输出参数:无
// 功能描述:批量传输回调函数
//**********************************************************************************
void callback_bulk_transaction( transfer_instance *hTrInstance )
{
	OSMboxPost(hTrInstance->os_event_ptr, &hTrInstance->completion_code);
}


⌨️ 快捷键说明

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