Hello, Could anyone with commit privileges please take this patch? It commits without any issues to -current.
Thanks ________________________________________ From: Sivaram Gowkanapalli Sent: Friday, May 8, 2020 11:24 PM To: [email protected] Subject: Elecom mouse patch to recognize all the buttons Hello, This is the corresponding linux patch to recognize all the mouse buttons https://github.com/torvalds/linux/blob/2f4c53349961c8ca480193e47da4d44fdb8335a8/drivers/hid/hid-elecom.c The same patch for OpenBSD Stable is as follows: Index: sys/dev/usb/ums.c =================================================================== RCS file: /cvs/src/sys/dev/usb/ums.c,v retrieving revision 1.43 diff -u -p -u -r1.43 ums.c --- sys/dev/usb/ums.c 12 Jan 2016 19:16:21 -0000 1.43 +++ sys/dev/usb/ums.c 9 May 2020 03:03:09 -0000 @@ -112,6 +112,36 @@ ums_match(struct device *parent, void *m return (UMATCH_NONE); } +/* + * Certain ELECOM mice misreport their button count meaning that they only work + * correctly with the ELECOM mouse assistant software which is unavailable for + * Linux. A four extra INPUT reports and a FEATURE report are described by the + * report descriptor but it does not appear that these enable software to + * control what the extra buttons map to. The only simple and straightforward + * solution seems to involve fixing up the report descriptor. + * + * Report descriptor format: + * Positions 13, 15, 21 and 31 store the button bit count, button usage minimum, + * button usage maximum and padding bit count respectively. + */ +#define MOUSE_BUTTONS_MAX 8 +static void +mouse_button_fixup(struct ums_softc *sc, void *desc, int size, + int nbuttons) +{ + uByte *udesc = desc; + + if (udesc == NULL || + size < 32 || udesc[12] != 0x95 || + udesc[14] != 0x75 || udesc[15] != 0x01 || + udesc[20] != 0x29 || udesc[30] != 0x75) + return; + printf("%s: Fixing up Elecom mouse button count\n", sc->sc_hdev.sc_dev.dv_xname); + udesc[13] = nbuttons; + udesc[21] = nbuttons; + udesc[31] = MOUSE_BUTTONS_MAX - nbuttons; +} + void ums_attach(struct device *parent, struct device *self, void *aux) { @@ -130,6 +160,29 @@ ums_attach(struct device *parent, struct quirks = usbd_get_quirks(sc->sc_hdev.sc_udev)->uq_flags; uhidev_get_report_desc(uha->parent, &desc, &size); + if (uaa->vendor == USB_VENDOR_ELECOM) { + /* Correct the report descriptor for the ELECOM mouse. + * HID driver for ELECOM devices: + * - EX-G Trackballs (M-XT3DRBK, M-XT3URBK, M-XT4DRBK) + * - DEFT Trackballs (M-DT1DRBK, M-DT1URBK, M-DT2DRBK, M-DT2URBK) + * - HUGE Trackballs (M-HT1DRBK, M-HT1URBK) + */ + switch (uaa->product) { + case USB_PRODUCT_ELECOM_M_XT3URBK: + case USB_PRODUCT_ELECOM_M_XT3DRBK: + case USB_PRODUCT_ELECOM_M_XT4DRBK: + mouse_button_fixup(sc, desc, size, 6); + break; + case USB_PRODUCT_ELECOM_M_DT1URBK: + case USB_PRODUCT_ELECOM_M_DT1DRBK: + case USB_PRODUCT_ELECOM_M_HT1URBK: + case USB_PRODUCT_ELECOM_M_HT1DRBK: + mouse_button_fixup(sc, desc, size, 8); + break; + default: + break; + } + } repid = uha->reportid; sc->sc_hdev.sc_isize = hid_report_size(desc, size, hid_input, repid); sc->sc_hdev.sc_osize = hid_report_size(desc, size, hid_output, repid); Index: sys/dev/usb/usbdevs.h =================================================================== RCS file: /cvs/src/sys/dev/usb/usbdevs.h,v retrieving revision 1.713 diff -u -p -u -r1.713 usbdevs.h --- sys/dev/usb/usbdevs.h 27 Aug 2019 18:00:19 -0000 1.713 +++ sys/dev/usb/usbdevs.h 9 May 2020 03:03:09 -0000 @@ -1699,6 +1699,13 @@ #define USB_PRODUCT_ELECOM_UCSGT 0x5003 /* UC-SGT Serial */ #define USB_PRODUCT_ELECOM_UCSGT0 0x5004 /* UC-SGT0 Serial */ #define USB_PRODUCT_ELECOM_LDUSBTX3 0xabc1 /* LD-USB/TX */ +#define USB_PRODUCT_ELECOM_M_XT3URBK 0x00fb /* M-XT3UR BK */ +#define USB_PRODUCT_ELECOM_M_XT3DRBK 0x00fc /* M-XT3DR BK */ +#define USB_PRODUCT_ELECOM_M_XT4DRBK 0x00fd /* M-XT4DR BK */ +#define USB_PRODUCT_ELECOM_M_DT1URBK 0x00fe /* M-DT1UR BK */ +#define USB_PRODUCT_ELECOM_M_DT1DRBK 0x00ff /* M-DT1DR BK */ +#define USB_PRODUCT_ELECOM_M_HT1URBK 0x010c /* M-HT1UR BK */ +#define USB_PRODUCT_ELECOM_M_HT1DRBK 0x010d /* M-HT1DR BK */ /* Elektor Electronics products */ #define USB_PRODUCT_ELEKTOR_FT323R 0x0005 /* FT323R */ Index: sys/dev/usb/usbdevs_data.h =================================================================== RCS file: /cvs/src/sys/dev/usb/usbdevs_data.h,v retrieving revision 1.707 diff -u -p -u -r1.707 usbdevs_data.h --- sys/dev/usb/usbdevs_data.h 27 Aug 2019 18:00:19 -0000 1.707 +++ sys/dev/usb/usbdevs_data.h 9 May 2020 03:03:10 -0000 @@ -3014,6 +3014,34 @@ const struct usb_known_product usb_known "LD-USB/TX", }, { + USB_VENDOR_ELECOM, USB_PRODUCT_ELECOM_M_XT3URBK, + "M-XT3UR BK", + }, + { + USB_VENDOR_ELECOM, USB_PRODUCT_ELECOM_M_XT3DRBK, + "M-XT3DR BK", + }, + { + USB_VENDOR_ELECOM, USB_PRODUCT_ELECOM_M_XT4DRBK, + "M-XT4DR BK", + }, + { + USB_VENDOR_ELECOM, USB_PRODUCT_ELECOM_M_DT1URBK, + "M-DT1UR BK", + }, + { + USB_VENDOR_ELECOM, USB_PRODUCT_ELECOM_M_DT1DRBK, + "M-DT1DR BK", + }, + { + USB_VENDOR_ELECOM, USB_PRODUCT_ELECOM_M_HT1URBK, + "M-HT1UR BK", + }, + { + USB_VENDOR_ELECOM, USB_PRODUCT_ELECOM_M_HT1DRBK, + "M-HT1DR BK", + }, + { USB_VENDOR_ELEKTOR, USB_PRODUCT_ELEKTOR_FT323R, "FT323R", }, Thanks
