]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/nusb/lib/usb.h
nusb/usbd: fix dump %U formatter
[plan9front.git] / sys / src / cmd / nusb / lib / usb.h
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;
10 typedef struct Ep Ep;
11 typedef struct Iface Iface;
12 typedef struct Usbdev Usbdev;
13
14 enum {
15         /* fundamental constants */
16         Nep     = 256,  /* max. endpoints per usb device & per interface */
17
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 */
25
26         /* request type */
27         Rh2d    = 0<<7,         /* host to device */
28         Rd2h    = 1<<7,         /* device to host */ 
29
30         Rstd    = 0<<5,         /* types */
31         Rclass  = 1<<5,
32         Rvendor = 2<<5,
33
34         Rdev    = 0,            /* recipients */
35         Riface  = 1,
36         Rep     = 2,            /* endpoint */
37         Rother  = 3,
38
39         /* standard requests (USB2.0) */
40         Rgetstatus      = 0,
41         Rclearfeature   = 1,
42         Rsetfeature     = 3,
43         Rsetaddress     = 5,
44         Rgetdesc        = 6,
45         Rsetdesc        = 7,
46         Rgetconf        = 8,
47         Rsetconf        = 9,
48         Rgetiface       = 10,
49         Rsetiface       = 11,
50         Rsynchframe     = 12,
51
52         /* standard requests (USB3.0) */
53         Rsethubdepth    = 12,
54         Rgetporterrcnt  = 13,
55
56         Rgetcur = 0x81,
57         Rgetmin = 0x82,
58         Rgetmax = 0x83,
59         Rgetres = 0x84,
60         Rsetcur = 0x01,
61         Rsetmin = 0x02,
62         Rsetmax = 0x03,
63         Rsetres = 0x04,
64
65         /* dev classes */
66         Clnone          = 0,            /* not in usb */
67         Claudio         = 1,
68         Clcomms         = 2,
69         Clhid           = 3,
70         Clprinter       = 7,
71         Clstorage       = 8,
72         Clhub           = 9,
73         Cldata          = 10,
74
75         /* standard descriptor sizes */
76         Ddevlen         = 18,
77         Dconflen        = 9,
78         Difacelen       = 9,
79         Deplen          = 7,
80
81         /* descriptor types */
82         Ddev            = 1,
83         Dconf           = 2,
84         Dstr            = 3,
85         Diface          = 4,
86         Dep             = 5,
87         Dreport         = 0x22,
88         Dfunction       = 0x24,
89         Dphysical       = 0x23,
90
91         /* feature selectors */
92         Fdevremotewakeup = 1,
93         Fhalt   = 0,
94
95         /* device state */
96         Detached = 0,
97         Attached,
98         Enabled,
99         Assigned,
100         Configured,
101
102         /* endpoint direction */
103         Ein = 0,
104         Eout,
105         Eboth,
106
107         /* endpoint type */
108         Econtrol = 0,
109         Eiso = 1,
110         Ebulk = 2,
111         Eintr = 3,
112
113         /* endpoint isotype */
114         Eunknown = 0,
115         Easync = 1,
116         Eadapt = 2,
117         Esync = 3,
118
119         /* config attrib */
120         Cbuspowered = 1<<7,
121         Cselfpowered = 1<<6,
122         Cremotewakeup = 1<<5,
123
124         /* report types */
125         Tmtype  = 3<<2,
126         Tmitem  = 0xF0,
127         Tmain   = 0<<2,
128                 Tinput  = 0x80,
129                 Toutput = 0x90,
130                 Tfeature = 0xB0,
131                 Tcoll   = 0xA0,
132                 Tecoll  = 0xC0,
133          Tglobal        = 1<<2,
134                 Tusagepage = 0x00,
135                 Tlmin   = 0x10,
136                 Tlmax   = 0x20,
137                 Tpmin   = 0x30,
138                 Tpmax   = 0x40,
139                 Tunitexp        = 0x50,
140                 Tunit   = 0x60,
141                 Trepsize        = 0x70,
142                 TrepID  = 0x80,
143                 Trepcount = 0x90,
144                 Tpush   = 0xA0,
145                 Tpop    = 0xB0,
146          Tlocal = 2<<2,
147                 Tusage  = 0x00,
148                 Tumin   = 0x10,
149                 Tumax   = 0x20,
150                 Tdindex = 0x30,
151                 Tdmin   = 0x40,
152                 Tdmax   = 0x50,
153                 Tsindex = 0x70,
154                 Tsmin   = 0x80,
155                 Tsmax   = 0x90,
156                 Tsetdelim = 0xA0,
157          Treserved      = 3<<2,
158          Tlong  = 0xFE,
159
160 };
161
162 /*
163  * Usb device (when used for ep0s) or endpoint.
164  * RC: One ref because of existing, another one per ogoing I/O.
165  * per-driver resources (including FS if any) are released by aux
166  * once the last ref is gone. This may include other Devs using
167  * to access endpoints for actual I/O.
168  */
169 struct Dev
170 {
171         Ref;
172         char*   dir;            /* path for the endpoint dir */
173         int     id;             /* usb id for device or ep. number */
174         int     dfd;            /* descriptor for the data file */
175         int     cfd;            /* descriptor for the control file */
176         int     isusb3;         /* this is a usb3 device */
177         int     depth;          /* hub depth for usb3 hubs */
178         int     maxpkt;         /* cached from usb description */
179         Usbdev* usb;            /* USB description */
180         void*   aux;            /* for the device driver */
181         char*   hname;          /* hash name, unique for device */
182 };
183
184 /*
185  * device description as reported by USB (unpacked).
186  */
187 struct Usbdev
188 {
189         int     ver;            /* usb version */
190         ulong   csp;            /* USB class/subclass/proto */
191         int     vid;            /* vendor id */
192         int     did;            /* product (device) id */
193         int     dno;            /* device release number */
194         char*   vendor;
195         char*   product;
196         char*   serial;
197         int     vsid;
198         int     psid;
199         int     ssid;
200         int     class;          /* from descriptor */
201         int     nconf;          /* from descriptor */
202         Conf*   conf[Nconf];    /* configurations */
203         Ep*     ep[Nep];        /* all endpoints in device */
204         Desc*   ddesc[Nddesc];  /* (raw) device specific descriptors */
205 };
206
207 struct Ep
208 {
209         uchar   addr;           /* endpt address, 0-15 (|0x80 if Ein) */
210         uchar   dir;            /* direction, Ein/Eout */
211         uchar   type;           /* Econtrol, Eiso, Ebulk, Eintr */
212         uchar   isotype;                /* Eunknown, Easync, Eadapt, Esync */
213         int     id;
214         int     maxpkt;         /* max. packet size */
215         int     ntds;           /* nb. of Tds per µframe */
216         Conf*   conf;           /* the endpoint belongs to */
217         Iface*  iface;          /* the endpoint belongs to */
218 };
219
220 struct Altc
221 {
222         int     attrib;
223         int     interval;
224         int     maxpkt;
225         int     ntds;
226         void*   aux;            /* for the driver program */
227 };
228
229 struct Iface
230 {
231         int     id;             /* interface number */
232         ulong   csp;            /* USB class/subclass/proto */
233         Altc*   altc[Naltc];
234         Ep*     ep[Nep];
235         void*   aux;            /* for the driver program */
236 };
237
238 struct Conf
239 {
240         int     cval;           /* value for set configuration */
241         int     attrib;
242         int     milliamps;      /* maximum power in this config. */
243         Iface*  iface[Niface];
244 };
245
246 /*
247  * Device-specific descriptors.
248  * They show up mixed with other descriptors
249  * within a configuration.
250  * These are unknown to the library but handed to the driver.
251  */
252 struct DDesc
253 {
254         uchar   bLength;
255         uchar   bDescriptorType;
256         uchar   bbytes[1];
257         /* extra bytes allocated here to keep the rest of it */
258 };
259
260 struct Desc
261 {
262         Conf*   conf;           /* where this descriptor was read */
263         Iface*  iface;          /* last iface before desc in conf. */
264         Ep*     ep;             /* last endpt before desc in conf. */
265         Altc*   altc;           /* last alt.c. before desc in conf. */
266         DDesc   data;           /* unparsed standard USB descriptor */
267 };
268
269 /*
270  * layout of standard descriptor types
271  */
272 struct DDev
273 {
274         uchar   bLength;
275         uchar   bDescriptorType;
276         uchar   bcdUSB[2];
277         uchar   bDevClass;
278         uchar   bDevSubClass;
279         uchar   bDevProtocol;
280         uchar   bMaxPacketSize0;
281         uchar   idVendor[2];
282         uchar   idProduct[2];
283         uchar   bcdDev[2];
284         uchar   iManufacturer;
285         uchar   iProduct;
286         uchar   iSerialNumber;
287         uchar   bNumConfigurations;
288 };
289
290 struct DConf
291 {
292         uchar   bLength;
293         uchar   bDescriptorType;
294         uchar   wTotalLength[2];
295         uchar   bNumInterfaces;
296         uchar   bConfigurationValue;
297         uchar   iConfiguration;
298         uchar   bmAttributes;
299         uchar   MaxPower;
300 };
301
302 struct DIface
303 {
304         uchar   bLength;
305         uchar   bDescriptorType;
306         uchar   bInterfaceNumber;
307         uchar   bAlternateSetting;
308         uchar   bNumEndpoints;
309         uchar   bInterfaceClass;
310         uchar   bInterfaceSubClass;
311         uchar   bInterfaceProtocol;
312         uchar   iInterface;
313 };
314
315 struct DEp
316 {
317         uchar   bLength;
318         uchar   bDescriptorType;
319         uchar   bEndpointAddress;
320         uchar   bmAttributes;
321         uchar   wMaxPacketSize[2];
322         uchar   bInterval;
323 };
324
325 #define Class(csp)      ((csp) & 0xff)
326 #define Subclass(csp)   (((csp)>>8) & 0xff)
327 #define Proto(csp)      (((csp)>>16) & 0xff)
328 #define CSP(c, s, p)    ((c) | (s)<<8 | (p)<<16)
329
330 #define GET2(p)         (((p)[1] & 0xFF)<<8 | ((p)[0] & 0xFF))
331 #define PUT2(p,v)       {(p)[0] = (v); (p)[1] = (v)>>8;}
332 #define GET4(p)         (((p)[3]&0xFF)<<24 | ((p)[2]&0xFF)<<16 | \
333                          ((p)[1]&0xFF)<<8  | ((p)[0]&0xFF))
334 #define PUT4(p,v)       {(p)[0] = (v);     (p)[1] = (v)>>8; \
335                          (p)[2] = (v)>>16; (p)[3] = (v)>>24;}
336
337 #define dprint if(usbdebug)fprint
338 #define ddprint if(usbdebug > 1)fprint
339
340 #pragma varargck        type  "U"       Dev*
341 #pragma varargck        argpos  devctl  2
342
343 int     Ufmt(Fmt *f);
344 char*   classname(int c);
345 void    closedev(Dev *d);
346 int     configdev(Dev *d);
347 int     devctl(Dev *dev, char *fmt, ...);
348 void*   emallocz(ulong size, int zero);
349 char*   estrdup(char *s);
350 char*   hexstr(void *a, int n);
351 int     loaddevconf(Dev *d, int n);
352 int     loaddevdesc(Dev *d);
353 char*   loaddevstr(Dev *d, int sid);
354 Dev*    opendev(char *fn);
355 int     opendevdata(Dev *d, int mode);
356 Dev*    openep(Dev *d, int id);
357 int     parseconf(Usbdev *d, Conf *c, uchar *b, int n);
358 int     parsedesc(Usbdev *d, Conf *c, uchar *b, int n);
359 int     parsedev(Dev *xd, uchar *b, int n);
360 int     unstall(Dev *dev, Dev *ep, int dir);
361 int     usbcmd(Dev *d, int type, int req, int value, int index, uchar *data, int count);
362 Dev*    getdev(char *devid);
363
364 extern int usbdebug;    /* more messages for bigger values */
365
366