summaryrefslogtreecommitdiff
path: root/wrudf/ide-pc.h
blob: 727a7521b8add2e0e0bb4386b5ce501185caab50 (plain)
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