diff options
author | mischief <mischief@offblast.org> | 2020-11-21 12:31:54 -0800 |
---|---|---|
committer | mischief <mischief@offblast.org> | 2020-11-21 12:31:54 -0800 |
commit | f8738fd7578af0ce3552bc9da65502397b9faad3 (patch) | |
tree | 003919e52e34c4ecb01e00f360b37c7b209d3c5a | |
parent | 2594b99629957d8ce380157e9af4a5feff86c5fe (diff) | |
download | plan9front-f8738fd7578af0ce3552bc9da65502397b9faad3.tar.xz |
nusb/kb, nusb/joy: dont try to set protocol on nonboot devices
the hid 1.11 specification says that for hid devices which arent in
the boot subclass (subclass 1), it is only optional to support the set
protocol command. for my devices, trying to set protocol results in a
stall error and unusable devices.
fixes my Tex Shinobi keyboard and Playstation 4 controller.
-rw-r--r-- | sys/src/cmd/nusb/joy/joy.c | 8 | ||||
-rw-r--r-- | sys/src/cmd/nusb/kb/kb.c | 8 |
2 files changed, 16 insertions, 0 deletions
diff --git a/sys/src/cmd/nusb/joy/joy.c b/sys/src/cmd/nusb/joy/joy.c index b04028507..0cb254eaf 100644 --- a/sys/src/cmd/nusb/joy/joy.c +++ b/sys/src/cmd/nusb/joy/joy.c @@ -222,6 +222,14 @@ setproto(KDev *f, int eid) proto = Reportproto; }else kbfatal(f, "no report"); + + /* + * if a HID's subclass code is 1 (boot mode), it will support + * setproto, otherwise it is not guaranteed to. + */ + if(Subclass(f->dev->usb->ep[eid]->iface->csp) != 1) + return 0; + return usbcmd(f->dev, Rh2d|Rclass|Riface, Setproto, proto, id, nil, 0); } diff --git a/sys/src/cmd/nusb/kb/kb.c b/sys/src/cmd/nusb/kb/kb.c index 3e2913e34..7b9ed9f2c 100644 --- a/sys/src/cmd/nusb/kb/kb.c +++ b/sys/src/cmd/nusb/kb/kb.c @@ -368,6 +368,14 @@ setproto(Hiddev *f, int eid) } proto = Bootproto; } + + /* + * if a HID's subclass code is 1 (boot mode), it will support + * setproto, otherwise it is not guaranteed to. + */ + if(Subclass(iface->csp) != 1) + return 0; + return usbcmd(f->dev, Rh2d|Rclass|Riface, Setproto, proto, iface->id, nil, 0); } |