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