📄 hid.c
字号:
/*
** 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 + -