Hi timo
On Sat, Nov 21, 2020 at 08:10:03AM +0200, Timo Myyrä wrote:
> Hi,
>
> The last attempt at adding Kensington Slimblade trackball support seems
> to have stalled:
> https://marc.info/?l=openbsd-tech&m=147444999319756&w=2
Thanks for digging this up. I got a Slimblade, but have been using
Emulate3Buttons to paste because I didn't know about this diff.
>
> I tested the diff and it still seems apply with little fuzz and works
> with my slimblade. It would be nice to have this included so I can paste
> with mouse.
>
> Here's cleaned up patch for reference.
I built a kernel with the patch. Kensington Slimblade works, now can paste
with the button in the upper left corner. xev(1) detects all buttons.
Scrolling by "twisting" the trackball still works as usual.
The code looks ok thfr@ to me, but better wait for an additional ok from
someone with a bit more familiarity with the usb and hid parts.
>
> timo
>
>
> Index: sys/dev/usb/ums.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/usb/ums.c,v
> retrieving revision 1.45
> diff -u -p -u -p -r1.45 ums.c
> --- sys/dev/usb/ums.c 23 Aug 2020 11:08:02 -0000 1.45
> +++ sys/dev/usb/ums.c 20 Nov 2020 20:22:11 -0000
> @@ -150,6 +150,8 @@ ums_attach(struct device *parent, struct
> qflags |= HIDMS_MS_BAD_CLASS;
> if (quirks & UQ_MS_LEADING_BYTE)
> qflags |= HIDMS_LEADINGBYTE;
> + if (quirks & UQ_MS_VENDOR_BUTTONS)
> + qflags |= HIDMS_VENDOR_BUTTONS;
>
> if (hidms_setup(self, ms, qflags, uha->reportid, desc, size) != 0)
> return;
> Index: sys/dev/usb/usb_quirks.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/usb/usb_quirks.c,v
> retrieving revision 1.76
> diff -u -p -u -p -r1.76 usb_quirks.c
> --- sys/dev/usb/usb_quirks.c 5 Jan 2020 00:54:13 -0000 1.76
> +++ sys/dev/usb/usb_quirks.c 20 Nov 2020 20:22:11 -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_KENSINGTON, USB_PRODUCT_KENSINGTON_SLIMBLADE,
> + ANY, { UQ_MS_VENDOR_BUTTONS }},
> +
> { 0, 0, 0, { 0 } }
> };
>
> Index: sys/dev/usb/usb_quirks.h
> ===================================================================
> RCS file: /cvs/src/sys/dev/usb/usb_quirks.h,v
> retrieving revision 1.16
> diff -u -p -u -p -r1.16 usb_quirks.h
> --- sys/dev/usb/usb_quirks.h 19 Jul 2010 05:08:37 -0000 1.16
> +++ sys/dev/usb/usb_quirks.h 20 Nov 2020 20:22:11 -0000
> @@ -49,6 +49,8 @@ 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_MS_VENDOR_BUTTONS 0x00040000 /* mouse reports extra buttons in
> + vendor page */
> };
>
> extern const struct usbd_quirks usbd_no_quirk;
> Index: sys/dev/usb/usbdevs
> ===================================================================
> RCS file: /cvs/src/sys/dev/usb/usbdevs,v
> retrieving revision 1.728
> diff -u -p -u -p -r1.728 usbdevs
> --- sys/dev/usb/usbdevs 16 Nov 2020 09:49:10 -0000 1.728
> +++ sys/dev/usb/usbdevs 20 Nov 2020 20:22:11 -0000
> @@ -2491,6 +2491,7 @@ product KENSINGTON TURBOBALL 0x1005 Turb
> product KENSINGTON ORBIT_MAC 0x1009 Orbit trackball for Mac
> product KENSINGTON BT_EDR 0x105e Bluetooth
> product KENSINGTON VIDEOCAM_VGA 0x5002 VideoCAM VGA
> +product KENSINGTON SLIMBLADE 0x2041 Slimblade Trackball
>
> /* Keyspan products */
> product KEYSPAN USA28_NF 0x0101 USA-28 serial
> Index: sys/dev/usb/usbdevs.h
> ===================================================================
> RCS file: /cvs/src/sys/dev/usb/usbdevs.h,v
> retrieving revision 1.740
> diff -u -p -u -p -r1.740 usbdevs.h
> --- sys/dev/usb/usbdevs.h 16 Nov 2020 09:49:40 -0000 1.740
> +++ sys/dev/usb/usbdevs.h 20 Nov 2020 20:22:11 -0000
> @@ -2498,6 +2498,7 @@
> #define USB_PRODUCT_KENSINGTON_ORBIT_MAC 0x1009 /*
> Orbit trackball for Mac */
> #define USB_PRODUCT_KENSINGTON_BT_EDR 0x105e /* Bluetooth */
> #define USB_PRODUCT_KENSINGTON_VIDEOCAM_VGA 0x5002 /*
> VideoCAM VGA */
> +#define USB_PRODUCT_KENSINGTON_SLIMBLADE 0x2041 /*
> Slimblade Trackball */
>
> /* Keyspan products */
> #define USB_PRODUCT_KEYSPAN_USA28_NF 0x0101 /* USA-28
> serial */
> Index: sys/dev/usb/usbdevs_data.h
> ===================================================================
> RCS file: /cvs/src/sys/dev/usb/usbdevs_data.h,v
> retrieving revision 1.734
> diff -u -p -u -p -r1.734 usbdevs_data.h
> --- sys/dev/usb/usbdevs_data.h 16 Nov 2020 09:49:40 -0000 1.734
> +++ sys/dev/usb/usbdevs_data.h 20 Nov 2020 20:22:11 -0000
> @@ -5402,6 +5402,10 @@ const struct usb_known_product usb_known
> "VideoCAM VGA",
> },
> {
> + USB_VENDOR_KENSINGTON, USB_PRODUCT_KENSINGTON_SLIMBLADE,
> + "Slimblade Trackball",
> + },
> + {
> USB_VENDOR_KEYSPAN, USB_PRODUCT_KEYSPAN_USA28_NF,
> "USA-28 serial",
> },
> Index: sys/dev/hid/hidms.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/hid/hidms.c,v
> retrieving revision 1.5
> diff -u -p -u -p -r1.5 hidms.c
> --- sys/dev/hid/hidms.c 5 Sep 2018 16:34:58 -0000 1.5
> +++ sys/dev/hid/hidms.c 20 Nov 2020 20:22:11 -0000
> @@ -191,6 +191,21 @@ hidms_setup(struct device *self, struct
> break;
> ms->sc_num_buttons = i - 1;
>
> + /*
> + * The Kensington Slimblade reports some of its buttons as binary
> + * inputs in the first vendor usage page (0xff00). Add such inputs
> + * as buttons if the device has this quirk.
> + */
> + if (ms->sc_flags & HIDMS_VENDOR_BUTTONS) {
> + const int b = ms->sc_num_buttons;
> + for (i = 1; b + i <= MAX_BUTTONS; i++)
> + if (!hid_locate(desc, dlen,
> + HID_USAGE2(HUP_MICROSOFT, i),
> + id, hid_input, &ms->sc_loc_btn[b + i - 1], NULL))
> + break;
> + ms->sc_num_buttons += i;
> + }
> +
> if (hid_locate(desc, dlen, HID_USAGE2(HUP_DIGITIZERS,
> HUD_TIP_SWITCH), id, hid_input,
> &ms->sc_loc_btn[ms->sc_num_buttons], NULL)){
> Index: sys/dev/hid/hidmsvar.h
> ===================================================================
> RCS file: /cvs/src/sys/dev/hid/hidmsvar.h,v
> retrieving revision 1.1
> diff -u -p -u -p -r1.1 hidmsvar.h
> --- sys/dev/hid/hidmsvar.h 8 Jan 2016 15:54:13 -0000 1.1
> +++ sys/dev/hid/hidmsvar.h 20 Nov 2020 20:22:11 -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_VENDOR_BUTTONS 0x1000 /* extra buttons in vendor page */
>
> int sc_num_buttons;
> u_int32_t sc_buttons; /* mouse button status */
>