]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/cdfs/dat.h
cwfs: back to previous version
[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         /* 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;