xref: /netbsd/sys/dev/isa/mcdreg.h (revision 6550d01e)
1 /*	$NetBSD: mcdreg.h,v 1.9 2000/06/08 18:22:16 cgd Exp $	*/
2 
3 /*
4  * Copyright 1993 by Holger Veit (data part)
5  * Copyright 1993 by Brian Moore (audio part)
6  * All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  * 3. All advertising materials mentioning features or use of this software
17  *    must display the following acknowledgement:
18  *	This software was developed by Holger Veit and Brian Moore
19  *      for use with "386BSD" and similar operating systems.
20  *    "Similar operating systems" includes mainly non-profit oriented
21  *    systems for research and education, including but not restricted to
22  *    "NetBSD", "FreeBSD", "Mach" (by CMU).
23  * 4. Neither the name of the developer(s) nor the name "386BSD"
24  *    may be used to endorse or promote products derived from this
25  *    software without specific prior written permission.
26  *
27  * THIS SOFTWARE IS PROVIDED BY THE DEVELOPER(S) ``AS IS'' AND ANY
28  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
29  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
30  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE DEVELOPER(S) BE
31  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
32  * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
33  * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
34  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
35  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
36  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
37  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
38  *
39  * This file contains definitions for some cdrom control commands
40  * and status codes. This info was "inherited" from the DOS MTMCDE.SYS
41  * driver, and is thus not complete (and may even be wrong). Some day
42  * the manufacturer or anyone else might provide better documentation,
43  * so this file (and the driver) will then have a better quality.
44  */
45 
46 #if __GNUC__ >= 2
47 #pragma pack(1)
48 #endif
49 
50 typedef unsigned char	bcd_t;
51 #define	M_msf(msf)	msf[0]
52 #define	S_msf(msf)	msf[1]
53 #define	F_msf(msf)	msf[2]
54 
55 #define	MCD_COMMAND	0
56 #define	MCD_STATUS	0
57 #define	MCD_RDATA	0
58 #define	MCD_RESET	1
59 #define	MCD_XFER	1
60 #define	MCD_CTL2	2 /* XXX Is this right? */
61 #define	MCD_CONFIG	3
62 #define MCD_NPORT	4
63 
64 #define	MCD_MASK_DMA	0x07	/* bits 2-0 = DMA channel */
65 #define	MCD_MASK_IRQ	0x70	/* bits 6-4 = INT number */
66 				/* 001 = int 2,9 */
67 				/* 010 = int 3 */
68 				/* 011 = int 5 */
69 				/* 100 = int 10 */
70 				/* 101 = int 11 */
71 
72 /* Status bits */
73 #define	MCD_ST_DOOROPEN		0x80
74 #define	MCD_ST_DSKIN		0x40
75 #define	MCD_ST_DSKCHNG		0x20
76 #define	MCD_ST_SPINNING		0x10
77 #define	MCD_ST_AUDIODISK	0x08	/* audio disk is in */
78 #define	MCD_ST_READERR		0x04
79 #define	MCD_ST_AUDIOBSY		0x02	/* audio disk is playing */
80 #define	MCD_ST_CMDCHECK		0x01	/* command error */
81 
82 /* Xfer bits */
83 #define	MCD_XF_STATUSUNAVAIL	0x04
84 #define	MCD_XF_DATAUNAVAIL	0x02
85 
86 /* Modes */
87 #define	MCD_MD_TESTMODE		0x80	/* 0 = DATALENGTH is valid */
88 #define	MCD_MD_DATALENGTH	0x40	/* 1 = read ECC data also */
89 #define	MCD_MD_ECCMODE		0x20	/* 1 = disable secondary ECC */
90 #define	MCD_MD_SPINDOWN		0x08	/* 1 = spin down */
91 #define	MCD_MD_READTOC		0x04	/* 1 = read TOC on GETQCHN */
92 #define	MCD_MD_PLAYAUDIO	0x01	/* 1 = play audio through headphones */
93 
94 #define	MCD_MD_RAW		(MCD_MD_PLAYAUDIO|MCD_MD_ECCMODE|MCD_MD_DATALENGTH)
95 #define	MCD_MD_COOKED		(MCD_MD_PLAYAUDIO)
96 #define	MCD_MD_TOC		(MCD_MD_PLAYAUDIO|MCD_MD_READTOC)
97 #define	MCD_MD_SLEEP		(MCD_MD_PLAYAUDIO|MCD_MD_SPINDOWN)
98 
99 #define	MCD_BLKSIZE_RAW		sizeof(struct mcd_rawsector)
100 #define	MCD_BLKSIZE_COOKED	2048
101 
102 /* Lock states */
103 #define	MCD_LK_UNLOCK		0x00
104 #define	MCD_LK_LOCK		0x01
105 #define	MCD_LK_TEST		0x02
106 
107 /* Config commands */
108 #define	MCD_CF_IRQENABLE	0x10
109 #define	MCD_CF_DMATIMEOUT	0x08
110 #define	MCD_CF_READUPC		0x04
111 #define	MCD_CF_DMAENABLE	0x02
112 #define	MCD_CF_BLOCKSIZE	0x01
113 
114 /* UPC subcommands */
115 #define	MCD_UPC_DISABLE		0x00
116 #define	MCD_UPC_ENABLE		0x01
117 
118 /* commands known by the controller */
119 #define	MCD_CMDRESET		0x00
120 #define	MCD_CMDGETVOLINFO	0x10	/* gets mcd_volinfo */
121 #define	MCD_CMDGETDISKINFO	0x11	/* gets mcd_disk */
122 #define	MCD_CMDGETQCHN		0x20	/* gets mcd_qchninfo */
123 #define	MCD_CMDGETSENSE		0x30	/* gets sense info */
124 #define	MCD_CMDGETSTAT		0x40	/* gets a byte of status */
125 #define	MCD_CMDSETMODE		0x50	/* set transmission mode, needs byte */
126 #define	MCD_CMDSTOPAUDIO	0x70
127 #define	MCD_CMDSTOPAUDIOTIME	0x80
128 #define	MCD_CMDGETVOLUME	0x8E	/* gets mcd_volume */
129 #define	MCD_CMDCONFIGDRIVE	0x90
130 #define	MCD_CMDSETDRIVEMODE	0xa0	/* set drive mode */
131 #define	MCD_CMDSETVOLUME	0xae	/* sets mcd_volume */
132 #define	MCD_CMDREAD1		0xb0	/* read n sectors */
133 #define	MCD_CMDREADSINGLESPEED	0xc0	/* read (single speed) */
134 #define	MCD_CMDREADDOUBLESPEED	0xc1	/* read (double speed) */
135 #define	MCD_CMDGETDRIVEMODE	0xc2	/* get drive mode */
136 #define	MCD_CMDREAD3		0xc3	/* ? */
137 #define	MCD_CMDSETINTERLEAVE	0xc8	/* set interleave for read */
138 #define	MCD_CMDCONTINFO		0xdc	/* get controller info */
139 #define	MCD_CMDSTOP		0xf0	/* stop everything */
140 #define	MCD_CMDEJECTDISK	0xf6
141 #define	MCD_CMDCLOSETRAY	0xf8
142 #define	MCD_CMDSETLOCK		0xfe	/* needs byte */
143 
144 union mcd_qchninfo {
145 	struct {
146 		u_char	control:4;
147 		u_char	addr_type:4;
148 		u_char	trk_no;
149 		u_char	idx_no;
150 		bcd_t	track_size[3];
151 		u_char	:8;
152 		bcd_t	absolute_pos[3];
153 	} toc;
154 	struct {
155 		u_char	control:4;
156 		u_char	addr_type:4;
157 		u_char	trk_no;
158 		u_char	idx_no;
159 		bcd_t	relative_pos[3];
160 		u_char	:8;
161 		bcd_t	absolute_pos[3];
162 	} current;
163 	struct {
164 		u_char	control:4;
165 		u_char	addr_type:4;
166 		u_char	upccode[7];
167 		u_char	junk[2];
168 	} upc;
169 };
170 
171 struct mcd_volinfo {
172 	bcd_t	trk_low;
173 	bcd_t	trk_high;
174 	bcd_t	vol_msf[3];
175 	bcd_t	trk1_msf[3];
176 };
177 
178 struct mcd_result {
179 	u_char	length;
180 	union {
181 		struct {
182 			u_char	data[1];
183 		} raw;
184 		struct {
185 			u_char	code;
186 			u_char	version;
187 		} continfo;
188 		union mcd_qchninfo qchninfo;
189 		struct mcd_volinfo volinfo;
190 	} data;
191 };
192 
193 struct mcd_command {
194 	u_char	opcode;
195 	u_char	length;
196 	union {
197 		struct {
198 			u_char	data[1];
199 		} raw;
200 		struct {
201 			bcd_t	start_msf[3];
202 			bcd_t	reserved[3];
203 		} seek;
204 		struct {
205 			bcd_t	start_msf[3];
206 			bcd_t	length[3];
207 		} read;
208 		struct {
209 			bcd_t	start_msf[3];
210 			bcd_t	end_msf[3];
211 		} play;
212 		struct {
213 			u_char	mode;
214 		} datamode;
215 		struct {
216 			u_char	time;
217 		} hold;
218 		struct {
219 			u_char	mode;
220 		} drivemode;
221 		struct {
222 			u_char	mode;
223 		} lockmode;
224 		struct {
225 			u_char	subcommand;
226 			u_char	data1, data2;
227 		} config;
228 	} data;
229 };
230 
231 struct mcd_mbox {
232 	struct mcd_command cmd;
233 	struct mcd_result res;
234 };
235 
236 struct mcd_volume {
237 	u_char	v0l;
238 	u_char	v0rs;
239 	u_char	v0r;
240 	u_char	v0ls;
241 };
242 
243 struct mcd_rawsector {
244 	u_char	sync1[12];
245 	u_char	header[4];
246 	u_char	subheader1[4];
247 	u_char	subheader2[4];
248 	u_char	data[MCD_BLKSIZE_COOKED];
249 	u_char	ecc_bits[280];
250 };
251 
252 #if __GNUC__ >= 2
253 #pragma pack()
254 #endif
255