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