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
54typedef 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
165struct 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
171struct 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
178struct 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
188struct mcd_volume {
189	u_char	v0l;
190	u_char	v0rs;
191	u_char	v0r;
192	u_char	v0ls;
193} __packed;
194
195struct mcd_holdtime {
196	u_char	units_of_ten_seconds;
197			/* If this is 0, the default (12) is used */
198} __packed;
199
200struct mcd_read1 {
201	bcd_t	start_msf[3];
202	u_char	nsec[3];
203} __packed;
204
205struct mcd_read2 {
206	bcd_t	start_msf[3];
207	bcd_t	end_msf[3];
208} __packed;
209
210struct 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