xref: /NextBSD/sys/dev/mcd/mcdreg.h (revision eb1a5f8de9f7ea602c373a710f531abbf81141c4)
1 /*-
2  * Copyright 1993 by Holger Veit (data part)
3  * Copyright 1993 by Brian Moore (audio part)
4  * Changes Copyright 1993 by Gary Clark II
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  * 3. All advertising materials mentioning features or use of this software
16  *    must display the following acknowledgement:
17  *	This software was developed by Holger Veit and Brian Moore
18  *	for use with "386BSD" and similar operating systems.
19  *    "Similar operating systems" includes mainly non-profit oriented
20  *    systems for research and education, including but not restricted to
21  *    "NetBSD", "FreeBSD", "Mach" (by CMU).
22  * 4. Neither the name of the developer(s) nor the name "386BSD"
23  *    may be used to endorse or promote products derived from this
24  *    software without specific prior written permission.
25  *
26  * THIS SOFTWARE IS PROVIDED BY THE DEVELOPER(S) ``AS IS'' AND ANY
27  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE DEVELOPER(S) BE
30  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
31  * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
32  * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
33  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
34  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
35  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
36  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37  *
38  * This file contains definitions for some cdrom control commands
39  * and status codes. This info was "inherited" from the DOS MTMCDE.SYS
40  * driver, and is thus not complete (and may even be wrong). Some day
41  * the manufacturer or anyone else might provide better documentation,
42  * so this file (and the driver) will then have a better quality.
43  *
44  * $FreeBSD$
45  */
46 
47 #ifndef MCD_H
48 #define	MCD_H
49 
50 /* toc */
51 #define MCD_MAXTOCS	104	/* from the Linux driver */
52 #define MCD_LASTPLUS1	170	/* special toc entry */
53 
54 typedef unsigned char	bcd_t;
55 #define	M_msf(msf)	msf[0]
56 #define	S_msf(msf)	msf[1]
57 #define	F_msf(msf)	msf[2]
58 
59 /* io lines used */
60 #define	MCD_IO_BASE	0x300
61 
62 #define	MCD_REG_COMMAND	0
63 #define	MCD_REG_STATUS	0
64 #define	MCD_REG_RDATA	0
65 
66 #define	MCD_REG_RESET	1
67 #define	MCD_REG_CTL2	2	/* XXX Is this right? */
68 #define	MCD_REG_CONFIG	3
69 
70 #define	MCD_MASK_DMA	0x07	/* bits 2-0 = DMA channel */
71 #define	MCD_MASK_IRQ	0x70	/* bits 6-4 = INT number */
72 				/* 001 = int 2,9 */
73 				/* 010 = int 3 */
74 				/* 011 = int 5 */
75 				/* 100 = int 10 */
76 				/* 101 = int 11 */
77 /* flags */
78 #define MFL_DATA_NOT_AVAIL      0x02
79 #define MFL_STATUS_NOT_AVAIL    0x04
80 
81 /* New Commands */
82 #define M_RESET		0x00
83 #define M_PICKLE	0x04
84 
85 /* ports */
86 #define	MCD_DATA	0
87 #define	MCD_FLAGS	1
88 #define	MCD_CTRL	2
89 #define	CHANNEL		3	/* XXX ??? */
90 
91 /* Status bits */
92 #define	MCD_ST_DOOROPEN		0x80
93 #define	MCD_ST_DSKIN		0x40
94 #define	MCD_ST_DSKCHNG		0x20
95 #define	MCD_ST_SPINNING		0x10
96 #define	MCD_ST_AUDIODISK	0x08	/* Audio Disk is in */
97 #define	MCD_ST_BUSY		0x04
98 #define	MCD_ST_AUDIOBSY		0x02	/* Audio Disk is Playing */
99 #define	MCD_ST_CMDCHECK		0x01	/* Command error */
100 
101 /* commands known by the controller */
102 #define	MCD_CMDRESET		0x00
103 #define	MCD_CMDGETVOLINFO	0x10	/* gets mcd_volinfo */
104 #define	MCD_CMDGETDISKINFO	0x11	/* gets	mcd_disk information */
105 #define	MCD_CMDGETQCHN		0x20	/* gets mcd_qchninfo */
106 #define	MCD_CMDGETSENSE		0x30	/* gets	sense info */
107 #define	MCD_CMDGETSTAT		0x40	/* gets a byte of status */
108 
109 #define	MCD_CMDSETMODE		0x50	/* set transmission mode, needs byte */
110 
111 #define	MCD_MDBIT_TESTMODE	0x80	/* 0 = DATALENGTH setting is valid */
112 #define	MCD_MDBIT_DATALENGTH	0x40	/* 0 = Read User Data Only */
113 					/* 1 = Read Raw	sectors	(2352 bytes) */
114 
115 #define	MCDBLK	2048				/* for cooked mode */
116 #define	MCDRBLK	sizeof(struct mcd_rawsector)	/* for raw mode	*/
117 
118 #define	MCD_MDBIT_ECCMODE	0x20	/* 0 = Use secondary correction	*/
119 					/* 1 = Don't use secondary ECC */
120 #define	MCD_MDBIT_SPINDOWN	0x08	/* 0 = Spin Up,	1 = Spin Down */
121 #define	MCD_MDBIT_GET_TOC	0x04	/* 0 = Get UPC on next GETQCHAN	*/
122 					/* 1 = Get TOC on GETQCHAN */
123 #define	MCD_MDBIT_MUTEDATA	0x01	/* 1 = Don't play back Data as audio */
124 
125 #define	MCD_MD_RAW		(MCD_MDBIT_DATALENGTH|MCD_MDBIT_ECCMODE|MCD_MDBIT_MUTEDATA)
126 #define	MCD_MD_COOKED		(MCD_MDBIT_MUTEDATA)
127 #define	MCD_MD_TOC		(MCD_MDBIT_GET_TOC|MCD_MDBIT_MUTEDATA)
128 
129 #define	MCD_CMDSTOPAUDIO	0x70
130 #define	MCD_CMDSTOPAUDIOTIME	0x80
131 #define	MCD_CMDGETVOLUME	0x8E	/* gets mcd_volume */
132 #define	MCD_CMDSETDRIVEMODE	0xA0	/* Set drive mode */
133 #define	MCD_READUPC		0xA2	/* Get UPC info	*/
134 #define	MCD_CMDSETVOLUME	0xAE	/* sets mcd_volume */
135 #define	MCD_CMDREAD1		0xB0	/* read n sectors */
136 #define	MCD_CMDSINGLESPEEDREAD	0xC0	/* read	from-to	*/
137 #define	MCD_CMDSTARTAUDIOMSF	0xC1	/* read	audio data */
138 #define	MCD_CMDDOUBLESPEEDREAD	0xC1	/* Read	lots of	data from the drive */
139 #define	MCD_CMDGETDRIVEMODE	0xC2	/* Get the drive mode */
140 #define	MCD_CMDREAD		0xC3	/* Read	data from the drive */
141 #define	MCD_CMDSETINTERLEAVE	0xC8	/* Adjust the interleave */
142 #define	MCD_CMDCONTINFO		0xDC	/* Get controller info */
143 #define	MCD_CMDSTOP		0xF0	/* Stop	everything */
144 #define	MCD_CMDEJECTDISK	0xF6
145 #define	MCD_CMDCLOSETRAY	0xF8
146 
147 #define	MCD_CMDLOCKDRV		0xFE	/* needs byte */
148 #define	MCD_LK_UNLOCK	0x00
149 #define	MCD_LK_LOCK	0x01
150 #define	MCD_LK_TEST	0x02
151 
152 /* DMA Enable Stuff */
153 #define	MCD_DMA_IRQFLAGS	0x10	/* Set data0 for IRQ click */
154 
155 #define	MCD_DMA_PREIRQ		0x01	/* All of these	are for	*/
156 #define	MCD_DMA_POSTIRQ		0x02	/* MCD_DMA_IRQFLAG...	*/
157 #define	MCD_DMA_ERRIRQ		0x04	/*			*/
158 
159 #define	MCD_DMA_TIMEOUT		0x08	/* Set data0 for DMA timeout */
160 #define	MCD_DMA_UPCFLAG		0x04	/* 1 = Next command will be READUPC */
161 
162 #define	MCD_DMA_DMAMODE		0x02	/* 1 = Data uses DMA */
163 #define	MCD_DMA_TRANSFERLENGTH	0x01	/* data0 = MSB,	data1 =	LSB of block length */
164 
165 struct mcd_dma_mode {
166 	u_char	dma_mode;
167 	u_char	data0;		/* If dma_mode & 0x10: Use IRQ settings	*/
168 	u_char	data1;		/* Used	if dma_mode & 0x01 */
169 } __packed;
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 } __packed;
177 
178 struct mcd_qchninfo {
179 	u_char  addr_type:4;
180 	u_char  control:4;
181 	u_char	trk_no;
182 	u_char	idx_no;
183 	bcd_t	trk_size_msf[3];
184 	u_char	:8;
185 	bcd_t	hd_pos_msf[3];
186 } __packed;
187 
188 struct mcd_volume {
189 	u_char	v0l;
190 	u_char	v0rs;
191 	u_char	v0r;
192 	u_char	v0ls;
193 } __packed;
194 
195 struct mcd_holdtime {
196 	u_char	units_of_ten_seconds;
197 			/* If this is 0, the default (12) is used */
198 } __packed;
199 
200 struct mcd_read1 {
201 	bcd_t	start_msf[3];
202 	u_char	nsec[3];
203 } __packed;
204 
205 struct mcd_read2 {
206 	bcd_t	start_msf[3];
207 	bcd_t	end_msf[3];
208 } __packed;
209 
210 struct mcd_rawsector {
211 	u_char sync1[12];
212 	u_char header[4];
213 	u_char subheader1[4];
214 	u_char subheader2[4];
215 	u_char data[MCDBLK];
216 	u_char ecc_bits[280];
217 } __packed;
218 
219 #endif /* MCD_H */
220