usb.h 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. /*
  2. * common USB definitions
  3. */
  4. typedef struct Ctlr Ctlr;
  5. typedef struct Endpt Endpt;
  6. typedef struct Udev Udev;
  7. typedef struct Usbhost Usbhost;
  8. enum
  9. {
  10. MaxUsb = 10, /* max # of USB Host Controller Interfaces (Usbhost*) */
  11. MaxUsbDev = 32, /* max # of attached USB devs, including root hub (Udev*) */
  12. /* request type */
  13. RH2D = 0<<7, /* output */
  14. RD2H = 1<<7, /* input */
  15. Rstandard = 0<<5,
  16. Rclass = 1<<5,
  17. Rvendor = 2<<5,
  18. Rdevice = 0,
  19. Rinterface = 1,
  20. Rendpt = 2,
  21. Rother = 3,
  22. };
  23. #define Class(csp) ((csp)&0xff)
  24. #define Subclass(csp) (((csp)>>8)&0xff)
  25. #define Proto(csp) (((csp)>>16)&0xff)
  26. #define CSP(c, s, p) ((c) | ((s)<<8) | ((p)<<16))
  27. /* for OHCI */
  28. typedef struct ED ED;
  29. struct ED {
  30. ulong ctrl;
  31. ulong tail; /* transfer descriptor */
  32. ulong head;
  33. ulong next;
  34. };
  35. enum{
  36. Dirout,
  37. Dirin,
  38. };
  39. /*
  40. * device endpoint
  41. */
  42. struct Endpt
  43. {
  44. Ref;
  45. Lock;
  46. int x; /* index in Udev.ep */
  47. struct{ /* OHCI */
  48. char* err; /* needs to be global for unstall; fix? */
  49. int xdone;
  50. int xstarted;
  51. int queued; /* # of TDs queued on ED */
  52. Rendez rend;
  53. } dir[2];
  54. int epmode;
  55. int epnewmode;
  56. int id; /* hardware endpoint address */
  57. int maxpkt; /* maximum packet size (from endpoint descriptor) */
  58. uchar wdata01; /* 0=DATA0, 1=DATA1 for output direction */
  59. uchar rdata01; /* 0=DATA0, 1=DATA1 for input direction */
  60. int override; /* a data command sets this and prevents
  61. * auto setting of rdata01 or wdata01
  62. */
  63. uchar eof;
  64. ulong csp;
  65. uchar mode; /* OREAD, OWRITE, ORDWR */
  66. uchar nbuf; /* number of buffers allowed */
  67. uchar debug;
  68. uchar active; /* listed for examination by interrupts */
  69. int setin;
  70. /* ISO is all half duplex, so need only one copy of these: */
  71. ulong bw; /* bandwidth requirement (OHCI) */
  72. int hz;
  73. int remain; /* for packet size calculations */
  74. int partial; /* last iso packet may have been half full */
  75. Block *bpartial;
  76. int samplesz;
  77. int sched; /* schedule index; -1 if undefined or aperiodic */
  78. int pollms; /* polling interval in msec */
  79. int psize; /* (remaining) size of this packet */
  80. int off; /* offset into packet */
  81. /* Real-time iso stuff */
  82. vlong foffset; /* file offset (to detect seeks) */
  83. ulong poffset; /* offset of next packet to be queued */
  84. short frnum; /* frame number associated with poffset */
  85. int rem; /* remainder after rounding Hz to samples/ms */
  86. vlong toffset; /* offset associated with time */
  87. vlong time; /* time associated with offset */
  88. int buffered; /* bytes captured but unread, or written but unsent */
  89. /* end ISO stuff */
  90. Udev* dev; /* owning device */
  91. ulong nbytes;
  92. ulong nblocks;
  93. void *private;
  94. /*
  95. * all the rest could (should?) move to the driver private structure;
  96. * except perhaps err.
  97. */
  98. QLock rlock;
  99. Queue* rq;
  100. QLock wlock;
  101. Queue* wq;
  102. int ntd;
  103. Endpt* activef; /* active endpoint list */
  104. };
  105. /* OHCI endpoint modes */
  106. enum {
  107. Nomode,
  108. Ctlmode,
  109. Bulkmode,
  110. Intrmode,
  111. Isomode,
  112. Nmodes,
  113. };
  114. /* device parameters */
  115. enum
  116. {
  117. /* Udev.state */
  118. Disabled = 0,
  119. Attached,
  120. Enabled,
  121. Assigned,
  122. Configured,
  123. /* Udev.class */
  124. Noclass = 0,
  125. Hubclass = 9,
  126. };
  127. typedef enum {
  128. Fullspeed, /* Don't change order, used in ehci h/w interface */
  129. Lowspeed,
  130. Highspeed,
  131. Nospeed,
  132. } Speed; /* Device speed */
  133. /*
  134. * active USB device
  135. */
  136. struct Udev
  137. {
  138. Ref;
  139. Lock;
  140. Usbhost *uh;
  141. int x; /* index in usbdev[] */
  142. int busy;
  143. int state;
  144. int id;
  145. uchar port; /* port number on connecting hub */
  146. ulong csp;
  147. ushort vid; /* vendor id */
  148. ushort did; /* product id */
  149. Speed speed;
  150. int npt;
  151. Endpt* ep[16]; /* active end points */
  152. Udev* ports; /* active ports, if hub */
  153. Udev* next; /* next device on this hub */
  154. };
  155. /*
  156. * One of these per active Host Controller Interface (HCI)
  157. */
  158. struct Usbhost
  159. {
  160. ISAConf; /* hardware info */
  161. int tbdf; /* type+busno+devno+funcno */
  162. QLock; /* protects namespace state */
  163. int idgen; /* version # to distinguish new connections */
  164. Udev* dev[MaxUsbDev]; /* device endpoints managed by this HCI */
  165. void (*init)(Usbhost*);
  166. void (*interrupt)(Ureg*, void*);
  167. void (*debug)(Usbhost*, char*, char*);
  168. void (*portinfo)(Usbhost*, char*, char*);
  169. void (*portreset)(Usbhost*, int);
  170. void (*portenable)(Usbhost*, int, int);
  171. void (*epalloc)(Usbhost*, Endpt*);
  172. void (*epfree)(Usbhost*, Endpt*);
  173. void (*epopen)(Usbhost*, Endpt*);
  174. void (*epclose)(Usbhost*, Endpt*);
  175. void (*epmode)(Usbhost*, Endpt*);
  176. void (*epmaxpkt)(Usbhost*, Endpt*);
  177. long (*read)(Usbhost*, Endpt*, void*, long, vlong);
  178. long (*write)(Usbhost*, Endpt*, void*, long, vlong, int);
  179. void *ctlr;
  180. int tokin;
  181. int tokout;
  182. int toksetup;
  183. };
  184. extern void addusbtype(char*, int(*)(Usbhost*));