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