On 20/09/16(Tue) 22:29, Sven M. Hallberg wrote:
> Ahoi OpenBSD,
>
> My trackball reports two out of its four buttons in a non-standard way.
> I've patched my kernel with a new USB quirk for this situation. [*]
>
> I'd like to contribute this if you want it; please let me know if this
> is the way to do it or if you'd like any changes.
Can you do that without adding a new quirk? Is this way of reporting
extra buttons standard or is it a vendor-only feature? Where did you
get the documentation from?
>
> --pesco
> (sending from off-list)
>
>
> [*] The buttons appear in the HID descriptor like normal, except with
> their "usage" set to a vendor-reserved page. The quirk makes the driver
> treat this page like the standard button page.
>
> Index: sys/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
> --- sys/dev/usb/ums.c 12 Jan 2016 19:16:21 -0000 1.43
> +++ sys/dev/usb/ums.c 20 Sep 2016 19:21:54 -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_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.74
> diff -u -p -r1.74 usb_quirks.c
> --- sys/dev/usb/usb_quirks.c 27 Nov 2015 10:59:32 -0000 1.74
> +++ sys/dev/usb/usb_quirks.c 20 Sep 2016 19:21:54 -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 -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 Sep 2016 19:21:55 -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.668
> diff -u -p -r1.668 usbdevs
> --- sys/dev/usb/usbdevs 12 Sep 2016 07:55:33 -0000 1.668
> +++ sys/dev/usb/usbdevs 20 Sep 2016 19:21:55 -0000
> @@ -2397,6 +2397,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.680
> diff -u -p -r1.680 usbdevs.h
> --- sys/dev/usb/usbdevs.h 12 Sep 2016 07:56:29 -0000 1.680
> +++ sys/dev/usb/usbdevs.h 20 Sep 2016 19:21:56 -0000
> @@ -2404,6 +2404,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.674
> diff -u -p -r1.674 usbdevs_data.h
> --- sys/dev/usb/usbdevs_data.h 12 Sep 2016 07:56:29 -0000 1.674
> +++ sys/dev/usb/usbdevs_data.h 20 Sep 2016 19:21:58 -0000
> @@ -5166,6 +5166,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.3
> diff -u -p -r1.3 hidms.c
> --- sys/dev/hid/hidms.c 22 May 2016 22:06:11 -0000 1.3
> +++ sys/dev/hid/hidms.c 20 Sep 2016 19:22:44 -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 -r1.1 hidmsvar.h
> --- sys/dev/hid/hidmsvar.h 8 Jan 2016 15:54:13 -0000 1.1
> +++ sys/dev/hid/hidmsvar.h 20 Sep 2016 19:22:44 -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 */