Some changes to make supporting FreeBSD easier. From Arne

Schwabe <arne@rfc2549.org>, with some editing by me.
This commit is contained in:
Peter Osterlund
2004-04-04 22:23:08 +02:00
parent 30a409af6f
commit f56d238d28
5 changed files with 95 additions and 91 deletions

View File

@@ -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;
}
}

View File

@@ -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);

View File

@@ -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");
}
}

View File

@@ -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 */

View File

@@ -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");