The IBM/Lenovo ScrollPoint mouse is uses a TrackPoint-type mechanism
rather than a standard mouse wheel. It appears to the system as a
standard USB mouse with one caveat.

(http://www.ibmfiles.com/pages/scrollpoint.htm)

Where a standard USB mouse with a scrollwheel reports one click of the
wheel as 1 unit in the z direction, this one measures force and reports
a number from 1 to 64. It is VERY sensitive. Practically any force at
all will send it into double-digits range. Scrolling at ten to sixty
times normal speed is not pleasant.

IBM/Lenovo makes/made a driver for Microsoft Windows which lowered the
scrolling speed.

This divides the reported scroll movement by 16, giving a range from 1
to 4. I have been using this for over a year and find this comfortable.

Martin

Index: dev/hid/hidms.c
==================================================================
RCS file: /cvs/src/sys/dev/hid/hidms.c,v
retrieving revision 1.3
diff -u -p -r1.3 hidms.c
--- dev/hid/hidms.c     22 May 2016 22:06:11 -0000      1.3
+++ dev/hid/hidms.c     22 Sep 2016 00:55:18 -0000
@@ -385,6 +385,11 @@ hidms_input(struct hidms *ms, uint8_t *d
                    (ms->sc_tsscale.maxy - ms->sc_tsscale.miny);
        }
 
+       if (ms->sc_flags & HIDMS_FASTSCROLL) {
+               dz /= 16;
+               dw /= 16;
+       }
+
        for (i = 0; i < ms->sc_num_buttons; i++)
                if (hid_get_data(data, len, &ms->sc_loc_btn[i]))
                        buttons |= (1 << HIDMS_BUT(i));
Index: dev/hid/hidmsvar.h
===================================================================
RCS file: /cvs/src/sys/dev/hid/hidmsvar.h,v
retrieving revision 1.1
diff -u -p -r1.1 hidmsvar.h
--- dev/hid/hidmsvar.h  8 Jan 2016 15:54:13 -0000       1.1
+++ dev/hid/hidmsvar.h  22 Sep 2016 00:55:18 -0000
@@ -43,18 +43,19 @@ struct tsscale {
 struct hidms {
        int             sc_enabled;
        int             sc_flags;       /* device configuration */
-#define HIDMS_SPUR_BUT_UP      0x001   /* spurious button up events */
-#define HIDMS_Z                        0x002   /* Z direction available */
-#define HIDMS_REVZ             0x004   /* Z-axis is reversed */
-#define HIDMS_W                        0x008   /* W direction available */
-#define HIDMS_REVW             0x010   /* W-axis is reversed */
-#define HIDMS_LEADINGBYTE      0x020   /* Unknown leading byte */
-#define HIDMS_ABSX             0x040   /* X-axis is absolute */
-#define HIDMS_ABSY             0x080   /* Y-axis is absolute */
-#define HIDMS_TIP              0x100   /* Tip switch on a digitiser pen */
-#define HIDMS_BARREL           0x200   /* Barrel switch on a digitiser pen */
-#define HIDMS_ERASER           0x400   /* Eraser switch on a digitiser pen */
-#define HIDMS_MS_BAD_CLASS     0x800   /* Mouse doesn't identify properly */
+#define HIDMS_SPUR_BUT_UP      0x0001  /* spurious button up events */
+#define HIDMS_Z                        0x0002  /* Z direction available */
+#define HIDMS_REVZ             0x0004  /* Z-axis is reversed */
+#define HIDMS_W                        0x0008  /* W direction available */
+#define HIDMS_REVW             0x0010  /* W-axis is reversed */
+#define HIDMS_LEADINGBYTE      0x0020  /* Unknown leading byte */
+#define HIDMS_ABSX             0x0040  /* X-axis is absolute */
+#define HIDMS_ABSY             0x0080  /* Y-axis is absolute */
+#define HIDMS_TIP              0x0100  /* Tip switch on a digitiser pen */
+#define HIDMS_BARREL           0x0200  /* Barrel switch on a digitiser pen */
+#define HIDMS_ERASER           0x0400  /* Eraser switch on a digitiser pen */
+#define HIDMS_MS_BAD_CLASS     0x0800  /* Mouse doesn't identify properly */
+#define HIDMS_FASTSCROLL       0x1000  /* Eraser switch on a digitiser pen */
 
        int             sc_num_buttons;
        u_int32_t       sc_buttons;     /* mouse button status */
Index: dev/usb/ums.c
===================================================================
RCS file: /cvs/src/sys/dev/usb/ums.c,v
retrieving revision 1.43
diff -u -p -r1.43 ums.c
--- dev/usb/ums.c       12 Jan 2016 19:16:21 -0000      1.43
+++ dev/usb/ums.c       22 Sep 2016 00:55:18 -0000
@@ -143,6 +143,8 @@ ums_attach(struct device *parent, struct
                qflags |= HIDMS_MS_BAD_CLASS;
        if (quirks & UQ_MS_LEADING_BYTE)
                qflags |= HIDMS_LEADINGBYTE;
+       if (quirks & UQ_LENOVO_FASTSCROLL)
+               qflags |= HIDMS_FASTSCROLL;
 
        if (hidms_setup(self, ms, qflags, uha->reportid, desc, size) != 0)
                return;
Index: dev/usb/usb_quirks.c
===================================================================
RCS file: /cvs/src/sys/dev/usb/usb_quirks.c,v
retrieving revision 1.74
diff -u -p -r1.74 usb_quirks.c
--- dev/usb/usb_quirks.c        27 Nov 2015 10:59:32 -0000      1.74
+++ dev/usb/usb_quirks.c        22 Sep 2016 00:55:18 -0000
@@ -150,6 +150,9 @@ const struct usbd_quirk_entry {
  { USB_VENDOR_MICROSOFT, USB_PRODUCT_MICROSOFT_WLNOTEBOOK2,
        ANY, { UQ_MS_BAD_CLASS | UQ_MS_LEADING_BYTE }},
 
+ { USB_VENDOR_LENOVO, USB_PRODUCT_LENOVO_SCROLLPOINT,
+       ANY, { UQ_LENOVO_FASTSCROLL }},
+
  { 0, 0, 0, { 0 } }
 };
 
Index: dev/usb/usb_quirks.h
===================================================================
RCS file: /cvs/src/sys/dev/usb/usb_quirks.h,v
retrieving revision 1.16
diff -u -p -r1.16 usb_quirks.h
--- dev/usb/usb_quirks.h        19 Jul 2010 05:08:37 -0000      1.16
+++ dev/usb/usb_quirks.h        22 Sep 2016 00:55:18 -0000
@@ -49,6 +49,7 @@ struct usbd_quirks {
 #define UQ_MS_LEADING_BYTE     0x00010000 /* mouse sends unknown leading byte 
*/
 #define UQ_EHCI_NEEDTO_DISOWN  0x00020000 /* must hand device over to USB 1.1
                                                if attached to EHCI */
+#define UQ_LENOVO_FASTSCROLL   0x00040000 /* mouse scrolls too fast */
 };
 
 extern const struct usbd_quirks usbd_no_quirk;
Index: dev/usb/usbdevs
===================================================================
RCS file: /cvs/src/sys/dev/usb/usbdevs,v
retrieving revision 1.669
diff -u -p -r1.669 usbdevs
--- dev/usb/usbdevs     21 Sep 2016 08:55:21 -0000      1.669
+++ dev/usb/usbdevs     22 Sep 2016 00:55:18 -0000
@@ -2490,6 +2490,7 @@ product LEADTEK 9531              0x2101  9531 GPS
 
 /* Lenovo products */
 product LENOVO AX88179         0x304b  AX88179
+product LENOVO SCROLLPOINT     0x6049  ScrollPoint Mouse
 product LENOVO ETHERNET                0x7203  USB 2.0 Ethernet
 
 /* Lexar products */
Index: dev/usb/usbdevs.h
===================================================================
RCS file: /cvs/src/sys/dev/usb/usbdevs.h,v
retrieving revision 1.681
diff -u -p -r1.681 usbdevs.h
--- dev/usb/usbdevs.h   21 Sep 2016 08:56:17 -0000      1.681
+++ dev/usb/usbdevs.h   22 Sep 2016 00:55:18 -0000
@@ -1,4 +1,4 @@
-/*     $OpenBSD: usbdevs.h,v 1.681 2016/09/21 08:56:17 mpi Exp $       */
+/*     $OpenBSD$       */
 
 /*
  * THIS FILE IS AUTOMATICALLY GENERATED.  DO NOT EDIT.
@@ -2497,6 +2497,7 @@
 
 /* Lenovo products */
 #define        USB_PRODUCT_LENOVO_AX88179      0x304b          /* AX88179 */
+#define        USB_PRODUCT_LENOVO_SCROLLPOINT  0x6049          /* ScrollPoint 
Mouse */
 #define        USB_PRODUCT_LENOVO_ETHERNET     0x7203          /* USB 2.0 
Ethernet */
 
 /* Lexar products */
Index: dev/usb/usbdevs_data.h
===================================================================
RCS file: /cvs/src/sys/dev/usb/usbdevs_data.h,v
retrieving revision 1.675
diff -u -p -r1.675 usbdevs_data.h
--- dev/usb/usbdevs_data.h      21 Sep 2016 08:56:17 -0000      1.675
+++ dev/usb/usbdevs_data.h      22 Sep 2016 00:55:18 -0000
@@ -1,4 +1,4 @@
-/*     $OpenBSD: usbdevs_data.h,v 1.675 2016/09/21 08:56:17 mpi Exp $  */
+/*     $OpenBSD$       */
 
 /*
  * THIS FILE IS AUTOMATICALLY GENERATED.  DO NOT EDIT.
@@ -5440,6 +5440,10 @@ const struct usb_known_product usb_known
        {
            USB_VENDOR_LENOVO, USB_PRODUCT_LENOVO_AX88179,
            "AX88179",
+       },
+       {
+           USB_VENDOR_LENOVO, USB_PRODUCT_LENOVO_SCROLLPOINT,
+           "ScrollPoint Mouse",
        },
        {
            USB_VENDOR_LENOVO, USB_PRODUCT_LENOVO_ETHERNET,

Reply via email to