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

📄 cls_hndl.c

📁 使用ISP1362芯片的USB_OTG参考设计源代码比较新的版本
💻 C
字号:
/*
**  WASABI-Hot! version 1.2c   
**
**
**      -- copyright (c) 2001-2004 by Philips Japan, Ltd. -- All rights reserved --
**
**
**      ** This code has been made to check/learn                          ** 
**      **                             the ISP1362/ISP1363 functionalities **
**      ** Release 06-Aug-2004                                             **
**
**      OKANO, Akifumi
**      
**		Application Laboratory, Mobile and Connectivity
**      Semiconductors Div, Philips Japan Ltd.
**      akifumi.okano@philips.com
**      +81-3-3740-4668 
**
*/


/****************************************************************************/
/*	includes																*/
/****************************************************************************/

#include		<stdio.h>

#include		"_hc_cls/cls_hndl.h"
#include		"_hc_core/dev_ep.h"

#include		"class_dr/audio/sing.h"
#include		"class_dr/hid/hid.h"
#include		"class_dr/printer/printer.h"
#include		"class_dr/storage/storage.h"
#include		"class_dr/hub/hub.h"

#include		"_dc/dc_chap9.h"
#include 		"_otg/otg_demo.h"

#include		"ui.h"
#include		"general.h"

#define			CUSTOM_CLASS_INITIALIZATION_METHOD_LIST_ITEM_MAX		4


/****************************************************************************/
/*	macros																	*/
/****************************************************************************/

#define			make_vid_pid( x )		((( (unsigned long)( ((x)->dev_descriptor).idVendor) ) << 16) | (((x)->dev_descriptor).idProduct) )

/****************************************************************************/
/*	global vars																*/
/****************************************************************************/

unsigned short	(*g_if_class_initialization_method[ 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_initialization_method[ 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_dispose_method[ 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_dispose_method[ DV_CLASS_INITIALIZATION_METHOD_LIST_ITEM_NUMBER ])( device_instance *dvi_ptr )
																	=	{
																				NULL, NULL, NULL, NULL,
																				NULL, NULL, NULL, NULL,
																				NULL, NULL, NULL
																		};
																		
char			*gp_class_str[]										=	{
																				"Reserved",
																				"Audio",
																				"Communication",
																				"HumanInterface",
																				"Monitor",
																				"PysicalInterface",
																				"Power",
																				"Printer",
																				"Storage",
																				"Hub",
																				"VenderSpecific"
																		};

typedef	struct	_cstm_slot_item	{
									unsigned long				vid_pid;
									unsigned short				(*class_init_method)( device_instance *dvi_ptr );
									unsigned short				(*clshndl_dispose_method)( device_instance *dvi_ptr );
								}
								cstm_slot_item;

cstm_slot_item	cstm_slot[ CUSTOM_CLASS_INITIALIZATION_METHOD_LIST_ITEM_MAX ]
																	=	{
																				{	0L, NULL, NULL },
																				{	0L, NULL, NULL },
																				{	0L, NULL, NULL },
																				{	0L, NULL, NULL }
																		};
																		
																		

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

static unsigned char if_install_class_methods( 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_install_class_methods( 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 ) );
static unsigned char custom_install_class_methods( unsigned short vid, unsigned short pid, unsigned short (*cstm_class_init_method)( device_instance *dvi_ptr ), unsigned short (*cstm_class_dispose_method)( device_instance *dvi_ptr ) );


/****************************************************************************/
/*	function definitions													*/
/****************************************************************************/

void clshndl_initialization_method_install( void )
{
	if ( dv_install_class_methods( HUB_CLASS_DEVICE, hub_init_commands, hub_dispose_process ) )
		mprintf( LIGHTRED, ABORT, "error @ class_initialization_install, class code = 0x%X", HUB_CLASS_DEVICE );
		
	if ( if_install_class_methods( AUDIO_CLASS_INTERFACE, audio_init_commands, audio_dispose_process ) )
		mprintf( LIGHTRED, ABORT, "error @ class_initialization_install, class code = 0x%X", AUDIO_CLASS_INTERFACE );
		
	if ( if_install_class_methods( PRINTER_CLASS_INTERFACE, printer_init_commands, printer_dispose_process ) )
		mprintf( LIGHTRED, ABORT, "error @ class_initialization_install, class code = 0x%X", PRINTER_CLASS_INTERFACE );
		
	if ( if_install_class_methods( STORAGE_CLASS_INTERFACE, storage_init_commands, storage_dispose_process ) )
		mprintf( LIGHTRED, ABORT, "error @ class_initialization_install, class code = 0x%X", STORAGE_CLASS_INTERFACE );
		
	if ( if_install_class_methods( HID_CLASS_INTERFACE, hid_init_commands, hid_dispose_process ) )
		mprintf( LIGHTRED, ABORT, "error @ class_initialization_install, class code = 0x%X", HID_CLASS_INTERFACE );
		
	if ( custom_install_class_methods( PHILIPS_VID, WASABI_PID, otg_demo_wasabi_init_commands, NULL ) )
		mprintf( LIGHTRED, ABORT, "error @ class_initialization_install, class code = 0x%X", HID_CLASS_INTERFACE );
}



unsigned short clshndl_initialization_method( device_instance *dvi_ptr )
{
	unsigned char		dv_class_code;
	unsigned char		if_class_code;
	unsigned short		err;

	/*	check device class code	*/

	dv_class_code	= devep_get_device_class_ID( dvi_ptr );
	if_class_code	= devep_get_interface_class_ID( dvi_ptr );

	dv_class_code	= (dv_class_code < DV_CLASS_INITIALIZATION_METHOD_LIST_ITEM_NUMBER) ? dv_class_code : 0;
	if_class_code	= (if_class_code < IF_CLASS_INITIALIZATION_METHOD_LIST_ITEM_NUMBER) ? if_class_code : 0;
	
		//	If the ID has value greater than DV/IF_CLASS_INITIALIZATION_METHOD_LIST_ITEM_NUMBER, 
		//	the process treat the ID as 0 and it will goes to "else" part of next block.

	if ( dv_class_code )
	{
		if ( g_dv_class_initialization_method[ dv_class_code ] != NULL )
			if ( NULL != (err	= (*g_dv_class_initialization_method[ dv_class_code ])( dvi_ptr )) )
				return ( err );
	}
	else if ( if_class_code )
	{
		/*	check interface class code	*/

		if_class_code	= devep_get_interface_class_ID( dvi_ptr );

		if ( if_class_code < IF_CLASS_INITIALIZATION_METHOD_LIST_ITEM_NUMBER )
		{
			if ( g_if_class_initialization_method[ if_class_code ] != NULL )
				if ( NULL != (err	= (*g_if_class_initialization_method[ if_class_code ])( dvi_ptr )) )
					return ( err );
		}
	}
	else
	{
		unsigned char	i;
	
		for ( i = 0; i < CUSTOM_CLASS_INITIALIZATION_METHOD_LIST_ITEM_MAX; i++ )
		{
			if ( cstm_slot[ i ].vid_pid )
				if ( cstm_slot[ i ].vid_pid	== make_vid_pid( dvi_ptr ) )
					if ( NULL != cstm_slot[ i ].class_init_method )
						if ( NULL != (err	= (*cstm_slot[ i ].class_init_method)( dvi_ptr )) )
							return ( err );
		}
	}
	
	return ( 0 );
}


unsigned short clshndl_dispose_method( device_instance *dvi_ptr )
{
	unsigned char		dv_class_code;
	unsigned char		if_class_code;
	unsigned short		err;
	
	/*	check device class code	*/

	dv_class_code	= devep_get_device_class_ID( dvi_ptr );
	if_class_code	= devep_get_interface_class_ID( dvi_ptr );

	dv_class_code	= (dv_class_code < DV_CLASS_INITIALIZATION_METHOD_LIST_ITEM_NUMBER) ? dv_class_code : 0;
	if_class_code	= (if_class_code < IF_CLASS_INITIALIZATION_METHOD_LIST_ITEM_NUMBER) ? if_class_code : 0;
	
		//	If the ID has value greater than DV/IF_CLASS_INITIALIZATION_METHOD_LIST_ITEM_NUMBER, 
		//	the process treat the ID as 0 and it will goes to "else" part of next block.

	if ( dv_class_code )
	{
		if ( g_dv_class_dispose_method[ dv_class_code ] != NULL )
			if ( NULL != (err		= (*g_dv_class_dispose_method[ dv_class_code ])( dvi_ptr )) )
				return ( err );
	}
	else if ( if_class_code )
	{
		/*	check interface class code	*/

		if ( if_class_code < IF_CLASS_INITIALIZATION_METHOD_LIST_ITEM_NUMBER )
			if ( g_if_class_dispose_method[ if_class_code ] != NULL )
				if ( NULL != (err	= (*g_if_class_dispose_method[ if_class_code ])( dvi_ptr )) )
					return ( err );
	}
	else
	{
		unsigned char	i;

		for ( i = 0; i < CUSTOM_CLASS_INITIALIZATION_METHOD_LIST_ITEM_MAX; i++ )
			if ( !(cstm_slot[ i ].vid_pid) )
				if ( cstm_slot[ i ].vid_pid	== make_vid_pid( dvi_ptr ) )
					if ( NULL != cstm_slot[ i ].clshndl_dispose_method )
						if ( NULL != (err	= (*cstm_slot[ i ].clshndl_dispose_method)( dvi_ptr )) )
							return ( err );
	}
	
	return ( 0 );
}


static unsigned char dv_install_class_methods( 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_initialization_method[ dv_class_code ]	= dv_class_init_method;
	g_dv_class_dispose_method[ dv_class_code ]			= dv_class_dispose_method;
	
	return ( 0 );
}


static unsigned char if_install_class_methods( 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_initialization_method[ if_class_code ]	= if_class_init_method;
	g_if_class_dispose_method[ if_class_code ]			= if_class_dispose_method;
	
	return ( 0 );
}


static unsigned char custom_install_class_methods( unsigned short vid, unsigned short pid, unsigned short (*cstm_class_init_method)( device_instance *dvi_ptr ), unsigned short (*cstm_class_dispose_method)( device_instance *dvi_ptr ) )
{
	static unsigned char	curr_index	= 0;

	if ( !(curr_index < CUSTOM_CLASS_INITIALIZATION_METHOD_LIST_ITEM_MAX) )
		return ( 0xFF );
	
	cstm_slot[ curr_index ].vid_pid					= ((unsigned long)vid << 16) | pid;
	cstm_slot[ curr_index ].class_init_method		= cstm_class_init_method;
	cstm_slot[ curr_index ].clshndl_dispose_method	= cstm_class_dispose_method;
	
	curr_index++;
	
	return ( 0 );
}





⌨️ 快捷键说明

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