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.
This commit is contained in:
parent
2c3e60d95b
commit
758edf2b14
1 changed files with 28 additions and 0 deletions
|
@ -835,6 +835,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)
|
||||
{
|
||||
|
@ -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:
|
||||
|
|
Loading…
Reference in a new issue