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

📄 cls_hndl.c

📁 基于ARM的读U盘
💻 C
字号:
/****************************************************************************/
/*	includes																*/
/****************************************************************************/
#include "HostStack.h"


/****************************************************************************/
/*	global vars																*/
/****************************************************************************/
/*接口类设备初始化函数数组*/
unsigned short	(*g_if_class_drive_init[ IF_CLASS_INITIALIZATION_METHOD_LIST_ITEM_NUMBER ])( device_instance *dvi_ptr )
																	=	{
																				NULL, NULL, NULL, NULL,
																				NULL, NULL, NULL, NULL,
																				NULL, NULL, NULL
																		};
/*设备类设备初始化函数数组*/																		
unsigned short	(*g_dv_class_drive_ini[ DV_CLASS_INITIALIZATION_METHOD_LIST_ITEM_NUMBER ])( device_instance *dvi_ptr )
																	=	{
																				NULL, NULL, NULL, NULL,
																				NULL, NULL, NULL, NULL,
																				NULL, NULL, NULL
																		};
/*删除接口类设备函数数组*/																		
unsigned short	(*g_if_class_drive_dispose[ IF_CLASS_INITIALIZATION_METHOD_LIST_ITEM_NUMBER ])( device_instance *dvi_ptr )
																	=	{
																				NULL, NULL, NULL, NULL,
																				NULL, NULL, NULL, NULL,
																				NULL, NULL, NULL
																		};
/*删除类设备初始化函数数组*/																		
unsigned short	(*g_dv_class_drive_dispose[ DV_CLASS_INITIALIZATION_METHOD_LIST_ITEM_NUMBER ])( device_instance *dvi_ptr )
																	=	{
																				NULL, NULL, NULL, NULL,
																				NULL, NULL, NULL, NULL,
																				NULL, NULL, NULL
																		};
/*																		
char			*class_str[]	=	{
								"Reserved",
								"Audio",
								"Communication",
								"HumanInterface",
								"Monitor",
								"PysicalInterface",
								"Power",
								"Printer",
								"Storage",
								"Hub",
								"VenderSpecific"
							};

*/
/****************************************************************************/
/*	function prototypes														*/
/****************************************************************************/

static unsigned char if_reg_class_drive( unsigned char if_class_code, unsigned short (*if_class_init_method)( device_instance *dvi_ptr ), unsigned short (*if_class_dispose_method)( device_instance *dvi_ptr ) );
static unsigned char dv_reg_class_drive( unsigned char dv_class_code, unsigned short (*dv_class_init_method)( device_instance *dvi_ptr ), unsigned short (*dv_class_dispose_method)( device_instance *dvi_ptr ) );


/****************************************************************************/
/*	function definitions													*/
/****************************************************************************/
//****************************************************************************
// 函数名称:class_driver_registration
// 输入参数:无
// 输出参数:无
// 功能描述:注册类设备驱动
//****************************************************************************
void class_driver_registration( void )
{
#ifdef HUB_CLASS_DRIVE
	if ( dv_reg_class_drive( HUB_CLASS_DEVICE, hub_init_commands, hub_dispose_process ) )
		while(1);	
#endif

#ifdef AUDIO_CLASS_DRIVE
	if ( if_reg_class_drive( AUDIO_CLASS_INTERFACE, audio_init_commands, audio_dispose_process ) )
		while(1);	
#endif
	
#ifdef PRINTER_CLASS_DRIVE
	if ( if_reg_class_drive( PRINTER_CLASS_INTERFACE, printer_init_commands, printer_dispose_process ) )
		while(1);	
#endif
	
#ifdef HID_CLASS_DRIVE
	if ( if_reg_class_drive( HID_CLASS_INTERFACE, hid_init_commands, hid_dispose_process ) )
		while(1);	
#endif

#ifdef MASSSTRAGE_CLASS_DRIVE
	if ( if_reg_class_drive( MASSSTRAGE_CLASS_INTERFACE, mass_init_commands, mass_dispose_process) )
		while(1);	
#endif

}


//***************************************************************************
// 函数名称:class_initialization_method
// 输入参数:dvi_ptr,设备描述信息结构指针
// 输出参数:正常返回0,出错返回NULL
// 功能描述:初始化标准类设备
//***************************************************************************
unsigned short class_driver_install( device_instance *dvi_ptr )
{
	unsigned char		dv_class_code;
	unsigned char		if_class_code;
	unsigned short		err;

	/*	检查设备类代码	*/
	dv_class_code	= get_device_class_ID( dvi_ptr );
	if (  (dv_class_code<DV_CLASS_INITIALIZATION_METHOD_LIST_ITEM_NUMBER)&&( dv_class_code)  )
	{
		if ( g_dv_class_drive_ini[ dv_class_code ] != NULL )
			if ( 0 != (err	= (*g_dv_class_drive_ini[ dv_class_code ])( dvi_ptr )) )
				return ( err );
	}	
	else
	{
		/*	检查接口类代码	*/
		if_class_code	= get_interface_class_ID( dvi_ptr );
		if ( if_class_code < IF_CLASS_INITIALIZATION_METHOD_LIST_ITEM_NUMBER )
		{
			if ( g_if_class_drive_init[ if_class_code ] != NULL )
				if ( 0 != (err	= (*g_if_class_drive_init[ if_class_code ])( dvi_ptr )) )
					return ( err );
		}
	}
	return ( 0 );
}

//*******************************************************************
// 函数名称:class_dispose_method
// 输入参数:dvi_ptr,
// 输出参数:正常返回0,出借返回出错代码,
// 功能描述:删除一个标准类设备
//********************************************************************
unsigned short class_drive_dispose( device_instance *dvi_ptr )
{
	unsigned char		dv_class_code;
	unsigned char		if_class_code;
	unsigned short		err;
	
	/*	检查设备类代*/
	dv_class_code	= get_device_class_ID( dvi_ptr );// 获取设备类ID
	if ( (dv_class_code<DV_CLASS_INITIALIZATION_METHOD_LIST_ITEM_NUMBER)&&( dv_class_code) )
	{
		if ( g_dv_class_drive_dispose[ dv_class_code ] != NULL )
			if ( 0 != (err		= (*g_dv_class_drive_dispose[ dv_class_code ])( dvi_ptr )) )
				return ( err );
				
	}
	else
	{
		/*	检查接口类代码	*/
		if_class_code	= get_interface_class_ID( dvi_ptr );// 获取接口类ID
		if ( if_class_code < IF_CLASS_INITIALIZATION_METHOD_LIST_ITEM_NUMBER )
			if ( g_if_class_drive_dispose[ if_class_code ] != NULL )
				if ( 0 != (err	= (*g_if_class_drive_dispose[ if_class_code ])( dvi_ptr )) )
					return ( err );
	}
	
	return ( 0 );
}


//****************************************************************************
// 函数名称:if_reg_class_drive
// 输入参数:if_class_code,接口类代码
//				    if_class_init_method,接口类初始化函数
//				    if_class_dispose_method,接口类删除函数
// 输出参数:正常返回0,接口类代码无效返回0xff
// 功能描述:初始化接口类建立及删除函数
//****************************************************************************
static unsigned char if_reg_class_drive( unsigned char if_class_code, 
											 unsigned short (*if_class_init_method)( device_instance *dvi_ptr ), 
											 unsigned short (*if_class_dispose_method)( device_instance *dvi_ptr ) )
{
	if ( !(if_class_code < IF_CLASS_INITIALIZATION_METHOD_LIST_ITEM_NUMBER) )
		return ( 0xFF );
	
	g_if_class_drive_init[ if_class_code ]	= if_class_init_method;
	g_if_class_drive_dispose[ if_class_code ]	= if_class_dispose_method;
	
	return ( 0 );
}

//****************************************************************************
// 函数名称:dv_reg_class_drive
// 输入参数:dv_class_code,设备类代码
//				    dv_class_init_method,设备类初始化函数
//				    dv_class_dispose_method,设备类删除函数
// 输出参数:正常返回0,设备类代码无效返回0xff
// 功能描述:初始化设备类建立及删除函数
//****************************************************************************
static unsigned char dv_reg_class_drive( unsigned char dv_class_code, 
											    unsigned short (*dv_class_init_method)( device_instance *dvi_ptr ), 
											    unsigned short (*dv_class_dispose_method)( device_instance *dvi_ptr ) )
{
	if ( !(dv_class_code < DV_CLASS_INITIALIZATION_METHOD_LIST_ITEM_NUMBER) )
		return ( 0xFF );
	
	g_dv_class_drive_ini[ dv_class_code ]	= dv_class_init_method;
	g_dv_class_drive_dispose[ dv_class_code ]		= dv_class_dispose_method;
	
	return ( 0 );
}






⌨️ 快捷键说明

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