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

📄 atl_mix.c

📁 基于ARM的读U盘
💻 C
📖 第 1 页 / 共 3 页
字号:
			
	}

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