123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210 |
- enum {
- Maxtrack = 200,
- Ntrack = Maxtrack+1,
- BScdrom = 2048, /* mmc data block size */
- BScdda = 2352,
- BScdxa = 2336,
- BSmax = 2352,
- /* 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,
- /* 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 bits */
- Bufe = 1<<6, /* buffer under-run free recording enable */
- /* 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,
- Wttrackonce,
- Wtsessonce,
- Wtraw,
- Wtlayerjump,
- /* 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 */
- };
- typedef struct Buf Buf;
- typedef struct Drive Drive;
- typedef struct Track Track;
- typedef struct Otrack Otrack;
- typedef struct Dev Dev;
- typedef struct Msf Msf; /* minute, second, frame */
- 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
- {
- 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, long 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 */
- /* disc characteristics */
- int mmctype;
- char *dvdtype;
- int firsttrack;
- int ntrack;
- int nchange; /* compare with the members in Scsi */
- ulong changetime; /* " */
- int nameok;
- int writeok;
- int blank; /* (not used for anything yet) */
- int blankset;
- int recordable; /* writable by burning? */
- int recordableset;
- int erasable; /* rewritable? */
- int erasableset;
- Track track[Ntrack];
- ulong cap; /* drive capabilities */
- uchar blkbuf[BScdda];
- int maxreadspeed;
- int maxwritespeed;
- int readspeed;
- int writespeed;
- Dev;
- void *aux; /* kept by driver */
- };
- struct Buf
- {
- uchar *data; /* buffer */
- long 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, long); /* read, write */
- /* used only by client */
- Otrack *otrack;
- };
- extern int vflag;
|