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

📄 hid.c

📁 使用ISP1362芯片的USB_OTG参考设计源代码比较新的版本
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
**  WASABI-Hot! version 1.2c    (HID sub-unit)
**
**
**      -- 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 
*/

/*
**	HID-Keyboard/Mouse handling framework has been written by Hisashige Harashima
**		04-Mar-2002
*/


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

#include		<stdio.h>
#include		<stdlib.h>
#include		<alloc.h>

#include		"_hc_core/atl_mix.h"
#include		"_hc_core/dev_ep.h"
#include		"_hc_core/port_ctl.h"
#include		"_hc_core/transfer.h"

#include		"_hc_core/dev_ep.h"		// modification by hara
#include		"_hc_cls/cls_hndl.h"	// modification by hara

#include		"class_dr/hid/hid.h"
#include		"class_dr/audio/sing.h"

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


/****************************************************************************/
/*	constants																*/
/****************************************************************************/

#define			KEYBOARD_BUFFER_DEPTH		16


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

int				g_keyboard_buffer[ KEYBOARD_BUFFER_DEPTH ];
unsigned char	g_keyboard_buffer_ptr_in	= 0;
unsigned char	g_keyboard_buffer_ptr_out	= 0;

hid_cls_interface	hid_class_interface		= { 0, 0, NULL, NULL, NULL };

static char		mojitable[256];																	//Modification by hara

mouse_status	mouse						= { 2, 2, 0 };
mouse_status	p_mouse						= { 0, 0, 0 };

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

device_instance		*create_hid_class_instance( device_instance *dvi_ptr );
void				dispose_hid_class_instance( device_instance *dvi_ptr );
void				hid_callback_keyboard( endpoint_info_ptr epi_ptr );						//Modification by hara
void				hid_callback_mouse( endpoint_info_ptr epi_ptr );						//Modification by hara

void				display_mouse_status( void );

char				key_code_convert_a( char code );										//Modification by hara
char				key_code_convert_A( char code );										//Modification by hara	

void				hid_usb_key_buffer_push( int buffer );
unsigned char		keyboard_buffer_pointer_increment( unsigned char p );

void				moji_init(void);														//Modification by hara
unsigned long		is_new_key_code( unsigned char key_code, unsigned char *previous_key_codes );	//Modification by hara
void				copy_key_codes( unsigned char *target, unsigned char *source );			//Modification by hara
void 				hid_keyboard_main( void );

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

unsigned short  	hid_cls_interface_install( hid_cls_interface *hci )
{
	if ( hid_class_interface.idVendor )				//	if already installed
		return ( hid_class_interface.idVendor );	//	do nothing
	
	hid_class_interface		= *hci;
	
	return ( 0 );
}



unsigned short hid_init_commands( device_instance *dvi_ptr )
{
	hid_instance	*hid_i_ptr;
	
	char if_protocol_code;		//Modification by hara.
	
//	mprintf( YELLOW, CONTINUE, "HID connected!\r\n" );

	if ( devep_regist_config_descriptors( dvi_ptr, 1, 0 ) )
		return ( error );

	if ( NULL == create_hid_class_instance( dvi_ptr ) )
		mprintf( LIGHTRED, ABORT, "error @ create_hid_class_instance()\r\n" );


	//	Bus-power turn-on for all ports on the hib.

	hid_i_ptr			= (hid_instance *)hid_instance_ptr( dvi_ptr );


	//	Set interrupt pipe
	
	if ( (NO_OPEN_ATL_TRANSFER_SLOT == (hid_i_ptr->tr_index	= atlmix_get_open_transfer_index( INTERRUPT_TRANSFER ))) )
		mprintf( LIGHTRED, ABORT, "error @ transfer_control_transaction, transfer list full.\r\n" );

	if ( hid_class_interface.idVendor == (dvi_ptr->dev_descriptor).idVendor )
	{
		if ( hid_class_interface.idProduct == (dvi_ptr->dev_descriptor).idProduct )
		{
			if ( 0 != (*(hid_class_interface.hid_initialization_function))( dvi_ptr ) )
				return ( 1 );
		}
	}

// Modification by hara  from here.
		
	if_protocol_code = devep_get_interface_protocol_ID(dvi_ptr);
	
	if ( if_protocol_code == HID_INTERFACE_KEYBOARD)
	{
		hid_i_ptr->tr_instance_ptr		= atlmix_set_transfer( INTERRUPT_TRANSFER, hid_i_ptr->polling_rate, hid_i_ptr->tr_index, (unsigned char *)(&(hid_i_ptr->ep1_data)), hid_i_ptr->max_packet_size, IN, (dvi_ptr->epi_ptr)[ EpIN ][ 1 ], hid_callback_keyboard );

//		mprintf( YELLOW, CONTINUE, "***** Keyboard connected!*****\r\n" );
		moji_init();			//Modification by hara.
	}
	else if ( if_protocol_code == HID_INTERFACE_MOUSE)
	{
		hid_i_ptr->tr_instance_ptr		= atlmix_set_transfer( INTERRUPT_TRANSFER,  hid_i_ptr->polling_rate, hid_i_ptr->tr_index, (unsigned char *)(&(hid_i_ptr->ep1_data)), hid_i_ptr->max_packet_size, IN, (dvi_ptr->epi_ptr)[ EpIN ][ 1 ], hid_callback_mouse );
//		mprintf( YELLOW, CONTINUE, "***** Mouse connected! *****\r\n" );	
	}


// Modification by hara  to here.

//	mprintf( WHITE, CONTINUE, "hid_init_commands %p  %d \r\n", hid_i_ptr, hid_i_ptr->tr_index );


	return ( 0 );
}


device_instance *create_hid_class_instance( device_instance *dvi_ptr )
{
	//	This instance will be disposed in function "devep_dispose_device()"

	hid_instance	*hid_i_ptr;

	if ( NULL == (hid_i_ptr	= (hid_instance *)malloc( 4 + sizeof( hid_instance ) )) )
		mprintf( LIGHTRED, ABORT, "error @ malloc in create_hid_class_instance()\r\n" );

	//	Check endpoint characteristics
	
	if ( (dvi_ptr->conf_descriptor).bNumInterfaces != 1 )
		mprintf( LIGHTRED, ABORT, "error @ create_hid_class_instance, un-supported hid. (dvi_ptr->conf_descriptor).bNumInterfaces is not 1.\r\n" );
	
	if ( ((dvi_ptr->epi_ptr[ EpIN ][ 1 ])->endpoint_descriptor).bEndpointAddress != 0x81 )
		mprintf( LIGHTRED, ABORT, "error @ create_hid_class_instance, un-supported hid. ((dvi_ptr->epi_ptr[ EpIN ][ 1 ])->endpoint_descriptor).bEndpointAddress is not 0x81.\r\n" );
	
	hid_i_ptr->max_packet_size	= ((dvi_ptr->epi_ptr[ EpIN ][ 1 ])->endpoint_descriptor).wMaxPacketSize;
	hid_i_ptr->polling_rate		= ((dvi_ptr->epi_ptr[ EpIN ][ 1 ])->endpoint_descriptor).bInterval;

	dvi_ptr->class_instance_ptr		= hid_i_ptr;

	hid_i_ptr->tr_index				= 0xFF;
	hid_i_ptr->tr_instance_ptr		= NULL;

	return ( dvi_ptr );
}



unsigned short hid_dispose_process( device_instance *dvi_ptr )
{
	hid_instance		*hid_i_ptr;
	device_instance		*downstream_device_ptr;
	int					i;

	if ( hid_class_interface.idVendor == (dvi_ptr->dev_descriptor).idVendor )
		if ( hid_class_interface.idProduct == (dvi_ptr->dev_descriptor).idProduct )
			(*(hid_class_interface.hid_dispose_function))( dvi_ptr );
		
	/*
	**	Stop interrupt transfer to the HID
	*/
	
	hid_i_ptr				= (hid_instance *)hid_instance_ptr( dvi_ptr );

	atlmix_free_transfer_index( INTERRUPT_TRANSFER, hid_i_ptr->tr_index );

	return ( 0 );
}

/*********************************************************
**
**  Keyboard handling.
**
**********************************************************/



void hid_callback_keyboard( endpoint_info_ptr epi_ptr )
{
//
//	KEYBOARD	KEYBOARD	KEYBOARD	KEYBOARD	KEYBOARD	KEYBOARD	KEYBOARD
//

	unsigned long	status;	
	device_instance 		*dvi_ptr;
	static unsigned char	previous_key_codes[ 8 ]	= { 0, 0, 0, 0, 0, 0, 0, 0 };
	unsigned char			key_codes[ 8 ];
	unsigned char			*data_ptr;
	unsigned char			i;
	char					moji		= 0;
	
	if ( atlmix_is_fatal_error( (transfer_instance *)(epi_ptr->transfer_instance) ) )
	{
		//		Device may be detached
		atlmix_free_transfer( (transfer_instance *)(epi_ptr->transfer_instance) );
		return;
	}

	dvi_ptr	= devep_find_device( epi_ptr->dev_addr );

	status	= *((unsigned long *)(((transfer_instance *)(epi_ptr->transfer_instance))->data_ptr_base));
	status = (status & 0x000000FF);
	
	copy_key_codes( key_codes, ((transfer_instance *)(epi_ptr->transfer_instance))->data_ptr_base );
	atlmix_re_enable_interrupt_transfer( epi_ptr->transfer_instance );

	if ( hid_class_interface.idVendor == (dvi_ptr->dev_descriptor).idVendor )
	{
		if ( hid_class_interface.idProduct == (dvi_ptr->dev_descriptor).idProduct )
		{
			(*(hid_class_interface.hid_callback_function))( dvi_ptr, *((unsigned long *)key_codes) );
			return;
		}
	}

	for ( i = 2; i < 8; i++ )
	{
		if ( status == 0x00) 
			moji	= key_code_convert_a( is_new_key_code( key_codes[ i ], previous_key_codes ) );
		
		else if ( status == 0x02)		//Shift right
			moji	= key_code_convert_A( is_new_key_code( key_codes[ i ], previous_key_codes ) );
		
		else if ( status == 0x20)		//Shift left
			moji	= key_code_convert_A( is_new_key_code( key_codes[ i ], previous_key_codes ) );
		
		if ( moji )
			hid_usb_key_buffer_push( moji & 0xFF );
	}
	
	copy_key_codes( previous_key_codes, key_codes );
}


void copy_key_codes( unsigned char *target, unsigned char *source )
{
	unsigned char	i;
	
	for ( i = 0; i < 8; i++ )
		*target++	= *source++;
}


unsigned long is_new_key_code( unsigned char key_code, unsigned char *previous_key_codes )
{
	unsigned char			i;
	
	for ( i = 2; i < 8; i++ )
		if ( key_code == previous_key_codes[ i ] )
			return ( 0 );
	
	return ( key_code );

}



/*********************************************************
**
**  Convert "charactor" from USB to ASCII from mojitable[i]
**
**********************************************************/


char key_code_convert_a( char code )
{
	
	if( (code >= 0x04) && (code <= 0x38) )			
		return (mojitable[code]);
			
		else
			return (0);	
}

/*********************************************************
**
**  Convert "charactor with Shift key" from USB to ASCII from mojitable[i]
**
**********************************************************/


char key_code_convert_A( char code )
{	
		
	if( (code >= 0x04) && (code <= 0x38) )			
		return (mojitable[code + 53]);	
	else
		return (0);	

}



/*************************************************
**
**  Mouse hanbdling
**
*************************************************/


void hid_callback_mouse( endpoint_info_ptr epi_ptr )
{

⌨️ 快捷键说明

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