xref: /openbsd/sys/scsi/cd.h (revision f82a5783)
1 /*	$OpenBSD: cd.h,v 1.28 2019/11/29 14:06:21 krw Exp $	*/
2 /*	$NetBSD: scsi_cd.h,v 1.6 1996/03/19 03:06:39 mycroft Exp $	*/
3 
4 /*
5  * Written by Julian Elischer (julian@tfs.com)
6  * for TRW Financial Systems.
7  *
8  * TRW Financial Systems, in accordance with their agreement with Carnegie
9  * Mellon University, makes this software available to CMU to distribute
10  * or use in any manner that they see fit as long as this message is kept with
11  * the software. For this reason TFS also grants any other persons or
12  * organisations permission to use or modify this software.
13  *
14  * TFS supplies this software to be publicly redistributed
15  * on the understanding that TFS is not responsible for the correct
16  * functioning of this software in any circumstances.
17  *
18  * Ported to run under 386BSD by Julian Elischer (julian@tfs.com) Sept 1992
19  */
20 #ifndef	_SCSI_CD_H
21 #define _SCSI_CD_H
22 
23 /*
24  *	Define two bits always in the same place in byte 2 (flag byte)
25  */
26 #define	CD_RELADDR	0x01
27 #define	CD_MSF		0x02
28 
29 /*
30  * SCSI command format
31  */
32 
33 struct scsi_blank {
34 	u_int8_t opcode;
35 	u_int8_t byte2;
36 #define BLANK_DISC	0
37 #define BLANK_MINIMAL	1
38 	u_int8_t addr[4];
39 	u_int8_t unused[5];
40 	u_int8_t control;
41 };
42 
43 struct scsi_close_track {
44 	u_int8_t opcode;
45 	u_int8_t flags;
46 #define CT_IMMED	1
47 	u_int8_t closefunc;
48 #define CT_CLOSE_TRACK	1
49 #define CT_CLOSE_SESS	2
50 #define CT_CLOSE_BORDER 3
51 	u_int8_t unused;
52 	u_int8_t track[2];
53 	u_int8_t unused1[3];
54 	u_int8_t control;
55 };
56 
57 struct scsi_pause {
58 	u_int8_t opcode;
59 	u_int8_t byte2;
60 	u_int8_t unused[6];
61 	u_int8_t resume;
62 	u_int8_t control;
63 };
64 #define	PA_PAUSE	1
65 #define PA_RESUME	0
66 
67 struct scsi_play_msf {
68 	u_int8_t opcode;
69 	u_int8_t byte2;
70 	u_int8_t unused;
71 	u_int8_t start_m;
72 	u_int8_t start_s;
73 	u_int8_t start_f;
74 	u_int8_t end_m;
75 	u_int8_t end_s;
76 	u_int8_t end_f;
77 	u_int8_t control;
78 };
79 
80 struct scsi_play_track {
81 	u_int8_t opcode;
82 	u_int8_t byte2;
83 	u_int8_t unused[2];
84 	u_int8_t start_track;
85 	u_int8_t start_index;
86 	u_int8_t unused1;
87 	u_int8_t end_track;
88 	u_int8_t end_index;
89 	u_int8_t control;
90 };
91 
92 struct scsi_play {
93 	u_int8_t opcode;
94 	u_int8_t byte2;
95 	u_int8_t blk_addr[4];
96 	u_int8_t unused;
97 	u_int8_t xfer_len[2];
98 	u_int8_t control;
99 };
100 
101 struct scsi_play_big {
102 	u_int8_t opcode;
103 	u_int8_t byte2;	/* same as above */
104 	u_int8_t blk_addr[4];
105 	u_int8_t xfer_len[4];
106 	u_int8_t unused;
107 	u_int8_t control;
108 };
109 
110 struct scsi_play_rel_big {
111 	u_int8_t opcode;
112 	u_int8_t byte2;	/* same as above */
113 	u_int8_t blk_addr[4];
114 	u_int8_t xfer_len[4];
115 	u_int8_t track;
116 	u_int8_t control;
117 };
118 
119 struct scsi_read_header {
120 	u_int8_t opcode;
121 	u_int8_t byte2;
122 	u_int8_t blk_addr[4];
123 	u_int8_t unused;
124 	u_int8_t data_len[2];
125 	u_int8_t control;
126 };
127 
128 struct scsi_read_subchannel {
129 	u_int8_t opcode;
130 	u_int8_t byte2;
131 	u_int8_t byte3;
132 #define	SRS_SUBQ	0x40
133 	u_int8_t subchan_format;
134 	u_int8_t unused[2];
135 	u_int8_t track;
136 	u_int8_t data_len[2];
137 	u_int8_t control;
138 };
139 
140 struct scsi_read_toc {
141 	u_int8_t opcode;
142 	u_int8_t byte2;
143 	u_int8_t unused[4];
144 	u_int8_t from_track;
145 	u_int8_t data_len[2];
146 	u_int8_t control;
147 };
148 
149 struct scsi_read_track_info {
150 	u_int8_t opcode;
151 	u_int8_t addrtype;
152 #define RTI_LBA		0
153 #define RTI_TRACK	1
154 #define RTI_BORDER	2
155 	u_int8_t addr[4];
156 	u_int8_t unused;
157 	u_int8_t data_len[2];
158 	u_int8_t control;
159 };
160 
161 struct scsi_load_unload {
162 	u_int8_t opcode;
163 	u_int8_t reserved;
164 #define	IMMED	0x1
165 	u_int8_t reserved2[2];
166 	u_int8_t options;
167 #define START	0x1
168 #define	LOUNLO	0x2
169 	u_int8_t reserved4[3];
170 	u_int8_t slot;
171 	u_int8_t reserved5[2];
172 	u_int8_t control;
173 };
174 
175 struct scsi_set_cd_speed {
176 	u_int8_t opcode;
177 	u_int8_t rotation;
178 #define ROTATE_CLV 0
179 #define ROTATE_CAV 1
180 	u_int8_t read[2];
181 	u_int8_t write[2];
182 	u_int8_t reserved[5];
183 	u_int8_t control;
184 };
185 
186 /*
187  * Opcodes
188  */
189 
190 #define READ_SUBCHANNEL		0x42	/* cdrom read Subchannel */
191 #define READ_TOC		0x43	/* cdrom read TOC */
192 #define READ_HEADER		0x44	/* cdrom read header */
193 #define PLAY			0x45	/* cdrom play 'play audio' mode */
194 #define PLAY_MSF		0x47	/* cdrom play Min,Sec,Frames mode */
195 #define PLAY_TRACK		0x48	/* cdrom play track/index mode */
196 #define PLAY_TRACK_REL		0x49	/* cdrom play track/index mode */
197 #define PAUSE			0x4b	/* cdrom pause in 'play audio' mode */
198 #define READ_TRACK_INFO		0x52	/* read track/rzone info */
199 #define CLOSE_TRACK		0x5b	/* close track/rzone/session/border */
200 #define BLANK			0xa1	/* cdrom blank */
201 #define PLAY_BIG		0xa5	/* cdrom pause in 'play audio' mode */
202 #define LOAD_UNLOAD		0xa6	/* cdrom load/unload media */
203 #define PLAY_TRACK_REL_BIG	0xa9	/* cdrom play track/index mode */
204 #define SET_CD_SPEED		0xbb	/* set cdrom read/write speed */
205 
206 /*
207  * Mode pages
208  */
209 
210 #define ERR_RECOVERY_PAGE	0x01
211 #define WRITE_PARAM_PAGE	0x05
212 #define AUDIO_PAGE		0x0e
213 #define CDVD_CAPABILITIES_PAGE	0x2a
214 
215 struct cd_audio_page {
216 	u_int8_t page_code;
217 #define	CD_PAGE_CODE	0x3F
218 #define	CD_PAGE_PS	0x80
219 	u_int8_t param_len;
220 	u_int8_t flags;
221 #define		CD_PA_SOTC	0x02
222 #define		CD_PA_IMMED	0x04
223 	u_int8_t unused[2];
224 	u_int8_t format_lba;
225 #define		CD_PA_FORMAT_LBA	0x0F
226 #define		CD_PA_APR_VALID	0x80
227 	u_int8_t lb_per_sec[2];
228 	struct	port_control {
229 		u_int8_t channels;
230 #define	CHANNEL 0x0F
231 #define	CHANNEL_0 1
232 #define	CHANNEL_1 2
233 #define	CHANNEL_2 4
234 #define	CHANNEL_3 8
235 #define	LEFT_CHANNEL	CHANNEL_0
236 #define	RIGHT_CHANNEL	CHANNEL_1
237 #define MUTE_CHANNEL    0x0
238 #define BOTH_CHANNEL    LEFT_CHANNEL | RIGHT_CHANNEL
239 		u_int8_t volume;
240 	} port[4];
241 #define	LEFT_PORT	0
242 #define	RIGHT_PORT	1
243 };
244 
245 /*
246  * There are 2352 bytes in a CD digital audio frame.  One frame is 1/75 of a
247  * second, at 44.1kHz sample rate, 16 bits/sample, 2 channels.
248  *
249  * The frame data have the two channels interleaved, with the left
250  * channel first.  Samples are little endian 16-bit signed values.
251  */
252 #define CD_DA_BLKSIZ		2352	/* # bytes in CD-DA frame */
253 #define CD_NORMAL_DENSITY_CODE	0x00	/* from Toshiba CD-ROM specs */
254 #define CD_DA_DENSITY_CODE	0x82	/* from Toshiba CD-ROM specs */
255 
256 struct scsi_read_dvd_structure {
257 	u_int8_t	opcode;		/* GPCMD_READ_DVD_STRUCTURE */
258 	u_int8_t	reserved;
259 	u_int8_t	address[4];
260 	u_int8_t	layer;
261 	u_int8_t	format;
262 	u_int8_t	length[2];
263 	u_int8_t	agid;		/* bottom 6 bits reserved */
264 	u_int8_t	control;
265 };
266 
267 struct scsi_read_dvd_structure_data {
268 	u_int8_t	len[2];		/* Big-endian length of valid data. */
269 	u_int8_t	reserved[2];
270 	u_int8_t	data[2048];
271 };
272 
273 #endif /* _SCSI_CD_H */
274