FreeBSD/Linux Kernel Cross Reference
sys/sys/cdio.h
1 /* $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 "\1\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 "\1\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 "\1\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_ */
Cache object: 67d53505c4ea85fab1d0b570883655c2
|