dat.h 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  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. typedef struct Buf Buf;
  109. typedef struct Drive Drive;
  110. typedef struct Track Track;
  111. typedef struct Otrack Otrack;
  112. typedef struct Dev Dev;
  113. typedef struct Msf Msf; /* minute, second, frame */
  114. struct Msf {
  115. int m;
  116. int s;
  117. int f;
  118. };
  119. struct Track
  120. {
  121. /* initialized while obtaining the toc (gettoc) */
  122. vlong size; /* total size in bytes */
  123. long bs; /* block size in bytes */
  124. ulong beg; /* beginning block number */
  125. ulong end; /* ending block number */
  126. int type;
  127. Msf mbeg;
  128. Msf mend;
  129. /* initialized by fs */
  130. char name[32];
  131. int mode;
  132. ulong mtime;
  133. };
  134. struct DTrack /* not used */
  135. {
  136. uchar name[32];
  137. uchar beg[4]; /* msf value; only used for audio */
  138. uchar end[4]; /* msf value; only used for audio */
  139. uchar size[8];
  140. uchar magic[4];
  141. };
  142. struct Otrack
  143. {
  144. Track *track;
  145. Drive *drive;
  146. int nchange;
  147. int omode;
  148. Buf *buf;
  149. int nref; /* kept by file server */
  150. };
  151. struct Dev
  152. {
  153. Otrack* (*openrd)(Drive *d, int trackno);
  154. Otrack* (*create)(Drive *d, int bs);
  155. long (*read)(Otrack *t, void *v, long n, vlong off);
  156. long (*write)(Otrack *t, void *v, long n);
  157. void (*close)(Otrack *t);
  158. int (*gettoc)(Drive*);
  159. int (*fixate)(Drive *d);
  160. char* (*ctl)(Drive *d, int argc, char **argv);
  161. char* (*setspeed)(Drive *d, int r, int w);
  162. };
  163. struct Drive
  164. {
  165. QLock;
  166. Scsi;
  167. int type; /* scsi peripheral device type */
  168. /* disc characteristics */
  169. int mmctype;
  170. char *dvdtype;
  171. int firsttrack;
  172. int ntrack;
  173. int nchange; /* compare with the members in Scsi */
  174. ulong changetime; /* " */
  175. int nameok;
  176. int writeok;
  177. int blank; /* (not used for anything yet) */
  178. int blankset;
  179. int recordable; /* writable by burning? */
  180. int recordableset;
  181. int erasable; /* rewritable? */
  182. int erasableset;
  183. Track track[Ntrack];
  184. ulong cap; /* drive capabilities */
  185. uchar blkbuf[BScdda];
  186. int maxreadspeed;
  187. int maxwritespeed;
  188. int readspeed;
  189. int writespeed;
  190. Dev;
  191. void *aux; /* kept by driver */
  192. };
  193. struct Buf
  194. {
  195. uchar *data; /* buffer */
  196. vlong off; /* data[0] at offset off in file */
  197. int bs; /* block size */
  198. long ndata; /* no. valid bytes in data */
  199. int nblock; /* total buffer size in blocks */
  200. int omode; /* OREAD, OWRITE */
  201. long (*fn)(Buf*, void*, long, ulong); /* read, write */
  202. /* used only by client */
  203. Otrack *otrack;
  204. };
  205. extern int vflag;