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

Reply via email to