1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
|
/* ide-pc.h
*
* PURPOSE
* Header file for programs using ide-pc.c defined routines
*
* COPYRIGHT
* This file is distributed under the terms of the GNU General Public
* License (GPL). Copies of the GPL can be obtained from:
* ftp://prep.ai.mit.edu/pub/gnu/GPL
* Each contributing author retains all rights to their own work.
*
* (C) 2001 Enno Fennema
*
* HISTORY
* 16 Aug 01 ef Created.
*
*/
#ifndef _IDE_PC_H
#define _IDE_PC_H
#include <sys/types.h>
struct cdrom_inquiry {
u_char type : 5; /* 0 */
#define INQ_WORM 4
#define INQ_CDROM 5
u_char qualifier : 3; /* 0 */
u_char type_modifier : 7; /* 1 */
u_char removable : 1; /* 1 */
u_char ansi_version : 3; /* 2 */
u_char ecma_version : 3; /* 2 */
u_char iso_version : 2; /* 2 */
u_char data_format : 4; /* 3 */
u_char res3_54 : 2; /* 3 */
u_char termiop : 1; /* 3 */
u_char aenc : 1; /* 3 */
u_char add_len : 8; /* 4 */
u_char sense_len : 8; /* 5 */ /* only Emulex ??? */
u_char res2 : 8; /* 6 */
u_char softreset : 1; /* 7 */
u_char cmdque : 1;
u_char res7_2 : 1;
u_char linked : 1;
u_char sync : 1;
u_char wbus16 : 1;
u_char wbus32 : 1;
u_char reladr : 1; /* 7 */
char vendor_info[8]; /* 8 */
char prod_ident[16]; /* 16 */
char prod_revision[4]; /* 32 */
char vendor_uniq[20]; /* 36 */
char reserved[40]; /* 56 to 96 */
};
struct cdrom_discinfo {
u_short data_length;
u_char disc_status :2;
#define DS_EMPTY 0 /* Empty disk */
#define DS_APPENDABLE 1 /* Incomplete disk (appendable) */
#define DS_COMPLETE 2 /* Complete disk (closed/no B0 pointer) */
u_char session_status :2;
#define SS_EMPTY 0 /* Empty session */
#define SS_APPENDABLE 1 /* Incomplete session */
#define SS_COMPLETE 3 /* Complete session (needs DS_COMPLETE) */
u_char erasable:1;
u_char _r1 :3;
u_char trk0;
u_char nsessions;
u_char trk0_lastsession;
u_char trk1_lastsession;
u_char _r4 :5;
u_char uru :1;
u_char dbc_v :1;
u_char did_v :1;
u_char disc_type;
u_char _r9;
u_char _r10;
u_char _r11;
u_int disc_id;
u_char latest_leadin_msf[4];
u_char last_leadout_msf[4];
u_char barcode[8];
u_char _r32;
u_char n_opc;
};
struct cdrom_trackinfo {
u_short data_length;
u_char trk;
u_char session;
u_char _r4;
u_char trk_mode :4;
u_char copy :1;
u_char damage :1;
u_char _r5 :2;
u_char data_mode :4;
u_char fixpkt :1;
u_char packet :1;
u_char blank :1;
u_char rsrvd_trk :1;
u_char nwa_v :1;
u_char _r7 :7;
u_int trk_start;
u_int nwa;
u_int free_blks;
u_int fixpkt_size;
u_int trk_size;
};
struct cdrom_buffercapacity {
u_short dataLength;
u_short rsrvd;
u_int totalBufferLength;
u_int freeBufferLength;
};
struct cdrom_reccapacity {
u_int lastblock;
u_int blocksize;
};
struct cdrom_header {
u_char datamode;
u_char _r234[3];
int lba;
};
#define PGCTL_CURRENT_VALUES 0
#define PGCTL_CHANGE_MASK 1
#define PGCTL_DEFAULT_VALUES 2
#define PGCTL_SAVED_VALUES 3
typedef struct mode_header {
u_short data_length; // length excl. this field
u_char medium_type;
u_char dev_specific;
u_short r1;
u_short block_desc_length; // 0
} mode_hdr;;
#define GPMODE_READ_ERROR_RECOV_PAGE 0x01 // Read/Write Error Recov in Mt Fuji version
struct read_error_recovery_params {
u_char page_code :6; // 07h
u_char _r1 :1;
u_char ps :1;
u_char length;
u_char error_recovery_param;
u_char retry_count;
u_char _r2[4];
};
#define GPMODE_CACHE_PAGE 0x08 // Cache control page
struct cdrom_cacheparams {
u_char page_code :6; // 08h
u_char _r1 :1;
u_char ps :1;
u_char length;
u_char rcd :1;
u_char mf :1;
u_char wce :1;
u_char _r2 :5;
u_short dpftl;
u_short minpf;
u_short maxpf;
u_short maxpfceiling;
};
struct cdrom_writeparams {
u_char page_code :6;
u_char _r1 :1;
u_char ps :1;
u_char page_length;
u_char write_type :4;
u_char test_write :1;
u_char _r2 :3;
u_char trk_mode :4;
u_char copy :1;
u_char fp :1;
u_char multi_session :2;
#define MS_NONE 0 /* No B0 pointer. Next session not allowed*/
#define MS_FINAL 1 /* B0 = FF:FF:FF. Next session not allowed*/
#define MS_MULTI 3 /* B0 = Next PA. Next session allowed */
u_char data_blk_type :4;
#define DB_RAW 0 /* 2352 bytes of raw data */
#define DB_RAW_PQ 1 /* 2368 bytes (raw data + P/Q Subchannel) */
#define DB_RAW_PW 2 /* 2448 bytes (raw data + P-W Subchannel) */
#define DB_RAW_PW_R 3 /* 2448 bytes (raw data + P-W raw Subchannel)*/
#define DB_RES_4 4 /* - Reserved */
#define DB_RES_5 5 /* - Reserved */
#define DB_RES_6 6 /* - Reserved */
#define DB_VU_7 7 /* - Vendor specific */
#define DB_ROM_MODE1 8 /* 2048 bytes Mode 1 (ISO/IEC 10149) */
#define DB_ROM_MODE2 9 /* 2336 bytes Mode 2 (ISO/IEC 10149) */
#define DB_XA_F1 10 /* 2048 bytes Mode 2? (CD-ROM XA form 1) */
#define DB_XA_F1_8H 11 /* 2056 bytes Mode 2 (CD-ROM XA form 1) + 8 header bytes */
#define DB_XA_F2 12 /* 2324 bytes Mode 2 (CD-ROM XA form 2) */
#define DB_XA_MODE2_MIX 13 /* 2332 bytes Mode 2 (CD-ROM XA 1/2+subhdr) */
#define DB_RES_14 14 /* - Reserved */
#define DB_VU_15 15 /* - Vendor specific */
u_char _r4 :4;
u_char _r5;
u_char _r6;
u_char host_appl_code :6;
u_char _r7 :2;
u_char session_format;
u_char _r9;
u_int pkt_size __attribute__ ((packed));
u_short audio_pause;
u_char mcn[16];
u_char isrc[16];
u_char subhdr0;
u_char subhdr1;
u_char subhdr2;
u_char subhdr3;
};
struct cdrom_capabilities { /* CD Cap / mech status */
u_char p_code : 6;
u_char p_res : 1;
u_char parsave : 1;
u_char p_len; /* 0x14 = 20 Bytes */
u_char cd_r_read : 1; /* Reads CD-R media */
u_char cd_rw_read : 1; /* Reads CD-RW media */
u_char method2 : 1; /* Reads fixed packet method2 media */
u_char dvd_rom_read : 1; /* Reads DVD ROM media */
u_char dvd_r_read : 1; /* Reads DVD-R media */
u_char dvd_ram_read : 1; /* Reads DVD-RAM media */
u_char res_2_67 : 2; /* Reserved */
u_char cd_r_write : 1; /* Supports writing CD-R media */
u_char cd_rw_write : 1; /* Supports writing CD-RW media */
u_char test_write : 1; /* Supports emulation write */
u_char res_3_3 : 1; /* Reserved */
u_char dvd_r_write : 1; /* Supports writing DVD-R media */
u_char dvd_ram_write : 1; /* Supports writing DVD-RAM media */
u_char res_3_67 : 2; /* Reserved */
u_char audio_play : 1; /* Supports Audio play operation */
u_char composite : 1; /* Deliveres composite A/V stream */
u_char digital_port_2 : 1; /* Supports digital output on port 2 */
u_char digital_port_1 : 1; /* Supports digital output on port 1 */
u_char mode_2_form_1 : 1; /* Reads Mode-2 form 1 media (XA) */
u_char mode_2_form_2 : 1; /* Reads Mode-2 form 2 media */
u_char multi_session : 1; /* Reads multi-session media */
u_char res_4 : 1; /* Reserved */
u_char cd_da_supported : 1; /* Reads audio data with READ CD cmd */
u_char cd_da_accurate : 1; /* READ CD data stream is accurate */
u_char rw_supported : 1; /* Reads R-W sub channel information */
u_char rw_deint_corr : 1; /* Reads de-interleved R-W sub chan */
u_char c2_pointers : 1; /* Supports C2 error pointers */
u_char ISRC : 1; /* Reads ISRC information */
u_char UPC : 1; /* Reads media catalog number (UPC) */
u_char read_bar_code : 1; /* Supports reading bar codes */
u_char lock : 1; /* PREVENT/ALLOW may lock media */
u_char lock_state : 1; /* Lock state 0=unlocked 1=locked */
u_char prevent_jumper : 1; /* State of prev/allow jumper 0=pres */
u_char eject : 1; /* Ejects disc/cartr with STOP LoEj */
u_char res_6_4 : 1; /* Reserved */
u_char loading_type : 3; /* Loading mechanism type */
#define CAPS_LT_CADDY 0
#define CAPS_LT_TRAY 1
u_char sep_chan_vol : 1; /* Vol controls each channel separat */
u_char sep_chan_mute : 1; /* Mute controls each channel separat*/
u_char disk_present_rep: 1; /* Changer supports disk present rep */
u_char sw_slot_sel : 1; /* Load empty slot in changer */
u_char res_7 : 4; /* Reserved */
u_short max_read_speed; /* Max. read speed in KB/s */
u_short num_vol_levels; /* # of supported volume levels */
u_short buffer_size; /* Buffer size for the data in KB */
u_short cur_read_speed; /* Current read speed in KB/s */
u_char res_16; /* Reserved */
u_char res_17_0 : 1; /* Reserved */
u_char BCK : 1; /* Data valid on falling edge of BCK */
u_char RCK : 1; /* Set: HIGH high LRCK=left channel */
u_char LSBF : 1; /* Set: LSB first Clear: MSB first */
u_char length : 2; /* 0=32BCKs 1=16BCKs 2=24BCKs 3=24I2c*/
u_char res_17 : 2; /* Reserved */
u_short max_write_speed; /* Max. write speed n KB/s */
u_short cur_write_speed; /* Current write speed in KB/s */
};
#define BLANK_DISC 0x00 /* Erase the entire disc */
#define BLANK_MINIMAL 0x01 /* Erase the PMA, 1st session TOC, pregap */
#define BLANK_TRACK 0x02 /* Erase an incomplete track */
#define BLANK_UNRESERVE 0x03 /* Unreserve a track */
#define BLANK_TAIL 0x04 /* Erase the tail of a track: input trackno required */
#define BLANK_UNCLOSE 0x05 /* Unclose the last session */
#define BLANK_SESSION 0x06 /* Erase the last session */
// #define PGCTL_CURRENT_VALUES 0
// #define PGCTL_CHANGE_MASK 1
// #define PGCTL_DEFAULT_VALUES 2
// #define PGCTL_SAVED_VALUES 3
void fail(char *fmt, ...);
struct request_sense *get_sense_data();
char* get_sense_string(void);
int blank(int fd, int type, int track); // see BLANK_xxx above
int format(int fd, int session_grow, int size);
int close_track_session(int fd, int close_track, int track); // close_track == 0 --> close session
int synchronize_cache(int fd);
int test_unit_ready(int fd);
#define DS_OPERATIONAL 0
#define DS_NO_DISC 1
#define DS_TRAY_OPEN 2
#define DS_NOT_READY 3
int getDriveState(int fd); // returns DS_xxx
int inquiry(int fd, struct cdrom_inquiry *inq);
int mediumRemoval(int fd, int allow);
int read_discinfo(int fd, struct cdrom_discinfo *di);
int read_trackinfo(int fd, struct cdrom_trackinfo *ti, int track);
int read_buffercapacity(int fd, struct cdrom_buffercapacity *bufcap);
int read_reccapacity(int fd, struct cdrom_reccapacity *rc);
int read_header(int fd, struct cdrom_header *hd, u_int block);
int reserve_track(int fd, int size);
#define SSU_STOP 0
#define SSU_STOP_EJECT 1
#define SSU_START 2
#define SSU_LOAD_START 3
int startStopUnit(int fd, int ssu_action);
int readCD(int fd, int sectortype, int lba, int nblocks, char* buf);
int writeCD(int fd, int lba, int nblocks, char* buf);
int mode_sense(int fd, u_char **buffer, u_char **mode, u_char pageno, int pgctl);
int mode_select(int fd, u_char *buffer);
#ifdef MMC2
int verify(int fd, int lba, int nblocks);
#else
int verify(int fd, int sectortype, int lba, int nblocks, char* buf);
#endif
int set_cdspeed(int fd, int readspeed, int writespeed);
/* get_write_params sets the pointers to the mode header 'buffer' and the mode page 'wp' */
int get_writeparams(int fd, u_char **buffer, struct cdrom_writeparams **wp, int pgctl);
/* to set write params leave buffer and wp as returned by get_write_params */
int set_writeparams(int fd, u_char *buffer, struct cdrom_writeparams *wp);
int get_capabilities(int fd, u_char **buffer, struct cdrom_capabilities **cap, int pgctl);
#endif
|