mirror of
https://github.com/X11Libre/xf86-input-synaptics.git
synced 2026-04-14 11:54:16 +00:00
Some changes to make supporting FreeBSD easier. From Arne
Schwabe <arne@rfc2549.org>, with some editing by me.
This commit is contained in:
32
ps2comm.c
32
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;
|
||||
}
|
||||
}
|
||||
|
||||
61
ps2comm.h
61
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);
|
||||
|
||||
68
synaptics.c
68
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");
|
||||
}
|
||||
}
|
||||
|
||||
19
synaptics.h
19
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 */
|
||||
|
||||
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user