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 */
177 char* hname; /* hash name, unique for device */
181 * device description as reported by USB (unpacked).
185 ulong csp; /* USB class/subclass/proto */
186 int vid; /* vendor id */
187 int did; /* product (device) id */
188 int dno; /* device release number */
195 int class; /* from descriptor */
196 int nconf; /* from descriptor */
197 Conf* conf[Nconf]; /* configurations */
198 Ep* ep[Nep]; /* all endpoints in device */
199 Desc* ddesc[Nddesc]; /* (raw) device specific descriptors */
204 uchar addr; /* endpt address, 0-15 (|0x80 if Ein) */
205 uchar dir; /* direction, Ein/Eout */
206 uchar type; /* Econtrol, Eiso, Ebulk, Eintr */
207 uchar isotype; /* Eunknown, Easync, Eadapt, Esync */
209 int maxpkt; /* max. packet size */
210 int ntds; /* nb. of Tds per µframe */
211 Conf* conf; /* the endpoint belongs to */
212 Iface* iface; /* the endpoint belongs to */
219 void* aux; /* for the driver program */
224 int id; /* interface number */
225 ulong csp; /* USB class/subclass/proto */
228 void* aux; /* for the driver program */
233 int cval; /* value for set configuration */
235 int milliamps; /* maximum power in this config. */
236 Iface* iface[Niface];
240 * Device-specific descriptors.
241 * They show up mixed with other descriptors
242 * within a configuration.
243 * These are unknown to the library but handed to the driver.
248 uchar bDescriptorType;
250 /* extra bytes allocated here to keep the rest of it */
255 Conf* conf; /* where this descriptor was read */
256 Iface* iface; /* last iface before desc in conf. */
257 Ep* ep; /* last endpt before desc in conf. */
258 Altc* altc; /* last alt.c. before desc in conf. */
259 DDesc data; /* unparsed standard USB descriptor */
263 * layout of standard descriptor types
268 uchar bDescriptorType;
273 uchar bMaxPacketSize0;
280 uchar bNumConfigurations;
286 uchar bDescriptorType;
287 uchar wTotalLength[2];
288 uchar bNumInterfaces;
289 uchar bConfigurationValue;
290 uchar iConfiguration;
298 uchar bDescriptorType;
299 uchar bInterfaceNumber;
300 uchar bAlternateSetting;
302 uchar bInterfaceClass;
303 uchar bInterfaceSubClass;
304 uchar bInterfaceProtocol;
311 uchar bDescriptorType;
312 uchar bEndpointAddress;
314 uchar wMaxPacketSize[2];
318 #define Class(csp) ((csp) & 0xff)
319 #define Subclass(csp) (((csp)>>8) & 0xff)
320 #define Proto(csp) (((csp)>>16) & 0xff)
321 #define CSP(c, s, p) ((c) | (s)<<8 | (p)<<16)
323 #define GET2(p) (((p)[1] & 0xFF)<<8 | ((p)[0] & 0xFF))
324 #define PUT2(p,v) {(p)[0] = (v); (p)[1] = (v)>>8;}
325 #define GET4(p) (((p)[3]&0xFF)<<24 | ((p)[2]&0xFF)<<16 | \
326 ((p)[1]&0xFF)<<8 | ((p)[0]&0xFF))
327 #define PUT4(p,v) {(p)[0] = (v); (p)[1] = (v)>>8; \
328 (p)[2] = (v)>>16; (p)[3] = (v)>>24;}
330 #define dprint if(usbdebug)fprint
331 #define ddprint if(usbdebug > 1)fprint
333 #pragma varargck type "U" Dev*
334 #pragma varargck argpos devctl 2
337 char* classname(int c);
338 void closedev(Dev *d);
339 int configdev(Dev *d);
340 int devctl(Dev *dev, char *fmt, ...);
341 void* emallocz(ulong size, int zero);
342 char* estrdup(char *s);
343 char* hexstr(void *a, int n);
344 int loaddevconf(Dev *d, int n);
345 int loaddevdesc(Dev *d);
346 char* loaddevstr(Dev *d, int sid);
347 Dev* opendev(char *fn);
348 int opendevdata(Dev *d, int mode);
349 Dev* openep(Dev *d, int id);
350 int parseconf(Usbdev *d, Conf *c, uchar *b, int n);
351 int parsedesc(Usbdev *d, Conf *c, uchar *b, int n);
352 int parsedev(Dev *xd, uchar *b, int n);
353 int unstall(Dev *dev, Dev *ep, int dir);
354 int usbcmd(Dev *d, int type, int req, int value, int index, uchar *data, int count);
355 Dev* getdev(char *devid);
357 extern int usbdebug; /* more messages for bigger values */