Add the DragonFly cvs id and perform general cleanups on cvs/rcs/sccs ids. Most
[dragonfly.git] / sys / dev / disk / mcd / mcdreg.h
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: src/sys/i386/isa/mcdreg.h,v 1.14 1999/08/28 00:44:57 peter Exp $
45  * $DragonFly: src/sys/dev/disk/mcd/Attic/mcdreg.h,v 1.2 2003/06/17 04:28:37 dillon Exp $
46  */
47
48 #ifndef MCD_H
49 #define MCD_H
50
51 #ifdef __GNUC__
52 #if __GNUC__ >= 2
53 #pragma pack(1)
54 #endif
55 #endif
56
57 typedef unsigned char   bcd_t;
58 #define M_msf(msf)      msf[0]
59 #define S_msf(msf)      msf[1]
60 #define F_msf(msf)      msf[2]
61
62 /* io lines used */
63 #define MCD_IO_BASE     0x300
64
65 #define mcd_command     0
66 #define mcd_status      0
67 #define mcd_rdata       0
68
69 #define mcd_reset       1
70 #define mcd_ctl2        2 /* XXX Is this right? */
71 #define mcd_config      3
72
73 #define MCD_MASK_DMA    0x07    /* bits 2-0 = DMA channel */
74 #define MCD_MASK_IRQ    0x70    /* bits 6-4 = INT number */
75                                 /* 001 = int 2,9 */
76                                 /* 010 = int 3 */
77                                 /* 011 = int 5 */
78                                 /* 100 = int 10 */
79                                 /* 101 = int 11 */
80 /* flags */
81 #define MFL_DATA_NOT_AVAIL      0x02
82 #define MFL_STATUS_NOT_AVAIL    0x04
83
84 /* New Commands */
85 #define M_RESET         0x00
86 #define M_PICKLE        0x04
87
88 /* ports */
89 #define MCD_DATA        0
90 #define MCD_FLAGS       1
91 #define MCD_CTRL        2
92 #define CHANNEL         3       /* XXX ??? */
93
94 /* Status bits */
95 #define MCD_ST_DOOROPEN         0x80
96 #define MCD_ST_DSKIN            0x40
97 #define MCD_ST_DSKCHNG          0x20
98 #define MCD_ST_SPINNING         0x10
99 #define MCD_ST_AUDIODISK        0x08    /* Audio Disk is in */
100 #define MCD_ST_BUSY             0x04
101 #define MCD_ST_AUDIOBSY         0x02    /* Audio Disk is Playing */
102 #define MCD_ST_CMDCHECK         0x01    /* Command error */
103
104 /* commands known by the controller */
105 #define MCD_CMDRESET            0x00
106 #define MCD_CMDGETVOLINFO       0x10    /* gets mcd_volinfo */
107 #define MCD_CMDGETDISKINFO      0x11    /* gets mcd_disk information */
108 #define MCD_CMDGETQCHN          0x20    /* gets mcd_qchninfo */
109 #define MCD_CMDGETSENSE         0x30    /* gets sense info */
110 #define MCD_CMDGETSTAT          0x40    /* gets a byte of status */
111
112 #define MCD_CMDSETMODE          0x50    /* set transmission mode, needs byte */
113
114 #define MCD_MDBIT_TESTMODE      0x80    /* 0 = DATALENGTH setting is valid */
115 #define MCD_MDBIT_DATALENGTH    0x40    /* 0 = Read User Data Only */
116                                         /* 1 = Read Raw sectors (2352 bytes) */
117
118 #define MCDBLK  2048                            /* for cooked mode */
119 #define MCDRBLK sizeof(struct mcd_rawsector)    /* for raw mode */
120
121 #define MCD_MDBIT_ECCMODE       0x20    /* 0 = Use secondary correction */
122                                         /* 1 = Don't use secondary ECC */
123 #define MCD_MDBIT_SPINDOWN      0x08    /* 0 = Spin Up, 1 = Spin Down */
124 #define MCD_MDBIT_GET_TOC       0x04    /* 0 = Get UPC on next GETQCHAN */
125                                         /* 1 = Get TOC on GETQCHAN */
126 #define MCD_MDBIT_MUTEDATA      0x01    /* 1 = Don't play back Data as audio */
127
128 #define MCD_MD_RAW              (MCD_MDBIT_DATALENGTH|MCD_MDBIT_ECCMODE|MCD_MDBIT_MUTEDATA)
129 #define MCD_MD_COOKED           (MCD_MDBIT_MUTEDATA)
130 #define MCD_MD_TOC              (MCD_MDBIT_GET_TOC|MCD_MDBIT_MUTEDATA)
131
132 #define MCD_CMDSTOPAUDIO        0x70
133 #define MCD_CMDSTOPAUDIOTIME    0x80
134 #define MCD_CMDGETVOLUME        0x8E    /* gets mcd_volume */
135 #define MCD_CMDSETDRIVEMODE     0xA0    /* Set drive mode */
136 #define MCD_READUPC             0xA2    /* Get UPC info */
137 #define MCD_CMDSETVOLUME        0xAE    /* sets mcd_volume */
138 #define MCD_CMDREAD1            0xB0    /* read n sectors */
139 #define MCD_CMDSINGLESPEEDREAD  0xC0    /* read from-to */
140 #define MCD_CMDSTARTAUDIOMSF    0xC1    /* read audio data */
141 #define MCD_CMDDOUBLESPEEDREAD  0xC1    /* Read lots of data from the drive */
142 #define MCD_CMDGETDRIVEMODE     0xC2    /* Get the drive mode */
143 #define MCD_CMDREAD             0xC3    /* Read data from the drive */
144 #define MCD_CMDSETINTERLEAVE    0xC8    /* Adjust the interleave */
145 #define MCD_CMDCONTINFO         0xDC    /* Get controller info */
146 #define MCD_CMDSTOP             0xF0    /* Stop everything */
147 #define MCD_CMDEJECTDISK        0xF6
148 #define MCD_CMDCLOSETRAY        0xF8
149
150 #define MCD_CMDLOCKDRV          0xFE    /* needs byte */
151 #define MCD_LK_UNLOCK   0x00
152 #define MCD_LK_LOCK     0x01
153 #define MCD_LK_TEST     0x02
154
155 /* DMA Enable Stuff */
156 #define MCD_DMA_IRQFLAGS        0x10    /* Set data0 for IRQ click */
157
158 #define MCD_DMA_PREIRQ          0x01    /* All of these are for */
159 #define MCD_DMA_POSTIRQ         0x02    /* MCD_DMA_IRQFLAG...   */
160 #define MCD_DMA_ERRIRQ          0x04    /*                      */
161
162 #define MCD_DMA_TIMEOUT         0x08    /* Set data0 for DMA timeout */
163 #define MCD_DMA_UPCFLAG         0x04    /* 1 = Next command will be READUPC */
164
165 #define MCD_DMA_DMAMODE         0x02    /* 1 = Data uses DMA */
166 #define MCD_DMA_TRANSFERLENGTH  0x01    /* data0 = MSB, data1 = LSB of block length */
167
168 struct mcd_dma_mode {
169         u_char  dma_mode;
170         u_char  data0;          /* If dma_mode & 0x10: Use IRQ settings */
171         u_char  data1;          /* Used if dma_mode & 0x01 */
172 };
173
174 struct mcd_volinfo {
175         bcd_t   trk_low;
176         bcd_t   trk_high;
177         bcd_t   vol_msf[3];
178         bcd_t   trk1_msf[3];
179 };
180
181 struct mcd_qchninfo {
182         u_char  addr_type:4;
183         u_char  control:4;
184         u_char  trk_no;
185         u_char  idx_no;
186         bcd_t   trk_size_msf[3];
187         u_char  :8;
188         bcd_t   hd_pos_msf[3];
189 };
190
191 struct mcd_volume {
192         u_char  v0l;
193         u_char  v0rs;
194         u_char  v0r;
195         u_char  v0ls;
196 };
197
198 struct mcd_holdtime {
199         u_char  units_of_ten_seconds;
200                         /* If this is 0, the default (12) is used */
201 };
202
203 struct mcd_read1 {
204         bcd_t   start_msf[3];
205         u_char  nsec[3];
206 };
207
208 struct mcd_read2 {
209         bcd_t   start_msf[3];
210         bcd_t   end_msf[3];
211 };
212
213 struct mcd_rawsector {
214         u_char sync1[12];
215         u_char header[4];
216         u_char subheader1[4];
217         u_char subheader2[4];
218         u_char data[MCDBLK];
219         u_char ecc_bits[280];
220 };
221
222 #ifdef __GNUC__
223 #if __GNUC__ >= 2
224 #pragma pack(4)
225 #endif
226 #endif
227 #endif /* MCD_H */