dat.h 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. enum {
  2. Maxtrack = 200,
  3. Ntrack = Maxtrack+1,
  4. BScdrom = 2048, /* mmc data block size */
  5. BScdda = 2352,
  6. BScdxa = 2336,
  7. BSmax = 2352,
  8. /* scsi peripheral device types, SPC-3 §6.4.2 */
  9. TypeDA = 0, /* Direct Access (SBC) */
  10. TypeSA = 1, /* Sequential Access (SSC) */
  11. TypeWO = 4, /* Worm (SBC)*/
  12. TypeCD = 5, /* CD/DVD/BD (MMC) */
  13. TypeMO = 7, /* rewriteable Magneto-Optical (SBC) */
  14. TypeMC = 8, /* Medium Changer (SMC) */
  15. /* MMC device types */
  16. Mmcnone = 0,
  17. Mmccd,
  18. Mmcdvdminus,
  19. Mmcdvdplus,
  20. Mmcbd,
  21. /* disc or track types */
  22. TypeNone = 0,
  23. TypeAudio,
  24. TypeAwritable,
  25. TypeData,
  26. TypeDwritable,
  27. TypeDisk,
  28. TypeBlank,
  29. /* offsets in Pagcapmechsts mode page; see MMC-3 §5.5.10 */
  30. Capread = 2,
  31. Capwrite = 3,
  32. Capmisc = 5,
  33. /* device capabilities in Pagcapmechsts mode page */
  34. Capcdr = 1<<0, /* bytes 2 & 3 */
  35. Capcdrw = 1<<1,
  36. Captestwr = 1<<2,
  37. Capdvdrom = 1<<3,
  38. Capdvdr = 1<<4,
  39. Capdvdram = 1<<5,
  40. Capcdda = 1<<0, /* Capmisc bits */
  41. Caprw = 1<<2,
  42. /* Pagwrparams mode page offsets */
  43. Wpwrtype = 2, /* write type */
  44. Wptrkmode, /* track mode */
  45. Wpdatblktype,
  46. Wpsessfmt = 8,
  47. Wppktsz = 10, /* BE ulong: # user data blks/fixed pkt */
  48. /* Pagwrparams bits */
  49. Bufe = 1<<6, /* Wpwrtype: buffer under-run free recording enable */
  50. /* Wptrkmode */
  51. Msbits = 3<<6, /* multisession field */
  52. Msnonext= 0<<6, /* no next border nor session */
  53. Mscdnonext= 1<<6, /* cd special: no next session */
  54. Msnext = 3<<6, /* next session or border allowed */
  55. Fp = 1<<5, /* pay attention to Wppktsz */
  56. /* close track session cdb bits */
  57. Closetrack = 1,
  58. Closesessfinal = 2, /* close session / finalize disc */
  59. Closefinaldvdrw = 3, /* dvd-rw special: finalize */
  60. /* dvd+r dl special: close session, write extended lead-out */
  61. Closesessextdvdrdl = 4,
  62. Closefinal30mm = 5, /* dvd+r special: finalize with ≥30mm radius */
  63. Closedvdrbdfinal= 6, /* dvd+r, bd-r special: finalize */
  64. /* read toc format values */
  65. Tocfmttoc = 0,
  66. Tocfmtsessnos = 1,
  67. Tocfmtqleadin = 2,
  68. Tocfmtqpma = 3,
  69. Tocfmtatip = 4,
  70. Tocfmtcdtext = 5,
  71. /* read toc cdb[1] bit */
  72. Msfbit = 1<<1,
  73. /* write types, MMC-6 §7.5.4.9 */
  74. Wtpkt = 0, /* a.k.a. incremental */
  75. Wttrackonce,
  76. Wtsessonce, /* a.k.a. disc-at-once */
  77. Wtraw,
  78. Wtlayerjump,
  79. /* track modes (TODO: also track types?) */
  80. Tmcdda = 0, /* audio cdda */
  81. Tm2audio, /* 2 audio channels */
  82. Tmunintr = 4, /* data, recorded uninterrupted */
  83. Tmintr, /* data, recorded interrupted (dvd default) */
  84. /* data block types */
  85. Dbraw = 0, /* 2352 bytes */
  86. Db2kdata = 8, /* mode 1: 2K of user data */
  87. Db2336, /* mode 2: 2336 bytes of user data */
  88. /* session formats */
  89. Sfdata = 0,
  90. Sfcdi = 0x10,
  91. Sfcdxa = 0x20,
  92. /* Cache control bits in mode page 8 byte 2 */
  93. Ccrcd = 1<<0, /* read cache disabled */
  94. Ccmf = 1<<1, /* multiplication factor */
  95. Ccwce = 1<<2, /* writeback cache enabled */
  96. Ccsize = 1<<3, /* use `cache segment size', not `# of cache segments' */
  97. Ccdisc = 1<<4, /* discontinuity */
  98. Cccap = 1<<5, /* caching analysis permitted */
  99. Ccabpf = 1<<6, /* abort pre-fetch */
  100. Ccic = 1<<7, /* initiator control */
  101. /* drive->cap bits */
  102. Cwrite = 1<<0,
  103. Ccdda = 1<<1,
  104. CDNblock = 12, /* chosen for CD */
  105. DVDNblock = 16, /* DVD ECC block is 16 sectors */
  106. BDNblock = 32, /* BD ECC block (`cluster') is 32 sectors */
  107. /*
  108. * make a single transfer fit in a 9P rpc. if we don't do this,
  109. * remote access (e.g., via /mnt/term/dev/sd*) fails mysteriously.
  110. */
  111. Readblock = 8192/BScdrom,
  112. };
  113. typedef struct Buf Buf;
  114. typedef struct Drive Drive;
  115. typedef struct Track Track;
  116. typedef struct Otrack Otrack;
  117. typedef struct Dev Dev;
  118. typedef struct Msf Msf; /* minute, second, frame */
  119. struct Msf {
  120. int m;
  121. int s;
  122. int f;
  123. };
  124. struct Track
  125. {
  126. /* initialized while obtaining the toc (gettoc) */
  127. vlong size; /* total size in bytes */
  128. long bs; /* block size in bytes */
  129. ulong beg; /* beginning block number */
  130. ulong end; /* ending block number */
  131. int type;
  132. Msf mbeg;
  133. Msf mend;
  134. /* initialized by fs */
  135. char name[32];
  136. int mode;
  137. ulong mtime;
  138. };
  139. struct DTrack /* not used */
  140. {
  141. uchar name[32];
  142. uchar beg[4]; /* msf value; only used for audio */
  143. uchar end[4]; /* msf value; only used for audio */
  144. uchar size[8];
  145. uchar magic[4];
  146. };
  147. struct Otrack
  148. {
  149. Track *track;
  150. Drive *drive;
  151. int nchange;
  152. int omode;
  153. Buf *buf;
  154. int nref; /* kept by file server */
  155. };
  156. struct Dev
  157. {
  158. Otrack* (*openrd)(Drive *d, int trackno);
  159. Otrack* (*create)(Drive *d, int bs);
  160. long (*read)(Otrack *t, void *v, long n, vlong off);
  161. long (*write)(Otrack *t, void *v, long n);
  162. void (*close)(Otrack *t);
  163. int (*gettoc)(Drive*);
  164. int (*fixate)(Drive *d);
  165. char* (*ctl)(Drive *d, int argc, char **argv);
  166. char* (*setspeed)(Drive *d, int r, int w);
  167. };
  168. struct Drive
  169. {
  170. QLock;
  171. Scsi;
  172. int type; /* scsi peripheral device type */
  173. /* disc characteristics */
  174. int mmctype;
  175. char *dvdtype;
  176. int firsttrack;
  177. int ntrack;
  178. int nchange; /* compare with the members in Scsi */
  179. ulong changetime; /* " */
  180. int nameok;
  181. int writeok;
  182. int blank; /* (not used for anything yet) */
  183. int blankset;
  184. int recordable; /* writable by burning? */
  185. int recordableset;
  186. int erasable; /* rewritable? */
  187. int erasableset;
  188. Track track[Ntrack];
  189. ulong cap; /* drive capabilities */
  190. uchar blkbuf[BScdda];
  191. int maxreadspeed;
  192. int maxwritespeed;
  193. int readspeed;
  194. int writespeed;
  195. Dev;
  196. void *aux; /* kept by driver */
  197. };
  198. struct Buf
  199. {
  200. uchar *data; /* buffer */
  201. vlong off; /* data[0] at offset off in file */
  202. int bs; /* block size */
  203. long ndata; /* no. valid bytes in data */
  204. int nblock; /* total buffer size in blocks */
  205. int omode; /* OREAD, OWRITE */
  206. long (*fn)(Buf*, void*, long, ulong); /* read, write */
  207. /* used only by client */
  208. Otrack *otrack;
  209. };
  210. extern int vflag;