summaryrefslogtreecommitdiff
path: root/sys/src/cmd/nusb
diff options
context:
space:
mode:
authorkvik <kvik@a-b.xyz>2020-05-08 20:49:11 +0200
committerkvik <kvik@a-b.xyz>2020-05-08 20:49:11 +0200
commit758edf2b1448bcc461bc2f99eeaabad1a077351d (patch)
tree838b4f0bf0a388b7b0876b7fd234f37cb9e15297 /sys/src/cmd/nusb
parent2c3e60d95b0beafa25845b401ed9996ebe8100fb (diff)
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.
Diffstat (limited to 'sys/src/cmd/nusb')
-rw-r--r--sys/src/cmd/nusb/kb/kb.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/sys/src/cmd/nusb/kb/kb.c b/sys/src/cmd/nusb/kb/kb.c
index 8d481aaee..3e2913e34 100644
--- a/sys/src/cmd/nusb/kb/kb.c
+++ b/sys/src/cmd/nusb/kb/kb.c
@@ -836,6 +836,33 @@ readerproc(void* a)
}
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 @@ hdsetup(Dev *d, Ep *ep)
fprint(2, "%s: %s: opendevdata: %r\n", argv0, f->ep->dir);
goto Err;
}
+ quirks(f);
procrfork(readerproc, f, Stack, RFNOTEG);
return;
Err: