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