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
/*
 * Definitions for a Sony interface CDROM drive.
 *
 * Corey Minyard (minyard@wf-rch.cirr.com)
 *
 *  Copyright (C) 1993  Corey Minyard
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 *
 */

/*
 * Offsets (from the base address) and bits for the various write registers
 * of the drive.
 */
#define SONY_CMD_REG_OFFSET	0
#define SONY_PARAM_REG_OFFSET	1
#define SONY_WRITE_REG_OFFSET	2
#define SONY_CONTROL_REG_OFFSET	3
#	define SONY_ATTN_CLR_BIT	0x01
#	define SONY_RES_RDY_CLR_BIT	0x02
#	define SONY_DATA_RDY_CLR_BIT	0x04
#	define SONY_ATTN_INT_EN_BIT	0x08
#	define SONY_RES_RDY_INT_EN_BIT	0x10
#	define SONY_DATA_RDY_INT_EN_BIT	0x20
#	define SONY_PARAM_CLR_BIT	0x40
#	define SONY_DRIVE_RESET_BIT	0x80

/*
 * Offsets (from the base address) and bits for the various read registers
 * of the drive.
 */
#define SONY_STATUS_REG_OFFSET	0
#	define SONY_ATTN_BIT		0x01
#	define SONY_RES_RDY_BIT		0x02
#	define SONY_DATA_RDY_BIT	0x04
#	define SONY_ATTN_INT_ST_BIT	0x08
#	define SONY_RES_RDY_INT_ST_BIT	0x10
#	define SONY_DATA_RDY_INT_ST_BIT	0x20
#	define SONY_DATA_REQUEST_BIT	0x40
#	define SONY_BUSY_BIT		0x80
#define SONY_RESULT_REG_OFFSET	1
#define SONY_READ_REG_OFFSET	2
#define SONY_FIFOST_REG_OFFSET	3
#	define SONY_PARAM_WRITE_RDY_BIT	0x01
#	define SONY_PARAM_REG_EMPTY_BIT	0x02
#	define SONY_RES_REG_NOT_EMP_BIT	0x04
#	define SONY_RES_REG_FULL_BIT	0x08

#define LOG_START_OFFSET	150	/* Offset of first logical sector */

#define SONY_DETECT_TIMEOUT	80	/* Maximum amount of time
					   that drive detection code
					   will wait for response
					   from drive (in 1/100th's
					   of seconds). */
 
#define SONY_JIFFIES_TIMEOUT	500	/* Maximum number of times the
					   drive will wait/try for an
					   operation */
#define SONY_RESET_TIMEOUT	100	/* Maximum number of times the
					   drive will wait/try a reset
					   operation */
#define SONY_READY_RETRIES	20000	/* How many times to retry a
					   spin waiting for a register
					   to come ready */

#define MAX_CDU31A_RETRIES	3	/* How many times to retry an
					   operation */

/* Commands to request or set drive control parameters and disc information */
#define SONY_REQ_DRIVE_CONFIG_CMD	0x00    /* Returns s_sony_drive_config */
#define SONY_REQ_DRIVE_MODE_CMD		0x01
#define SONY_REQ_DRIVE_PARAM_CMD	0x02
#define SONY_REQ_MECH_STATUS_CMD	0x03
#define SONY_REQ_AUDIO_STATUS_CMD	0x04
#define SONY_SET_DRIVE_PARAM_CMD	0x10
#define SONY_REQ_TOC_DATA_CMD		0x20    /* Returns s_sony_toc */
#define SONY_REQ_SUBCODE_ADDRESS_CMD	0x21    /* Returns s_sony_subcode */
#define SONY_REQ_UPC_EAN_CMD		0x22
#define SONY_REQ_ISRC_CMD		0x23
#define SONY_REQ_TOC_DATA_SPEC_CMD	0x24

/* Commands to request information from the drive */
#define SONY_READ_TOC_CMD		0x30
#define SONY_SEEK_CMD			0x31
#define SONY_READ_CMD			0x32
#define SONY_READ_BLKERR_STAT_CMD	0x34
#define SONY_ABORT_CMD			0x35
#define SONY_READ_TOC_SPEC_CMD		0x36

/* Commands to control audio */
#define SONY_AUDIO_PLAYBACK_CMD		0x40
#define SONY_AUDIO_STOP_CMD		0x41
#define SONY_AUDIO_SCAN_CMD		0x42

/* Miscellaneous control commands */
#define SONY_EJECT_CMD			0x50
#define SONY_SPIN_UP_CMD		0x51
#define SONY_SPIN_DOWN_CMD		0x52

/* Diagnostic commands */
#define SONY_WRITE_BUFFER_CMD		0x60
#define SONY_READ_BUFFER_CMD		0x61
#define SONY_DIAGNOSTICS_CMD		0x62


/*
 * The following are command paramters for the set drive parameter command
 */
#define SONY_SD_DECODE_PARAM		0x00
#define SONY_SD_INTERFACE_PARAM		0x01
#define SONY_SD_BUFFERING_PARAM		0x02
#define SONY_SD_AUDIO_PARAM		0x03
#define SONY_SD_AUDIO_VOLUME		0x04
#define SONY_SD_MECH_CONTROL		0x05
#define SONY_SD_AUTO_SPIN_DOWN_TIME	0x06

/*
 * The following extract information from the drive configuration about
 * the drive itself.
 */
#define SONY_HWC_GET_LOAD_MECH(c)	(c.hw_config[0] & 0x03)
#define SONY_HWC_EJECT(c)		(c.hw_config[0] & 0x04)
#define SONY_HWC_LED_SUPPORT(c)		(c.hw_config[0] & 0x08)
#define SONY_HWC_GET_BUF_MEM_SIZE(c)	((c.hw_config[0] & 0xc0) >> 6)
#define SONY_HWC_AUDIO_PLAYBACK(c)	(c.hw_config[1] & 0x01)
#define SONY_HWC_ELECTRIC_VOLUME(c)	(c.hw_config[1] & 0x02)
#define SONY_HWC_ELECTRIC_VOLUME_CTL(c)	(c.hw_config[1] & 0x04)

#define SONY_HWC_CADDY_LOAD_MECH	0x00
#define SONY_HWC_TRAY_LOAD_MECH		0x01
#define SONY_HWC_POPUP_LOAD_MECH	0x02
#define SONY_HWC_UNKWN_LOAD_MECH	0x03

#define SONY_HWC_8KB_BUFFER		0x00
#define SONY_HWC_32KB_BUFFER		0x01
#define SONY_HWC_64KB_BUFFER		0x02
#define SONY_HWC_UNKWN_BUFFER		0x03

/*
 * This is the complete status returned from the drive configuration request
 * command.
 */
struct s_sony_drive_config
{
   unsigned char exec_status[2];
   char vendor_id[8];
   char product_id[16];
   char product_rev_level[8];
   unsigned char hw_config[2];
};

/* The following is returned from the request subcode address command */
struct s_sony_subcode
{
   unsigned char exec_status[2];
   unsigned char address	:4;
   unsigned char control	:4;
   unsigned char track_num;
   unsigned char index_num;
   unsigned char rel_msf[3];
   unsigned char reserved1;
   unsigned char abs_msf[3];
};

/*
 * The following is returned from the request TOC (Table Of Contents) command.
 * (last_track_num-first_track_num+1) values are valid in tracks.
 */
struct s_sony_toc
{
   unsigned char exec_status[2];
   unsigned char address0	:4;
   unsigned char control0	:4;
   unsigned char point0;
   unsigned char first_track_num;
   unsigned char disk_type;
   unsigned char dummy0;
   unsigned char address1	:4;
   unsigned char control1	:4;
   unsigned char point1;
   unsigned char last_track_num;
   unsigned char dummy1;
   unsigned char dummy2;
   unsigned char address2	:4;
   unsigned char control2	:4;
   unsigned char point2;
   unsigned char lead_out_start_msf[3];
   struct
   {
      unsigned char address	:4;
      unsigned char control	:4;
      unsigned char track;
      unsigned char track_start_msf[3];
   } tracks[100];

   unsigned int lead_out_start_lba;
};


/*
 * The following are errors returned from the drive.
 */

/* Command error group */
#define SONY_ILL_CMD_ERR		0x10
#define SONY_ILL_PARAM_ERR		0x11

/* Mechanism group */
#define SONY_NOT_LOAD_ERR		0x20
#define SONY_NO_DISK_ERR		0x21
#define SONY_NOT_SPIN_ERR		0x22
#define SONY_SPIN_ERR			0x23
#define SONY_SPINDLE_SERVO_ERR		0x25
#define SONY_FOCUS_SERVO_ERR		0x26
#define SONY_EJECT_MECH_ERR		0x29
#define SONY_AUDIO_PLAYING_ERR		0x2a
#define SONY_EMERGENCY_EJECT_ERR	0x2c

/* Seek error group */
#define SONY_FOCUS_ERR			0x30
#define SONY_FRAME_SYNC_ERR		0x31
#define SONY_SUBCODE_ADDR_ERR		0x32
#define SONY_BLOCK_SYNC_ERR		0x33
#define SONY_HEADER_ADDR_ERR		0x34

/* Read error group */
#define SONY_ILL_TRACK_R_ERR		0x40
#define SONY_MODE_0_R_ERR		0x41
#define SONY_ILL_MODE_R_ERR		0x42
#define SONY_ILL_BLOCK_SIZE_R_ERR	0x43
#define SONY_MODE_R_ERR			0x44
#define SONY_FORM_R_ERR			0x45
#define SONY_LEAD_OUT_R_ERR		0x46
#define SONY_BUFFER_OVERRUN_R_ERR	0x47

/* Data error group */
#define SONY_UNREC_CIRC_ERR		0x53
#define SONY_UNREC_LECC_ERR		0x57

/* Subcode error group */
#define SONY_NO_TOC_ERR			0x60
#define SONY_SUBCODE_DATA_NVAL_ERR	0x61
#define SONY_FOCUS_ON_TOC_READ_ERR	0x63
#define SONY_FRAME_SYNC_ON_TOC_READ_ERR	0x64
#define SONY_TOC_DATA_ERR		0x65

/* Hardware failure group */
#define SONY_HW_FAILURE_ERR		0x70
#define SONY_LEAD_IN_A_ERR		0x91
#define SONY_LEAD_OUT_A_ERR		0x92
#define SONY_DATA_TRACK_A_ERR		0x93

/*
 * The following are returned from the Read With Block Error Status command.
 * They are not errors but information (Errors from the 0x5x group above may
 * also be returned
 */
#define SONY_NO_CIRC_ERR_BLK_STAT	0x50
#define SONY_NO_LECC_ERR_BLK_STAT	0x54
#define SONY_RECOV_LECC_ERR_BLK_STAT	0x55
#define SONY_NO_ERR_DETECTION_STAT	0x59

/* 
 * The following is not an error returned by the drive, but by the code
 * that talks to the drive.  It is returned because of a timeout.
 */
#define SONY_TIMEOUT_OP_ERR		0x01
#define SONY_SIGNAL_OP_ERR		0x02


/*
 * The following are attention code for asyncronous events from the drive.
 */

/* Standard attention group */
#define SONY_EMER_EJECT_ATTN		0x2c
#define SONY_HW_FAILURE_ATTN		0x70
#define SONY_MECH_LOADED_ATTN		0x80
#define SONY_EJECT_PUSHED_ATTN		0x81

/* Audio attention group */
#define SONY_AUDIO_PLAY_DONE_ATTN	0x90
#define SONY_LEAD_IN_ERR_ATTN	 	0x91
#define SONY_LEAD_OUT_ERR_ATTN	 	0x92
#define SONY_DATA_TRACK_ERR_ATTN	0x93
#define SONY_AUDIO_PLAYBACK_ERR_ATTN	0x94

/* Auto spin up group */
#define SONY_SPIN_UP_COMPLETE_ATTN	0x24
#define SONY_SPINDLE_SERVO_ERR_ATTN	0x25
#define SONY_FOCUS_SERVO_ERR_ATTN	0x26
#define SONY_TOC_READ_DONE_ATTN		0x62
#define SONY_FOCUS_ON_TOC_READ_ERR_ATTN	0x63
#define SONY_SYNC_ON_TOC_READ_ERR_ATTN	0x65

/* Auto eject group */
#define SONY_SPIN_DOWN_COMPLETE_ATTN	0x27
#define SONY_EJECT_COMPLETE_ATTN	0x28
#define SONY_EJECT_MECH_ERR_ATTN	0x29
以智者之名,为愚者代辩