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