shithub: riscv

Download patch

ref: 758edf2b1448bcc461bc2f99eeaabad1a077351d
parent: 2c3e60d95b0beafa25845b401ed9996ebe8100fb
author: kvik <kvik@a-b.xyz>
date: Fri May 8 16:49:11 EDT 2020

nusb/kb: add quirks for Elecom HUGE trackball

As said in the code comment:

	Elecom trackball report descriptor lies by
	omission, failing to mention all its buttons.
	We patch the descriptor with a correct count
	which lets us parse full reports. Tested with:
		Elecom HUGE (M-HT1DRBK, M-HT1URBK)

The descriptor fixup is adapted from Linux kernel:
	drivers/hid/hid-elecom.c
in which a more detailed account of why and how this
works may be found.

A followup change to nusb/kb will be needed to expose
these additional events for potential remapping.

--- a/sys/src/cmd/nusb/kb/kb.c
+++ b/sys/src/cmd/nusb/kb/kb.c
@@ -836,6 +836,33 @@
 }
 
 static void
+quirks(Hiddev *f)
+{
+	Dev *d;
+	
+	d = f->dev;
+	
+	/* Elecom trackball report descriptor lies by
+	 * omission, failing to mention all its buttons.
+	 * We patch the descriptor with a correct count
+	 * which lets us parse full reports. Tested with:
+	 *   Elecom HUGE (M-HT1DRBK, M-HT1URBK) */
+	if(d->usb->vid == 0x056e && d->usb->did == 0x010c){
+		if(f->nrep < 32
+		|| f->rep[12] != 0x95
+		|| f->rep[14] != 0x75
+		|| f->rep[15] != 0x01
+		|| f->rep[20] != 0x29
+		|| f->rep[30] != 0x75)
+		return;
+
+		f->rep[13] = 8;
+		f->rep[21] = 8;
+		f->rep[31] = 0;
+	}
+}
+
+static void
 hdsetup(Dev *d, Ep *ep)
 {
 	Hiddev *f;
@@ -858,6 +885,7 @@
 		fprint(2, "%s: %s: opendevdata: %r\n", argv0, f->ep->dir);
 		goto Err;
 	}
+	quirks(f);
 	procrfork(readerproc, f, Stack, RFNOTEG);
 	return;
 Err: