📄 cls_hndl.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 + -