xref: /plan9/sys/src/cmd/cdfs/dat.h (revision 3468a4915d661daa200976acc4f80f51aae144b2)
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;
245