dat.h 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  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 bits */
  43. Bufe = 1<<6, /* buffer under-run free recording enable */
  44. /* close track session cdb bits */
  45. Closetrack = 1,
  46. Closesessfinal = 2, /* close session / finalize disc */
  47. Closefinaldvdrw = 3, /* dvd-rw special: finalize */
  48. /* dvd+r dl special: close session, write extended lead-out */
  49. Closesessextdvdrdl = 4,
  50. Closefinal30mm = 5, /* dvd+r special: finalize with ≥30mm radius */
  51. Closedvdrbdfinal= 6, /* dvd+r, bd-r special: finalize */
  52. /* read toc format values */
  53. Tocfmttoc = 0,
  54. Tocfmtsessnos = 1,
  55. Tocfmtqleadin = 2,
  56. Tocfmtqpma = 3,
  57. Tocfmtatip = 4,
  58. Tocfmtcdtext = 5,
  59. /* read toc cdb[1] bit */
  60. Msfbit = 1<<1,
  61. /* write types, MMC-6 §7.5.4.9 */
  62. Wtpkt = 0,
  63. Wttrackonce,
  64. Wtsessonce,
  65. Wtraw,
  66. Wtlayerjump,
  67. /* Cache control bits in mode page 8 byte 2 */
  68. Ccrcd = 1<<0, /* read cache disabled */
  69. Ccmf = 1<<1, /* multiplication factor */
  70. Ccwce = 1<<2, /* writeback cache enabled */
  71. Ccsize = 1<<3, /* use `cache segment size', not `# of cache segments' */
  72. Ccdisc = 1<<4, /* discontinuity */
  73. Cccap = 1<<5, /* caching analysis permitted */
  74. Ccabpf = 1<<6, /* abort pre-fetch */
  75. Ccic = 1<<7, /* initiator control */
  76. /* drive->cap bits */
  77. Cwrite = 1<<0,
  78. Ccdda = 1<<1,
  79. CDNblock = 12, /* chosen for CD */
  80. DVDNblock = 16, /* DVD ECC block is 16 sectors */
  81. BDNblock = 32, /* BD ECC block (`cluster') is 32 sectors */
  82. };
  83. typedef struct Buf Buf;
  84. typedef struct Drive Drive;
  85. typedef struct Track Track;
  86. typedef struct Otrack Otrack;
  87. typedef struct Dev Dev;
  88. typedef struct Msf Msf; /* minute, second, frame */
  89. struct Msf {
  90. int m;
  91. int s;
  92. int f;
  93. };
  94. struct Track
  95. {
  96. /* initialized while obtaining the toc (gettoc) */
  97. vlong size; /* total size in bytes */
  98. long bs; /* block size in bytes */
  99. ulong beg; /* beginning block number */
  100. ulong end; /* ending block number */
  101. int type;
  102. Msf mbeg;
  103. Msf mend;
  104. /* initialized by fs */
  105. char name[32];
  106. int mode;
  107. ulong mtime;
  108. };
  109. struct DTrack
  110. {
  111. uchar name[32];
  112. uchar beg[4]; /* msf value; only used for audio */
  113. uchar end[4]; /* msf value; only used for audio */
  114. uchar size[8];
  115. uchar magic[4];
  116. };
  117. struct Otrack
  118. {
  119. Track *track;
  120. Drive *drive;
  121. int nchange;
  122. int omode;
  123. Buf *buf;
  124. int nref; /* kept by file server */
  125. };
  126. struct Dev
  127. {
  128. Otrack* (*openrd)(Drive *d, int trackno);
  129. Otrack* (*create)(Drive *d, int bs);
  130. long (*read)(Otrack *t, void *v, long n, long off);
  131. long (*write)(Otrack *t, void *v, long n);
  132. void (*close)(Otrack *t);
  133. int (*gettoc)(Drive*);
  134. int (*fixate)(Drive *d);
  135. char* (*ctl)(Drive *d, int argc, char **argv);
  136. char* (*setspeed)(Drive *d, int r, int w);
  137. };
  138. struct Drive
  139. {
  140. QLock;
  141. Scsi;
  142. int type; /* scsi peripheral device type */
  143. /* disc characteristics */
  144. int mmctype;
  145. char *dvdtype;
  146. int firsttrack;
  147. int ntrack;
  148. int nchange; /* compare with the members in Scsi */
  149. ulong changetime; /* " */
  150. int nameok;
  151. int writeok;
  152. int blank; /* (not used for anything yet) */
  153. int blankset;
  154. int recordable; /* writable by burning? */
  155. int recordableset;
  156. int erasable; /* rewritable? */
  157. int erasableset;
  158. Track track[Ntrack];
  159. ulong cap; /* drive capabilities */
  160. uchar blkbuf[BScdda];
  161. int maxreadspeed;
  162. int maxwritespeed;
  163. int readspeed;
  164. int writespeed;
  165. Dev;
  166. void *aux; /* kept by driver */
  167. };
  168. struct Buf
  169. {
  170. uchar *data; /* buffer */
  171. long off; /* data[0] at offset off in file */
  172. int bs; /* block size */
  173. long ndata; /* no. valid bytes in data */
  174. int nblock; /* total buffer size in blocks */
  175. int omode; /* OREAD, OWRITE */
  176. long (*fn)(Buf*, void*, long, long); /* read, write */
  177. /* used only by client */
  178. Otrack *otrack;
  179. };
  180. extern int vflag;