1
2
3
4 #ifndef _SYS_CDIO_H_
5 #define _SYS_CDIO_H_
6
7 #include <sys/types.h>
8 #include <sys/ioccom.h>
9
10
11
12 union msf_lba {
13 struct {
14 u_char unused;
15 u_char minute;
16 u_char second;
17 u_char frame;
18 } msf;
19 u_int32_t lba;
20 u_char addr[4];
21 };
22
23 struct cd_toc_entry {
24 u_char nothing1;
25 #if _BYTE_ORDER == _LITTLE_ENDIAN
26 u_int control:4;
27 u_int addr_type:4;
28 #endif
29 #if _BYTE_ORDER == _BIG_ENDIAN
30 u_int addr_type:4;
31 u_int control:4;
32 #endif
33 u_char track;
34 u_char nothing2;
35 union msf_lba addr;
36 };
37
38 struct cd_sub_channel_header {
39 u_char nothing1;
40 u_char audio_status;
41 #define CD_AS_AUDIO_INVALID 0x00
42 #define CD_AS_PLAY_IN_PROGRESS 0x11
43 #define CD_AS_PLAY_PAUSED 0x12
44 #define CD_AS_PLAY_COMPLETED 0x13
45 #define CD_AS_PLAY_ERROR 0x14
46 #define CD_AS_NO_STATUS 0x15
47 u_char data_len[2];
48 };
49
50 struct cd_sub_channel_q_data {
51 u_char data_format;
52 #if _BYTE_ORDER == _LITTLE_ENDIAN
53 u_int control:4;
54 u_int addr_type:4;
55 #endif
56 #if _BYTE_ORDER == _BIG_ENDIAN
57 u_int addr_type:4;
58 u_int control:4;
59 #endif
60 u_char track_number;
61 u_char index_number;
62 u_char absaddr[4];
63 u_char reladdr[4];
64 #if _BYTE_ORDER == _LITTLE_ENDIAN
65 u_int :7;
66 u_int mc_valid:1;
67 #endif
68 #if _BYTE_ORDER == _BIG_ENDIAN
69 u_int mc_valid:1;
70 u_int :7;
71 #endif
72 u_char mc_number[15];
73 #if _BYTE_ORDER == _LITTLE_ENDIAN
74 u_int :7;
75 u_int ti_valid:1;
76 #endif
77 #if _BYTE_ORDER == _BIG_ENDIAN
78 u_int ti_valid:1;
79 u_int :7;
80 #endif
81 u_char ti_number[15];
82 };
83
84 struct cd_sub_channel_position_data {
85 u_char data_format;
86 #if _BYTE_ORDER == _LITTLE_ENDIAN
87 u_int control:4;
88 u_int addr_type:4;
89 #endif
90 #if _BYTE_ORDER == _BIG_ENDIAN
91 u_int addr_type:4;
92 u_int control:4;
93 #endif
94 u_char track_number;
95 u_char index_number;
96 union msf_lba absaddr;
97 union msf_lba reladdr;
98 };
99
100 struct cd_sub_channel_media_catalog {
101 u_char data_format;
102 u_char nothing1;
103 u_char nothing2;
104 u_char nothing3;
105 #if _BYTE_ORDER == _LITTLE_ENDIAN
106 u_int :7;
107 u_int mc_valid:1;
108 #endif
109 #if _BYTE_ORDER == _BIG_ENDIAN
110 u_int mc_valid:1;
111 u_int :7;
112 #endif
113 u_char mc_number[15];
114 };
115
116 struct cd_sub_channel_track_info {
117 u_char data_format;
118 u_char nothing1;
119 u_char track_number;
120 u_char nothing2;
121 #if _BYTE_ORDER == _LITTLE_ENDIAN
122 u_int :7;
123 u_int ti_valid:1;
124 #endif
125 #if _BYTE_ORDER == _BIG_ENDIAN
126 u_int ti_valid:1;
127 u_int :7;
128 #endif
129 u_char ti_number[15];
130 };
131
132 struct cd_sub_channel_info {
133 struct cd_sub_channel_header header;
134 union {
135 struct cd_sub_channel_q_data q_data;
136 struct cd_sub_channel_position_data position;
137 struct cd_sub_channel_media_catalog media_catalog;
138 struct cd_sub_channel_track_info track_info;
139 } what;
140 };
141
142
143
144
145 struct ioc_play_track {
146 u_char start_track;
147 u_char start_index;
148 u_char end_track;
149 u_char end_index;
150 };
151
152 #define CDIOCPLAYTRACKS _IOW('c', 1, struct ioc_play_track)
153 struct ioc_play_blocks {
154 int blk;
155 int len;
156 };
157 #define CDIOCPLAYBLOCKS _IOW('c', 2, struct ioc_play_blocks)
158
159 struct ioc_read_subchannel {
160 u_char address_format;
161 #define CD_LBA_FORMAT 1
162 #define CD_MSF_FORMAT 2
163 u_char data_format;
164 #define CD_SUBQ_DATA 0
165 #define CD_CURRENT_POSITION 1
166 #define CD_MEDIA_CATALOG 2
167 #define CD_TRACK_INFO 3
168 u_char track;
169 int data_len;
170 struct cd_sub_channel_info *data;
171 };
172 #define CDIOCREADSUBCHANNEL _IOWR('c', 3, struct ioc_read_subchannel)
173
174 struct ioc_toc_header {
175 u_short len;
176 u_char starting_track;
177 u_char ending_track;
178 };
179
180 #define CDIOREADTOCHEADER _IOR('c', 4, struct ioc_toc_header)
181
182 struct ioc_read_toc_entry {
183 u_char address_format;
184 u_char starting_track;
185 #define CD_TRACK_LEADOUT 0xaa
186 u_short data_len;
187 struct cd_toc_entry *data;
188 };
189 #define CDIOREADTOCENTRIES _IOWR('c', 5, struct ioc_read_toc_entry)
190 #define CDIOREADTOCENTRYS CDIOREADTOCENTRIES
191
192
193 #define CDIOREADMSADDR _IOWR('c', 6, int)
194
195 struct ioc_patch {
196 u_char patch[4];
197 };
198 #define CDIOCSETPATCH _IOW('c', 9, struct ioc_patch)
199
200 struct ioc_vol {
201 u_char vol[4];
202 };
203 #define CDIOCGETVOL _IOR('c', 10, struct ioc_vol)
204 #define CDIOCSETVOL _IOW('c', 11, struct ioc_vol)
205 #define CDIOCSETMONO _IO('c', 12)
206 #define CDIOCSETSTEREO _IO('c', 13)
207 #define CDIOCSETMUTE _IO('c', 14)
208 #define CDIOCSETLEFT _IO('c', 15)
209 #define CDIOCSETRIGHT _IO('c', 16)
210 #define CDIOCSETDEBUG _IO('c', 17)
211 #define CDIOCCLRDEBUG _IO('c', 18)
212 #define CDIOCPAUSE _IO('c', 19)
213 #define CDIOCRESUME _IO('c', 20)
214 #define CDIOCRESET _IO('c', 21)
215 #define CDIOCSTART _IO('c', 22)
216 #define CDIOCSTOP _IO('c', 23)
217 #define CDIOCEJECT _IO('c', 24)
218 #define CDIOCALLOW _IO('c', 25)
219 #define CDIOCPREVENT _IO('c', 26)
220 #define CDIOCCLOSE _IO('c', 27)
221 #define CDIOCSETCDDA _IOW('c', 28, int)
222
223 struct ioc_play_msf {
224 u_char start_m;
225 u_char start_s;
226 u_char start_f;
227 u_char end_m;
228 u_char end_s;
229 u_char end_f;
230 };
231 #define CDIOCPLAYMSF _IOW('c', 25, struct ioc_play_msf)
232
233 struct ioc_load_unload {
234 u_char options;
235 #define CD_LU_ABORT 0x1
236 #define CD_LU_UNLOAD 0x2
237 #define CD_LU_LOAD 0x3
238 u_char slot;
239 };
240 #define CDIOCLOADUNLOAD _IOW('c', 26, struct ioc_load_unload)
241
242
243
244
245 #define DVD_READ_STRUCT _IOWR('d', 0, union dvd_struct)
246 #define DVD_WRITE_STRUCT _IOWR('d', 1, union dvd_struct)
247 #define DVD_AUTH _IOWR('d', 2, union dvd_authinfo)
248
249 #define GPCMD_READ_DVD_STRUCTURE 0xad
250 #define GPCMD_SEND_DVD_STRUCTURE 0xad
251 #define GPCMD_REPORT_KEY 0xa4
252 #define GPCMD_SEND_KEY 0xa3
253
254
255 #define DVD_STRUCT_PHYSICAL 0x00
256 #define DVD_STRUCT_COPYRIGHT 0x01
257 #define DVD_STRUCT_DISCKEY 0x02
258 #define DVD_STRUCT_BCA 0x03
259 #define DVD_STRUCT_MANUFACT 0x04
260
261 struct dvd_layer {
262 u_int8_t book_version;
263 u_int8_t book_type;
264 u_int8_t min_rate;
265 u_int8_t disc_size;
266 u_int8_t layer_type;
267 u_int8_t track_path;
268 u_int8_t nlayers;
269 u_int8_t track_density;
270 u_int8_t linear_density;
271 u_int8_t bca;
272 u_int32_t start_sector;
273 u_int32_t end_sector;
274 u_int32_t end_sector_l0;
275 };
276
277 struct dvd_physical {
278 u_int8_t type;
279
280 u_int8_t layer_num;
281 struct dvd_layer layer[4];
282 };
283
284 struct dvd_copyright {
285 u_int8_t type;
286
287 u_int8_t layer_num;
288 u_int8_t cpst;
289 u_int8_t rmi;
290 };
291
292 struct dvd_disckey {
293 u_int8_t type;
294
295 u_int8_t agid;
296 u_int8_t value[2048];
297 };
298
299 struct dvd_bca {
300 u_int8_t type;
301
302 int len;
303 u_int8_t value[188];
304 };
305
306 struct dvd_manufact {
307 u_int8_t type;
308
309 u_int8_t layer_num;
310 int len;
311 u_int8_t value[2048];
312 };
313
314 union dvd_struct {
315 u_int8_t type;
316
317 struct dvd_physical physical;
318 struct dvd_copyright copyright;
319 struct dvd_disckey disckey;
320 struct dvd_bca bca;
321 struct dvd_manufact manufact;
322 };
323
324
325
326
327
328
329 #define DVD_LU_SEND_AGID 0
330 #define DVD_HOST_SEND_CHALLENGE 1
331 #define DVD_LU_SEND_KEY1 2
332 #define DVD_LU_SEND_CHALLENGE 3
333 #define DVD_HOST_SEND_KEY2 4
334
335
336 #define DVD_AUTH_ESTABLISHED 5
337 #define DVD_AUTH_FAILURE 6
338
339
340 #define DVD_LU_SEND_TITLE_KEY 7
341 #define DVD_LU_SEND_ASF 8
342 #define DVD_INVALIDATE_AGID 9
343 #define DVD_LU_SEND_RPC_STATE 10
344 #define DVD_HOST_SEND_RPC_STATE 11
345
346 #if 0
347
348 typedef u_int8_t dvd_key[5];
349 typedef u_int8_t dvd_challenge[10];
350 #endif
351
352 #define DVD_KEY_SIZE 5
353 #define DVD_CHALLENGE_SIZE 10
354
355 struct dvd_lu_send_agid {
356 u_int8_t type;
357
358 u_int8_t agid;
359 };
360
361 struct dvd_host_send_challenge {
362 u_int8_t type;
363
364 u_int8_t agid;
365 u_int8_t chal[DVD_CHALLENGE_SIZE];
366 };
367
368 struct dvd_send_key {
369 u_int8_t type;
370
371 u_int8_t agid;
372 u_int8_t key[DVD_KEY_SIZE];
373 };
374
375 struct dvd_lu_send_challenge {
376 u_int8_t type;
377
378 u_int8_t agid;
379 u_int8_t chal[DVD_CHALLENGE_SIZE];
380 };
381
382 #define DVD_CPM_NO_COPYRIGHT 0
383 #define DVD_CPM_COPYRIGHTED 1
384
385 #define DVD_CP_SEC_NONE 0
386 #define DVD_CP_SEC_EXIST 1
387
388 #define DVD_CGMS_UNRESTRICTED 0
389 #define DVD_CGMS_SINGLE 2
390 #define DVD_CGMS_RESTRICTED 3
391
392 struct dvd_lu_send_title_key {
393 u_int8_t type;
394
395 u_int8_t agid;
396 u_int8_t title_key[DVD_KEY_SIZE];
397 int lba;
398 u_int8_t cpm;
399 u_int8_t cp_sec;
400 u_int8_t cgms;
401 };
402
403 struct dvd_lu_send_asf {
404 u_int8_t type;
405
406 u_int8_t agid;
407 u_int8_t asf;
408 };
409
410 struct dvd_host_send_rpcstate {
411 u_int8_t type;
412 u_int8_t pdrc;
413 };
414
415 struct dvd_lu_send_rpcstate {
416 u_int8_t type;
417 u_int8_t vra;
418 u_int8_t ucca;
419 u_int8_t region_mask;
420 u_int8_t rpc_scheme;
421 };
422
423 union dvd_authinfo {
424 u_int8_t type;
425
426 struct dvd_lu_send_agid lsa;
427 struct dvd_host_send_challenge hsc;
428 struct dvd_send_key lsk;
429 struct dvd_lu_send_challenge lsc;
430 struct dvd_send_key hsk;
431 struct dvd_lu_send_title_key lstk;
432 struct dvd_lu_send_asf lsasf;
433 struct dvd_host_send_rpcstate hrpcs;
434 struct dvd_lu_send_rpcstate lrpcs;
435 };
436 #endif