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