diff -Nur linux-2.6.17-gentoo-r7/drivers/input/mouse/Kconfig linux-2.6.17-gentoo-r7-hacked/drivers/input/mouse/Kconfig --- linux-2.6.17-gentoo-r7/drivers/input/mouse/Kconfig 2006-09-07 13:18:44.000000000 +0200 +++ linux-2.6.17-gentoo-r7-hacked/drivers/input/mouse/Kconfig 2006-09-05 00:45:33.000000000 +0200 @@ -37,6 +37,13 @@ To compile this driver as a module, choose M here: the module will be called psmouse. +config MOUSE_TPWHEEL + bool "TrackPoint wheel emulation" + depends on MOUSE_PS2 + help + Say Y to enable the tp-scroll feature. Press middle button to scroll up and down. + + config MOUSE_SERIAL tristate "Serial mouse" select SERIO diff -Nur linux-2.6.17-gentoo-r7/drivers/input/mouse/psmouse-base.c linux-2.6.17-gentoo-r7-hacked/drivers/input/mouse/psmouse-base.c --- linux-2.6.17-gentoo-r7/drivers/input/mouse/psmouse-base.c 2006-09-07 13:18:44.000000000 +0200 +++ linux-2.6.17-gentoo-r7-hacked/drivers/input/mouse/psmouse-base.c 2006-09-05 00:48:46.000000000 +0200 @@ -128,6 +128,7 @@ { struct input_dev *dev = psmouse->dev; unsigned char *packet = psmouse->packet; + int rel_y = packet[2] ? (int) ((packet[0] << 3) & 0x100) - (int) packet[2] : 0; if (psmouse->pktcnt < psmouse->pktsize) return PSMOUSE_GOOD_DATA; @@ -174,15 +175,72 @@ } /* + * IBM Trackpoint wheel emulation + * Joerg Hundertmarck + * 2006-09-05 00:35 GMT+1 + */ +#ifdef CONFIG_MOUSE_TPWHEEL + if ( psmouse->type == PSMOUSE_TRACKPOINT ) { + /* Middle button pressed? */ + if ( psmouse->scroll_state == 0 && (packet[0] >> 2) & 1 ) + /* Okay, lets keep state */ + psmouse->scroll_state = 1; + + /* If the middle button was pressed */ + if ( psmouse->scroll_state == 1 ) { + /* Button pressed */ + if ( (packet[0] >> 2) & 1 ) { + /* Moved? */ + if ( rel_y ) + /* Yes, initiate wheel mode */ + psmouse->scroll_state = 2; + else + return PSMOUSE_FULL_PACKET; + } + + /* Button released */ + else { + /* Reset scroll state */ + psmouse->scroll_state = 0; + + /* Important! Report middle button pressed + * Note: scroll_state equal 0 that means Normal operation is + * executed to reset the middle button state. */ + input_report_key(dev, BTN_MIDDLE, 1); + + /* Flush reported data. That's important for middle button action */ + input_sync(dev); + } + } + + /* Wheel mode? */ + if ( psmouse->scroll_state == 2 ) { + /* Button already pressed */ + if ( ((packet[0] >> 2) & 1) ) { + /* Rotate wheel */ + input_report_rel(dev, REL_WHEEL, rel_y * -1); + + /* Flush ... */ + input_sync(dev); + + return PSMOUSE_FULL_PACKET; + } + + /* Button released, reset to normal mode */ + psmouse->scroll_state = 0; + } + } +#endif + +/* * Generic PS/2 Mouse */ input_report_key(dev, BTN_LEFT, packet[0] & 1); input_report_key(dev, BTN_MIDDLE, (packet[0] >> 2) & 1); input_report_key(dev, BTN_RIGHT, (packet[0] >> 1) & 1); - input_report_rel(dev, REL_X, packet[1] ? (int) packet[1] - (int) ((packet[0] << 4) & 0x100) : 0); - input_report_rel(dev, REL_Y, packet[2] ? (int) ((packet[0] << 3) & 0x100) - (int) packet[2] : 0); + input_report_rel(dev, REL_Y, rel_y); input_sync(dev); @@ -597,8 +655,12 @@ if (max_proto > PSMOUSE_IMEX && ps2pp_init(psmouse, set_properties) == 0) return PSMOUSE_PS2PP; - if (max_proto > PSMOUSE_IMEX && trackpoint_detect(psmouse, set_properties) == 0) + if (max_proto > PSMOUSE_IMEX && trackpoint_detect(psmouse, set_properties) == 0) { + /* hack preq 1 */ + set_bit(REL_WHEEL, psmouse->dev->relbit); + printk(KERN_WARNING "IBM TrackPoint scrolling feature activated.\n"); return PSMOUSE_TRACKPOINT; + } /* * Reset to defaults in case the device got confused by extended diff -Nur linux-2.6.17-gentoo-r7/drivers/input/mouse/psmouse.h linux-2.6.17-gentoo-r7-hacked/drivers/input/mouse/psmouse.h --- linux-2.6.17-gentoo-r7/drivers/input/mouse/psmouse.h 2006-09-07 13:18:44.000000000 +0200 +++ linux-2.6.17-gentoo-r7-hacked/drivers/input/mouse/psmouse.h 2006-09-05 00:49:00.000000000 +0200 @@ -56,6 +56,10 @@ char devname[64]; char phys[32]; +#ifdef CONFIG_MOUSE_TPWHEEL + unsigned char scroll_state; +#endif + unsigned int rate; unsigned int resolution; unsigned int resetafter;