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

📄 dev_ep.c

📁 基于ARM的读U盘
💻 C
📖 第 1 页 / 共 3 页
字号:
	
	device_list[ 0 ] = (device_instance *)1;
	device_list[ 1 ] = (device_instance *)1;
	
	for ( i = 2; i < MAX_DEVICE_NUM; i++ )
		device_list[ i ]	= NULL;

}

//**************************************************************************
// 函数名称:	device_new_address
// 输入参数: 无
// 输出参数: 返回地址编号
// 功能描述: 获取可用的设备地址
//**************************************************************************
unsigned char device_new_address( void )
{
	int		i;

	for ( i = 2; i < MAX_DEVICE_NUM; i++ )
		if ( !device_list[ i ] )
			return ( i );
	return ( 0 );
}


//*******************************************************************
//函数名称:find_device
//输入参数:address,设备地址
//输出参数:device_instance,设备信息指针
//功能说明:查找设备
//*******************************************************************
device_instance *find_device( unsigned char address )
{
	return ( device_list[ address ] );
}

//******************************************************************
// 函数名称:get_interface_class_ID
// 输出参数:dviPtr,设备描述信息结构指针
// 输出参数:bInterfaceClass或0xff
// 功能描述:返回设备接口类地址,如果设备类ID不为0,则返回0xFF.
//******************************************************************
unsigned char get_interface_class_ID( device_instance *dviPtr )
{
	if ( 0x00 == get_device_class_ID( dviPtr ) )
		return ( (dviPtr->interfacef_descriptor).bInterfaceClass );
	else
		return ( 0xFF );
}

//******************************************************************
// 函数名称:get_device_class_ID
// 输出参数:dviPtr,设备描述信息结构指针
// 输出参数:bDeviceClass
// 功能描述:获取设备类ID
//******************************************************************
unsigned char get_device_class_ID( device_instance *dviPtr )
{
	return ( (dviPtr->dev_descriptor).bDeviceClass );
}




//*******************************************************************
//函数名称:find_class_interface
//输入参数:InterfaceClassID,查找接口类ID
//				   DeviceIndex,同类设备索引号
//输出参数:device_instance,设备信息指针
//功能说明:查找设备接口类
//*******************************************************************
device_instance *find_class_interface( unsigned char InterfaceClassID,  unsigned char DeviceIndex )
{
	device_instance		*dviPtr;
	int					i;
	
	for ( i = 2; i <( MAX_DEVICE_NUM); i++ )
	{	
		if ( NULL == (dviPtr = find_device( i )) )
			continue;

		if ( check_interface_class_ID( dviPtr, InterfaceClassID ) )
		{
			if(DeviceIndex== 0x00)
				return ( dviPtr );
			else
				DeviceIndex --;
		}
	}
	
	return ( NULL );
}

//*******************************************************************
//函数名称:check_interface_class_ID
//输入参数:dviPtr,设备信息指针
//				  InterfaceClassID,查找的接口类ID
//输出参数:返回1,查找到合适的ID
//功能说明:查找设备类ID
//*******************************************************************
unsigned char check_interface_class_ID( device_instance *dviPtr, unsigned char InterfaceClassID )
{
	if ( (dviPtr->dev_descriptor).bDeviceClass == 0x00 )
		if ( (dviPtr->interfacef_descriptor).bInterfaceClass == InterfaceClassID )
			return ( 1 );

	return ( 0 );
}



//*******************************************************************
//函数名称:check_pid_vid
//输入参数:dviPtr,设备信息指针
//				  InterfaceClassID,查找的接口类ID
//输出参数:返回1,查找到合适的ID
//功能说明:查找设备VID和PID。
//*******************************************************************
unsigned char check_pid_vid( device_instance *dviPtr, unsigned short VID,unsigned short  PID)
{
	if ( (dviPtr->dev_descriptor).idVendor== VID )
		if ( (dviPtr->dev_descriptor).idProduct== PID )
			return ( 1 );
 
	return ( 0 );
}
//*******************************************************************
//函数名称:find_pid_vid
//输入参数:InterfaceClassID,查找接口类ID
//输出参数:device_instance,设备信息指针
//功能说明:查找指定VID和PID的设备
//*******************************************************************
device_instance *find_pid_vid( unsigned short VID,unsigned short PID )
{
	device_instance		*dviPtr;
	int					i;
	
	for ( i = 2; i <( MAX_DEVICE_NUM); i++ )
	{	
		if ( NULL == (dviPtr = find_device( i )) )
			continue;
		if ( check_pid_vid( dviPtr, VID , PID) )
			return ( dviPtr );
	}
	
	return ( NULL );
}

//*******************************************************************
//函数名称:find_endport_type
//输入参数:dviPtr,设备信息指针
//		    endport_type,端点类型
//  		endport_direction,端点的方向,输入(1)或输出(0)
//			index,端点序号,如果设备有多个同类型的端点,可以通过序号选择。
//输出参数:返回端点指针,空指针查找失败
//功能说明:查找设备VID和PID。
//*******************************************************************
endpoint_info  * find_endport_type(device_instance *dviPtr, unsigned char endport_type,unsigned char endport_direction,unsigned char index)
{
	unsigned char i;
	endpoint_info	*epi_ptr;
	for( i=0; i<MAX_ENDPOINT_NUM; i++)
	{
		epi_ptr=dviPtr->epi_ptr[i];
		if ( NULL!=epi_ptr )
		{
			if((epi_ptr->transfer_type&0x03) == (endport_type&0x03))
				if( epi_ptr->direction == endport_direction)
				{
					index--;
					if(index==0)
						return epi_ptr;			// 返回端点指针
				}
		}

	}
	return NULL;
}
//*******************************************************************
//函数名称:find_endport_number
//输入参数:dviPtr,设备信息指针
//		   	 	  endport_number,端点号
//  				  endport_direction,端点的方向,输入(1)或输出(0)
//输出参数:返回端点指针,空指针查找失败
//功能说明:以端点号和方向查找设备端点
//*******************************************************************
endpoint_info * find_endport_number(  device_instance *dviPtr, 
                                   	  unsigned char endport_number,
                                   	  unsigned char endport_direction)
{
	endpoint_info	*epi_ptr;
	epi_ptr =	dviPtr->epi_ptr[endport_number*2 + endport_direction];
	return epi_ptr;	
}

/********************************************************************** 
** Modification by hara from here.
** Inreface Protocol ID handling in Interface descriptor for HID class
***********************************************************************/

device_instance *find_protocol_interface( unsigned char InterfaceProtocolID, unsigned char search_start_address )
{
	device_instance		*dviPtr;
	int					i;
	
	if ( search_start_address < 2 )
		search_start_address	= 2;
	
	for ( i = search_start_address; i < 128; i++ )
	{	
		if ( NULL == (dviPtr	= find_device( i )) )
			continue;

		if ( check_interface_protocol_ID( dviPtr, InterfaceProtocolID ) )
			return ( dviPtr );
	}
	
	return ( NULL );
}


unsigned char check_interface_protocol_ID( device_instance *dviPtr, unsigned char InterfaceProtocolID )
{
	if (InterfaceProtocolID == get_interface_protocol_ID( dviPtr ) )
		return ( 1 );
	else
		return ( 0 );
}


unsigned char get_interface_protocol_ID( device_instance *dviPtr )
{
	if ( 0x03 ==  get_interface_class_ID( dviPtr ) )
		return ( (dviPtr->interfacef_descriptor).bInterfaceProtocol );
	else
		return ( 0xFF );
}



/********************************************************************** 
** Modification by hara from here.
** Inreface Protocol ID handling in Interface descriptor for HID class
***********************************************************************/

device_instance *find_subclass_interface( unsigned char InterfaceSubclassID, unsigned char search_start_address )
{
	device_instance		*dviPtr;
	int					i;
	
	if ( search_start_address < 2 )
		search_start_address	= 2;
	
	for ( i = search_start_address; i < 128; i++ )
	{	
		if ( NULL == (dviPtr	= find_device( i )) )
			continue;

		if ( check_interface_subclass_ID( dviPtr, InterfaceSubclassID ) )
			return ( dviPtr );
	}
	
	return ( NULL );
}


unsigned char check_interface_subclass_ID( device_instance *dviPtr, unsigned char InterfaceSubclassID )
{
	if (InterfaceSubclassID == get_interface_subclass_ID( dviPtr ) )
		return ( 1 );
	else
		return ( 0 );
}


unsigned char get_interface_subclass_ID( device_instance *dviPtr )
{
	if ( 0x08 ==  get_interface_class_ID( dviPtr ) )
		return ( (dviPtr->interfacef_descriptor).bInterfaceSubClass );
	else
		return ( 0xFF );
}



//******************************************************************************************
// 函数名称:ClearEndpointSTALL
// 输入参数:dvi_ptr,USB设备描述信息数据结构
//				    epi_ptr,端点描述信息数据结构
// 输出参数:TRUE,正常返回;
//				    FALSE,出错返回。
// 功能描述:清除端点停止状态
//******************************************************************************************
unsigned char ClearEndpointSTALL(device_instance *dvi_ptr, endpoint_info *epi_ptr)
{
	unsigned short 	wIndex;
	unsigned short	wLength = 0;
	unsigned char  	buff_ptr;
	unsigned short 	CompletionCode;
	
	wIndex =  epi_ptr->endpoint_descriptor.bEndpointAddress;			// 端点号
	CompletionCode = std_request(&buff_ptr, dvi_ptr, 
		             					std_Dv_request_CLEAR_FEATURE_Ep, 
		             					0x0000, wIndex, &wLength );	
	epi_ptr->toggle = 0;											
	return 	( CompletionCode? FALSE: TRUE );
}




⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -