root / lab4 / .minix-src / include / sys / cdio.h @ 14
History | View | Annotate | Download (11.1 KB)
1 | 13 | up20180614 | /* $NetBSD: cdio.h,v 1.34 2015/09/06 06:01:02 dholland Exp $ */
|
---|---|---|---|
2 | |||
3 | #ifndef _SYS_CDIO_H_
|
||
4 | #define _SYS_CDIO_H_
|
||
5 | |||
6 | #include <sys/ioccom.h> |
||
7 | |||
8 | /* Shared between kernel & process */
|
||
9 | |||
10 | union msf_lba {
|
||
11 | struct {
|
||
12 | u_char unused; |
||
13 | u_char minute; |
||
14 | u_char second; |
||
15 | u_char frame; |
||
16 | } msf; |
||
17 | uint32_t lba; |
||
18 | u_char addr[4];
|
||
19 | }; |
||
20 | |||
21 | struct cd_toc_entry {
|
||
22 | u_char nothing1; |
||
23 | #if BYTE_ORDER == LITTLE_ENDIAN
|
||
24 | uint32_t control:4;
|
||
25 | uint32_t addr_type:4;
|
||
26 | #endif
|
||
27 | #if BYTE_ORDER == BIG_ENDIAN
|
||
28 | uint32_t addr_type:4;
|
||
29 | uint32_t control:4;
|
||
30 | #endif
|
||
31 | u_char track; |
||
32 | u_char nothing2; |
||
33 | union msf_lba addr;
|
||
34 | }; |
||
35 | |||
36 | struct cd_sub_channel_header {
|
||
37 | u_char nothing1; |
||
38 | u_char audio_status; |
||
39 | #define CD_AS_AUDIO_INVALID 0x00 |
||
40 | #define CD_AS_PLAY_IN_PROGRESS 0x11 |
||
41 | #define CD_AS_PLAY_PAUSED 0x12 |
||
42 | #define CD_AS_PLAY_COMPLETED 0x13 |
||
43 | #define CD_AS_PLAY_ERROR 0x14 |
||
44 | #define CD_AS_NO_STATUS 0x15 |
||
45 | u_char data_len[2];
|
||
46 | }; |
||
47 | |||
48 | struct cd_sub_channel_q_data {
|
||
49 | u_char data_format; |
||
50 | #if BYTE_ORDER == LITTLE_ENDIAN
|
||
51 | uint32_t control:4;
|
||
52 | uint32_t addr_type:4;
|
||
53 | #endif
|
||
54 | #if BYTE_ORDER == BIG_ENDIAN
|
||
55 | uint32_t addr_type:4;
|
||
56 | uint32_t control:4;
|
||
57 | #endif
|
||
58 | u_char track_number; |
||
59 | u_char index_number; |
||
60 | u_char absaddr[4];
|
||
61 | u_char reladdr[4];
|
||
62 | #if BYTE_ORDER == LITTLE_ENDIAN
|
||
63 | uint32_t :7;
|
||
64 | uint32_t mc_valid:1;
|
||
65 | #endif
|
||
66 | #if BYTE_ORDER == BIG_ENDIAN
|
||
67 | uint32_t mc_valid:1;
|
||
68 | uint32_t :7;
|
||
69 | #endif
|
||
70 | u_char mc_number[15];
|
||
71 | #if BYTE_ORDER == LITTLE_ENDIAN
|
||
72 | uint32_t :7;
|
||
73 | uint32_t ti_valid:1;
|
||
74 | #endif
|
||
75 | #if BYTE_ORDER == BIG_ENDIAN
|
||
76 | uint32_t ti_valid:1;
|
||
77 | uint32_t :7;
|
||
78 | #endif
|
||
79 | u_char ti_number[15];
|
||
80 | }; |
||
81 | |||
82 | struct cd_sub_channel_position_data {
|
||
83 | u_char data_format; |
||
84 | #if BYTE_ORDER == LITTLE_ENDIAN
|
||
85 | uint32_t control:4;
|
||
86 | uint32_t addr_type:4;
|
||
87 | #endif
|
||
88 | #if BYTE_ORDER == BIG_ENDIAN
|
||
89 | uint32_t addr_type:4;
|
||
90 | uint32_t control:4;
|
||
91 | #endif
|
||
92 | u_char track_number; |
||
93 | u_char index_number; |
||
94 | union msf_lba absaddr;
|
||
95 | union msf_lba reladdr;
|
||
96 | }; |
||
97 | |||
98 | struct cd_sub_channel_media_catalog {
|
||
99 | u_char data_format; |
||
100 | u_char nothing1; |
||
101 | u_char nothing2; |
||
102 | u_char nothing3; |
||
103 | #if BYTE_ORDER == LITTLE_ENDIAN
|
||
104 | uint32_t :7;
|
||
105 | uint32_t mc_valid:1;
|
||
106 | #endif
|
||
107 | #if BYTE_ORDER == BIG_ENDIAN
|
||
108 | uint32_t mc_valid:1;
|
||
109 | uint32_t :7;
|
||
110 | #endif
|
||
111 | u_char mc_number[15];
|
||
112 | }; |
||
113 | |||
114 | struct cd_sub_channel_track_info {
|
||
115 | u_char data_format; |
||
116 | u_char nothing1; |
||
117 | u_char track_number; |
||
118 | u_char nothing2; |
||
119 | #if BYTE_ORDER == LITTLE_ENDIAN
|
||
120 | uint32_t :7;
|
||
121 | uint32_t ti_valid:1;
|
||
122 | #endif
|
||
123 | #if BYTE_ORDER == BIG_ENDIAN
|
||
124 | uint32_t ti_valid:1;
|
||
125 | uint32_t :7;
|
||
126 | #endif
|
||
127 | u_char ti_number[15];
|
||
128 | }; |
||
129 | |||
130 | struct cd_sub_channel_info {
|
||
131 | struct cd_sub_channel_header header;
|
||
132 | union {
|
||
133 | struct cd_sub_channel_q_data q_data;
|
||
134 | struct cd_sub_channel_position_data position;
|
||
135 | struct cd_sub_channel_media_catalog media_catalog;
|
||
136 | struct cd_sub_channel_track_info track_info;
|
||
137 | } what; |
||
138 | }; |
||
139 | |||
140 | /*
|
||
141 | * Ioctls for the CD drive
|
||
142 | */
|
||
143 | struct ioc_play_track {
|
||
144 | u_char start_track; |
||
145 | u_char start_index; |
||
146 | u_char end_track; |
||
147 | u_char end_index; |
||
148 | }; |
||
149 | |||
150 | #define CDIOCPLAYTRACKS _IOW('c', 1, struct ioc_play_track) |
||
151 | struct ioc_play_blocks {
|
||
152 | int blk;
|
||
153 | int len;
|
||
154 | }; |
||
155 | #define CDIOCPLAYBLOCKS _IOW('c', 2, struct ioc_play_blocks) |
||
156 | |||
157 | struct ioc_read_subchannel {
|
||
158 | u_char address_format; |
||
159 | #define CD_LBA_FORMAT 1 |
||
160 | #define CD_MSF_FORMAT 2 |
||
161 | u_char data_format; |
||
162 | #define CD_SUBQ_DATA 0 |
||
163 | #define CD_CURRENT_POSITION 1 |
||
164 | #define CD_MEDIA_CATALOG 2 |
||
165 | #define CD_TRACK_INFO 3 |
||
166 | u_char track; |
||
167 | int data_len;
|
||
168 | struct cd_sub_channel_info *data;
|
||
169 | }; |
||
170 | #define CDIOCREADSUBCHANNEL _IOWR('c', 3, struct ioc_read_subchannel ) |
||
171 | |||
172 | #ifdef _KERNEL
|
||
173 | /* As above, but with the buffer following the request for in-kernel users. */
|
||
174 | struct ioc_read_subchannel_buf {
|
||
175 | struct ioc_read_subchannel req;
|
||
176 | struct cd_sub_channel_info info;
|
||
177 | }; |
||
178 | #define CDIOCREADSUBCHANNEL_BUF _IOWR('c', 3, struct ioc_read_subchannel_buf) |
||
179 | #endif
|
||
180 | |||
181 | struct ioc_toc_header {
|
||
182 | u_short len; |
||
183 | u_char starting_track; |
||
184 | u_char ending_track; |
||
185 | }; |
||
186 | |||
187 | #define CDIOREADTOCHEADER _IOR('c', 4, struct ioc_toc_header) |
||
188 | |||
189 | struct ioc_read_toc_entry {
|
||
190 | u_char address_format; |
||
191 | u_char starting_track; |
||
192 | u_short data_len; |
||
193 | struct cd_toc_entry *data;
|
||
194 | }; |
||
195 | #define CDIOREADTOCENTRIES _IOWR('c', 5, struct ioc_read_toc_entry) |
||
196 | #define CDIOREADTOCENTRYS CDIOREADTOCENTRIES
|
||
197 | |||
198 | #ifdef _KERNEL
|
||
199 | /* As above, but with the buffer following the request for in-kernel users. */
|
||
200 | struct ioc_read_toc_entry_buf {
|
||
201 | struct ioc_read_toc_entry req;
|
||
202 | struct cd_toc_entry entry[100]; /* NB: 8 bytes each */ |
||
203 | }; |
||
204 | #define CDIOREADTOCENTRIES_BUF _IOWR('c', 5, struct ioc_read_toc_entry_buf) |
||
205 | #endif
|
||
206 | |||
207 | /* read LBA start of a given session; 0=last, others not yet supported */
|
||
208 | #define CDIOREADMSADDR _IOWR('c', 6, int) |
||
209 | |||
210 | struct ioc_patch {
|
||
211 | u_char patch[4]; /* one for each channel */ |
||
212 | }; |
||
213 | #define CDIOCSETPATCH _IOW('c', 9, struct ioc_patch) |
||
214 | |||
215 | struct ioc_vol {
|
||
216 | u_char vol[4]; /* one for each channel */ |
||
217 | }; |
||
218 | #define CDIOCGETVOL _IOR('c', 10, struct ioc_vol) |
||
219 | #define CDIOCSETVOL _IOW('c', 11, struct ioc_vol) |
||
220 | #define CDIOCSETMONO _IO('c', 12) |
||
221 | #define CDIOCSETSTEREO _IO('c', 13) |
||
222 | #define CDIOCSETMUTE _IO('c', 14) |
||
223 | #define CDIOCSETLEFT _IO('c', 15) |
||
224 | #define CDIOCSETRIGHT _IO('c', 16) |
||
225 | #define CDIOCSETDEBUG _IO('c', 17) |
||
226 | #define CDIOCCLRDEBUG _IO('c', 18) |
||
227 | #define CDIOCPAUSE _IO('c', 19) |
||
228 | #define CDIOCRESUME _IO('c', 20) |
||
229 | #define CDIOCRESET _IO('c', 21) |
||
230 | #define CDIOCSTART _IO('c', 22) |
||
231 | #define CDIOCSTOP _IO('c', 23) |
||
232 | #define CDIOCEJECT _IO('c', 24) |
||
233 | #define CDIOCALLOW _IO('c', 25) |
||
234 | #define CDIOCPREVENT _IO('c', 26) |
||
235 | #define CDIOCCLOSE _IO('c', 27) |
||
236 | |||
237 | struct ioc_play_msf {
|
||
238 | u_char start_m; |
||
239 | u_char start_s; |
||
240 | u_char start_f; |
||
241 | u_char end_m; |
||
242 | u_char end_s; |
||
243 | u_char end_f; |
||
244 | }; |
||
245 | #define CDIOCPLAYMSF _IOW('c', 25, struct ioc_play_msf) |
||
246 | |||
247 | struct ioc_load_unload {
|
||
248 | u_char options; |
||
249 | #define CD_LU_ABORT 0x1 /* NOTE: These are the same as the ATAPI */ |
||
250 | #define CD_LU_UNLOAD 0x2 /* op values for the LOAD_UNLOAD command */ |
||
251 | #define CD_LU_LOAD 0x3 |
||
252 | u_char slot; |
||
253 | }; |
||
254 | #define CDIOCLOADUNLOAD _IOW('c', 26, struct ioc_load_unload) |
||
255 | |||
256 | |||
257 | #if defined(_KERNEL) || defined(_EXPOSE_MMC)
|
||
258 | /* not exposed to userland yet until its completely mature */
|
||
259 | /*
|
||
260 | * MMC device abstraction interface.
|
||
261 | *
|
||
262 | * It gathers information from GET_CONFIGURATION, READ_DISCINFO,
|
||
263 | * READ_TRACKINFO, READ_TOC2, READ_CD_CAPACITY and GET_CONFIGURATION
|
||
264 | * SCSI/ATAPI calls regardless if its a legacy CD-ROM/DVD-ROM device or a MMC
|
||
265 | * standard recordable device.
|
||
266 | */
|
||
267 | struct mmc_discinfo {
|
||
268 | uint16_t mmc_profile; |
||
269 | uint16_t mmc_class; |
||
270 | |||
271 | uint8_t disc_state; |
||
272 | uint8_t last_session_state; |
||
273 | uint8_t bg_format_state; |
||
274 | uint8_t link_block_penalty; /* in sectors */
|
||
275 | |||
276 | uint64_t mmc_cur; /* current MMC_CAPs */
|
||
277 | uint64_t mmc_cap; /* possible MMC_CAPs */
|
||
278 | |||
279 | uint32_t disc_flags; /* misc flags */
|
||
280 | |||
281 | uint32_t disc_id; |
||
282 | uint64_t disc_barcode; |
||
283 | uint8_t application_code; /* 8 bit really */
|
||
284 | |||
285 | uint8_t unused1[3]; /* padding */ |
||
286 | |||
287 | uint32_t last_possible_lba; /* last leadout start adr. */
|
||
288 | uint32_t sector_size; |
||
289 | |||
290 | uint16_t num_sessions; |
||
291 | uint16_t num_tracks; /* derived */
|
||
292 | |||
293 | uint16_t first_track; |
||
294 | uint16_t first_track_last_session; |
||
295 | uint16_t last_track_last_session; |
||
296 | |||
297 | uint16_t unused2; /* padding/misc info resv. */
|
||
298 | |||
299 | uint16_t reserved1[4]; /* MMC-5 track resources */ |
||
300 | uint32_t reserved2[3]; /* MMC-5 POW resources */ |
||
301 | |||
302 | uint32_t reserved3[8]; /* MMC-5+ */ |
||
303 | }; |
||
304 | #define MMCGETDISCINFO _IOR('c', 28, struct mmc_discinfo) |
||
305 | |||
306 | #define MMC_CLASS_UNKN 0 |
||
307 | #define MMC_CLASS_DISC 1 |
||
308 | #define MMC_CLASS_CD 2 |
||
309 | #define MMC_CLASS_DVD 3 |
||
310 | #define MMC_CLASS_MO 4 |
||
311 | #define MMC_CLASS_BD 5 |
||
312 | #define MMC_CLASS_FILE 0xffff /* emulation mode */ |
||
313 | |||
314 | #define MMC_DFLAGS_BARCODEVALID (1 << 0) /* barcode is present and valid */ |
||
315 | #define MMC_DFLAGS_DISCIDVALID (1 << 1) /* discid is present and valid */ |
||
316 | #define MMC_DFLAGS_APPCODEVALID (1 << 2) /* application code valid */ |
||
317 | #define MMC_DFLAGS_UNRESTRICTED (1 << 3) /* restricted, then set app. code */ |
||
318 | |||
319 | #define MMC_DFLAGS_FLAGBITS \
|
||
320 | "\10\1BARCODEVALID\2DISCIDVALID\3APPCODEVALID\4UNRESTRICTED"
|
||
321 | |||
322 | #define MMC_CAP_SEQUENTIAL (1 << 0) /* sequential writable only */ |
||
323 | #define MMC_CAP_RECORDABLE (1 << 1) /* record-able; i.e. not static */ |
||
324 | #define MMC_CAP_ERASABLE (1 << 2) /* drive can erase sectors */ |
||
325 | #define MMC_CAP_BLANKABLE (1 << 3) /* media can be blanked */ |
||
326 | #define MMC_CAP_FORMATTABLE (1 << 4) /* media can be formatted */ |
||
327 | #define MMC_CAP_REWRITABLE (1 << 5) /* media can be rewritten */ |
||
328 | #define MMC_CAP_MRW (1 << 6) /* Mount Rainier formatted */ |
||
329 | #define MMC_CAP_PACKET (1 << 7) /* using packet recording */ |
||
330 | #define MMC_CAP_STRICTOVERWRITE (1 << 8) /* only writes a packet at a time */ |
||
331 | #define MMC_CAP_PSEUDOOVERWRITE (1 << 9) /* overwrite through replacement */ |
||
332 | #define MMC_CAP_ZEROLINKBLK (1 << 10) /* zero link block length capable */ |
||
333 | #define MMC_CAP_HW_DEFECTFREE (1 << 11) /* hardware defect management */ |
||
334 | |||
335 | #define MMC_CAP_FLAGBITS \
|
||
336 | "\10\1SEQUENTIAL\2RECORDABLE\3ERASABLE\4BLANKABLE\5FORMATTABLE" \
|
||
337 | "\6REWRITABLE\7MRW\10PACKET\11STRICTOVERWRITE\12PSEUDOOVERWRITE" \
|
||
338 | "\13ZEROLINKBLK\14HW_DEFECTFREE"
|
||
339 | |||
340 | #define MMC_STATE_EMPTY 0 |
||
341 | #define MMC_STATE_INCOMPLETE 1 |
||
342 | #define MMC_STATE_FULL 2 |
||
343 | #define MMC_STATE_CLOSED 3 |
||
344 | |||
345 | #define MMC_BGFSTATE_UNFORM 0 |
||
346 | #define MMC_BGFSTATE_STOPPED 1 |
||
347 | #define MMC_BGFSTATE_RUNNING 2 |
||
348 | #define MMC_BGFSTATE_COMPLETED 3 |
||
349 | |||
350 | |||
351 | struct mmc_trackinfo {
|
||
352 | uint16_t tracknr; /* IN/OUT */
|
||
353 | uint16_t sessionnr; |
||
354 | |||
355 | uint8_t track_mode; |
||
356 | uint8_t data_mode; |
||
357 | |||
358 | uint16_t flags; |
||
359 | |||
360 | uint32_t track_start; |
||
361 | uint32_t next_writable; |
||
362 | uint32_t free_blocks; |
||
363 | uint32_t packet_size; |
||
364 | uint32_t track_size; |
||
365 | uint32_t last_recorded; |
||
366 | }; |
||
367 | #define MMCGETTRACKINFO _IOWR('c', 29, struct mmc_trackinfo) |
||
368 | |||
369 | #define MMC_TRACKINFO_COPY (1 << 0) |
||
370 | #define MMC_TRACKINFO_DAMAGED (1 << 1) |
||
371 | #define MMC_TRACKINFO_FIXED_PACKET (1 << 2) |
||
372 | #define MMC_TRACKINFO_INCREMENTAL (1 << 3) |
||
373 | #define MMC_TRACKINFO_BLANK (1 << 4) |
||
374 | #define MMC_TRACKINFO_RESERVED (1 << 5) |
||
375 | #define MMC_TRACKINFO_NWA_VALID (1 << 6) |
||
376 | #define MMC_TRACKINFO_LRA_VALID (1 << 7) |
||
377 | #define MMC_TRACKINFO_DATA (1 << 8) |
||
378 | #define MMC_TRACKINFO_AUDIO (1 << 9) |
||
379 | #define MMC_TRACKINFO_AUDIO_4CHAN (1 << 10) |
||
380 | #define MMC_TRACKINFO_PRE_EMPH (1 << 11) |
||
381 | |||
382 | #define MMC_TRACKINFO_FLAGBITS \
|
||
383 | "\10\1COPY\2DAMAGED\3FIXEDPACKET\4INCREMENTAL\5BLANK" \
|
||
384 | "\6RESERVED\7NWA_VALID\10LRA_VALID\11DATA\12AUDIO" \
|
||
385 | "\13AUDIO_4CHAN\14PRE_EMPH"
|
||
386 | |||
387 | struct mmc_op {
|
||
388 | uint16_t operation; /* IN */
|
||
389 | uint16_t mmc_profile; /* IN */
|
||
390 | |||
391 | /* parameters to operation */
|
||
392 | uint16_t tracknr; /* IN */
|
||
393 | uint16_t sessionnr; /* IN */
|
||
394 | uint32_t extent; /* IN */
|
||
395 | |||
396 | uint32_t reserved[4];
|
||
397 | }; |
||
398 | #define MMCOP _IOWR('c', 30, struct mmc_op) |
||
399 | |||
400 | #define MMC_OP_SYNCHRONISECACHE 1 |
||
401 | #define MMC_OP_CLOSETRACK 2 |
||
402 | #define MMC_OP_CLOSESESSION 3 |
||
403 | #define MMC_OP_FINALISEDISC 4 |
||
404 | #define MMC_OP_RESERVETRACK 5 |
||
405 | #define MMC_OP_RESERVETRACK_NWA 6 |
||
406 | #define MMC_OP_UNRESERVETRACK 7 |
||
407 | #define MMC_OP_REPAIRTRACK 8 |
||
408 | #define MMC_OP_UNCLOSELASTSESSION 9 |
||
409 | #define MMC_OP_MAX 9 |
||
410 | |||
411 | struct mmc_writeparams {
|
||
412 | uint16_t tracknr; /* IN */
|
||
413 | uint16_t mmc_class; /* IN */
|
||
414 | uint32_t mmc_cur; /* IN */
|
||
415 | uint32_t blockingnr; /* IN */
|
||
416 | |||
417 | /* when tracknr == 0 */
|
||
418 | uint8_t track_mode; /* IN; normally 5 */
|
||
419 | uint8_t data_mode; /* IN; normally 2 */
|
||
420 | }; |
||
421 | #define MMC_TRACKMODE_DEFAULT 5 /* data, incremental recording */ |
||
422 | #define MMC_DATAMODE_DEFAULT 2 /* CDROM XA disc */ |
||
423 | #define MMCSETUPWRITEPARAMS _IOW('c', 31, struct mmc_writeparams) |
||
424 | |||
425 | #endif /* _KERNEL || _EXPOSE_MMC */ |
||
426 | |||
427 | #endif /* !_SYS_CDIO_H_ */ |