3b7e09fad9
This patch adds semi-MT support for ALPS v4 protocol touchpads. It is based on the work by Seth Forshee for ALPS v3 and v4 protocol support. Three packets are required to assemble and process the MT data. ST events are reported at once to avoid latency. If there were two contacts or more, report MT data instead of ST events. Thanks to Seth Forshee for providing most of the code, guidance and insight for producing this patch. Signed-off-by: George Pantalos <gpantalos@gmail.com> Acked-by: Seth Forshee <seth.forshee@canonical.com> Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
65 lines
1.7 KiB
C
65 lines
1.7 KiB
C
/*
|
|
* 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
|
|
|
|
#define ALPS_PROTO_V1 0
|
|
#define ALPS_PROTO_V2 1
|
|
#define ALPS_PROTO_V3 2
|
|
#define ALPS_PROTO_V4 3
|
|
|
|
struct alps_model_info {
|
|
unsigned char signature[3];
|
|
unsigned char command_mode_resp; /* v3/v4 only */
|
|
unsigned char proto_version;
|
|
unsigned char byte0, mask0;
|
|
unsigned char flags;
|
|
};
|
|
|
|
struct alps_nibble_commands {
|
|
int command;
|
|
unsigned char data;
|
|
};
|
|
|
|
struct alps_data {
|
|
struct input_dev *dev2; /* Relative device */
|
|
char phys[32]; /* Phys */
|
|
const struct alps_model_info *i;/* Info */
|
|
const struct alps_nibble_commands *nibble_commands;
|
|
int addr_command; /* Command to set register address */
|
|
int prev_fin; /* Finger bit from previous packet */
|
|
int multi_packet; /* Multi-packet data in progress */
|
|
unsigned char multi_data[6]; /* Saved multi-packet data */
|
|
int x1, x2, y1, y2; /* Coordinates from last MT report */
|
|
int fingers; /* Number of fingers from MT report */
|
|
u8 quirks;
|
|
struct timer_list timer;
|
|
};
|
|
|
|
#define ALPS_QUIRK_TRACKSTICK_BUTTONS 1 /* trakcstick buttons in trackstick packet */
|
|
|
|
#ifdef CONFIG_MOUSE_PS2_ALPS
|
|
int alps_detect(struct psmouse *psmouse, bool set_properties);
|
|
int alps_init(struct psmouse *psmouse);
|
|
#else
|
|
inline int alps_detect(struct psmouse *psmouse, bool set_properties)
|
|
{
|
|
return -ENOSYS;
|
|
}
|
|
inline int alps_init(struct psmouse *psmouse)
|
|
{
|
|
return -ENOSYS;
|
|
}
|
|
#endif /* CONFIG_MOUSE_PS2_ALPS */
|
|
|
|
#endif
|