patch-2.4.10 linux/drivers/input/mousedev.c
Next file: linux/drivers/isdn/Config.in
Previous file: linux/drivers/input/keybdev.c
Back to the patch index
Back to the overall index
- Lines: 171
- Date:
Wed Sep 12 15:34:06 2001
- Orig file:
v2.4.9/linux/drivers/input/mousedev.c
- Orig date:
Sun Mar 25 18:14:20 2001
diff -u --recursive --new-file v2.4.9/linux/drivers/input/mousedev.c linux/drivers/input/mousedev.c
@@ -1,9 +1,9 @@
/*
- * $Id: mousedev.c,v 1.15 2000/08/14 21:05:26 vojtech Exp $
+ * $Id: mousedev.c,v 1.24 2000/11/15 10:57:45 vojtech Exp $
*
* Copyright (c) 1999-2000 Vojtech Pavlik
*
- * Input driver to PS/2 or ImPS/2 device driver module.
+ * Input driver to ImExPS/2 device driver module.
*
* Sponsored by SuSE
*/
@@ -66,20 +66,22 @@
signed char ps2[6];
unsigned long buttons;
unsigned char ready, buffer, bufsiz;
- unsigned char mode, genseq, impseq;
+ unsigned char mode, imexseq, impsseq;
};
-#define MOUSEDEV_GENIUS_LEN 5
-#define MOUSEDEV_IMPS_LEN 6
+#define MOUSEDEV_SEQ_LEN 6
-static unsigned char mousedev_genius_seq[] = { 0xe8, 3, 0xe6, 0xe6, 0xe6 };
static unsigned char mousedev_imps_seq[] = { 0xf3, 200, 0xf3, 100, 0xf3, 80 };
+static unsigned char mousedev_imex_seq[] = { 0xf3, 200, 0xf3, 200, 0xf3, 80 };
static struct input_handler mousedev_handler;
static struct mousedev *mousedev_table[MOUSEDEV_MINORS];
static struct mousedev mousedev_mix;
+static int xres = CONFIG_INPUT_MOUSEDEV_SCREEN_X;
+static int yres = CONFIG_INPUT_MOUSEDEV_SCREEN_Y;
+
static void mousedev_event(struct input_handle *handle, unsigned int type, unsigned int code, int value)
{
struct mousedev *mousedevs[3] = { handle->private, &mousedev_mix, NULL };
@@ -99,12 +101,12 @@
switch (code) {
case ABS_X:
size = handle->dev->absmax[ABS_X] - handle->dev->absmin[ABS_X];
- list->dx += (value * CONFIG_INPUT_MOUSEDEV_SCREEN_X - list->oldx) / size;
+ list->dx += (value * xres - list->oldx) / size;
list->oldx += list->dx * size;
break;
case ABS_Y:
size = handle->dev->absmax[ABS_Y] - handle->dev->absmin[ABS_Y];
- list->dy -= (value * CONFIG_INPUT_MOUSEDEV_SCREEN_Y - list->oldy) / size;
+ list->dy -= (value * yres - list->oldy) / size;
list->oldy -= list->dy * size;
break;
}
@@ -124,12 +126,12 @@
case BTN_TOUCH:
case BTN_LEFT: index = 0; break;
case BTN_4:
- case BTN_EXTRA: if (list->mode > 1) { index = 4; break; }
+ case BTN_EXTRA: if (list->mode == 2) { index = 4; break; }
case BTN_STYLUS:
case BTN_1:
case BTN_RIGHT: index = 1; break;
case BTN_3:
- case BTN_SIDE: if (list->mode > 1) { index = 3; break; }
+ case BTN_SIDE: if (list->mode == 2) { index = 3; break; }
case BTN_2:
case BTN_STYLUS2:
case BTN_MIDDLE: index = 2; break;
@@ -257,14 +259,19 @@
list->dy -= list->ps2[off + 2];
list->bufsiz = off + 3;
- if (list->mode > 1)
- list->ps2[off] |= ((list->buttons & 0x18) << 3);
+ if (list->mode == 2) {
+ list->ps2[off + 3] = (list->dz > 7 ? 7 : (list->dz < -7 ? -7 : list->dz));
+ list->dz -= list->ps2[off + 3];
+ list->ps2[off + 3] = (list->ps2[off + 3] & 0x0f) | ((list->buttons & 0x18) << 1);
+ list->bufsiz++;
+ }
- if (list->mode) {
+ if (list->mode == 1) {
list->ps2[off + 3] = (list->dz > 127 ? 127 : (list->dz < -127 ? -127 : list->dz));
- list->bufsiz++;
list->dz -= list->ps2[off + 3];
+ list->bufsiz++;
}
+
if (!list->dx && !list->dy && (!list->mode || !list->dz)) list->ready = 0;
list->buffer = list->bufsiz;
}
@@ -278,27 +285,26 @@
for (i = 0; i < count; i++) {
- if (get_user(c, &buffer[i]))
+ if (get_user(c, buffer + i))
return -EFAULT;
- if (c == mousedev_genius_seq[list->genseq]) {
- if (++list->genseq == MOUSEDEV_GENIUS_LEN) {
- list->genseq = 0;
- list->ready = 1;
+ if (c == mousedev_imex_seq[list->imexseq]) {
+ if (++list->imexseq == MOUSEDEV_SEQ_LEN) {
+ list->imexseq = 0;
list->mode = 2;
}
- } else list->genseq = 0;
+ } else list->imexseq = 0;
- if (c == mousedev_imps_seq[list->impseq]) {
- if (++list->impseq == MOUSEDEV_IMPS_LEN) {
- list->impseq = 0;
- list->ready = 1;
+ if (c == mousedev_imps_seq[list->impsseq]) {
+ if (++list->impsseq == MOUSEDEV_SEQ_LEN) {
+ list->impsseq = 0;
list->mode = 1;
}
- } else list->impseq = 0;
+ } else list->impsseq = 0;
list->ps2[0] = 0xfa;
list->bufsiz = 1;
+ list->ready = 1;
switch (c) {
@@ -307,16 +313,16 @@
break;
case 0xf2: /* Get ID */
- list->ps2[1] = (list->mode == 1) ? 3 : 0;
+ switch (list->mode) {
+ case 0: list->ps2[1] = 0;
+ case 1: list->ps2[1] = 3;
+ case 2: list->ps2[1] = 4;
+ }
list->bufsiz = 2;
break;
case 0xe9: /* Get info */
- if (list->mode == 2) {
- list->ps2[1] = 0x00; list->ps2[2] = 0x33; list->ps2[3] = 0x55;
- } else {
- list->ps2[1] = 0x60; list->ps2[2] = 3; list->ps2[3] = 200;
- }
+ list->ps2[1] = 0x60; list->ps2[2] = 3; list->ps2[3] = 200;
list->bufsiz = 4;
break;
}
@@ -434,7 +440,7 @@
if (mousedev_mix.open)
input_open_device(&mousedev->handle);
- printk(KERN_INFO "mouse%d: PS/2 mouse device for input%d\n", minor, dev->number);
+// printk(KERN_INFO "mouse%d: PS/2 mouse device for input%d\n", minor, dev->number);
return &mousedev->handle;
}
@@ -491,3 +497,7 @@
MODULE_AUTHOR("Vojtech Pavlik <vojtech@suse.cz>");
MODULE_DESCRIPTION("Input driver to PS/2 or ImPS/2 device driver");
+MODULE_PARM(xres, "i");
+MODULE_PARM_DESC(xres, "Horizontal screen resolution");
+MODULE_PARM(yres, "i");
+MODULE_PARM_DESC(yres, "Vertical screen resolution");
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)