ref: ee81e320c0810b705f7f32b39b6e900e5967cc79
parent: 4d5d86a6a228f88847d3d62a43ac9b3011cdb166
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Wed Feb 10 15:08:13 EST 2021
nusb: don't create rw iso endpoints (by Michael Forney) There may be two iso endpoints with the same ID if it is asynchronous or adaptive (one for data, one for feedback), and rw iso endpoints are unusable (error out with "iso i/o is half-duplex").
--- a/sys/src/cmd/nusb/lib/parse.c
+++ b/sys/src/cmd/nusb/lib/parse.c
@@ -111,8 +111,6 @@
return -1;
}
dep = (DEp *)b;
- altc->attrib = dep->bmAttributes; /* here? */
- altc->interval = dep->bInterval;
type = dep->bmAttributes & 0x03;
addr = dep->bEndpointAddress;
@@ -145,13 +143,18 @@
ep->maxpkt = GET2(dep->wMaxPacketSize);
ep->ntds = 1 + ((ep->maxpkt >> 11) & 3);
ep->maxpkt &= 0x7FF;
- altc->maxpkt = ep->maxpkt;
- altc->ntds = ep->ntds;
ep->addr = addr;
ep->type = type;
ep->isotype = (dep->bmAttributes>>2) & 0x03;
+ ep->isousage = (dep->bmAttributes>>4) & 0x03;
ep->conf = c;
ep->iface = ip;
+ if(ep->type != Eiso || ep->isousage == Edata || ep->isousage == Eimplicit){
+ altc->attrib = dep->bmAttributes;
+ altc->interval = dep->bInterval;
+ altc->maxpkt = ep->maxpkt;
+ altc->ntds = ep->ntds;
+ }
for(i = 0; i < nelem(ip->ep); i++)
if(ip->ep[i] == nil)
break;
--- a/sys/src/cmd/nusb/lib/usb.h
+++ b/sys/src/cmd/nusb/lib/usb.h
@@ -116,6 +116,11 @@
Eadapt = 2,
Esync = 3,
+ /* endpoint isousage */
+ Edata = 0,
+ Efeedback = 1,
+ Eimplicit = 2,
+
/* config attrib */
Cbuspowered = 1<<7,
Cselfpowered = 1<<6,
@@ -209,7 +214,9 @@
uchar addr; /* endpt address, 0-15 (|0x80 if Ein) */
uchar dir; /* direction, Ein/Eout */
uchar type; /* Econtrol, Eiso, Ebulk, Eintr */
- uchar isotype; /* Eunknown, Easync, Eadapt, Esync */
+ uchar isotype; /* Eunknown, Easync, Eadapt, Esync */
+ uchar isousage; /* Edata, Efeedback, Eimplicit */
+
int id;
int maxpkt; /* max. packet size */
int ntds; /* nb. of Tds per µframe */
--
⑨