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

📄 transfer.c

📁 ARM读写U盘驱动软件包源程序
💻 C
字号:
/****************************************Copyright (c)**************************************************
**                               Guangzou ZLG-MCU Development Co.,LTD.
**                                     graduate school
**                                 http://www.zlgmcu.com
**
**--------------File Info-------------------------------------------------------------------------------
** File Name: TRANSFER.c
** Last modified Date: 2005-04-22
** Last Version: V1.0 
** Description: 
**
**------------------------------------------------------------------------------------------------------
** Created By: Lishan Zhou
** Created date: 2005-04-22
** Version: V1.0 
** Description:
**
**------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
** Version:
** Description:
**
********************************************************************************************************/

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

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;									
	if ( 0 != (err = control_transaction( SETUP,  										
							(unsigned char *)dev_req, 
							&ds_size, epi_ptr )) )
		return ( err | 0x0000 );

	if ( transfer_size )
	{	epi_ptr->toggle 	= 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 );
}
                              

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;					
	err = tr_instance_ptr->completion_code;//updata 2005-6-17
	atl_close_transfer_instance( tr_instance_ptr);						
	
	return err; //updata 2005-6-17
}


void callback_control_transaction( transfer_instance *hTrInstance )
{	
	OSMboxPost(hTrInstance->os_event_ptr, &hTrInstance->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, 						
					 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;
}


void callback_interrupt_transaction( transfer_instance *hTrInstance )
{
	OSMboxPost(hTrInstance->os_event_ptr, &hTrInstance->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, 						
					 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;
}



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 + -