]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - sys/dev/mcd/mcdreg.h
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / sys / dev / 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$
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 */