1 typedef struct Altc Altc;
2 typedef struct Conf Conf;
3 typedef struct DConf DConf;
4 typedef struct DDesc DDesc;
5 typedef struct DDev DDev;
6 typedef struct DEp DEp;
7 typedef struct DIface DIface;
8 typedef struct Desc Desc;
9 typedef struct Dev Dev;
11 typedef struct Iface Iface;
12 typedef struct Usbdev Usbdev;
15 /* fundamental constants */
16 Nep = 256, /* max. endpoints per usb device & per interface */
18 /* tunable parameters */
19 Nconf = 16, /* max. configurations per usb device */
20 Nddesc = 8*Nep, /* max. device-specific descriptors per usb device */
21 Niface = 16, /* max. interfaces per configuration */
22 Naltc = 256, /* max. alt configurations per interface */
23 Uctries = 4, /* no. of tries for usbcmd */
24 Ucdelay = 50, /* delay before retrying */
27 Rh2d = 0<<7, /* host to device */
28 Rd2h = 1<<7, /* device to host */
30 Rstd = 0<<5, /* types */
34 Rdev = 0, /* recipients */
36 Rep = 2, /* endpoint */
39 /* standard requests */
62 Clnone = 0, /* not in usb */
71 /* standard descriptor sizes */
77 /* descriptor types */
87 /* feature selectors */
98 /* endpoint direction */
109 /* endpoint isotype */
118 Cremotewakeup = 1<<5,
159 * Usb device (when used for ep0s) or endpoint.
160 * RC: One ref because of existing, another one per ogoing I/O.
161 * per-driver resources (including FS if any) are released by aux
162 * once the last ref is gone. This may include other Devs using
163 * to access endpoints for actual I/O.
168 char* dir; /* path for the endpoint dir */
169 int id; /* usb id for device or ep. number */
170 int dfd; /* descriptor for the data file */
171 int cfd; /* descriptor for the control file */
172 int maxpkt; /* cached from usb description */
173 Ref nerrs; /* number of errors in requests */
174 Usbdev* usb; /* USB description */
175 void* aux; /* for the device driver */
176 void (*free)(void*); /* idem. to release aux */
180 * device description as reported by USB (unpacked).
184 ulong csp; /* USB class/subclass/proto */
185 int vid; /* vendor id */
186 int did; /* product (device) id */
187 int dno; /* device release number */
194 int class; /* from descriptor */
195 int nconf; /* from descriptor */
196 Conf* conf[Nconf]; /* configurations */
197 Ep* ep[Nep]; /* all endpoints in device */
198 Desc* ddesc[Nddesc]; /* (raw) device specific descriptors */
203 uchar addr; /* endpt address, 0-15 (|0x80 if Ein) */
204 uchar dir; /* direction, Ein/Eout */
205 uchar type; /* Econtrol, Eiso, Ebulk, Eintr */
206 uchar isotype; /* Eunknown, Easync, Eadapt, Esync */
208 int maxpkt; /* max. packet size */
209 int ntds; /* nb. of Tds per µframe */
210 Conf* conf; /* the endpoint belongs to */
211 Iface* iface; /* the endpoint belongs to */
218 void* aux; /* for the driver program */
223 int id; /* interface number */
224 ulong csp; /* USB class/subclass/proto */
227 void* aux; /* for the driver program */
232 int cval; /* value for set configuration */
234 int milliamps; /* maximum power in this config. */
235 Iface* iface[Niface];
239 * Device-specific descriptors.
240 * They show up mixed with other descriptors
241 * within a configuration.
242 * These are unknown to the library but handed to the driver.
247 uchar bDescriptorType;
249 /* extra bytes allocated here to keep the rest of it */
254 Conf* conf; /* where this descriptor was read */
255 Iface* iface; /* last iface before desc in conf. */
256 Ep* ep; /* last endpt before desc in conf. */
257 Altc* altc; /* last alt.c. before desc in conf. */
258 DDesc data; /* unparsed standard USB descriptor */
262 * layout of standard descriptor types
267 uchar bDescriptorType;
272 uchar bMaxPacketSize0;
279 uchar bNumConfigurations;
285 uchar bDescriptorType;
286 uchar wTotalLength[2];
287 uchar bNumInterfaces;
288 uchar bConfigurationValue;
289 uchar iConfiguration;
297 uchar bDescriptorType;
298 uchar bInterfaceNumber;
299 uchar bAlternateSetting;
301 uchar bInterfaceClass;
302 uchar bInterfaceSubClass;
303 uchar bInterfaceProtocol;
310 uchar bDescriptorType;
311 uchar bEndpointAddress;
313 uchar wMaxPacketSize[2];
317 #define Class(csp) ((csp) & 0xff)
318 #define Subclass(csp) (((csp)>>8) & 0xff)
319 #define Proto(csp) (((csp)>>16) & 0xff)
320 #define CSP(c, s, p) ((c) | (s)<<8 | (p)<<16)
322 #define GET2(p) (((p)[1] & 0xFF)<<8 | ((p)[0] & 0xFF))
323 #define PUT2(p,v) {(p)[0] = (v); (p)[1] = (v)>>8;}
324 #define GET4(p) (((p)[3]&0xFF)<<24 | ((p)[2]&0xFF)<<16 | \
325 ((p)[1]&0xFF)<<8 | ((p)[0]&0xFF))
326 #define PUT4(p,v) {(p)[0] = (v); (p)[1] = (v)>>8; \
327 (p)[2] = (v)>>16; (p)[3] = (v)>>24;}
329 #define dprint if(usbdebug)fprint
330 #define ddprint if(usbdebug > 1)fprint
332 #pragma varargck type "U" Dev*
333 #pragma varargck argpos devctl 2
336 char* classname(int c);
337 void closedev(Dev *d);
338 int configdev(Dev *d);
339 int devctl(Dev *dev, char *fmt, ...);
340 void* emallocz(ulong size, int zero);
341 char* estrdup(char *s);
342 char* hexstr(void *a, int n);
343 int loaddevconf(Dev *d, int n);
344 int loaddevdesc(Dev *d);
345 char* loaddevstr(Dev *d, int sid);
346 Dev* opendev(char *fn);
347 int opendevdata(Dev *d, int mode);
348 Dev* openep(Dev *d, int id);
349 int parseconf(Usbdev *d, Conf *c, uchar *b, int n);
350 int parsedesc(Usbdev *d, Conf *c, uchar *b, int n);
351 int parsedev(Dev *xd, uchar *b, int n);
352 int unstall(Dev *dev, Dev *ep, int dir);
353 int usbcmd(Dev *d, int type, int req, int value, int index, uchar *data, int count);
356 extern int usbdebug; /* more messages for bigger values */