1 | /* $NetBSD: scsipi_cd.h,v 1.21 2009/04/01 12:19:04 reinoud Exp $ */ |
2 | |
3 | /* |
4 | * Written by Julian Elischer (julian@tfs.com) |
5 | * for TRW Financial Systems. |
6 | * |
7 | * TRW Financial Systems, in accordance with their agreement with Carnegie |
8 | * Mellon University, makes this software available to CMU to distribute |
9 | * or use in any manner that they see fit as long as this message is kept with |
10 | * the software. For this reason TFS also grants any other persons or |
11 | * organisations permission to use or modify this software. |
12 | * |
13 | * TFS supplies this software to be publicly redistributed |
14 | * on the understanding that TFS is not responsible for the correct |
15 | * functioning of this software in any circumstances. |
16 | * |
17 | * Ported to run under 386BSD by Julian Elischer (julian@tfs.com) Sept 1992 |
18 | */ |
19 | |
20 | /* |
21 | * Define two bits always in the same place in byte 2 (flag byte) |
22 | */ |
23 | #define CD_RELADDR 0x01 |
24 | #define CD_MSF 0x02 |
25 | |
26 | /* |
27 | * SCSI and SCSI-like command format |
28 | */ |
29 | |
30 | #define LOAD_UNLOAD 0xa6 |
31 | struct scsipi_load_unload { |
32 | u_int8_t opcode; |
33 | u_int8_t unused1[3]; |
34 | u_int8_t options; |
35 | u_int8_t unused2[3]; |
36 | u_int8_t slot; |
37 | u_int8_t unused3[3]; |
38 | } __packed; |
39 | |
40 | #define PAUSE 0x4b /* cdrom pause in 'play audio' mode */ |
41 | struct scsipi_pause { |
42 | u_int8_t opcode; |
43 | u_int8_t byte2; |
44 | u_int8_t unused[6]; |
45 | u_int8_t resume; |
46 | u_int8_t control; |
47 | } __packed; |
48 | #define PA_PAUSE 0x00 |
49 | #define PA_RESUME 0x01 |
50 | |
51 | #define PLAY_MSF 0x47 /* cdrom play Min,Sec,Frames mode */ |
52 | struct scsipi_play_msf { |
53 | u_int8_t opcode; |
54 | u_int8_t byte2; |
55 | u_int8_t unused; |
56 | u_int8_t start_m; |
57 | u_int8_t start_s; |
58 | u_int8_t start_f; |
59 | u_int8_t end_m; |
60 | u_int8_t end_s; |
61 | u_int8_t end_f; |
62 | u_int8_t control; |
63 | } __packed; |
64 | |
65 | #define PLAY 0x45 /* cdrom play 'play audio' mode */ |
66 | struct scsipi_play { |
67 | u_int8_t opcode; |
68 | u_int8_t byte2; |
69 | u_int8_t blk_addr[4]; |
70 | u_int8_t unused; |
71 | u_int8_t xfer_len[2]; |
72 | u_int8_t control; |
73 | } __packed; |
74 | |
75 | #define 0x44 /* cdrom read header */ |
76 | struct { |
77 | u_int8_t ; |
78 | u_int8_t ; |
79 | u_int8_t [4]; |
80 | u_int8_t ; |
81 | u_int8_t [2]; |
82 | u_int8_t ; |
83 | } __packed; |
84 | |
85 | #define READ_SUBCHANNEL 0x42 /* cdrom read Subchannel */ |
86 | struct scsipi_read_subchannel { |
87 | u_int8_t opcode; |
88 | u_int8_t byte2; |
89 | u_int8_t byte3; |
90 | #define SRS_SUBQ 0x40 |
91 | u_int8_t subchan_format; |
92 | u_int8_t unused[2]; |
93 | u_int8_t track; |
94 | u_int8_t data_len[2]; |
95 | u_int8_t control; |
96 | } __packed; |
97 | |
98 | #define READ_TOC 0x43 /* cdrom read TOC */ |
99 | struct scsipi_read_toc { |
100 | u_int8_t opcode; |
101 | u_int8_t addr_mode; |
102 | u_int8_t resp_format; |
103 | u_int8_t unused[3]; |
104 | u_int8_t from_track; /* session nr in format 2 */ |
105 | u_int8_t data_len[2]; |
106 | u_int8_t control; |
107 | } __packed; |
108 | |
109 | struct { |
110 | uint8_t [2]; |
111 | uint8_t ; /* track or session */ |
112 | uint8_t ; |
113 | } __packed; |
114 | |
115 | /* read TOC form 0 result entries */ |
116 | struct scsipi_toc_formatted { |
117 | uint8_t unused1; |
118 | uint8_t adrcontrol; |
119 | uint8_t tracknr; |
120 | uint8_t unused2; |
121 | uint8_t msf_lba[4]; /* union msf_lba from cdio.h */ |
122 | } __packed; |
123 | |
124 | /* read TOC form 1 result entries */ |
125 | struct scsipi_toc_msinfo { |
126 | uint8_t unused1; |
127 | uint8_t adrcontol; |
128 | uint8_t tracknr; /* first track last compl. session */ |
129 | uint8_t unused2; |
130 | uint8_t msf_lba[4]; /* union msf_lba from cdio.h */ |
131 | } __packed; |
132 | |
133 | /* read TOC form 2 result entries */ |
134 | struct scsipi_toc_rawtoc { |
135 | uint8_t sessionnr; |
136 | uint8_t adrcontrol; |
137 | uint8_t tno; |
138 | uint8_t point; |
139 | uint8_t min; |
140 | uint8_t sec; |
141 | uint8_t frame; |
142 | uint8_t zero; /* zero/unused */ |
143 | uint8_t pmin; |
144 | uint8_t psec; |
145 | uint8_t pframe; |
146 | } __packed; |
147 | |
148 | /* read TOC form 3, 4 and 5 obmitted yet */ |
149 | |
150 | #define GET_CONFIGURATION 0x46 /* Get configuration */ |
151 | #define GET_CONF_NO_FEATURES_LEN 8 |
152 | struct scsipi_get_configuration { |
153 | uint8_t opcode; |
154 | uint8_t request_type; |
155 | uint8_t start_at_feature[2]; |
156 | uint8_t unused[3]; |
157 | uint8_t data_len[2]; |
158 | uint8_t control; |
159 | } __packed; |
160 | |
161 | struct scsipi_get_conf_data { |
162 | uint8_t data_len[4]; |
163 | uint8_t unused[2]; |
164 | uint8_t mmc_profile[2]; /* current mmc profile for disk */ |
165 | uint8_t feature_desc[1]; /* feature descriptors follow */ |
166 | } __packed; |
167 | |
168 | struct scsipi_get_conf_feature { /* feature descriptor */ |
169 | uint8_t featurecode[2]; |
170 | uint8_t flags; |
171 | uint8_t additional_length; /* length of feature dependent */ |
172 | uint8_t feature_dependent[256]; |
173 | } __packed; |
174 | #define FEATUREFLAG_CURRENT 1 |
175 | #define FEATUREFLAG_PERSISTENT 2 |
176 | |
177 | |
178 | #define READ_DISCINFO 0x51 |
179 | struct scsipi_read_discinfo { |
180 | uint8_t opcode; |
181 | uint8_t unused[6]; |
182 | uint8_t data_len[2]; |
183 | uint8_t control; |
184 | } __packed; |
185 | |
186 | #define READ_DISCINFO_SMALLSIZE 12 |
187 | #define READ_DISCINFO_BIGSIZE 34 /* + entries */ |
188 | struct scsipi_read_discinfo_data { |
189 | uint8_t data_len[2]; |
190 | uint8_t disc_state; |
191 | uint8_t first_track; |
192 | uint8_t num_sessions_lsb; |
193 | uint8_t first_track_last_session_lsb; |
194 | uint8_t last_track_last_session_lsb; |
195 | uint8_t disc_state2; |
196 | uint8_t disc_type; |
197 | uint8_t num_sessions_msb; |
198 | uint8_t first_track_last_session_msb; |
199 | uint8_t last_track_last_session_msb; |
200 | uint8_t discid[4]; |
201 | uint8_t last_session_leadin_hmsf[4]; |
202 | uint8_t last_possible_start_leadout_hmsf[4]; |
203 | uint8_t disc_bar_code[8]; |
204 | uint8_t application_code; |
205 | uint8_t num_opc_table_entries; |
206 | uint8_t opc_table_entries[1]; /* opc table entries follow */ |
207 | } __packed; |
208 | |
209 | |
210 | #define READ_TRACKINFO 0x52 |
211 | struct scsipi_read_trackinfo { |
212 | uint8_t opcode; |
213 | uint8_t addr_type; |
214 | uint8_t address[4]; |
215 | uint8_t nothing; |
216 | uint8_t data_len[2]; |
217 | uint8_t control; |
218 | } __packed; |
219 | #define READ_TRACKINFO_ADDR_LBA 0 |
220 | #define READ_TRACKINFO_ADDR_TRACK 1 |
221 | #define READ_TRACKINFO_ADDR_SESS 2 |
222 | |
223 | struct scsipi_read_trackinfo_data { |
224 | uint8_t data_len[2]; |
225 | uint8_t track_lsb; |
226 | uint8_t session_lsb; |
227 | uint8_t unused1; |
228 | uint8_t track_info_1; |
229 | uint8_t track_info_2; |
230 | uint8_t data_valid; |
231 | uint8_t track_start[4]; |
232 | uint8_t next_writable[4]; |
233 | uint8_t free_blocks[4]; |
234 | uint8_t packet_size[4]; |
235 | uint8_t track_size[4]; |
236 | uint8_t last_recorded[4]; |
237 | uint8_t track_msb; |
238 | uint8_t session_msb; |
239 | uint8_t unused2[2]; |
240 | } __packed; |
241 | #define READ_TRACKINFO_RETURNSIZE 36 |
242 | |
243 | |
244 | #define CLOSE_TRACKSESSION 0x5B |
245 | struct scsipi_close_tracksession { |
246 | uint8_t opcode; |
247 | uint8_t addr_type; /* bit 1 holds immediate */ |
248 | uint8_t function; /* bits 2,1,0 */ |
249 | uint8_t unused1; |
250 | uint8_t tracksessionnr[2]; |
251 | uint8_t unused2[3]; |
252 | uint8_t control; |
253 | } __packed; |
254 | |
255 | |
256 | #define RESERVE_TRACK 0x53 |
257 | struct scsipi_reserve_track { |
258 | uint8_t opcode; |
259 | uint8_t reserved[4]; |
260 | uint8_t reservation_size[4]; |
261 | uint8_t control; |
262 | } __packed; |
263 | |
264 | |
265 | #define REPAIR_TRACK 0x58 |
266 | struct scsipi_repair_track { |
267 | uint8_t opcode; |
268 | uint8_t reserved1; /* bit 1 holds immediate */ |
269 | uint8_t reserved2[2]; |
270 | uint8_t tracknr[2]; /* logical track nr */ |
271 | uint8_t reserved3[3]; |
272 | uint8_t control; |
273 | } __packed; |
274 | |
275 | |
276 | #define READ_CD_CAPACITY 0x25 /* slightly different from disk */ |
277 | struct scsipi_read_cd_capacity { |
278 | u_int8_t opcode; |
279 | u_int8_t byte2; |
280 | u_int8_t addr[4]; |
281 | u_int8_t unused[3]; |
282 | u_int8_t control; |
283 | } __packed; |
284 | |
285 | struct scsipi_read_cd_cap_data { |
286 | u_int8_t addr[4]; |
287 | u_int8_t length[4]; |
288 | } __packed; |
289 | |
290 | |
291 | /* mod pages common to scsi and atapi */ |
292 | struct cd_audio_page { |
293 | u_int8_t pg_code; |
294 | #define AUDIO_PAGE 0x0e |
295 | u_int8_t pg_length; |
296 | u_int8_t flags; |
297 | #define CD_PA_SOTC 0x02 |
298 | #define CD_PA_IMMED 0x04 |
299 | u_int8_t unused[2]; |
300 | u_int8_t format_lba; /* valid only for SCSI CDs */ |
301 | #define CD_PA_FORMAT_LBA 0x0F |
302 | #define CD_PA_APR_VALID 0x80 |
303 | u_int8_t lb_per_sec[2]; |
304 | struct port_control { |
305 | u_int8_t channels; |
306 | #define CHANNEL 0x0F |
307 | #define CHANNEL_0 1 |
308 | #define CHANNEL_1 2 |
309 | #define CHANNEL_2 4 |
310 | #define CHANNEL_3 8 |
311 | #define LEFT_CHANNEL CHANNEL_0 |
312 | #define RIGHT_CHANNEL CHANNEL_1 |
313 | #define MUTE_CHANNEL 0x0 |
314 | #define BOTH_CHANNEL LEFT_CHANNEL | RIGHT_CHANNEL |
315 | u_int8_t volume; |
316 | } port[4]; |
317 | #define LEFT_PORT 0 |
318 | #define RIGHT_PORT 1 |
319 | }; |
320 | |