diff options
author | kvik <kvik@a-b.xyz> | 2020-05-08 20:49:11 +0200 |
---|---|---|
committer | kvik <kvik@a-b.xyz> | 2020-05-08 20:49:11 +0200 |
commit | 758edf2b1448bcc461bc2f99eeaabad1a077351d (patch) | |
tree | 838b4f0bf0a388b7b0876b7fd234f37cb9e15297 /sys/src/cmd/nusb | |
parent | 2c3e60d95b0beafa25845b401ed9996ebe8100fb (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.c | 28 |
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: |