summaryrefslogtreecommitdiffstats
path: root/sys/i386/isa/sound/gus_card.c
diff options
context:
space:
mode:
authorpeter <peter@FreeBSD.org>1999-01-01 08:18:13 +0000
committerpeter <peter@FreeBSD.org>1999-01-01 08:18:13 +0000
commitd713c6aca4942e88e9afb66a012c176a3b3c93dd (patch)
tree145a2f9aaed47d75ef5882d97d90e8835c70db2c /sys/i386/isa/sound/gus_card.c
parentcfef427a396353878f1fdad225686030324bda8e (diff)
downloadFreeBSD-src-d713c6aca4942e88e9afb66a012c176a3b3c93dd.zip
FreeBSD-src-d713c6aca4942e88e9afb66a012c176a3b3c93dd.tar.gz
Part 2 of pcvt/voxware revival. I hope I have not clobbered any other
deltas, but it is possible since I had a few merge conflicts over the last few days while this has been sitting ready to go. (Part 1 was committed to the config files, but cvs aborted grrr..) Approved by: core
Diffstat (limited to 'sys/i386/isa/sound/gus_card.c')
-rw-r--r--sys/i386/isa/sound/gus_card.c188
1 files changed, 188 insertions, 0 deletions
diff --git a/sys/i386/isa/sound/gus_card.c b/sys/i386/isa/sound/gus_card.c
new file mode 100644
index 0000000..7dac1bd
--- /dev/null
+++ b/sys/i386/isa/sound/gus_card.c
@@ -0,0 +1,188 @@
+/*
+ * sound/gus_card.c
+ *
+ * Detection routine for the Gravis Ultrasound.
+ *
+ * Copyright by Hannu Savolainen 1993
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met: 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer. 2.
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ */
+
+#include <i386/isa/sound/sound_config.h>
+
+#if defined(CONFIG_GUS)
+
+#include <i386/isa/sound/gus_hw.h>
+#include <i386/isa/sound/iwdefs.h>
+
+int gus_base, gus_irq, gus_dma;
+extern int gus_wave_volume;
+extern int gus_pcm_volume;
+extern int have_gus_max;
+extern int gus_timer_enabled;
+
+static sound_os_info *gus_osp;
+
+#ifndef NOGUSPNP
+int IwaveOpen(char voices, char mode, struct address_info * hw);
+#endif
+
+void
+attach_gus_card(struct address_info * hw_config)
+{
+ int io_addr;
+
+ gus_osp = hw_config->osp;
+
+ snd_set_irq_handler(hw_config->irq, gusintr, hw_config->osp);
+
+ if (gus_wave_detect(hw_config->io_base)) {
+ /* Try first the default */
+ gus_wave_init(hw_config);
+
+ /* 0x10c-> is MAX */
+
+ if (hw_config->dma2 != -1 && hw_config->dma2 != hw_config->dma)
+ if (0)
+ printf("gus_card.c: Can't allocate DMA channel2\n");
+#ifdef CONFIG_MIDI
+ gus_midi_init();
+#endif
+ return ;
+ }
+#ifndef EXCLUDE_GUS_IODETECT
+
+ /*
+ * Look at the possible base addresses (0x2X0, X=1, 2, 3, 4, 5, 6)
+ */
+
+ for (io_addr = 0x210; io_addr <= 0x260; io_addr += 0x10)
+ if ( (io_addr != hw_config->io_base) /* Already tested */
+ && (gus_wave_detect(io_addr)) ) {
+ hw_config->io_base = io_addr;
+
+ printf(" WARNING! GUS found at %x, config was %x ",
+ io_addr, hw_config->io_base);
+ gus_wave_init(hw_config);
+ /* 0x10c-> is MAX */
+ if (hw_config->dma2 != -1 && hw_config->dma2 != hw_config->dma)
+ if (0)
+ printf("gus_card.c: Can't allocate DMA channel2\n");
+#ifdef CONFIG_MIDI
+ gus_midi_init();
+#endif
+ return ;
+ }
+#endif
+}
+
+int
+probe_gus(struct address_info * hw_config)
+{
+ int io_addr;
+
+ gus_osp = hw_config->osp;
+#ifndef NOGUSPNP
+ IwaveOpen((char) 32, (char) GUS_MODE, hw_config);
+#endif
+ if (gus_wave_detect(hw_config->io_base))
+ return 1;
+ printf("oops I didnt find gus \n");
+#undef EXCLUDE_GUS_IODETECT
+#ifndef EXCLUDE_GUS_IODETECT
+
+ /*
+ * Look at the possible base addresses (0x2X0, X=1, 2, 3, 4, 5, 6)
+ */
+ for (io_addr = 0x210; io_addr <= 0x260; io_addr += 0x10)
+ if ( (io_addr != hw_config->io_base) /* Already tested */
+ && (gus_wave_detect(io_addr)) ) {
+ hw_config->io_base = io_addr;
+ return 1;
+ }
+#endif
+
+ return 0;
+}
+
+void
+gusintr(int irq)
+{
+ u_char src;
+
+#ifdef CONFIG_GUSMAX
+ if (have_gus_max)
+ ad1848_interrupt(irq);
+#endif
+
+ for (;;) {
+ if (!(src = inb(u_IrqStatus)))
+ return;
+
+ if (src & DMA_TC_IRQ)
+ guswave_dma_irq();
+#ifdef CONFIG_MIDI
+ if (src & (MIDI_TX_IRQ | MIDI_RX_IRQ))
+ gus_midi_interrupt(0);
+#endif
+ if (src & (GF1_TIMER1_IRQ | GF1_TIMER2_IRQ)) {
+#ifdef CONFIG_SEQUENCER
+ if (gus_timer_enabled)
+ sound_timer_interrupt();
+ gus_write8(0x45, 0); /* Ack IRQ */
+ gus_timer_command(4, 0x80); /* Reset IRQ flags */
+#else
+ gus_write8(0x45, 0); /* Stop timers */
+#endif
+ }
+ if (src & (WAVETABLE_IRQ | ENVELOPE_IRQ))
+ gus_voice_irq();
+ }
+}
+
+#endif
+
+/*
+ * Some extra code for the 16 bit sampling option
+ */
+#if defined(CONFIG_GUS16)
+
+int
+probe_gus_db16(struct address_info * hw_config)
+{
+ return ad1848_detect(hw_config->io_base, NULL, hw_config->osp);
+}
+
+void
+attach_gus_db16(struct address_info * hw_config)
+{
+ gus_pcm_volume = 100;
+ gus_wave_volume = 90;
+
+ ad1848_init("GUS 16 bit sampling", hw_config->io_base,
+ hw_config->irq,
+ hw_config->dma,
+ hw_config->dma, 0,
+ hw_config->osp);
+}
+
+#endif
OpenPOWER on IntegriCloud