From f56d238d28567c0c23270a72ff656255f4fd8e0d Mon Sep 17 00:00:00 2001 From: Peter Osterlund Date: Sun, 4 Apr 2004 22:23:08 +0200 Subject: [PATCH] Some changes to make supporting FreeBSD easier. From Arne Schwabe , with some editing by me. --- ps2comm.c | 32 +++++++++++++------------ ps2comm.h | 61 ++++++++++++++++++++++++----------------------- synaptics.c | 68 ++++++++++++++++++++++++++--------------------------- synaptics.h | 19 ++++++++------- synclient.c | 6 ++--- 5 files changed, 95 insertions(+), 91 deletions(-) diff --git a/ps2comm.c b/ps2comm.c index 45c82c8..baee66b 100644 --- a/ps2comm.c +++ b/ps2comm.c @@ -28,6 +28,7 @@ #include "xf86_OSproc.h" #include "ps2comm.h" +#include "synaptics.h" /* acknowledge for commands and parameter */ #define PS2_ACK 0xFA @@ -314,27 +315,27 @@ synaptics_model_id(int fd, unsigned long int *model_id) * see also the SYN_CAP_* macros */ Bool -synaptics_capability(int fd, unsigned long int *capability, unsigned long int *ext_capab) +synaptics_capability(int fd, struct synapticshw *synhw) { byte cap[3]; DBG(ErrorF("Read capabilites...\n")); - *ext_capab = 0; + synhw->ext_cap = 0; if ((ps2_send_cmd(fd, SYN_QUE_CAPABILITIES) == Success) && (ps2_getbyte(fd, &cap[0]) == Success) && (ps2_getbyte(fd, &cap[1]) == Success) && (ps2_getbyte(fd, &cap[2]) == Success)) { - *capability = (cap[0] << 16) | (cap[1] << 8) | cap[2]; - DBG(ErrorF("capability %06X\n", *capability)); - if (SYN_CAP_VALID(*capability)) { - if (SYN_EXT_CAP_REQUESTS(*capability)) { + synhw->capabilities = (cap[0] << 16) | (cap[1] << 8) | cap[2]; + DBG(ErrorF("capabilities %06X\n", synhw->capabilities)); + if (SYN_CAP_VALID(*synhw)) { + if (SYN_EXT_CAP_REQUESTS(*synhw)) { if ((ps2_send_cmd(fd, SYN_QUE_EXT_CAPAB) == Success) && (ps2_getbyte(fd, &cap[0]) == Success) && (ps2_getbyte(fd, &cap[1]) == Success) && (ps2_getbyte(fd, &cap[2]) == Success)) { - *ext_capab = (cap[0] << 16) | (cap[1] << 8) | cap[2]; - DBG(ErrorF("ext-capability %06X\n", *ext_capab)); + synhw->ext_cap = (cap[0] << 16) | (cap[1] << 8) | cap[2]; + DBG(ErrorF("ext-capability %06X\n", synhw->ext_cap)); } else { DBG(ErrorF("synaptics says, that it has extended-capabilities, " "but I cannot read them.")); @@ -353,19 +354,20 @@ synaptics_capability(int fd, unsigned long int *capability, unsigned long int *e * See also the SYN_ID_* macros */ Bool -synaptics_identify(int fd, unsigned long int *ident) +synaptics_identify(int fd, struct synapticshw *synhw) { byte id[3]; DBG(ErrorF("Identify Touchpad...\n")); + synhw->identity = 0; if ((ps2_send_cmd(fd, SYN_QUE_IDENTIFY) == Success) && (ps2_getbyte(fd, &id[0]) == Success) && (ps2_getbyte(fd, &id[1]) == Success) && (ps2_getbyte(fd, &id[2]) == Success)) { - *ident = (id[0] << 16) | (id[1] << 8) | id[2]; - DBG(ErrorF("ident %06X\n", *ident)); - if (SYN_ID_IS_SYNAPTICS(*ident)) { + synhw->identity = (id[0] << 16) | (id[1] << 8) | id[2]; + DBG(ErrorF("ident %06X\n", synhw->identity)); + if (SYN_ID_IS_SYNAPTICS(*synhw)) { DBG(ErrorF("...done.\n")); return Success; } @@ -416,7 +418,7 @@ SynapticsDisableDevice(int fd) Bool QueryIsSynaptics(int fd) { - unsigned long id = 0; + struct synapticshw synhw; int i; for (i = 0; i < 3; i++) { @@ -426,10 +428,10 @@ QueryIsSynaptics(int fd) xf86WaitForInput(fd, 20000); xf86FlushInput(fd); - if (synaptics_identify(fd, &id) == Success) { + if (synaptics_identify(fd, &synhw) == Success) { return TRUE; } else { - ErrorF("Query no Synaptics: %06X\n", id); + ErrorF("Query no Synaptics: %06X\n", synhw.identity); return FALSE; } } diff --git a/ps2comm.h b/ps2comm.h index 8450151..326e4b1 100644 --- a/ps2comm.h +++ b/ps2comm.h @@ -9,40 +9,40 @@ #define SYN_BIT_W_MODE (1 << 0) /* synaptics model ID bits */ -#define SYN_MODEL_ROT180(m) ((m) & (1 << 23)) -#define SYN_MODEL_PORTRAIT(m) ((m) & (1 << 22)) -#define SYN_MODEL_SENSOR(m) (((m) >> 16) & 0x3f) -#define SYN_MODEL_HARDWARE(m) (((m) >> 9) & 0x7f) -#define SYN_MODEL_NEWABS(m) ((m) & (1 << 7)) -#define SYN_MODEL_PEN(m) ((m) & (1 << 6)) -#define SYN_MODEL_SIMPLIC(m) ((m) & (1 << 5)) -#define SYN_MODEL_GEOMETRY(m) ((m) & 0x0f) +#define SYN_MODEL_ROT180(synhw) ((synhw).model_id & (1 << 23)) +#define SYN_MODEL_PORTRAIT(synhw) ((synhw).model_id & (1 << 22)) +#define SYN_MODEL_SENSOR(synhw) (((synhw).model_id >> 16) & 0x3f) +#define SYN_MODEL_HARDWARE(synhw) (((synhw).model_id >> 9) & 0x7f) +#define SYN_MODEL_NEWABS(synhw) ((synhw).model_id & (1 << 7)) +#define SYN_MODEL_PEN(synhw) ((synhw).model_id & (1 << 6)) +#define SYN_MODEL_SIMPLIC(synhw) ((synhw).model_id & (1 << 5)) +#define SYN_MODEL_GEOMETRY(synhw) ((synhw).model_id & 0x0f) /* synaptics capability bits */ -#define SYN_CAP_EXTENDED(c) ((c) & (1 << 23)) -#define SYN_CAP_PASSTHROUGH(c) ((c) & (1 << 7)) -#define SYN_CAP_SLEEP(c) ((c) & (1 << 4)) -#define SYN_CAP_FOUR_BUTTON(c) ((c) & (1 << 3)) -#define SYN_CAP_MULTIFINGER(c) ((c) & (1 << 1)) -#define SYN_CAP_PALMDETECT(c) ((c) & (1 << 0)) -#define SYN_CAP_VALID(c) ((((c) & 0x00ff00) >> 8) == 0x47) -#define SYN_EXT_CAP_REQUESTS(c) (((c) & 0x700000) == 0x100000) -#define SYN_CAP_MULTI_BUTTON_NO(ec) (((ec) & 0x00f000) >> 12) +#define SYN_CAP_EXTENDED(synhw) ((synhw).capabilities & (1 << 23)) +#define SYN_CAP_PASSTHROUGH(synhw) ((synhw).capabilities & (1 << 7)) +#define SYN_CAP_SLEEP(synhw) ((synhw).capabilities & (1 << 4)) +#define SYN_CAP_FOUR_BUTTON(synhw) ((synhw).capabilities & (1 << 3)) +#define SYN_CAP_MULTIFINGER(synhw) ((synhw).capabilities & (1 << 1)) +#define SYN_CAP_PALMDETECT(synhw) ((synhw).capabilities & (1 << 0)) +#define SYN_CAP_VALID(synhw) ((((synhw).capabilities & 0x00ff00) >> 8) == 0x47) +#define SYN_EXT_CAP_REQUESTS(synhw) (((synhw).capabilities & 0x700000) == 0x100000) +#define SYN_CAP_MULTI_BUTTON_NO(synhw) (((synhw).ext_cap & 0x00f000) >> 12) /* synaptics modes query bits */ -#define SYN_MODE_ABSOLUTE(m) ((m) & (1 << 7)) -#define SYN_MODE_RATE(m) ((m) & (1 << 6)) -#define SYN_MODE_BAUD_SLEEP(m) ((m) & (1 << 3)) -#define SYN_MODE_DISABLE_GESTURE(m) ((m) & (1 << 2)) -#define SYN_MODE_PACKSIZE(m) ((m) & (1 << 1)) -#define SYN_MODE_WMODE(m) ((m) & (1 << 0)) -#define SYN_MODE_VALID(m) (((m) & 0xffff00) == 0x3B47) +#define SYN_MODE_ABSOLUTE(synhw) ((synhw).model_id & (1 << 7)) +#define SYN_MODE_RATE(synhw) ((synhw).model_id & (1 << 6)) +#define SYN_MODE_BAUD_SLEEP(synhw) ((synhw).model_id & (1 << 3)) +#define SYN_MODE_DISABLE_GESTURE(synhw) ((synhw).model_id & (1 << 2)) +#define SYN_MODE_PACKSIZE(synhw) ((synhw).model_id & (1 << 1)) +#define SYN_MODE_WMODE(synhw) ((synhw).model_id & (1 << 0)) +#define SYN_MODE_VALID(synhw) (((synhw).model_id & 0xffff00) == 0x3B47) /* synaptics identify query bits */ -#define SYN_ID_MODEL(i) (((i) >> 4) & 0x0f) -#define SYN_ID_MAJOR(i) ((i) & 0x0f) -#define SYN_ID_MINOR(i) (((i) >> 16) & 0xff) -#define SYN_ID_IS_SYNAPTICS(i) ((((i) >> 8) & 0xff) == 0x47) +#define SYN_ID_MODEL(synhw) (((synhw).identity >> 4) & 0x0f) +#define SYN_ID_MAJOR(synhw) ((synhw).identity & 0x0f) +#define SYN_ID_MINOR(synhw) (((synhw).identity >> 16) & 0xff) +#define SYN_ID_IS_SYNAPTICS(synhw) ((((synhw).identity >> 8) & 0xff) == 0x47) typedef unsigned char byte; @@ -52,11 +52,12 @@ synaptics_reset(int fd); Bool synaptics_model_id(int fd, unsigned long int *model_id); +struct synapticshw; Bool -synaptics_capability(int fd, unsigned long int *capability, unsigned long int *ext_capab); +synaptics_capability(int fd, struct synapticshw *synhw); Bool -synaptics_identify(int fd, unsigned long int *ident); +synaptics_identify(int fd, struct synapticshw *synhw); Bool synaptics_set_mode(int fd, byte cmd); diff --git a/synaptics.c b/synaptics.c index 8657264..d106bce 100644 --- a/synaptics.c +++ b/synaptics.c @@ -1382,29 +1382,27 @@ QueryHardware(LocalDevicePtr local) while ((retries++ <= 3) && (synaptics_reset(local->fd) != Success)) xf86Msg(X_ERROR, "%s reset failed\n", local->name); - if (synaptics_identify(local->fd, &priv->identity) != Success) + if (synaptics_identify(local->fd, &priv->synhw) != Success) return !Success; - para->identity = priv->identity; - if (synaptics_model_id(local->fd, &priv->model_id) != Success) + if (synaptics_model_id(local->fd, &priv->synhw.model_id) != Success) return !Success; - para->model_id = priv->model_id; - if (synaptics_capability(local->fd, &priv->capabilities, &priv->ext_cap) != Success) + if (synaptics_capability(local->fd, &priv->synhw) != Success) return !Success; - para->capabilities = priv->capabilities; - para->ext_cap = priv->ext_cap; + + para->synhw = priv->synhw; mode = SYN_BIT_ABSOLUTE_MODE | SYN_BIT_HIGH_RATE; - if (SYN_ID_MAJOR(priv->identity) >= 4) + if (SYN_ID_MAJOR(priv->synhw) >= 4) mode |= SYN_BIT_DISABLE_GESTURE; - if (SYN_CAP_EXTENDED(priv->capabilities)) + if (SYN_CAP_EXTENDED(priv->synhw)) mode |= SYN_BIT_W_MODE; if (synaptics_set_mode(local->fd, mode) != Success) return !Success; /* Check to see if the host mouse supports a guest */ - if (SYN_CAP_PASSTHROUGH(priv->capabilities)) { + if (SYN_CAP_PASSTHROUGH(priv->synhw)) { priv->hasGuest = TRUE; /* Enable the guest mouse. Set it to relative mode, three byte @@ -1557,7 +1555,7 @@ SynapticsParseRawPacket(LocalDevicePtr local, SynapticsPrivate *priv, struct SynapticsHwState *hwRet) { Bool ret = SynapticsGetPacket(local, priv); - int newabs = SYN_MODEL_NEWABS(priv->model_id); + int newabs = SYN_MODEL_NEWABS(priv->synhw); unsigned char *buf = priv->protoBuf; struct SynapticsHwState *hw = &(priv->hwState); int w, i; @@ -1607,8 +1605,8 @@ SynapticsParseRawPacket(LocalDevicePtr local, SynapticsPrivate *priv, hw->left = (buf[0] & 0x01) ? 1 : 0; hw->right = (buf[0] & 0x02) ? 1 : 0; - if (SYN_CAP_EXTENDED(priv->capabilities)) { - if (SYN_CAP_FOUR_BUTTON(priv->capabilities)) { + if (SYN_CAP_EXTENDED(priv->synhw)) { + if (SYN_CAP_FOUR_BUTTON(priv->synhw)) { hw->up = ((buf[3] & 0x01)) ? 1 : 0; if (hw->left) hw->up = !hw->up; @@ -1616,9 +1614,9 @@ SynapticsParseRawPacket(LocalDevicePtr local, SynapticsPrivate *priv, if (hw->right) hw->down = !hw->down; } - if (SYN_CAP_MULTI_BUTTON_NO(priv->ext_cap)) { + if (SYN_CAP_MULTI_BUTTON_NO(priv->synhw)) { if ((buf[3] & 2) ? !hw->right : hw->right) { - switch (SYN_CAP_MULTI_BUTTON_NO(priv->ext_cap) & ~0x01) { + switch (SYN_CAP_MULTI_BUTTON_NO(priv->synhw) & ~0x01) { default: break; case 8: @@ -1662,13 +1660,13 @@ SynapticsParseRawPacket(LocalDevicePtr local, SynapticsPrivate *priv, * If not, set it to 5, which corresponds to a finger of * normal width. */ - if (SYN_CAP_EXTENDED(priv->capabilities)) { + if (SYN_CAP_EXTENDED(priv->synhw)) { if ((w >= 0) && (w <= 1)) { - w_ok = SYN_CAP_MULTIFINGER(priv->capabilities); + w_ok = SYN_CAP_MULTIFINGER(priv->synhw); } else if (w == 2) { - w_ok = SYN_MODEL_PEN(priv->model_id); + w_ok = SYN_MODEL_PEN(priv->synhw); } else if ((w >= 4) && (w <= 15)) { - w_ok = SYN_CAP_PALMDETECT(priv->capabilities); + w_ok = SYN_CAP_PALMDETECT(priv->synhw); } } if (!w_ok) @@ -1701,7 +1699,7 @@ static Bool PacketOk(SynapticsPrivate *priv) { unsigned char *buf = priv->protoBuf; - int newabs = SYN_MODEL_NEWABS(priv->model_id); + int newabs = SYN_MODEL_NEWABS(priv->synhw); if (newabs ? ((buf[0] & 0xC0) != 0x80) : ((buf[0] & 0xC0) != 0xC0)) { DBG(4, ErrorF("Synaptics driver lost sync at 1st byte\n")); @@ -1796,32 +1794,32 @@ SynapticsGetPacket(LocalDevicePtr local, SynapticsPrivate *priv) static void PrintIdent(SynapticsPrivate *priv) { - xf86Msg(X_PROBED, " Synaptics Touchpad, model: %d\n", SYN_ID_MODEL(priv->identity)); - xf86Msg(X_PROBED, " Firmware: %d.%d\n", SYN_ID_MAJOR(priv->identity), - SYN_ID_MINOR(priv->identity)); + xf86Msg(X_PROBED, " Synaptics Touchpad, model: %d\n", SYN_ID_MODEL(priv->synhw)); + xf86Msg(X_PROBED, " Firmware: %d.%d\n", SYN_ID_MAJOR(priv->synhw), + SYN_ID_MINOR(priv->synhw)); - if (SYN_MODEL_ROT180(priv->model_id)) + if (SYN_MODEL_ROT180(priv->synhw)) xf86Msg(X_PROBED, " 180 degree mounted touchpad\n"); - if (SYN_MODEL_PORTRAIT(priv->model_id)) + if (SYN_MODEL_PORTRAIT(priv->synhw)) xf86Msg(X_PROBED, " portrait touchpad\n"); - xf86Msg(X_PROBED, " Sensor: %d\n", SYN_MODEL_SENSOR(priv->model_id)); - if (SYN_MODEL_NEWABS(priv->model_id)) + xf86Msg(X_PROBED, " Sensor: %d\n", SYN_MODEL_SENSOR(priv->synhw)); + if (SYN_MODEL_NEWABS(priv->synhw)) xf86Msg(X_PROBED, " new absolute packet format\n"); - if (SYN_MODEL_PEN(priv->model_id)) + if (SYN_MODEL_PEN(priv->synhw)) xf86Msg(X_PROBED, " pen detection\n"); - if (SYN_CAP_EXTENDED(priv->capabilities)) { + if (SYN_CAP_EXTENDED(priv->synhw)) { xf86Msg(X_PROBED, " Touchpad has extended capability bits\n"); - if (SYN_CAP_MULTI_BUTTON_NO(priv->ext_cap)) + if (SYN_CAP_MULTI_BUTTON_NO(priv->synhw)) xf86Msg(X_PROBED, " -> %d multi buttons, i.e. besides standard buttons\n", - (int)(SYN_CAP_MULTI_BUTTON_NO(priv->ext_cap))); - else if (SYN_CAP_FOUR_BUTTON(priv->capabilities)) + (int)(SYN_CAP_MULTI_BUTTON_NO(priv->synhw))); + else if (SYN_CAP_FOUR_BUTTON(priv->synhw)) xf86Msg(X_PROBED, " -> four buttons\n"); - if (SYN_CAP_MULTIFINGER(priv->capabilities)) + if (SYN_CAP_MULTIFINGER(priv->synhw)) xf86Msg(X_PROBED, " -> multifinger detection\n"); - if (SYN_CAP_PALMDETECT(priv->capabilities)) + if (SYN_CAP_PALMDETECT(priv->synhw)) xf86Msg(X_PROBED, " -> palm detection\n"); - if (SYN_CAP_PASSTHROUGH(priv->capabilities)) + if (SYN_CAP_PASSTHROUGH(priv->synhw)) xf86Msg(X_PROBED, " -> pass-through port\n"); } } diff --git a/synaptics.h b/synaptics.h index 0c21628..7e8c95b 100644 --- a/synaptics.h +++ b/synaptics.h @@ -18,6 +18,14 @@ typedef enum { MAX_TAP } TapEvent; +typedef struct synapticshw { + unsigned long int model_id; /* Model-ID */ + unsigned long int capabilities; /* Capabilities */ + unsigned long int ext_cap; /* Extended Capabilities */ + unsigned long int identity; /* Identification */ +} synapticshw_t; + + #define SHM_SYNAPTICS 23947 typedef struct _SynapticsSHM { @@ -33,10 +41,8 @@ typedef struct _SynapticsSHM int guest_dx, guest_dy; /* guest device movement */ /* Probed hardware properties */ - unsigned long int model_id; /* Model-ID */ - unsigned long int capabilities; /* Capabilities */ - unsigned long int ext_cap; /* Extended Capabilities */ - unsigned long int identity; /* Identification */ + synapticshw_t synhw; + Bool isSynaptics; /* Synaptics touchpad active */ /* Parameter data */ @@ -133,10 +139,7 @@ typedef struct _SynapticsPrivateRec struct SynapticsHwState hwState; /* Data read from the touchpad */ - unsigned long int model_id; /* Model-ID */ - unsigned long int capabilities; /* Capabilities */ - unsigned long int ext_cap; /* Extended Capabilities */ - unsigned long int identity; /* Identification */ + synapticshw_t synhw; Bool isSynaptics; /* Synaptics touchpad active */ Bool hasGuest; /* Has a guest mouse */ Bool shm_config; /* True when shared memory area allocated */ diff --git a/synclient.c b/synclient.c index 40ef724..cf8aa8c 100644 --- a/synclient.c +++ b/synclient.c @@ -35,9 +35,9 @@ static void show_hw_info(SynapticsSHM* synshm) { printf("Hardware properties:\n"); if (synshm->isSynaptics) { - printf(" Model Id = %08lx\n", synshm->model_id); - printf(" Capabilities = %08lx\n", synshm->capabilities); - printf(" Identity = %08lx\n", synshm->identity); + printf(" Model Id = %08lx\n", synshm->synhw.model_id); + printf(" Capabilities = %08lx\n", synshm->synhw.capabilities); + printf(" Identity = %08lx\n", synshm->synhw.identity); } else { printf(" No touchpad found\n"); printf(" Do you use a newer kernel than 2.4?\n");