www.nico.schottelius.org/software/gpm/browse_source/gpm-1.20.2-broken/patches/done/need_update/gpm-diff-first

1048 lines
36 KiB
Plaintext

diff -u -w ../../gpm-1.19.6/src/debuglog.c ./debuglog.c
--- ../../gpm-1.19.6/src/debuglog.c Sun Dec 30 00:56:34 2001
+++ ./debuglog.c Sat Dec 29 15:13:48 2001
@@ -37,6 +37,7 @@
# endif
#endif
+#include <stdlib.h> /* exit */
#include <stdarg.h>
#include <stdio.h>
#include <string.h>
@@ -74,13 +75,14 @@
gpm_oops(char *f, int n, char *s, ...)
{
if (LOG_ERR <= gpm_debug_level) {
- int pri;
va_list ap;
#if(defined(HAVE_VSYSLOG) && defined(HAVE_SYSLOG))
+ int pri;
static char fmt[] = ": %m";
char* buf = alloca(strlen(s)+sizeof(fmt));
- strcpy(buf, s); strcat(buf, fmt);
+ strcpy(buf, s);
+ strcat(buf, fmt);
#endif
va_start(ap, s);
diff -u -w ../../gpm-1.19.6/src/gpm-root.y ./gpm-root.y
--- ../../gpm-1.19.6/src/gpm-root.y Sun Dec 30 00:56:34 2001
+++ ./gpm-root.y Sat Dec 29 15:17:40 2001
@@ -1196,7 +1196,7 @@
Draw *draw=NULL;
DrawItem *item;
char s[80];
- int posty, postx, postX;
+ int posty=0, postx, postX;
struct sigaction childaction;
int evflag;
int recursenow=0; /* not on first iteration */
diff -u -w ../../gpm-1.19.6/src/gpm.c ./gpm.c
--- ../../gpm-1.19.6/src/gpm.c Sun Dec 30 00:56:34 2001
+++ ./gpm.c Sat Dec 29 21:53:12 2001
@@ -27,6 +27,7 @@
#include <errno.h>
#include <unistd.h> /* select(); */
#include <signal.h> /* SIGPIPE */
+#include <time.h> /* time */
#include <sys/param.h>
#include <sys/fcntl.h> /* O_RDONLY */
#include <sys/wait.h> /* wait() */
@@ -235,6 +251,7 @@
}
fd=open_console(O_WRONLY);
+ gpm_debug_log(LOG_DEBUG,"Paste %i",c);
if (ioctl(fd, TIOCLINUX, &c) < 0)
oops("ioctl(TIOCLINUX)");
close(fd);
@@ -386,8 +407,25 @@
{
gpm_debug_log(LOG_NOTICE,"Skipping a data packet (?)");
return NULL;
}
+
+ /* Better debug output
+ 29/12/2001 02:12. pebl*/
+ switch (protocol->packetlength)
+ {
+ case 4:
+ gpm_debug_log(LOG_DEBUG,"Data %02x %02x %02x %02x",data[0],data[1],data[2],data[3]);
+ break;
+ case 5:
+ gpm_debug_log(LOG_DEBUG,"Data %02x %02x %02x %02x %02x",data[0],data[1],data[2],data[3],data[4]);
+ break;
+ case 6:
+ gpm_debug_log(LOG_DEBUG,"Data %02x %02x %02x %02x %02x %02x",data[0],data[1],data[2],data[3],data[4],data[5]);
+ break;
+ default:
gpm_debug_log(LOG_DEBUG,"Data %02x %02x %02x (%02x)",data[0],data[1],data[2],data[3]);
+ }
+
return data;
}
@@ -532,7 +586,10 @@
* Return information also if never happens, but enough time has elapsed.
* Note: return 1 will segfault due to missing event->vc
*/
- if (time(NULL)<=awaketime) return 0;
+ if (time(NULL)<=awaketime){
+ gpm_debug_log(LOG_DEBUG,"No dy, dx or buttons");
+ return 0;
+ }
awaketime=time(NULL)+1;
break;
}
@@ -1104,7 +1169,7 @@
continue;
}
- gpm_debug_log(LOG_DEBUG,"selected %i times",pending);
+ gpm_debug_log(LOG_DEBUG,"select returned %i fd",pending);
/*....................................... manage graphic mode */
diff -u -w ../../gpm-1.19.6/src/gpn.c ./gpn.c
--- ../../gpm-1.19.6/src/gpn.c Sun Dec 30 00:56:34 2001
+++ ./gpn.c Sat Dec 29 14:27:12 2001
@@ -460,7 +463,7 @@
check_uniqueness();
gpm_debug_log(LOG_INFO,"Signed");
- } /*if*/
+ } /*if(gpm_log_daemon)*/
/*
* well, I used to create a symlink in the /tmp dir to be compliant with old
diff -u -w ../../gpm-1.19.6/src/libcurses.c ./libcurses.c
--- ../../gpm-1.19.6/src/libcurses.c Sun Dec 30 00:56:34 2001
+++ ./libcurses.c Fri Dec 21 16:13:05 2001
@@ -93,7 +93,7 @@
/* JD patch 11/08/1998 */
#define MAXNBPREVCHAR 4 /* I don't think more is usefull, JD */
static int nbprevchar=0, prevchar[MAXNBPREVCHAR];
- extern gpm_convert_event(char *data, Gpm_Event *event);
+ extern int gpm_convert_event(char *data, Gpm_Event *event);
int c; unsigned char mdata[4];
/* JD patch 11/08/1998 */
diff -u -w ../../gpm-1.19.6/src/liblow.c ./liblow.c
--- ../../gpm-1.19.6/src/liblow.c Sun Dec 30 00:56:34 2001
+++ ./liblow.c Fri Dec 21 16:13:11 2001
@@ -529,7 +529,7 @@
#define DELAY_MS 100
static struct timeval to={0,DELAY_MS*1000};
static fd_set selSet;
- extern gpm_convert_event(unsigned char *data, Gpm_Event *event);
+ extern int gpm_convert_event(unsigned char *data, Gpm_Event *event);
int c; unsigned char mdata[4];
if (nbprevchar) /* if there are some consumed char ... */
diff -u -w ../../gpm-1.19.6/src/mice.c ./mice.c
--- ../../gpm-1.19.6/src/mice.c Sun Dec 30 00:56:34 2001
+++ ./mice.c Sat Dec 29 21:35:11 2001
@@ -93,7 +93,7 @@
static int parse_argv(argv_helper *info, int argc, char **argv)
{
- int i, j, errors = 0;
+ int i, j=0, errors = 0;
long l;
argv_helper *p;
char *s, *t;
@@ -595,8 +605,8 @@
* and then switch to 4-byte mode.
*/
static unsigned char prev=0;
static Gpm_Type *mytype=mice; /* it is the first */
- unsigned char b;
+ unsigned char b = 0;
if (data[1]==GPM_EXTRA_MAGIC_1 && data[2]==GPM_EXTRA_MAGIC_2)
{
@@ -665,10 +675,10 @@
int treshold;
} wcmodell[] = {
/* ModellName Magic MaxX MaxY Border Tresh */
- "UltraPad" , "UD", 0, 0, 250, 20,
- /* "Intuos" , "GD", 0, 0, 0, 20, not yet supported */
- "PenPartner", "CT", 0, 0, 0, 20,
- "Graphire" , "ET", 5103, 3711, 0, 20
+ {"UltraPad" , "UD", 0, 0, 250, 20},
+ /* {"Intuos" , "GD", 0, 0, 0, 20}, not yet supported */
+ {"PenPartner", "CT", 0, 0, 0, 20},
+ {"Graphire" , "ET", 5103, 3711, 0, 20}
};
#define IsA(m) ((WacomModell==(-1))? 0:!strcmp(#m,wcmodell[WacomModell].name))
@@ -2045,6 +2107,7 @@
* The first three strings are the name, an help line, a long name (if any)
* Then come the functions: the decoder and the initializazion function
* (called I_* and M_*)
+ * Flags:
* Follows an array of four bytes: it is the protocol-identification, based
* on the first two bytes of a packet: if
* "((byte0 & proto[0]) == proto[1]) && ((byte1 & proto[2]) == proto[3])"
diff -u -w ../../gpm-1.19.6/src/mouse-test.c ./mouse-test.c
--- ../../gpm-1.19.6/src/mouse-test.c Sun Dec 30 00:56:34 2001
+++ ./mouse-test.c Sat Dec 29 21:55:30 2001
@@ -335,7 +371,7 @@
devcount);
printf("Please move the mouse. Press any key when done\r\n"
" (You can specify your device name on cmdline, in order to\r\n"
- " avoid this step\r\n. Different baud rates are tried at "
+ " avoid this step.)\r\n Different baud rates are tried at "
"different times\r\n");
timeout.tv_sec=10; /* max test time */
@@ -375,7 +436,7 @@
}
}
- } /* devcount>1 */
+ } /* while(devcount>1) */
mousefd=devlist->fd;
mousename=devlist->name;
diff -u -w ../../gpm-1.19.6/src/synaptics.c ./synaptics.c
--- ../../gpm-1.19.6/src/synaptics.c Sun Dec 30 00:56:34 2001
+++ ./synaptics.c Sat Dec 29 21:20:17 2001
@@ -212,48 +238,49 @@
static param_data_type param_data [] = {
/* enabling configuration parameters */
- { "edge_motion_enabled", Flag_Param, &edge_motion_enabled },
- { "edge_motion_speed_enabled", Flag_Param, &edge_motion_speed_enabled },
- { "corner_taps_enabled", Flag_Param, &corner_taps_enabled },
- { "taps_enabled", Flag_Param, &taps_enabled },
- { "pressure_speed_enabled", Flag_Param, &pressure_speed_enabled },
- { "tossing_enabled", Flag_Param, &tossing_enabled },
- { "does_toss_use_static_speed", Flag_Param, &does_toss_use_static_speed },
+ { "edge_motion_enabled", Flag_Param, {&edge_motion_enabled }},
+ { "edge_motion_speed_enabled", Flag_Param, {&edge_motion_speed_enabled }},
+ { "corner_taps_enabled", Flag_Param, {&corner_taps_enabled }},
+ { "taps_enabled", Flag_Param, {&taps_enabled }},
+ { "pressure_speed_enabled", Flag_Param, {&pressure_speed_enabled }},
+ { "tossing_enabled", Flag_Param, {&tossing_enabled }},
+ { "does_toss_use_static_speed", Flag_Param, {&does_toss_use_static_speed }},
/* pressure induced speed related configuration parameters */
- { "low_pressure", Integer_Param, &low_pressure },
- { "speed_up_pressure", Integer_Param, &speed_up_pressure },
- { "pressure_factor", Float_Param, &pressure_factor },
- { "standard_speed_factor", Float_Param, &standard_speed_factor },
+ { "low_pressure", Integer_Param, {&low_pressure }},
+ { "speed_up_pressure", Integer_Param, {&speed_up_pressure }},
+ { "pressure_factor", Float_Param, {&pressure_factor }},
+ { "standard_speed_factor", Float_Param, {&standard_speed_factor }},
/* toss/catch related parameters */
- { "min_toss_time", Integer_Param, &min_toss_time },
- { "max_toss_time", Integer_Param, &max_toss_time },
- { "toss_cleanup_time", Integer_Param, &toss_cleanup_time },
- { "min_toss_dist", Integer_Param, &min_toss_dist },
- { "static_toss_speed", Integer_Param, &static_toss_speed },
- { "toss_speed_factor", Float_Param, &toss_speed_factor },
+ { "min_toss_time", Integer_Param, {&min_toss_time }},
+ { "max_toss_time", Integer_Param, {&max_toss_time }},
+ { "toss_cleanup_time", Integer_Param, {&toss_cleanup_time }},
+ { "min_toss_dist", Integer_Param, {&min_toss_dist }},
+ { "static_toss_speed", Integer_Param, {&static_toss_speed }},
+ { "toss_speed_factor", Float_Param, {&toss_speed_factor }},
/* edge motion related configuration parameters */
- { "edge_speed", Integer_Param, &edge_speed },
+ { "edge_speed", Integer_Param, {&edge_speed }},
/* corner tap actions */
- { "upper_left_action", Corner_Param, &corner_actions [0] },
- { "lower_left_action", Corner_Param, &corner_actions [1] },
- { "upper_right_action", Corner_Param, &corner_actions [2] },
- { "lower_right_action", Corner_Param, &corner_actions [3] },
+ { "upper_left_action", Corner_Param, {&corner_actions [0] }},
+ { "lower_left_action", Corner_Param, {&corner_actions [1] }},
+ { "upper_right_action", Corner_Param, {&corner_actions [2] }},
+ { "lower_right_action", Corner_Param, {&corner_actions [3] }},
/* use wmode */
- { "use_wmode", Flag_Param, &use_wmode },
- { "finger_threshold", Integer_Param, &finger_threshold },
- { "tap_lower_limit", Integer_Param, &tap_lower_limit },
- { "tap_upper_limit", Integer_Param, &tap_upper_limit },
- { "tap_range", Integer_Param, &tap_range },
- { "tap_interval", Integer_Param, &tap_interval },
- { "drag_lock", Flag_Param, &drag_lock },
- { "multiple_click_delay", Integer_Param, &multiple_click_delay },
+ { "use_wmode", Flag_Param, {&use_wmode }},
+ { "finger_threshold", Integer_Param, {&finger_threshold }},
+ { "tap_lower_limit", Integer_Param, {&tap_lower_limit }},
+ { "tap_upper_limit", Integer_Param, {&tap_upper_limit }},
+ { "tap_range", Integer_Param, {&tap_range }},
+ { "tap_interval", Integer_Param, {&tap_interval }},
+ { "drag_lock", Flag_Param, {&drag_lock }},
+ { "multiple_click_delay", Integer_Param, {&multiple_click_delay }},
/* end of list */
- { NULL, Flag_Param, NULL }
+ { NULL, Flag_Param, {NULL }}
};
/*
** The information returned in the identification packet.
+** STIG page 10
*/
typedef struct {
int info_model_code;
@@ -264,7 +291,19 @@
/*
** The information returned in the model ID packet.
+** STIG page 11
*/
+
+#define INFO_ROT180_BITS 0x800000 /* bit 23 */
+#define INFO_PORTRAIT_BITS 0x400000 /* bit 22 */
+#define INFO_SENSOR_BITS 0x3F0000 /* bit 16-21 */
+#define INFO_HARDWARE_BITS 0x00FE00 /* bit 9-15 */
+#define INFO_NEW_ABS_BITS 0x000080 /* bit 7 */
+#define INFO_CAP_PEN_BITS 0x000040 /* bit 6 */
+#define INFO_SIMPLE_CMD_BITS 0x000020 /* bit 5 */
+#define INFO_GEOMETRY_BITS 0x00000F /* bit 0-3 */
+
+
typedef struct {
int info_rot180;
int info_portrait;
@@ -276,83 +315,37 @@
int info_geometry;
} model_id_type;
-/*
-** The information returned in the extended capibility packet.
-*/
-
-typedef struct {
- int cap_ext;
- int cap_sleep;
- int cap_four_button;
- int cap_multi_finger;
- int cap_palm_detect;
-} ext_cap_type;
-
-/*
-** The format of the reported absolute data.
-*/
-typedef struct {
- int gesture;
- int finger;
- int left;
- int middle;
- int down;
- int right;
- int x;
- int y;
- int pressure;
-} report_type;
-
-
-/*
-** A location record.
-*/
-typedef struct {
- int x;
- int y;
-} location_type;
-
/*
-** The information in the mode byte.
+** The sensor types as of STIG 2.5
+** Page 11
*/
-#define RELATIVE_MODE 0x00
-#define ABSOLUTE_MODE 0x80
-#define LOW_REPORT_RATE 0x00
-#define HIGH_REPORT_RATE 0x40
-#define USE_1200_BAUD 0x00
-#define USE_9600_BAUD 0x08
-#define PS2_NO_SLEEP 0x00
-#define PS2_SLEEP 0x08
-#define NORMAL_REPORT 0x00
-#define EXTENDED_REPORT 0x02
-#define REPORT_W_OFF 0x00
-#define REPORT_W_ON 0x01
-
-
static char *model_names [] = {
"Unknown",
- "Standard TouchPad",
- "Mini Module",
- "Super Module",
+ "Standard TouchPad (TM41xx134)",
+ "Mini Module (TM41xx156)",
+ "Super Module (TM41xx180)",
"",
"",
"",
- "Flexible pad",
- "Ultra-thin Module",
- "Wide pad Module",
+ "Flexible pad (discontinued)",
+ "Ultra-thin Module (TM41xx220)",
+ "Wide pad Module (TW41xx230)",
"",
- "Stamp pad Module",
- "Sub-mini Module",
- "TBD",
+ "Stamp pad Module (TM41xx240)",
+ "Sub-mini Module (TM41xx140)",
+ "MultiSwitch module (TBD)",
"",
- "Advanced Technology pad",
+ "Advanced Technology pad (TM41xx221)",
"Ultra-thin Module, connector reversed"
};
/*
** Define the information known about a sensor.
+** STIG page 14.
+** Resolution only apply for absolute mode.
+** For older models the default resulotion is 85x94.
*/
typedef struct {
char *model;
@@ -381,6 +374,76 @@
/*
+** The information returned in the extended capability packet.
+** STIG page 15
+*/
+
+#define EXT_CAP_EXTENDED 0x8000 /* Bit 15 */
+#define EXT_CAP_SLEEP 0x0010 /* Bit 4 */
+#define EXT_CAP_FOUR_BUTTON 0x0008 /* Bit 3 */
+#define EXT_CAP_MULTI_FINGER 0X0002 /* Bit 1 */
+#define EXT_CAP_PALM_DETECT 0X0001 /* Bit 0 */
+
+typedef struct {
+ int cap_ext;
+ int cap_sleep;
+ int cap_four_button;
+ int cap_multi_finger;
+ int cap_palm_detect;
+} ext_cap_type;
+
+
+
+/*
+** The information in the mode byte.
+** STIG Page 17
+*/
+#define ABSOLUTE_MODE 0x80 /* Bit 7 set */
+#define RELATIVE_MODE 0x00 /* Bit */
+#define HIGH_REPORT_RATE 0x40 /* Bit 6 set 0 = 80 packages per second */
+#define LOW_REPORT_RATE 0x00 /* Bit 40 packages per second */
+#define USE_9600_BAUD 0x08 /* Bit 3 for serial protocol */
+#define USE_1200_BAUD 0x00 /* Bit */
+#define PS2_SLEEP 0x08 /* Bit 3 for ps2 protocol */
+#define PS2_NO_SLEEP 0x00 /* Bit */
+#define NO_TAPDRAG_GESTURE 0x04 /* Bit 2 for model version >= 4 */
+#define TAPDRAG_GESTURE 0x00 /* Bit */
+#define EXTENDED_REPORT 0x02 /* Bit 1 for serial absolute mode only */
+#define NORMAL_REPORT 0x00 /* Bit */
+#define REPORT_W_ON 0x01 /* Bit 0 set */
+#define REPORT_W_OFF 0x00 /* Bit */
+
+
+
+/*
+** The format of the reported absolute data.
+*/
+typedef struct {
+ int gesture;
+ int finger;
+ int left;
+ int middle;
+ int down;
+ int right;
+ int x;
+ int y;
+ int pressure;
+} report_type;
+
+
+/*
+** A location record.
+** This is needed to make an average over several packages,
+** because the reported x,y might not be that accurate.
+*/
+typedef struct {
+ int x;
+ int y;
+} location_type;
+
+
+
+/*
** Parameters for controlling the touchpad.
*/
/* touchpad information */
@@ -417,7 +481,8 @@
**
****************************************************************************/
+/* Get model name, STIG page 11 */
static char *syn_model_name (int sensor)
{
if (sensor < 0 || sensor > 16) {
return "Reserved";
@@ -427,24 +492,27 @@
}
-/* convert the model id from bits to values */
+/* convert the model id from bits to values
+* STIG page 11
+*/
void extract_model_id_info (int model_int, model_id_type *model)
{
- model->info_rot180 = check_bits (model_int, 0x00800000);
- model->info_portrait = check_bits (model_int, 0x00400000);
- model->info_sensor = (model_int & 0x003f0000) >> 16;
- model->info_hardware = (model_int & 0x0000fe00) >> 8;
- model->info_new_abs = check_bits (model_int, 0x00000080);
- model->info_cap_pen = check_bits (model_int, 0x00000040);
- model->info_simple_cmd = check_bits (model_int, 0x00000020);
- model->info_geometry = model_int & 0x0000000f;
+ model->info_rot180 = check_bits (model_int, INFO_ROT180_BITS);
+ model->info_portrait = check_bits (model_int, INFO_PORTRAIT_BITS);
+ model->info_sensor = (model_int & INFO_SENSOR_BITS) >> 16;
+ model->info_hardware = (model_int & INFO_HARDWARE_BITS) >> 8;
+ model->info_new_abs = check_bits (model_int, INFO_NEW_ABS_BITS);
+ model->info_cap_pen = check_bits (model_int, INFO_CAP_PEN_BITS);
+ model->info_simple_cmd = check_bits (model_int, INFO_SIMPLE_CMD_BITS);
+ model->info_geometry = (model_int & INFO_GEOMETRY_BITS);
}
-/* Translate the reported data into a record for processing */
+/* Translate the reported data into a record for processing
+ * STIG page 14*/
static sensor_info_type *syn_get_sensor_info (int sensor_id)
{
- if (sensor_id < 0 || sensor_id > 12) {
+ if (sensor_id < 0 || 12 < sensor_id ) {
return &sensor_info [0];
} else {
return &sensor_info [sensor_id];
@@ -519,14 +589,14 @@
int edges)
{
gpm_debug_log (LOG_DEBUG,
- "\r%c%c%c%c%c %4dx%-4d %3d %c%c%c%c %c%c",
+ "\rSynps2: %c%c%c%c%c %4dx%-4d %3d %c%c%c%c %c%c",
report.gesture ? 'g' : '-',
report.finger ? 'f' : '-',
report.left ? 'l' : '-',
report.middle ? 'm' : '-',
-
report.right ? 'r' : '-',
+
report.x, report.y, report.pressure,
edges & LEFT_EDGE ? 'l' : '-',
edges & RIGHT_EDGE ? 'r' : '-',
@@ -637,6 +707,7 @@
last_edges = edges;
packet_num++;
} else {
+ /* No finger on the pad */
/* handle the tossing action if enabled */
if (tossing_enabled && !was_tossing &&
last_finger &&
@@ -1045,66 +1120,127 @@
/* Adapted from tpconfig.c by C. Scott Ananian */
/*------------------------------------------------------------------------*/
+/* PS2 Synaptics is using LSB, STIG page 29.
+**
+** After power on or reset:
+** 100 samples per second
+** Resolution is 4 counts per mm
+** Scaling 1:1
+** Stream mode is selected
+** Data reporting is disabled
+** Absolte mode is disabled
+*/
+
+/* Normal ps2 commands, Command set is on STIG page 33 */
+#define PS2_RESET 0xFF /* Reset */
+#define PS2_RESEND 0xFE /* Resend command */
+#define PS2_ERROR 0xFC /* Error, after an resend or disconnect*/
+#define PS2_ACK 0xFA /* Command acknowledge */
+#define PS2_SAMPLE_RATE 0xF3 /* Set sample rate to the following byte */
+#define PS2_READ_DEVICE 0xF2 /* Read device type */
+#define PS2_READY 0xAA /* Send after a calibration or ERROR */
+#define PS2_STATUS_REQ 0xE9 /* Send status request */
+#define PS2_RESOLUTION 0xE8 /* Set resolution, to following transmitted byte */
+#define PS2_SCALE_11 0xE6 /* Set scale to 1:1 */
+
+
+/* Additional commands*/
+#define PS2_SYN_CMD 0xE8 /* Four of these each with an following byte encodes a command*/
+#define PS2_SYN_INERT 0xE6 /* This ps2 command is ignored by synaptics */
+#define PS2_SYN_STATUS_OK 0x47 /* Special synaptics Status report is recognized */
+#define PS2_SYN_IDCODE 0x00
+#define PS2_SYN_SET_MODE 0x14 /* Set the mode instead of sample rate (used after a sample rate cmd) */
+
+
+/* These are the commands that can be given (encoded) by PS_SYN_CMD */
+#define PS2_SYN_CMD_IDENTIFY 0x00 /* Identify Touchpad */
+#define PS2_SYN_CMD_MODES 0x01 /* Read Touchpad Modes */
+#define PS2_SYN_CMD_CAPABILITIES 0x02 /* Read capabilities */
+#define PS2_SYN_CMD_MODEL_ID 0x03 /* Read model id */
+#define PS2_SYN_CMD_SERIAL_NO_P 0x06 /* Read serial number prefix */
+#define PS2_SYN_CMD_SERIAL_NO_S 0x07 /* Read serial number suffix */
+#define PS2_SYN_CMD_RESOLUTIONS 0x08 /* Read resolutions */
+
+
+
+
typedef unsigned char byte;
+/* read a byte from the ps/2 port */
+static byte ps2_getbyte(int fd)
+{
+ byte b;
+
+ read(fd, &b, 1);
+ return b;
+}
+
+
/* write a byte to the ps/2 port, handling ACK */
static void ps2_putbyte(int fd,
byte b)
{
byte ack;
+
write(fd, &b, 1);
read(fd, &ack, 1);
- if (ack != 0xFA)
+ /* Should check for resend code PS2_RESEND also */
+ if (ack != PS2_ACK)
gpm_debug_log (LOG_ERR,"Invalid ACK in synps2 initialization");
}
-/* read a byte from the ps/2 port */
-static byte ps2_getbyte(int fd)
-{
- byte b;
- read(fd, &b, 1);
- return b;
-}
-
-/* use the Synaptics extended ps/2 syntax to write a special command byte */
+/* use the Synaptics extended ps/2 syntax to write a special command byte
+* STIG page 36: Send exactly four PS2_SYN_CMD (which is otherwise ignored)
+* and after each a byte with the 2 first bits being the command (LSB). End it with
+* either PS2_SAMPLE_RATE or PS2_STATUS_REQ. It is hinted to send an inert command
+* first so not have five or more PS2_SYN_CMD by coincident.
+*/
static void ps2_send_cmd(int fd,
byte cmd)
{
int i;
+
/* initialize with 'inert' command */
- ps2_putbyte(fd, 0xE6);
+ ps2_putbyte(fd, PS2_SYN_INERT);
for (i=0; i<4; i++) {
- ps2_putbyte(fd, 0xE8);
+ ps2_putbyte(fd, PS2_SYN_CMD);
ps2_putbyte(fd, (cmd>>6)&0x3);
cmd<<=2;
}
}
-/* write 'cmd' to mode byte 1 */
+/* write 'cmd' to mode byte 1.
+ * See ps2_send_cmd */
static void ps2_set_mode1(int fd,
byte cmd)
{
ps2_send_cmd(fd, cmd);
- ps2_putbyte(fd, 0xF3);
+ ps2_putbyte(fd, PS2_SAMPLE_RATE);
ps2_putbyte(fd, 0x0A);
}
-/* write 'cmd' to mode byte 2 */
+/* write 'cmd' to mode byte 2
+ * See ps2_send_cmd. PS2_SR_SET_MODE stores the touchpad mode encoded in the
+ * four PS2_SYN_CMD commands
+ */
static void ps2_set_mode2(int fd,
byte cmd)
{
ps2_send_cmd(fd, cmd);
- ps2_putbyte(fd, 0xF3);
- ps2_putbyte(fd, 0x14);
+ ps2_putbyte(fd, PS2_SAMPLE_RATE);
+ ps2_putbyte(fd, PS2_SYN_SET_MODE);
}
-/* read three byte status ('a','b','c') corresponding to register 'cmd' */
+/* read three byte status ('a','b','c') corresponding to register 'cmd'
+* Special status request for synatips is given after a cmd.
+* Byte b is PS2_SYN_STATUS_OK to recognize a synaptics
+*/
static void ps2_status_rqst(int fd,
byte cmd,
byte *bytes)
{
ps2_send_cmd(fd, cmd);
- ps2_putbyte(fd, 0xE9);
+ ps2_putbyte(fd, PS2_STATUS_REQ);
bytes [0]=ps2_getbyte(fd);
bytes [1]=ps2_getbyte(fd);
bytes [2]=ps2_getbyte(fd);
@@ -1117,8 +1253,8 @@
{
byte bytes [3];
- ps2_status_rqst (fd, 0x00, bytes);
- if (bytes [1] != 0x47) {
+ ps2_status_rqst (fd, PS2_SYN_CMD_IDENTIFY, bytes);
+ if (bytes [1] != PS2_SYN_STATUS_OK) {
printf ("PS/2 device doesn't appear to be a synaptics touchpad\n");
} else {
info->info_minor = bytes [0];
@@ -1128,6 +1264,36 @@
}
+
+
+/* read the extended capibility from the ps2 touchpad, STIG page 15 */
+static void syn_read_ps2_cap (int fd,
+ ext_cap_type *cap)
+{
+ unsigned char bytes [3];
+ ps2_status_rqst (fd, PS2_SYN_CMD_CAPABILITIES, bytes);
+
+ if (bytes [1] != PS2_SYN_STATUS_OK) {
+ printf ("PS/2 device doesn't appear to be a synaptics touchpad\n");
+ }
+
+ cap->cap_ext = check_bits (bytes[0], EXT_CAP_EXTENDED >> 16);
+
+ /* If the extended bit is not set it should be assumed that neither of the
+ other capabilites is availible.*/
+ if(cap->cap_ext){
+ cap->cap_sleep = check_bits (bytes[2], EXT_CAP_SLEEP);
+ cap->cap_four_button = check_bits (bytes[2], EXT_CAP_FOUR_BUTTON);
+ cap->cap_multi_finger = check_bits (bytes[2], EXT_CAP_MULTI_FINGER);
+ cap->cap_palm_detect = check_bits (bytes[2], EXT_CAP_PALM_DETECT);
+ }else{
+ cap->cap_sleep = 0;
+ cap->cap_four_button = 0;
+ cap->cap_multi_finger = 0;
+ cap->cap_palm_detect = 0;
+ }
+}
+
/* read the model_id from the ps2 touchpad */
static void syn_read_ps2_model_id (int fd,
model_id_type *model)
@@ -1135,75 +1301,97 @@
unsigned char bytes [3];
int model_int;
- ps2_status_rqst (fd, 0x03, bytes);
+ ps2_status_rqst (fd, PS2_SYN_CMD_MODEL_ID, bytes);
model_int = ((bytes [0] << 16) |
(bytes [1] << 8) |
- bytes [2]);
+ (bytes [2]));
extract_model_id_info (model_int, model);
}
-/* read the extended capibility from the ps2 touchpad */
-static void syn_read_ps2_cap (int fd,
- ext_cap_type *cap)
-{
- unsigned char bytes [3];
- ps2_status_rqst (fd, 0x02, bytes);
- cap->cap_ext = check_bits (bytes[0], 0x80);
- cap->cap_sleep = check_bits (bytes[2], 0x10);
- cap->cap_four_button = check_bits (bytes[2], 0x08);
- cap->cap_multi_finger = check_bits (bytes[2], 0x02);
- cap->cap_palm_detect = check_bits (bytes[2], 0x01);
-}
/* read the modes from the touchpad (in ps/2 format) */
static void read_ps2_modes (int fd)
{
unsigned char bytes [3];
- ps2_status_rqst (fd, 0x01, bytes);
+ ps2_status_rqst (fd, PS2_SYN_CMD_MODES, bytes);
#if DEBUG_SENT_DATA
gpm_debug_log (LOG_DEBUG,"PS/2 modes: %02X", bytes [2]);
#endif
}
+
+/*
+ * Translate the incomming data to an uniform report
+ *
+ */
+
+/* STIG page 42
+ * wmode = 0, newer version. Gesture, right and left are repeated.
+ *
+ * byte 0 | 1 | 0 | Finger | Reserved | 0 | Gesture | Right | Left |
+ * byte 1 | y-pos 11-8 | x-pos 11-8 |
+ * byte 2 | z pressure 0-7 |
+ * byte 3 | 1 | 1 | y-pos 12 | x-pos 12 | 0 | Gesture | Right | Left |
+ * byte 4 | x - pos 0-7 |
+ * byte 5 | y - pos 0-7 |
+ *
+ * STIG page 43
+ * wmode = 0, old version < 3.2.
+ * Second is a second gesture!?
+ *
+ * byte 0 | 1 | 1 | z-pres 6-7 | Second | Gesture | Right | Left |
+ * byte 1 | finger | 0 | 0 | x-pos 12-8 |
+ * byte 2 | x-pos 0-7 |
+ * byte 3 | 1 | 0 | z-pressure 0-5 |
+ * byte 4 |Reserved | 0 | 0 | y - pos 8-12 |
+ * byte 5 | y - pos 0-7 |
+ *
+
+ */
+
/* Translate the reported data into a record for processing */
static void syn_translate_ps2_report (unsigned char *data,
report_type *report)
{
int i;
- if (((data [0] & 0xc8) == 0x80) &&
- ((data [3] & 0xc8) == 0xc0) &&
- ((data [0] & 0x0f) == (data [3] & 0x0f))) {
+ /* Check that this is indead an absolute 6 byte new version packet*/
+ if (((data [0] & 0xc8) == 0x80) && /* Check static in byte 0 */
+ ((data [3] & 0xc8) == 0xc0) && /* Check static in byte 3 */
+ ((data [0] & 0x0F) == (data [3] & 0x0F))) { /* check repeated date */
report->gesture = check_bits (data [0], 0x04);
report->finger = check_bits (data [0], 0x20);
report->left = check_bits (data [0], 0x01);
report->middle = 0;
report->right = check_bits (data [0], 0x02);
report->x = (((data [1] & 0x0f) << 8) |
((data [3] & 0x10) << 8) |
- data [4]);
- report->y = (((data [1] & 0xf0) << 4) |
+ ((data [4])));
+ report->y = (((data [1] & 0xF0) << 4) |
((data [3] & 0x20) << 7) |
- data [5]);
+ ((data [5])));
report->pressure = data [2];
- } else if (((data [0] & 0xc0) == 0xc0) &&
- ((data [1] & 0x60) == 0x00) &&
- ((data [3] & 0xc0) == 0x80) &&
- ((data [4] & 0x60) == 0x00)) {
+ } /* Old style packet maybe */
+ else if (((data [0] & 0xC0) == 0xC0) && /* Static in byte 0*/
+ ((data [1] & 0x60) == 0x00) && /* Static in byte 1*/
+ ((data [3] & 0xC0) == 0x80) && /* Static in byte 3*/
+ ((data [4] & 0x60) == 0x00)) { /* Static in byte 4*/
report->gesture = check_bits (data [0], 0x04);
report->finger = check_bits (data [1], 0x80);
report->left = check_bits (data [0], 0x01);
report->middle = 0;
report->right = check_bits (data [0], 0x02);
- report->x = (((data [1] & 0x1f) << 8) |
- data [2]);
+ report->x = (((data [1] & 0x1F) << 8) |
+ ((data [2])));
report->y = (((data [4] & 0x1f) << 8) |
- data [5]);
+ ((data [5])));
report->pressure = (((data [0] & 0x30) << 2 ) |
- (data [3] & 0x3f));
- } else {
- gpm_debug_log (LOG_NOTICE,"tossing PS/2 data: ");
+ ((data [3] & 0x3f)));
+ } else { /* Garbage or not
+ * The synaptics pad keeps sending data 1 sec after last touch
+ */
+ gpm_debug_log (LOG_NOTICE,"Garbage or tossing PS/2 data: ");
for (i = 0; i < 6; i++)
gpm_debug_log (LOG_NOTICE,"%02X ", data [i]);
report->gesture = 0;
@@ -1217,56 +1405,79 @@
}
}
+
+/* STIG page 42
+ * wmode = 1,
+ *
+ * byte 0 | 1 | 0 | W 2-3 | 0 | W 1 | Right | Left |
+ * byte 1 | y-pos 11-8 | x-pos 11-8 |
+ * byte 2 | z pressure 0-7 |
+ * byte 3 | 1 | 1 | y-pos 12 | x-pos 12 | 0 | W 0 | R/D | L/U |
+ * byte 4 | x - pos 0-7 |
+ * byte 5 | y - pos 0-7 |
+ *
+ */
+
static void syn_translate_ps2_wmode_report (unsigned char *data,
report_type *report)
{
int i;
- static int finger_timer = 0;
- static int gesture_timer = 0;
+ static int finger_on_pad_timer = 0;
+ static int time_to_forget_tap = 0;
static int gesture_delay = 0;
static int stroke_x;
static int stroke_y;
static int drag_locked = 0;
+ /* Check that it is an absolute packet */
if (((data[0] & 0xc8) == 0x80) && ((data[3] & 0xc8) == 0xc0)) {
- unsigned int w = ((data[3] & 0x04) >> 2) |
+
+ unsigned int w = (((data[3] & 0x04) >> 2) |
((data[0] & 0x04) >> 1) |
- ((data[0] & 0x30) >> 2);
+ ((data[0] & 0x30) >> 2));
report->left = check_bits (data[0], 0x01);
report->middle = check_bits (data[0] ^ data[3], 0x01);
report->down = check_bits (data[0] ^ data[3], 0x02);
report->right = check_bits (data[0], 0x02);
- report->x = (((data[1] & 0x0f) << 8) |
+ report->x = (((data[1] & 0x0F) << 8) |
((data[3] & 0x10) << 8) |
- data[4]);
- report->y = (((data[1] & 0xf0) << 4) |
+ ((data[4])));
+ report->y = (((data[1] & 0xF0) << 4) |
((data[3] & 0x20) << 7) |
- data[5]);
+ ((data[5])));
report->pressure = data[2];
report->finger = (data[2] > finger_threshold);
if (report->finger) {
- if (finger_timer == 0) { /* finger down */
+ if (finger_on_pad_timer == 0) { /* finger down for the first time */
stroke_x = report->x;
stroke_y = report->y;
}
- if (finger_timer < (tap_upper_limit * 80 / 1000)) finger_timer ++; /* don't want timer to overflow */
-
- if (gesture_timer > 0) gesture_timer = 1; /* dragging or consecutive tap, gesture to end with finger up */
+ /* don't want timer to overflow */
+ if (finger_on_pad_timer < (tap_upper_limit * 80 / 1000))
+ finger_on_pad_timer ++;
+
+ /* dragging or consecutive tap, gesture to end with finger up
+ * forget fast that there was a tap if this is not a part of a tap.*/
+ if (time_to_forget_tap > 0)
+ time_to_forget_tap = 1;
} else { /* interesting things happen when finger is up */
- /* tap determination */
- if ((finger_timer > (tap_lower_limit * 80 / 1000)) && /* minimum finger down time */
- (finger_timer < (tap_upper_limit * 80 / 1000)) && /* maximum finger down time */
+ /* tap determination: Was the finger long enough on the pad and not too
+ * long, while staying at the same place.
+ */
+ if ((finger_on_pad_timer > (tap_lower_limit * 80 / 1000)) && /* minimum finger down time */
+ (finger_on_pad_timer < (tap_upper_limit * 80 / 1000)) && /* maximum finger down time */
(distance((double)(stroke_x - report->x), /* maximum range for finger to drift while down */
(double)(stroke_y - report->y))
< sqr((double)tap_range))) {
/* not a consecutive tap? */
- if (gesture_timer == 0) gesture_delay = 0; /* right -> don't delay gesture */
+ if (time_to_forget_tap == 0)
+ gesture_delay = 0; /* right -> don't delay gesture */
else { /* a consecutive tap! */
gesture_delay = multiple_click_delay * 80 / 1000; /* delay gesture to create multiple click */
}
@@ -1274,28 +1485,32 @@
/* is drag locked */
if (drag_locked) {
drag_locked = 0; /* unlock it and don't gesture. */
- gesture_timer = 0;
- } else gesture_timer = tap_interval * 80 / 1000; /* setup gesture time to count down */
+ time_to_forget_tap = 0;
+ } else
+ time_to_forget_tap = tap_interval * 80 / 1000; /* setup gesture time to count down */
- } else {
+ } else { /* It was not a tap */
- /* a drag to lock? */
- if (drag_lock && (gesture_timer > 0) && (finger_timer >= (tap_upper_limit * 80 / 1000)))
+ /* a drag to lock? If user did a tap and quickly hold the finger longer than a tap.
+ */
+ if (drag_lock && (time_to_forget_tap > 0) && (finger_on_pad_timer >= (tap_upper_limit * 80 / 1000)))
drag_locked = 1;
- if (gesture_timer > 0) gesture_timer --;
+ if (time_to_forget_tap > 0) time_to_forget_tap --;
if (gesture_delay > 0) gesture_delay --;
}
- finger_timer = 0;
+ finger_on_pad_timer = 0;
}
- report->gesture = ((gesture_timer > 0) && (gesture_delay == 0)) || drag_locked;
+ report->gesture = ((time_to_forget_tap > 0) && (gesture_delay == 0)) || drag_locked;
report->left = (report->left || report->gesture);
- } else {
+ } else { /* Packet is garbage or not?? The synaptics pad keeps sending data 1
+ * sec after last touch,
+ */
gpm_debug_log (LOG_NOTICE,"tossing PS/2 data: ");
for (i = 0; i < 6; i++)
gpm_debug_log (LOG_NOTICE,"%02X ", data [i]);
@@ -1343,8 +1558,11 @@
{
report_type report;
- if (use_wmode) syn_translate_ps2_wmode_report (data, &report);
- else syn_translate_ps2_report (data, &report);
+ if (use_wmode)
+ syn_translate_ps2_wmode_report (data, &report);
+ else
+ syn_translate_ps2_report (data, &report);
+
syn_process_data (state, report);
}
@@ -1394,7 +1612,8 @@
syn_read_ps2_ident (fd, &ident);
syn_read_ps2_model_id (fd, &model);
syn_read_ps2_cap (fd, &cap);
- if (! (cap.cap_ext)) use_wmode = 0; /* wmode not support by the pad */
+ if (! (cap.cap_ext))
+ use_wmode = 0; /* wmode not support by the pad */
syn_process_config (ident, model);
/* select 6 byte packet, high packet rate, no-sleep */