2005-04-16 15:20:36 -07:00
/*
* ALPS touchpad PS / 2 mouse driver
*
* Copyright ( c ) 2003 Peter Osterlund < petero2 @ telia . com >
* Copyright ( c ) 2005 Vojtech Pavlik < vojtech @ suse . cz >
*
* This program is free software ; you can redistribute it and / or modify it
* under the terms of the GNU General Public License version 2 as published by
* the Free Software Foundation .
*/
# ifndef _ALPS_H
# define _ALPS_H
2013-02-13 22:19:59 -08:00
# define ALPS_PROTO_V1 1
# define ALPS_PROTO_V2 2
# define ALPS_PROTO_V3 3
# define ALPS_PROTO_V4 4
2011-11-07 19:53:24 -08:00
2013-02-13 20:55:19 -08:00
/**
* struct alps_model_info - touchpad ID table
* @ signature : E7 response string to match .
* @ command_mode_resp : For V3 / V4 touchpads , the final byte of the EC response
* ( aka command mode response ) identifies the firmware minor version . This
* can be used to distinguish different hardware models which are not
* uniquely identifiable through their E7 responses .
* @ proto_version : Indicates V1 / V2 / V3 / . . .
* @ byte0 : Helps figure out whether a position report packet matches the
* known format for this model . The first byte of the report , ANDed with
* mask0 , should match byte0 .
* @ mask0 : The mask used to check the first byte of the report .
* @ flags : Additional device capabilities ( passthrough port , trackstick , etc . ) .
*
* Many ( but not all ) ALPS touchpads can be identified by looking at the
* values returned in the " E7 report " and / or the " EC report. " This table
* lists a number of such touchpads .
*/
2005-04-16 15:20:36 -07:00
struct alps_model_info {
2013-02-13 20:55:19 -08:00
unsigned char signature [ 3 ] ;
unsigned char command_mode_resp ;
2011-11-07 19:53:24 -08:00
unsigned char proto_version ;
2013-02-13 20:55:19 -08:00
unsigned char byte0 , mask0 ;
unsigned char flags ;
2005-04-16 15:20:36 -07:00
} ;
2013-02-13 20:55:19 -08:00
/**
* struct alps_nibble_commands - encodings for register accesses
* @ command : PS / 2 command used for the nibble
* @ data : Data supplied as an argument to the PS / 2 command , if applicable
*
* The ALPS protocol uses magic sequences to transmit binary data to the
* touchpad , as it is generally not OK to send arbitrary bytes out the
* PS / 2 port . Each of the sequences in this table sends one nibble of the
* register address or ( write ) data . Different versions of the ALPS protocol
* use slightly different encodings .
*/
2011-11-07 19:53:36 -08:00
struct alps_nibble_commands {
int command ;
unsigned char data ;
} ;
2013-02-13 20:55:19 -08:00
/**
* struct alps_data - private data structure for the ALPS driver
* @ dev2 : " Relative " device used to report trackstick or mouse activity .
* @ phys : Physical path for the relative device .
* @ nibble_commands : Command mapping used for touchpad register accesses .
* @ addr_command : Command used to tell the touchpad that a register address
* follows .
2013-02-13 20:56:33 -08:00
* @ proto_version : Indicates V1 / V2 / V3 / . . .
* @ byte0 : Helps figure out whether a position report packet matches the
* known format for this model . The first byte of the report , ANDed with
* mask0 , should match byte0 .
* @ mask0 : The mask used to check the first byte of the report .
* @ flags : Additional device capabilities ( passthrough port , trackstick , etc . ) .
2013-02-13 22:22:08 -08:00
* @ hw_init : Protocol - specific hardware init function .
* @ process_packet : Protocol - specific function to process a report packet .
* @ set_abs_params : Protocol - specific function to configure the input_dev .
2013-02-13 20:55:19 -08:00
* @ prev_fin : Finger bit from previous packet .
* @ multi_packet : Multi - packet data in progress .
* @ multi_data : Saved multi - packet data .
* @ x1 : First X coordinate from last MT report .
* @ x2 : Second X coordinate from last MT report .
* @ y1 : First Y coordinate from last MT report .
* @ y2 : Second Y coordinate from last MT report .
* @ fingers : Number of fingers from last MT report .
* @ quirks : Bitmap of ALPS_QUIRK_ * .
* @ timer : Timer for flushing out the final report packet in the stream .
*/
2005-04-16 15:20:36 -07:00
struct alps_data {
2013-02-13 20:55:19 -08:00
struct input_dev * dev2 ;
char phys [ 32 ] ;
2013-02-13 20:56:33 -08:00
/* these are autodetected when the device is identified */
2011-11-07 19:53:36 -08:00
const struct alps_nibble_commands * nibble_commands ;
2013-02-13 20:55:19 -08:00
int addr_command ;
2013-02-13 20:56:33 -08:00
unsigned char proto_version ;
unsigned char byte0 , mask0 ;
unsigned char flags ;
2013-02-13 22:22:08 -08:00
int ( * hw_init ) ( struct psmouse * psmouse ) ;
void ( * process_packet ) ( struct psmouse * psmouse ) ;
void ( * set_abs_params ) ( struct alps_data * priv , struct input_dev * dev1 ) ;
2013-02-13 20:55:19 -08:00
int prev_fin ;
int multi_packet ;
unsigned char multi_data [ 6 ] ;
int x1 , x2 , y1 , y2 ;
int fingers ;
2011-11-07 19:53:36 -08:00
u8 quirks ;
2009-12-15 08:39:50 -08:00
struct timer_list timer ;
2005-04-16 15:20:36 -07:00
} ;
2011-11-07 19:53:36 -08:00
# define ALPS_QUIRK_TRACKSTICK_BUTTONS 1 /* trakcstick buttons in trackstick packet */
2007-03-10 01:39:54 -05:00
# ifdef CONFIG_MOUSE_PS2_ALPS
2009-09-09 19:13:20 -07:00
int alps_detect ( struct psmouse * psmouse , bool set_properties ) ;
2007-03-10 01:39:54 -05:00
int alps_init ( struct psmouse * psmouse ) ;
# else
2009-09-09 19:13:20 -07:00
inline int alps_detect ( struct psmouse * psmouse , bool set_properties )
2007-03-10 01:39:54 -05:00
{
return - ENOSYS ;
}
inline int alps_init ( struct psmouse * psmouse )
{
return - ENOSYS ;
}
# endif /* CONFIG_MOUSE_PS2_ALPS */
2005-04-16 15:20:36 -07:00
# endif