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 { |
37 | u_char ; |
38 | u_char ; |
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 [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 ; |
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 { |
182 | u_short ; |
183 | u_char ; |
184 | u_char ; |
185 | }; |
186 | |
187 | #define _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_ */ |
428 | |