Annotation of sys/dev/isa/sbdspvar.h, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: sbdspvar.h,v 1.16 2002/03/14 03:16:05 millert Exp $ */
2: /* $NetBSD: sbdspvar.h,v 1.37 1998/08/10 00:20:39 mycroft Exp $ */
3:
4: /*
5: * Copyright (c) 1991-1993 Regents of the University of California.
6: * All rights reserved.
7: *
8: * Redistribution and use in source and binary forms, with or without
9: * modification, are permitted provided that the following conditions
10: * are met:
11: * 1. Redistributions of source code must retain the above copyright
12: * notice, this list of conditions and the following disclaimer.
13: * 2. Redistributions in binary form must reproduce the above copyright
14: * notice, this list of conditions and the following disclaimer in the
15: * documentation and/or other materials provided with the distribution.
16: * 3. All advertising materials mentioning features or use of this software
17: * must display the following acknowledgement:
18: * This product includes software developed by the Computer Systems
19: * Engineering Group at Lawrence Berkeley Laboratory.
20: * 4. Neither the name of the University nor of the Laboratory may be used
21: * to endorse or promote products derived from this software without
22: * specific prior written permission.
23: *
24: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
25: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
28: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
30: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34: * SUCH DAMAGE.
35: *
36: */
37:
38: #include "midi.h"
39: #if NMIDI > 0
40: #include <dev/ic/mpuvar.h>
41: #endif
42:
43: #include <sys/timeout.h>
44:
45: #define SB_MASTER_VOL 0
46: #define SB_MIDI_VOL 1
47: #define SB_CD_VOL 2
48: #define SB_VOICE_VOL 3
49: #define SB_OUTPUT_CLASS 4
50:
51: #define SB_MIC_VOL 5
52: #define SB_LINE_IN_VOL 6
53: #define SB_RECORD_SOURCE 7
54: #define SB_TREBLE 8
55: #define SB_BASS 9
56: #define SB_RECORD_CLASS 10
57: #define SB_INPUT_CLASS 11
58:
59: #define SB_PCSPEAKER 12
60: #define SB_INPUT_GAIN 13
61: #define SB_OUTPUT_GAIN 14
62: #define SB_AGC 15
63: #define SB_EQUALIZATION_CLASS 16
64:
65: #define SB_CD_IN_MUTE 17
66: #define SB_MIC_IN_MUTE 18
67: #define SB_LINE_IN_MUTE 19
68: #define SB_MIDI_IN_MUTE 20
69:
70: #define SB_CD_SWAP 21
71: #define SB_MIC_SWAP 22
72: #define SB_LINE_SWAP 23
73: #define SB_MIDI_SWAP 24
74:
75: #define SB_CD_OUT_MUTE 25
76: #define SB_MIC_OUT_MUTE 26
77: #define SB_LINE_OUT_MUTE 27
78:
79: #define SB_NDEVS 28
80:
81: #define SB_IS_IN_MUTE(x) ((x) < SB_CD_SWAP)
82:
83: /*
84: * Software state, per SoundBlaster card.
85: * The soundblaster has multiple functionality, which we must demultiplex.
86: * One approach is to have one major device number for the soundblaster card,
87: * and use different minor numbers to indicate which hardware function
88: * we want. This would make for one large driver. Instead our approach
89: * is to partition the design into a set of drivers that share an underlying
90: * piece of hardware. Most things are hard to share, for example, the audio
91: * and midi ports. For audio, we might want to mix two processes' signals,
92: * and for midi we might want to merge streams (this is hard due to
93: * running status). Moreover, we should be able to re-use the high-level
94: * modules with other kinds of hardware. In this module, we only handle the
95: * most basic communications with the sb card.
96: */
97: struct sbdsp_softc {
98: struct device sc_dev; /* base device */
99: struct isadev sc_id; /* ISA device */
100: isa_chipset_tag_t sc_ic;
101: bus_space_tag_t sc_iot; /* tag */
102: bus_space_handle_t sc_ioh; /* handle */
103: void *sc_ih; /* interrupt vectoring */
104: struct device *sc_isa;
105: struct timeout sc_tmo;
106:
107: int sc_iobase; /* I/O port base address */
108: int sc_irq; /* interrupt */
109: int sc_ist; /* interrupt share type */
110: int sc_drq8; /* DMA (8-bit) */
111: int sc_drq16; /* DMA (16-bit) */
112:
113: int sc_open; /* reference count of open calls */
114: #define SB_CLOSED 0
115: #define SB_OPEN_AUDIO 1
116: #define SB_OPEN_MIDI 2
117: int sc_openflags; /* flags used on open */
118: u_char sc_fullduplex; /* can do full duplex */
119:
120: u_char gain[SB_NDEVS][2]; /* kept in input levels */
121: #define SB_LEFT 0
122: #define SB_RIGHT 1
123: #define SB_LR 0
124:
125: u_int in_mask; /* input ports */
126: u_int in_port; /* XXX needed for MI interface */
127: u_int in_filter; /* one of SB_TREBLE_EQ, SB_BASS_EQ, 0 */
128:
129: u_int spkr_state; /* non-null is on */
130:
131: struct sbdsp_state {
132: u_int rate; /* Sample rate */
133: u_char tc; /* Time constant */
134: struct sbmode *modep;
135: u_char bmode;
136: int dmachan; /* DMA channel */
137: int blksize; /* Block size, preadjusted */
138: u_char run;
139: #define SB_NOTRUNNING 0 /* Not running, not initialized */
140: #define SB_RUNNING 3 /* non-looping mode */
141: #define SB_LOOPING 2 /* DMA&PCM running (looping mode) */
142: } sc_i, sc_o; /* Input and output state */
143:
144: u_long sc_interrupts; /* number of interrupts taken */
145:
146: int (*sc_intr8)(void *); /* dma completion intr handler */
147: void *sc_arg8; /* arg for sc_intr8() */
148: int (*sc_intr16)(void *); /* dma completion intr handler */
149: void *sc_arg16; /* arg for sc_intr16() */
150: void (*sc_intrp)(void *); /* PCM output intr handler */
151: void *sc_argp; /* arg for sc_intrp() */
152: void (*sc_intrr)(void *); /* PCM input intr handler */
153: void *sc_argr; /* arg for sc_intrr() */
154: void (*sc_intrm)(void *, int);/* midi input intr handler */
155: void *sc_argm; /* arg for sc_intrm() */
156:
157: u_int sc_mixer_model;
158: #define SBM_NONE 0
159: #define SBM_CT1335 1
160: #define SBM_CT1345 2
161: #define SBM_CT1XX5 3
162: #define SBM_CT1745 4
163: #define ISSBM1745(x) ((x)->sc_mixer_model >= SBM_CT1XX5)
164:
165: u_int sc_model; /* DSP model */
166: #define SB_UNK -1
167: #define SB_1 0 /* original SB */
168: #define SB_20 1 /* SB 2 */
169: #define SB_2x 2 /* SB 2, new version */
170: #define SB_PRO 3 /* SB Pro */
171: #define SB_JAZZ 4 /* Jazz 16 */
172: #define SB_16 5 /* SB 16 */
173: #define SB_32 6 /* SB AWE 32 */
174: #define SB_64 7 /* SB AWE 64 */
175:
176: #define SB_NAMES { "SB_1", "SB_2.0", "SB_2.x", "SB_Pro", "Jazz_16", "SB_16", "SB_AWE_32", "SB_AWE_64" }
177:
178: u_int sc_version; /* DSP version */
179: #define SBVER_MAJOR(v) (((v)>>8) & 0xff)
180: #define SBVER_MINOR(v) ((v)&0xff)
181:
182: #if NMIDI > 0
183: int sc_hasmpu;
184: struct mpu_softc sc_mpu_sc; /* MPU401 Uart state */
185: #endif
186: };
187:
188: #define ISSBPRO(sc) ((sc)->sc_model == SB_PRO || (sc)->sc_model == SB_JAZZ)
189: #define ISSBPROCLASS(sc) ((sc)->sc_model >= SB_PRO)
190: #define ISSB16CLASS(sc) ((sc)->sc_model >= SB_16)
191:
192: #ifdef _KERNEL
193: int sbdsp_open(void *, int);
194: void sbdsp_close(void *);
195:
196: int sbdsp_probe(struct sbdsp_softc *);
197: void sbdsp_attach(struct sbdsp_softc *);
198:
199: int sbdsp_set_in_gain(void *, u_int, u_char);
200: int sbdsp_set_in_gain_real(void *, u_int, u_char);
201: int sbdsp_get_in_gain(void *);
202: int sbdsp_set_out_gain(void *, u_int, u_char);
203: int sbdsp_set_out_gain_real(void *, u_int, u_char);
204: int sbdsp_get_out_gain(void *);
205: int sbdsp_set_monitor_gain(void *, u_int);
206: int sbdsp_get_monitor_gain(void *);
207: int sbdsp_query_encoding(void *, struct audio_encoding *);
208: int sbdsp_set_params(void *, int, int, struct audio_params *, struct audio_params *);
209: int sbdsp_round_blocksize(void *, int);
210: int sbdsp_get_avail_in_ports(void *);
211: int sbdsp_get_avail_out_ports(void *);
212: int sbdsp_speaker_ctl(void *, int);
213:
214: int sbdsp_commit(void *);
215: int sbdsp_trigger_output(void *, void *, void *, int, void (*)(void *),
216: void *, struct audio_params *);
217: int sbdsp_trigger_input(void *, void *, void *, int, void (*)(void *),
218: void *, struct audio_params *);
219:
220: int sbdsp_haltdma(void *);
221:
222: void sbdsp_compress(int, u_char *, int);
223: void sbdsp_expand(int, u_char *, int);
224:
225: int sbdsp_reset(struct sbdsp_softc *);
226: void sbdsp_spkron(struct sbdsp_softc *);
227: void sbdsp_spkroff(struct sbdsp_softc *);
228:
229: int sbdsp_wdsp(struct sbdsp_softc *, int v);
230: int sbdsp_rdsp(struct sbdsp_softc *);
231:
232: int sbdsp_intr(void *);
233:
234: int sbdsp_set_sr(struct sbdsp_softc *, u_long *, int);
235:
236: void sbdsp_mix_write(struct sbdsp_softc *, int, int);
237: int sbdsp_mix_read(struct sbdsp_softc *, int);
238:
239: int sbdsp_mixer_set_port(void *, mixer_ctrl_t *);
240: int sbdsp_mixer_get_port(void *, mixer_ctrl_t *);
241: int sbdsp_mixer_query_devinfo(void *, mixer_devinfo_t *);
242:
243: void *sb_malloc(void *, int, size_t, int, int);
244: void sb_free(void *, void *, int);
245: size_t sb_round(void *, int, size_t);
246: paddr_t sb_mappage(void *, void *, off_t, int);
247:
248: int sbdsp_get_props(void *);
249:
250:
251: int sbdsp_midi_open(void *, int,
252: void (*iintr)(void *, int),
253: void (*ointr)(void *), void *arg);
254: void sbdsp_midi_close(void *);
255: int sbdsp_midi_output(void *, int);
256: void sbdsp_midi_getinfo(void *, struct midi_info *);
257: #endif
CVSweb