enum { Maxtrack = 200, Ntrack = Maxtrack+1, BScdrom = 2048, /* mmc data block size */ BScdda = 2352, BScdxa = 2336, BSmax = 2352, Maxfeatures = 512, /* scsi peripheral device types, SPC-3 §6.4.2 */ TypeDA = 0, /* Direct Access (SBC) */ TypeSA = 1, /* Sequential Access (SSC) */ TypeWO = 4, /* Worm (SBC)*/ TypeCD = 5, /* CD/DVD/BD (MMC) */ TypeMO = 7, /* rewriteable Magneto-Optical (SBC) */ TypeMC = 8, /* Medium Changer (SMC) */ /* MMC device types */ Mmcnone = 0, Mmccd, Mmcdvdminus, Mmcdvdplus, Mmcbd, /* disc or track types */ TypeNone = 0, TypeAudio, TypeAwritable, TypeData, TypeDwritable, TypeDisk, TypeBlank, /* disc writability classes */ Readonly = 0, /* -ROM */ Write1, /* -R: write once only */ Erasewrite, /* -R[WE]: erase then write */ Ram, /* -RAM: read & write unrestricted */ /* tri-state flags */ Unset = -1, No, Yes, /* offsets in Pagcapmechsts mode page; see MMC-3 §5.5.10 */ Capread = 2, Capwrite = 3, Capmisc = 5, /* device capabilities in Pagcapmechsts mode page */ Capcdr = 1<<0, /* bytes 2 & 3 */ Capcdrw = 1<<1, Captestwr = 1<<2, Capdvdrom = 1<<3, Capdvdr = 1<<4, Capdvdram = 1<<5, Capcdda = 1<<0, /* Capmisc bits */ Caprw = 1<<2, /* Pagwrparams mode page offsets */ Wpwrtype = 2, /* write type */ Wptrkmode, /* track mode */ Wpdatblktype, Wpsessfmt = 8, Wppktsz = 10, /* BE ulong: # user data blks/fixed pkt */ /* Pagwrparams bits */ Bufe = 1<<6, /* Wpwrtype: buffer under-run free recording enable */ /* Wptrkmode */ Msbits = 3<<6, /* multisession field */ Msnonext= 0<<6, /* no next border nor session */ Mscdnonext= 1<<6, /* cd special: no next session */ Msnext = 3<<6, /* next session or border allowed */ Fp = 1<<5, /* pay attention to Wppktsz */ /* close track session cdb bits */ Closetrack = 1, Closesessfinal = 2, /* close session / finalize disc */ Closefinaldvdrw = 3, /* dvd-rw special: finalize */ /* dvd+r dl special: close session, write extended lead-out */ Closesessextdvdrdl = 4, Closefinal30mm = 5, /* dvd+r special: finalize with ≥30mm radius */ Closedvdrbdfinal= 6, /* dvd+r, bd-r special: finalize */ /* read toc format values */ Tocfmttoc = 0, Tocfmtsessnos = 1, Tocfmtqleadin = 2, Tocfmtqpma = 3, Tocfmtatip = 4, Tocfmtcdtext = 5, /* read toc cdb[1] bit */ Msfbit = 1<<1, /* write types, MMC-6 §7.5.4.9 */ Wtpkt = 0, /* a.k.a. incremental */ Wttrackonce, Wtsessonce, /* a.k.a. disc-at-once */ Wtraw, Wtlayerjump, /* track modes (determine: are these also track types?) */ Tmcdda = 0, /* audio cdda */ Tm2audio, /* 2 audio channels */ Tmunintr = 4, /* data, recorded uninterrupted */ Tmintr, /* data, recorded interrupted (dvd default) */ /* data block types */ Dbraw = 0, /* 2352 bytes */ Db2kdata = 8, /* mode 1: 2K of user data */ Db2336, /* mode 2: 2336 bytes of user data */ /* session formats */ Sfdata = 0, Sfcdi = 0x10, Sfcdxa = 0x20, /* Cache control bits in mode page 8 byte 2 */ Ccrcd = 1<<0, /* read cache disabled */ Ccmf = 1<<1, /* multiplication factor */ Ccwce = 1<<2, /* writeback cache enabled */ Ccsize = 1<<3, /* use `cache segment size', not `# of cache segments' */ Ccdisc = 1<<4, /* discontinuity */ Cccap = 1<<5, /* caching analysis permitted */ Ccabpf = 1<<6, /* abort pre-fetch */ Ccic = 1<<7, /* initiator control */ /* drive->cap bits */ Cwrite = 1<<0, Ccdda = 1<<1, CDNblock = 12, /* chosen for CD */ DVDNblock = 16, /* DVD ECC block is 16 sectors */ BDNblock = 32, /* BD ECC block (`cluster') is 32 sectors */ /* BD-R are write-once in increments of 64KB */ /* * make a single transfer fit in a 9P rpc. if we don't do this, * remote access (e.g., via /mnt/term/dev/sd*) fails mysteriously. */ Readblock = 8192/BScdrom,}; typedef struct Buf Buf;typedef struct Dev Dev;typedef struct Drive Drive;typedef struct Msf Msf; /* minute, second, frame */typedef struct Otrack Otrack;typedef struct Track Track;typedef schar Tristate; struct Msf { int m; int s; int f;}; struct Track{ /* initialized while obtaining the toc (gettoc) */ vlong size; /* total size in bytes */ long bs; /* block size in bytes */ ulong beg; /* beginning block number */ ulong end; /* ending block number */ int type; Msf mbeg; Msf mend; /* initialized by fs */ char name[32]; int mode; ulong mtime;}; struct DTrack /* not used */{ uchar name[32]; uchar beg[4]; /* msf value; only used for audio */ uchar end[4]; /* msf value; only used for audio */ uchar size[8]; uchar magic[4];}; struct Otrack{ Track *track; Drive *drive; int nchange; int omode; Buf *buf; int nref; /* kept by file server */}; struct Dev{ Otrack* (*openrd)(Drive *d, int trackno); Otrack* (*create)(Drive *d, int bs); long (*read)(Otrack *t, void *v, long n, vlong off); long (*write)(Otrack *t, void *v, long n); void (*close)(Otrack *t); int (*gettoc)(Drive*); int (*fixate)(Drive *d); char* (*ctl)(Drive *d, int argc, char **argv); char* (*setspeed)(Drive *d, int r, int w);}; struct Drive{ QLock; Scsi; int type; /* scsi peripheral device type: Type?? */ /* disc characteristics */ int mmctype; /* cd, dvd, or bd */ char *dvdtype; /* name of dvd flavour */ char *laysfx; /* layer suffix (e.g., -dl) */ int firsttrack; int invistrack; int ntrack; int nchange; /* compare with the members in Scsi */ ulong changetime; /* " */ int relearn; /* need to re-learn the disc? */ int nameok; int writeok; /* writable disc? */ /* * we could combine these attributes into a single variable except * that we discover them separately sometimes. */ Tristate recordable; /* writable by burning? */ Tristate erasable; /* writable after erasing? */ Track track[Ntrack]; ulong end; /* # of blks on current disc */ ulong cap; /* drive capabilities */ uchar blkbuf[BScdda]; int maxreadspeed; int maxwritespeed; int readspeed; int writespeed; Dev; uchar features[Maxfeatures/8]; void *aux; /* kept by driver */}; struct Buf{ uchar *data; /* buffer */ vlong off; /* data[0] at offset off in file */ int bs; /* block size */ long ndata; /* no. valid bytes in data */ int nblock; /* total buffer size in blocks */ int omode; /* OREAD, OWRITE */ long (*fn)(Buf*, void*, long, ulong); /* read, write */ /* used only by client */ Otrack *otrack;}; extern int vflag;
enum {
Maxtrack = 200,
Ntrack = Maxtrack+1,
BScdrom = 2048, /* mmc data block size */
BScdda = 2352,
BScdxa = 2336,
BSmax = 2352,
Maxfeatures = 512,
/* scsi peripheral device types, SPC-3 §6.4.2 */
TypeDA = 0, /* Direct Access (SBC) */
TypeSA = 1, /* Sequential Access (SSC) */
TypeWO = 4, /* Worm (SBC)*/
TypeCD = 5, /* CD/DVD/BD (MMC) */
TypeMO = 7, /* rewriteable Magneto-Optical (SBC) */
TypeMC = 8, /* Medium Changer (SMC) */
/* MMC device types */
Mmcnone = 0,
Mmccd,
Mmcdvdminus,
Mmcdvdplus,
Mmcbd,
/* disc or track types */
TypeNone = 0,
TypeAudio,
TypeAwritable,
TypeData,
TypeDwritable,
TypeDisk,
TypeBlank,
/* disc writability classes */
Readonly = 0, /* -ROM */
Write1, /* -R: write once only */
Erasewrite, /* -R[WE]: erase then write */
Ram, /* -RAM: read & write unrestricted */
/* tri-state flags */
Unset = -1,
No,
Yes,
/* offsets in Pagcapmechsts mode page; see MMC-3 §5.5.10 */
Capread = 2,
Capwrite = 3,
Capmisc = 5,
/* device capabilities in Pagcapmechsts mode page */
Capcdr = 1<<0, /* bytes 2 & 3 */
Capcdrw = 1<<1,
Captestwr = 1<<2,
Capdvdrom = 1<<3,
Capdvdr = 1<<4,
Capdvdram = 1<<5,
Capcdda = 1<<0, /* Capmisc bits */
Caprw = 1<<2,
/* Pagwrparams mode page offsets */
Wpwrtype = 2, /* write type */
Wptrkmode, /* track mode */
Wpdatblktype,
Wpsessfmt = 8,
Wppktsz = 10, /* BE ulong: # user data blks/fixed pkt */
/* Pagwrparams bits */
Bufe = 1<<6, /* Wpwrtype: buffer under-run free recording enable */
/* Wptrkmode */
Msbits = 3<<6, /* multisession field */
Msnonext= 0<<6, /* no next border nor session */
Mscdnonext= 1<<6, /* cd special: no next session */
Msnext = 3<<6, /* next session or border allowed */
Fp = 1<<5, /* pay attention to Wppktsz */
/* close track session cdb bits */
Closetrack = 1,
Closesessfinal = 2, /* close session / finalize disc */
Closefinaldvdrw = 3, /* dvd-rw special: finalize */
/* dvd+r dl special: close session, write extended lead-out */
Closesessextdvdrdl = 4,
Closefinal30mm = 5, /* dvd+r special: finalize with ≥30mm radius */
Closedvdrbdfinal= 6, /* dvd+r, bd-r special: finalize */
/* read toc format values */
Tocfmttoc = 0,
Tocfmtsessnos = 1,
Tocfmtqleadin = 2,
Tocfmtqpma = 3,
Tocfmtatip = 4,
Tocfmtcdtext = 5,
/* read toc cdb[1] bit */
Msfbit = 1<<1,
/* write types, MMC-6 §7.5.4.9 */
Wtpkt = 0, /* a.k.a. incremental */
Wttrackonce,
Wtsessonce, /* a.k.a. disc-at-once */
Wtraw,
Wtlayerjump,
/* track modes (determine: are these also track types?) */
Tmcdda = 0, /* audio cdda */
Tm2audio, /* 2 audio channels */
Tmunintr = 4, /* data, recorded uninterrupted */
Tmintr, /* data, recorded interrupted (dvd default) */
/* data block types */
Dbraw = 0, /* 2352 bytes */
Db2kdata = 8, /* mode 1: 2K of user data */
Db2336, /* mode 2: 2336 bytes of user data */
/* session formats */
Sfdata = 0,
Sfcdi = 0x10,
Sfcdxa = 0x20,
/* Cache control bits in mode page 8 byte 2 */
Ccrcd = 1<<0, /* read cache disabled */
Ccmf = 1<<1, /* multiplication factor */
Ccwce = 1<<2, /* writeback cache enabled */
Ccsize = 1<<3, /* use `cache segment size', not `# of cache segments' */
Ccdisc = 1<<4, /* discontinuity */
Cccap = 1<<5, /* caching analysis permitted */
Ccabpf = 1<<6, /* abort pre-fetch */
Ccic = 1<<7, /* initiator control */
/* drive->cap bits */
Cwrite = 1<<0,
Ccdda = 1<<1,
CDNblock = 12, /* chosen for CD */
DVDNblock = 16, /* DVD ECC block is 16 sectors */
BDNblock = 32, /* BD ECC block (`cluster') is 32 sectors */
/* BD-R are write-once in increments of 64KB */
/*
* make a single transfer fit in a 9P rpc. if we don't do this,
* remote access (e.g., via /mnt/term/dev/sd*) fails mysteriously.
*/
Readblock = 8192/BScdrom,
};
typedef struct Buf Buf;
typedef struct Dev Dev;
typedef struct Drive Drive;
typedef struct Msf Msf; /* minute, second, frame */
typedef struct Otrack Otrack;
typedef struct Track Track;
typedef schar Tristate;
struct Msf {
int m;
int s;
int f;
};
struct Track
{
/* initialized while obtaining the toc (gettoc) */
vlong size; /* total size in bytes */
long bs; /* block size in bytes */
ulong beg; /* beginning block number */
ulong end; /* ending block number */
int type;
Msf mbeg;
Msf mend;
/* initialized by fs */
char name[32];
int mode;
ulong mtime;
};
struct DTrack /* not used */
{
uchar name[32];
uchar beg[4]; /* msf value; only used for audio */
uchar end[4]; /* msf value; only used for audio */
uchar size[8];
uchar magic[4];
};
struct Otrack
{
Track *track;
Drive *drive;
int nchange;
int omode;
Buf *buf;
int nref; /* kept by file server */
};
struct Dev
{
Otrack* (*openrd)(Drive *d, int trackno);
Otrack* (*create)(Drive *d, int bs);
long (*read)(Otrack *t, void *v, long n, vlong off);
long (*write)(Otrack *t, void *v, long n);
void (*close)(Otrack *t);
int (*gettoc)(Drive*);
int (*fixate)(Drive *d);
char* (*ctl)(Drive *d, int argc, char **argv);
char* (*setspeed)(Drive *d, int r, int w);
};
struct Drive
{
QLock;
Scsi;
int type; /* scsi peripheral device type: Type?? */
/* disc characteristics */
int mmctype; /* cd, dvd, or bd */
char *dvdtype; /* name of dvd flavour */
char *laysfx; /* layer suffix (e.g., -dl) */
int firsttrack;
int invistrack;
int ntrack;
int nchange; /* compare with the members in Scsi */
ulong changetime; /* " */
int relearn; /* need to re-learn the disc? */
int nameok;
int writeok; /* writable disc? */
/*
* we could combine these attributes into a single variable except
* that we discover them separately sometimes.
*/
Tristate recordable; /* writable by burning? */
Tristate erasable; /* writable after erasing? */
Track track[Ntrack];
ulong end; /* # of blks on current disc */
ulong cap; /* drive capabilities */
uchar blkbuf[BScdda];
int maxreadspeed;
int maxwritespeed;
int readspeed;
int writespeed;
Dev;
uchar features[Maxfeatures/8];
void *aux; /* kept by driver */
};
struct Buf
{
uchar *data; /* buffer */
vlong off; /* data[0] at offset off in file */
int bs; /* block size */
long ndata; /* no. valid bytes in data */
int nblock; /* total buffer size in blocks */
int omode; /* OREAD, OWRITE */
long (*fn)(Buf*, void*, long, ulong); /* read, write */
/* used only by client */
Otrack *otrack;
};
extern int vflag;