Project

General

Profile

Statistics
| Revision:

root / lab4 / .minix-src / include / sys / cdio.h @ 13

History | View | Annotate | Download (11.1 KB)

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
    "\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_ */