📄 transfer.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 + -