📄 atl_mix.c
字号:
}
set_LAST_PTD_flag( last_ptd_start );
*atl_buffer_access_length = ptd_start - bp;
}
/* private functions */
//******************************************************************************************
//函数名称:atl_buffer_state
//输入参数:pattern,
//输出参数:无
//功能描述:获取ATL缓冲区状态
//******************************************************************************************
unsigned char atl_buffer_state( unsigned short pattern )
{
return ( read_register16( Com16_HcBufferStatus ) & pattern );
}
//******************************************************************************************
//函数名称:PTD_image_create
//输入参数:php,
// data,
// atl_buffer,
//输出参数:无
//功能描述:
//******************************************************************************************
void PTD_image_create( PTD_header_param *php, unsigned char *data, unsigned char *atl_buffer )
{
int i;
set_PTD_header( atl_buffer, php ); // 将PTD数据结构压缩成8字节结构
atl_buffer += 8; // 8字节PTD的数据长度
for ( i = 0; i < php->TotalBytes; i++ ) // 写数据到缓冲区
*atl_buffer++ = *data++;
}
//******************************************************************************************
//函数名称:set_PTD_header
//输入参数:ph,
// php,
//输出参数:无
//功能描述:
//******************************************************************************************
void set_PTD_header( unsigned char *ph, PTD_header_param *php )
{
*(ph + 0) = php->ActualBytes & 0x0FF;
*(ph + 1) = (php->CompletionCode << 4)
| (php->Active << 3)
| (php->Toggle << 2)
| (php->ActualBytes >> 8);
*(ph + 2) = php->MaxPacketSize & 0xFF;
*(ph + 3) = (php->EndpointNumber << 4)
| (php->Last << 3)
| (php->Speed << 2)
| (php->MaxPacketSize >> 8);
*(ph + 4) = php->TotalBytes & 0xFF;
*(ph + 5) = (php->DirectionPID << 2)
| (php->TotalBytes >> 8);
*(ph + 6) = (php->Format << 7)
| (php->FunctionAddress & 0x7F);
*(ph + 5) |= (php->test << 4);
}
//******************************************************************************************
//函数名称:set_LAST_PTD_flag
//输入参数:p,
//输出参数:无
//功能描述:
//******************************************************************************************
void set_LAST_PTD_flag( unsigned char *p )
{
*(p + 3) = *(p + 3) | (0x01 << 3);
}
//******************************************************************************************
//函数名称:get_PTD_header
//输入参数:php,PTD_header_param数据结构类型指针
// ph,PTD数所结构指针
//输出参数:无
//功能描述:将PTD数据结构转换为PTD_header_param数据结构
//******************************************************************************************
void get_PTD_header( PTD_header_param *php, unsigned char *ph )
{
php->ActualBytes = *(ph + 0) | ((*(ph + 1) & 0x3) << 8);
php->CompletionCode = *(ph + 1) >> 4;
php->Active = (*(ph + 1) >> 3) & 0x01;
php->Toggle = (*(ph + 1) >> 2) & 0x01;
php->MaxPacketSize = *(ph + 2) | ((*(ph + 3) & 0x3) << 8);
php->EndpointNumber = *(ph + 3) >> 4;
php->Last = (*(ph + 3) >> 3) & 0x01;
php->Speed = (*(ph + 3) >> 2) & 0x01;
php->TotalBytes = *(ph + 4) | ((*(ph + 5) & 0x3) << 8);
php->DirectionPID = (*(ph + 5) >> 2) & 0x03;
php->Format = *(ph + 6) >> 7;
php->FunctionAddress = *(ph + 6) & 0x7F;
}
//******************************************************************************************
//函数名称:is_fatal_error
//输入参数:tr_inst_ptr,
//输出参数:True,发生严重的错误,
// False,无严重错误。
//功能描述:查询是否发生严重的错误。
//******************************************************************************************
unsigned char is_fatal_error( transfer_instance *tr_inst_ptr )
{
unsigned char completion_code;
completion_code = tr_inst_ptr->completion_code;
if ( !completion_code )
return ( FALSE );
else if ( completion_code & 0x8 )
return ( FALSE );
else
return ( TRUE );
}
//***********************************************************
// 函数名称:insert_tr_to_ep_list
// 输入参数:to_this_list,被插入的传输描述符链表指针的指针
// list,将插入的传输描述符指针
// 输出参数:无
// 功能描述:将传输描述符插入到端点传输描述符链表
//***********************************************************
void insert_tr_to_ep_list(transfer_instance **to_this_list, transfer_instance *list )
{
disable();
if(list->epi_ptr->ep_num==0x2)
to_this_list = to_this_list;
if(*to_this_list!=NULL)
list->tr_list_for_ep.Flink = (*to_this_list)->tr_list_for_ep.Flink;
else
list->tr_list_for_ep.Flink = list;
list->tr_list_for_ep.Blink = *to_this_list;
if(*to_this_list!=NULL)
(*to_this_list)->tr_list_for_ep.Flink = list;
*to_this_list = list;
enable();
}
//***********************************************************
// 函数名称:remove_tr_list
// 输出参数:from_this_list
// list
// 输入参数:无
// 功能描述:
//***********************************************************
void remove_tr_list(transfer_instance **from_this_list, transfer_instance *list )
{
transfer_instance * last_tr_inst_ptr;
transfer_instance * next_tr_inst_ptr;
/*
if( (*from_this_list) != list )
list->tr_list_for_tr.Flink->tr_list_for_tr.Blink = list->tr_list_for_tr.Blink;
if( list->tr_list_for_tr.Blink != NULL )
list->tr_list_for_tr.Blink->tr_list_for_tr.Flink = list->tr_list_for_tr.Flink;
else
(*from_this_list)->tr_list_for_tr.Flink = list->tr_list_for_tr.Flink;
if( (*from_this_list) == list )
*from_this_list = list->tr_list_for_tr.Blink;
list->tr_list_for_tr.Blink = NULL;
list->tr_list_for_tr.Flink = NULL;
*/
if(((*from_this_list)->tr_list_for_tr.Flink==list)&&(*from_this_list)==list)
(*from_this_list) = NULL ;
else
if((*from_this_list)->tr_list_for_tr.Flink==list)/*删除链表的末项*/
{
(*from_this_list)->tr_list_for_tr.Flink = list->tr_list_for_tr.Flink;
last_tr_inst_ptr = list->tr_list_for_tr.Flink; // 被删除的前一项
last_tr_inst_ptr->tr_list_for_tr.Blink= NULL;
}
else
if((*from_this_list)==list) /* 删除链表中的首项 */
{
next_tr_inst_ptr = list->tr_list_for_tr.Blink;
next_tr_inst_ptr->tr_list_for_tr.Flink = list->tr_list_for_tr.Flink;
*from_this_list = next_tr_inst_ptr;
}
else/*删除链表中的中间项*/
{
last_tr_inst_ptr = list->tr_list_for_tr.Flink;
next_tr_inst_ptr = list->tr_list_for_tr.Blink;
last_tr_inst_ptr->tr_list_for_tr.Blink = next_tr_inst_ptr;
next_tr_inst_ptr->tr_list_for_tr.Flink = last_tr_inst_ptr;
}
list->tr_list_for_tr.Flink = NULL;
list->tr_list_for_tr.Blink = NULL;
}
//***********************************************************
// 函数名称:remove_tr_list
// 输出参数:from_this_list
// list
// 输入参数:无
// 功能描述:
//***********************************************************
void remove_tr_from_ep(transfer_instance *list )
{
transfer_instance **from_this_list;
transfer_instance * last_tr_inst_ptr;
transfer_instance * next_tr_inst_ptr;
if(NULL==list->epi_ptr->tr_instance_ptr) // UPDATA 2005-3-16
return;
from_this_list = &list->epi_ptr->tr_instance_ptr;
if(((*from_this_list)->tr_list_for_ep.Flink==list)&&(*from_this_list)==list)
(*from_this_list) = NULL ;
else
if((*from_this_list)->tr_list_for_ep.Flink==list)/*删除链表的末项*/
{
(*from_this_list)->tr_list_for_ep.Flink = list->tr_list_for_ep.Flink;
last_tr_inst_ptr = list->tr_list_for_ep.Flink; // 被删除的前一项
last_tr_inst_ptr->tr_list_for_ep.Blink= NULL;
}
else
if((*from_this_list)==list) /* 删除链表中的首项 */
{
next_tr_inst_ptr = list->tr_list_for_ep.Blink;
next_tr_inst_ptr->tr_list_for_ep.Flink = list->tr_list_for_ep.Flink;
*from_this_list = next_tr_inst_ptr;
}
else/*删除链表中的中间项*/
{
last_tr_inst_ptr = list->tr_list_for_ep.Flink;
next_tr_inst_ptr = list->tr_list_for_ep.Blink;
last_tr_inst_ptr->tr_list_for_ep.Blink = next_tr_inst_ptr;
next_tr_inst_ptr->tr_list_for_ep.Flink = last_tr_inst_ptr;
}
list->tr_list_for_ep.Flink = NULL;
list->tr_list_for_ep.Blink = NULL;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -