aboutsummaryrefslogtreecommitdiff
path: root/Src/Plugins/Input/in_cdda/windac/Aspi.h
blob: cc55c36e2caf3826246c65d54dfac3bdc70dfda4 (plain) (blame)
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
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
#ifndef ASPI_INCLUDED
#define ASPI_INCLUDED

#include <Windows.h>
#include <Stdio.h>
#include <Stdlib.h>

// Handle to the ASPI libaray
extern HINSTANCE hAspiLib;
void GetAspiError(int nErrorCode,LPSTR lpszError);

// 1 byte alignment or SCSI structures
#pragma pack(push,1)

#define MAX_SCSIDEVICES 16


#define TIMEOUT 10000


typedef void (*POSTPROCFUNC)();

typedef struct TOC_TAG 
{
  BYTE	_reserved1;
  BYTE	bFlags;
  BYTE	bTrack;
  BYTE	_reserved2;
  DWORD	dwStartSector;
} TOC;


// The SRB_Flags are defined below.  These flags may be OR'd together to form
// the final value for SRB_Flags in the SRB.  Note that SRB_POSTING and
// SRB_EVENT_NOTIFY are mutually exclusive, as are SRB_DIR_IN and SRB_DIR_OUT.  In
// addition, the directioin bits (SRB_DIR_IN and SRB_DIR_OUT) MUST be set
// correctly on commands which transfer data.  Using SRB_DIR_SCSI is no longer
// an option as in ASPI for DOS and ASPI for Win16.

#define	SRB_POSTING					0x01	// Enable ASPI command completion posting. See section on posting below.
#define	SRB_ENABLE_RESIDUAL_COUNT	0x04	// Enables reporting of residual byte count.This flag is only significant if the host adapter reports support for residual byte count in the SC_HA_INQUIRY command.  When data underrun occurs, the SRB_BufLen field is updated to reflect the remaining bytes to transfer.
#define	SRB_DIR_IN					0x08	// Data transfer from SCSI target to host.
#define SRB_DIR_OUT					0x10	// Data transfer from host to SCSI target.
#define	SRB_EVENT_NOTIFY			0x40	// Enable ASPI command event notification. See section on event notification below.


// Inquiry DeviceTypeCodes 
#define DTC_DISK			0x00	// Direct-access device
#define DTC_TAPE			0x01	// Sequential-access device 
#define DTC_PRINTER			0x02	// Printer device 
#define DTC_PROCESSOR		0x03	// Processor device 
#define DTC_WORM			0x04	// Write-once device 
#define DTC_CDROM			0x05	// CD-ROM device 
#define DTC_SCANNER			0x06	// Scanner device 
#define DTC_OPTICAL			0x07	// Optical memory device 
#define DTC_JUKEBOX			0x08	// Medium changer device 
#define DTC_COMM			0x09	// Communications device 
#define DTC_PREPRESS1		0x0A	// Pre-press device 1 
#define DTC_PREPRESS2		0x0B	// Pre-press device 2 
#define DTC_UNKNOWN			0x1F	// Unknown or no device type 


/***************************************************************************
 ** SRB Status
 ***************************************************************************/
#define SS_PENDING                0x00   /* SRB being processed            */
#define SS_COMP                   0x01   /* SRB completed without error    */
#define SS_ABORTED                0x02   /* SRB aborted                    */
#define SS_ABORT_FAIL             0x03   /* Unable to abort SRB            */
#define SS_ERR                    0x04   /* SRB completed with error       */
#define SS_INVALID_CMD            0x80   /* Invalid ASPI command           */
#define SS_INVALID_HA             0x81   /* Invalid host adapter number    */
#define SS_NO_DEVICE              0x82   /* SCSI device not installed      */
#define SS_INVALID_SRB            0xE0   /* Invalid parameter set in SRB   */
#define SS_OLD_MANAGER            0xE1   /* ASPI manager doesn't support   */
                                         /* windows                        */
#define SS_BUFFER_ALIGN           0xE1   /* Buffer not aligned (replaces   */
                                         /* SS_OLD_MANAGER in Win32)       */
#define SS_ILLEGAL_MODE           0xE2   /* Unsupported Windows mode       */
#define SS_NO_ASPI                0xE3   /* No ASPI managers               */
#define SS_FAILED_INIT            0xE4   /* ASPI for windows failed init   */
#define SS_ASPI_IS_BUSY           0xE5   /* No resources available to      */
                                         /* execute command                */
#define SS_BUFFER_TO_BIG          0xE6   /* Buffer size too big to handle  */
#define SS_BUFFER_TOO_BIG         0xE6   /* Correct spelling of 'too'      */
#define SS_MISMATCHED_COMPONENTS  0xE7   /* The DLLs/EXEs of ASPI don't    */
                                         /* version check                  */
#define SS_NO_ADAPTERS            0xE8   /* No host adapters to manager    */
#define SS_INSUFFICIENT_RESOURCES 0xE9   /* Couldn't allocate resources    */
                                         /* needed to init                 */
#define SS_ASPI_IS_SHUTDOWN       0xEA   /* Call came to ASPI after        */
                                         /* PROCESS_DETACH                 */
#define SS_BAD_INSTALL            0xEB   /* The DLL or other components    */
                                         /* are installed wrong            */


// SRB defines
#define	SC_HA_INQUIRY		0x00	// Get information about installed host adapters,including the number of installed adapters.
#define	SC_GET_DEV_TYPE		0x01	// Get information about installed SCSI devices.
#define	SC_EXEC_SCSI_CMD	0x02	// Execute SCSI I/O.
#define	SC_ABORT_SRB		0x03	// Abort an outstanding I/O request.
#define	SC_RESET_DEV		0x04	// Reset an individual SCSI target.
#define	SC_GET_DISK_INFO	0x06	// Get information on disk type SCSI devices (not available under Windows NT).
#define SC_GETSET_TIMEOUTS	0x08

// MISC defines
#define CDSAMPLEFREQ 44100
#define TRACKSPERSEC 75

#define CB_CDDASECTOR	2352
#define CB_QSUBCHANNEL	0
#define CB_CDROMSECTOR	2048
#define CB_AUDIO	(CB_CDDASECTOR-CB_QSUBCHANNEL)



typedef struct
{
	BYTE        SRB_Cmd;            // ASPI command code
	BYTE        SRB_Status;         // ASPI command status byte
	BYTE        SRB_HaId;           // ASPI host adapter number
	BYTE        SRB_Flags;          // ASPI request flags
	DWORD       SRB_Hdr_Rsvd;       // Reserved, MUST = 0
} SRB_HEADER, *LPSRB;


typedef struct
{
    BYTE        SRB_Cmd;            // ASPI command code = SC_HA_INQUIRY
    BYTE        SRB_Status;         // ASPI command status byte
    BYTE        SRB_HaId;           // ASPI host adapter number
    BYTE        SRB_Flags;          // ASPI request flags
    DWORD       SRB_Hdr_Rsvd;       // Reserved, MUST = 0
    BYTE        HA_Count;           // Number of host adapters present
    BYTE        HA_SCSI_ID;         // SCSI ID of host adapter
    BYTE        HA_ManagerId[16];   // String describing the manager
    BYTE        HA_Identifier[16];  // String describing the host adapter
    BYTE        HA_Unique[16];      // Host Adapter Unique parameters
    WORD        HA_Rsvd1;
} SRB_HAINQUIRY, *LPSRB_HAINQUIRY;


typedef struct
{
    BYTE        SRB_Cmd;            // ASPI command code = SC_GET_DEV_TYPE
    BYTE        SRB_Status;         // ASPI command status byte
    BYTE        SRB_HaId;           // ASPI host adapter number
    BYTE        SRB_Flags;          // Reserved
    DWORD       SRB_Hdr_Rsvd;       // Reserved
    BYTE        SRB_Target;         // Target's SCSI ID
    BYTE        SRB_Lun;            // Target's LUN number
    BYTE        SRB_DeviceType;     // Target's peripheral device type
    BYTE        SRB_Rsvd1;          // Reserved for alignment
} SRB_GDEVBLOCK, *LPSRB_GDEVBLOCK;


#define SENSE_LEN 14				// Maximum sense length


typedef struct
{
    BYTE        SRB_Cmd;            // ASPI command code = SC_EXEC_SCSI_CMD
    BYTE        SRB_Status;         // ASPI command status byte
    BYTE        SRB_HaId;           // ASPI host adapter number
    BYTE        SRB_Flags;          // ASPI request flags
    DWORD       SRB_Hdr_Rsvd;       // Reserved
    BYTE        SRB_Target;         // Target's SCSI ID
    BYTE        SRB_Lun;            // Target's LUN number
    WORD        SRB_Rsvd1;          // Reserved for Alignment
    DWORD       SRB_BufLen;         // Data Allocation Length
    BYTE        *SRB_BufPointer;    // Data Buffer Point
    BYTE        SRB_SenseLen;       // Sense Allocation Length
    BYTE        SRB_CDBLen;         // CDB Length
    BYTE        SRB_HaStat;         // Host Adapter Status
    BYTE        SRB_TargStat;       // Target Status
    void        (*SRB_PostProc)();  // Post routine
    void        *SRB_Rsvd2;         // Reserved
    BYTE        SRB_Rsvd3[16];      // Reserved for expansion
    BYTE        CDBByte[16];        // SCSI CDB
    BYTE        SenseArea[SENSE_LEN+2]; // Request Sense buffer
} SRB_EXECSCSICMD, *LPSRB_EXECSCSICMD;


typedef struct
{
    BYTE        SRB_Cmd;            // ASPI command code = SC_EXEC_SCSI_CMD
    BYTE        SRB_Status;         // ASPI command status byte
    BYTE        SRB_HaId;           // ASPI host adapter number
    BYTE        SRB_Flags;          // Reserved
    DWORD       SRB_Hdr_Rsvd;       // Reserved
    BYTE        SRB_Target;         // Target's SCSI ID
    BYTE        SRB_Lun;            // Target's LUN number
    BYTE        SRB_DriveFlags;     // Driver flags
    BYTE        SRB_Int13HDriveInfo;// Host Adapter Status
    BYTE        SRB_Heads;          // Preferred number of heads translation
    BYTE        SRB_Sectors;        // Preferred number of sectors translation
    BYTE        SRB_Rsvd1[10];      // Reserved
} SRB_GETDISKINFO, *LPSRB_GETDISKINFO;



typedef struct
{
    BYTE        SRB_Cmd;            // ASPI command code = SC_RESET_DEV
    BYTE        SRB_Status;         // ASPI command status byte
    BYTE        SRB_HaId;           // ASPI host adapter number
    BYTE        SRB_Flags;          // Reserved
    DWORD       SRB_Hdr_Rsvd;       // Reserved
    BYTE        SRB_Target;         // Target's SCSI ID
    BYTE        SRB_Lun;            // Target's LUN number
    BYTE        SRB_Rsvd1[12];      // Reserved for Alignment
    BYTE        SRB_HaStat;         // Host Adapter Status
    BYTE        SRB_TargStat;       // Target Status
    void        *SRB_PostProc;      // Post routine
    void        *SRB_Rsvd2;         // Reserved
    BYTE        SRB_Rsvd3[32];      // Reserved
} SRB_BUSDEVICERESET, *LPSRB_BUSDEVICERESET;


typedef struct
{
  BYTE     SRB_Cmd;           /* 00/000 ASPI cmd code == SC_ABORT_SRB      */
  BYTE     SRB_Status;        /* 01/001 ASPI command status byte           */
  BYTE     SRB_HaID;          /* 02/002 ASPI host adapter number           */
  BYTE     SRB_Flags;         /* 03/003 Reserved, must = 0                 */
  DWORD    SRB_Hdr_Rsvd;      /* 04/004 Reserved, must = 0                 */
  void     *SRB_ToAbort;      /* 08/008 Pointer to SRB to abort            */
} SRB_Abort, *PSRB_Abort, FAR *LPSRB_Abort;


typedef unsigned char	Ucbit;
typedef unsigned char	u_char;

#define	MP_P_CODE			\
	Ucbit	p_code		: 6;	\
	Ucbit	p_res		: 1;	\
	Ucbit	parsave		: 1


// CD Cap / mech status 
typedef struct SCSICDMODEPAGE2A_TAG
{		
	MP_P_CODE;					// parsave & pagecode				(0)
	u_char	p_len;				// 0x14 = 20 Bytes					(1)

	Ucbit	cd_r_read	: 1;	// Reads CD-R  media				(2)
	Ucbit	cd_rw_read	: 1;	// Reads CD-RW media		     
	Ucbit	method2		: 1;	// Reads fixed packet method2 media  
	Ucbit	dvd_rom_read: 1;	// Reads DVD ROM media		     
	Ucbit	dvd_r_read	: 1;	// Reads DVD-R media		     
	Ucbit	dvd_ram_read: 1;	// Reads DVD-RAM media		     
	Ucbit	res_2_67	: 2;	// Reserved			     

	Ucbit	cd_r_write	: 1;	// Supports writing CD-R  media		(3)
	Ucbit	cd_rw_write	: 1;	// Supports writing CD-RW media	     
	Ucbit	test_write	: 1;	// Supports emulation write	     
	Ucbit	res_3_3		: 1;	// Reserved			     
	Ucbit	dvd_r_write	: 1;	// Supports writing DVD-R media	     
	Ucbit	dvd_ram_write: 1;	// Supports writing DVD-RAM media    
	Ucbit	res_3_67	: 2;	// Reserved			     

	Ucbit	audio_play	: 1;	// Supports Audio play operation	(4)    
	Ucbit	composite	: 1;	// Deliveres composite A/V stream
	Ucbit	digital_port_2: 1;	// Supports digital output on port 2 
	Ucbit	digital_port_1: 1;	// Supports digital output on port 1 
	Ucbit	mode_2_form_1: 1;	// Reads Mode-2 form 1 media (XA)    
	Ucbit	mode_2_form_2: 1;	// Reads Mode-2 form 2 media	     
	Ucbit	multi_session: 1;	// Reads multi-session media	     
	Ucbit	res_4		: 1;	// Reserved			     

	Ucbit	cd_da_supported: 1;	// Reads audio data with READ CD cmd 
	Ucbit	cd_da_accurate: 1;	// READ CD data stream is accurate   
	Ucbit	rw_supported: 1;	// Reads R-W sub channel information 
	Ucbit	rw_deint_cor: 1;	// Reads de-interleved R-W sub chan  
	Ucbit	c2_pointers	: 1;	// Supports C2 error pointers	     
	Ucbit	ISRC		: 1;	// Reads ISRC information	     
	Ucbit	UPC			: 1;	// Reads media catalog number (UPC)  
	Ucbit	read_bar_code: 1;	// Supports reading bar codes	     

	Ucbit	lock		: 1;	// PREVENT/ALLOW may lock media	     (5)
	Ucbit	lock_state	: 1;	// Lock state 0=unlocked 1=locked    
	Ucbit	prevent_jumper: 1;	// State of prev/allow jumper 0=pres 
	Ucbit	eject		: 1;	// Ejects disc/cartr with STOP LoEj  
	Ucbit	res_6_4		: 1;	// Reserved			     
	Ucbit	loading_type: 3;	// Loading mechanism type	     

	Ucbit	sep_chan_vol: 1;	// Vol controls each channel separat (6)
	Ucbit	sep_chan_mute: 1;	// Mute controls each channel separat
	Ucbit	disk_present_rep:1;	// Changer supports disk present rep 
	Ucbit	sw_slot_sel:1;		// Load empty slot in changer	     
	Ucbit	res_7	: 4;		// Reserved			     

	BYTE	ReadSpeedH;			// Max. read speed in KB/s				(7)
	BYTE	ReadSpeedL;			// Max. read speed in KB/s				(7)

	u_char	num_vol_levels[2];	// # of supported volume levels			(9)

	u_char	buffer_size[2];		// Buffer size for the data in KB		(11)
	u_char	cur_read_speed[2];	// Current read speed in KB/s			(13)	     
	u_char	res_16;				// Reserved								(14)
	
	Ucbit	res_17_0: 1;		// Reserved								(15)
	Ucbit	BCK		: 1;		// Data valid on falling edge of BCK 
	Ucbit	RCK		: 1;		// Set: HIGH high LRCK=left channel  
	Ucbit	LSBF		: 1;	// Set: LSB first Clear: MSB first   
	Ucbit	length		: 2;	// 0=32BCKs 1=16BCKs 2=24BCKs 3=24I2c
	Ucbit	res_17		: 2;	// Reserved			     
	
	u_char	max_write_speed[2];	// Max. write speed supported in KB/s	(17)

	u_char	cur_write_speed[2];	// Current write speed in KB/s			(19)

} SCSICDMODEPAGE2A;

char *fillbytes(void *tov, int cnt, char val);


typedef struct SCISMODEHEADER_TAG {
	Ucbit	sense_data_len	: 8;
	u_char	medium_type;
	Ucbit	res2		: 4;
	Ucbit	cache		: 1;
	Ucbit	res		: 2;
	Ucbit	write_prot	: 1;
	BYTE	nBlockLen;
} SCISMODEHEADER;

typedef struct SCSIMODEHDR_6_TAG {
	BYTE		btModeDataLen;					// 0
	BYTE		btMediumType;					// 1
	BYTE		btDevSpecificParam;				// 2
	BYTE		btBlkDescrLen;					// 3
} SCSIMODEHDR_6;


typedef struct SCSIMODEHDR_10_TAG {
	BYTE		btModeDataLenH;					// 0
	BYTE		btModeDataLenL;					// 1
	BYTE		btMediumType;					// 2
	BYTE		btDevSpecificParam;				// 3
	BYTE		btReserved1;					// 4
	BYTE		btReserved2;					// 5 
	BYTE		btBlkDescrLenH;					// 6
	BYTE		btBlkDescrLenL;					// 7
} SCSIMODEHDR_10;

typedef struct SCSIBLOCKDESCRIPTOR_TAG {
	BYTE		btDensity;						// 0
	BYTE		btNumberOfBlocksH;				// 1
	BYTE		btNumberOfBlocksM;				// 2
	BYTE		btNumberOfBlocksL;				// 3
	BYTE		btReserved;						// 4
	BYTE		btBlockLenH;					// 5 
	BYTE		btBlockLenM;					// 6
	BYTE		btBlockLenL;					// 7
} SCSIBLOCKDESCRIPTOR;




// Error recovery Parameters
typedef struct SCSICDMODEPAGE1A_TAG{
		MP_P_CODE;								//  0	parsave & pagecode
	u_char	p_len;								//  1	0x0A = 12 Bytes
	Ucbit	disa_correction	: 1;				//	2	Byte 2
	Ucbit	term_on_rec_err	: 1;
	Ucbit	report_rec_err	: 1;
	Ucbit	en_early_corr	: 1;
	Ucbit	read_continuous	: 1;
	Ucbit	tranfer_block	: 1;
	Ucbit	en_auto_reall_r	: 1;
	Ucbit	en_auto_reall_w	: 1;
	u_char	rd_retry_count;						//	3	Byte 3
	u_char	correction_span;					//  4
	char	head_offset_count;					//  5
	char	data_strobe_offset;					//  6
	u_char	res;								//  7
	u_char	wr_retry_count;						//  8
	u_char	res_tape[2];						//  9
	u_char	recov_timelim[2];					// 11
} SCSICDMODEPAGE1A;




typedef struct
{
	BYTE SRB_Cmd; // ASPI command code = SC_GETSET_TIMEOUTS
	BYTE SRB_Status; // ASPI command status byte
	BYTE SRB_HaId; // ASPI host adapter number
	BYTE SRB_Flags; // ASPI request flags
	DWORD SRB_Hdr_Rsvd; // Reserved
	BYTE SRB_Target; // Target's SCSI ID
	BYTE SRB_Lun; // Target's LUN number
	DWORD SRB_Timeout; // Timeout in half seconds
}
SRB_GetSetTimeouts, *PSRB_GetSetTimeouts;

typedef struct
{
	LPBYTE AB_BufPointer; // Pointer to the ASPI allocated buffer
	DWORD AB_BufLen; // Length in bytes of the buffer
	DWORD AB_ZeroFill; // Flag set to 1 if buffer should be zeroed
	DWORD AB_Reserved; // Reserved, MUST = 0
}
ASPI32BUFF, *PASPI32BUFF;

#pragma pack(pop)

#endif