1 1.11 andvar /* $NetBSD: gusreg.h,v 1.11 2024/02/09 22:08:35 andvar Exp $ */ 2 1.2 jtc 3 1.1 brezak /*- 4 1.2 jtc * Copyright (c) 1996 The NetBSD Foundation, Inc. 5 1.1 brezak * All rights reserved. 6 1.1 brezak * 7 1.2 jtc * This code is derived from software contributed to The NetBSD Foundation 8 1.2 jtc * by Ken Hornstein and John Kohl. 9 1.1 brezak * 10 1.1 brezak * Redistribution and use in source and binary forms, with or without 11 1.1 brezak * modification, are permitted provided that the following conditions 12 1.1 brezak * are met: 13 1.1 brezak * 1. Redistributions of source code must retain the above copyright 14 1.1 brezak * notice, this list of conditions and the following disclaimer. 15 1.1 brezak * 2. Redistributions in binary form must reproduce the above copyright 16 1.1 brezak * notice, this list of conditions and the following disclaimer in the 17 1.1 brezak * documentation and/or other materials provided with the distribution. 18 1.1 brezak * 19 1.3 jtc * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 1.3 jtc * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 1.3 jtc * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 1.6 jtc * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 1.6 jtc * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 1.3 jtc * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 1.3 jtc * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 1.3 jtc * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 1.3 jtc * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 1.3 jtc * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 1.3 jtc * POSSIBILITY OF SUCH DAMAGE. 30 1.1 brezak */ 31 1.1 brezak 32 1.1 brezak /* 33 1.1 brezak * Register definitions of Gravis UltraSound card 34 1.1 brezak */ 35 1.1 brezak 36 1.1 brezak /* 37 1.1 brezak * MIDI control registers. Essentially a MC6850 UART. Note the MC6850's 38 1.1 brezak * "feature" of having read-only and write-only registers combined on one 39 1.1 brezak * address. 40 1.1 brezak */ 41 1.1 brezak 42 1.5 augustss #define GUS_IOH4_OFFSET 0x100 43 1.5 augustss #define GUS_NPORT4 2 44 1.5 augustss 45 1.5 augustss #define GUS_MIDI_CONTROL (0x100-GUS_IOH4_OFFSET) 46 1.5 augustss #define GUS_MIDI_STATUS (0x100-GUS_IOH4_OFFSET) 47 1.5 augustss #define GUS_MIDI_READ (0x101-GUS_IOH4_OFFSET) 48 1.5 augustss #define GUS_MIDI_WRITE (0x101-GUS_IOH4_OFFSET) 49 1.1 brezak 50 1.1 brezak /* 51 1.1 brezak * Joystick interface - note this is an absolute address, NOT an offset from 52 1.1 brezak * the GUS base address. 53 1.1 brezak */ 54 1.1 brezak 55 1.1 brezak #define GUS_JOYSTICK 0x201 56 1.1 brezak 57 1.1 brezak /* 58 1.1 brezak * GUS control registers 59 1.1 brezak */ 60 1.1 brezak 61 1.1 brezak #define GUS_MIX_CONTROL 0x000 62 1.1 brezak #define GUS_IRQ_STATUS 0x006 63 1.1 brezak #define GUS_TIMER_CONTROL 0x008 64 1.1 brezak #define GUS_TIMER_DATA 0x009 65 1.1 brezak #define GUS_REG_CONTROL 0x00f /* rev 3.4 or later only: select reg 66 1.1 brezak at 2XB */ 67 1.1 brezak #define GUS_REG_NORMAL 0x00 /* IRQ/DMA as usual */ 68 1.1 brezak #define GUS_REG_IRQCTL 0x05 /* IRQ ctl: write 0 to clear IRQ state */ 69 1.1 brezak #define GUS_REG_JUMPER 0x06 /* jumper control: */ 70 1.1 brezak #define GUS_JUMPER_MIDIEN 0x02 /* bit: enable MIDI ports */ 71 1.1 brezak #define GUS_JUMPER_JOYEN 0x04 /* bit: enable joystick ports */ 72 1.1 brezak 73 1.1 brezak #define GUS_IRQ_CONTROL 0x00b 74 1.1 brezak #define GUS_DMA_CONTROL 0x00b 75 1.1 brezak #define GUS_IRQCTL_CONTROL 0x00b 76 1.1 brezak #define GUS_JUMPER_CONTROL 0x00b 77 1.5 augustss 78 1.5 augustss #define GUS_NPORT1 16 79 1.5 augustss 80 1.5 augustss #define GUS_IOH2_OFFSET 0x102 81 1.5 augustss #define GUS_VOICE_SELECT (0x102-GUS_IOH2_OFFSET) 82 1.5 augustss #define GUS_REG_SELECT (0x103-GUS_IOH2_OFFSET) 83 1.5 augustss #define GUS_DATA_LOW (0x104-GUS_IOH2_OFFSET) 84 1.5 augustss #define GUS_DATA_HIGH (0x105-GUS_IOH2_OFFSET) 85 1.5 augustss /* GUS_MIXER_SELECT 106 */ 86 1.5 augustss #define GUS_DRAM_DATA (0x107-GUS_IOH2_OFFSET) 87 1.5 augustss 88 1.5 augustss #define GUS_NPORT2 6 89 1.1 brezak 90 1.1 brezak /* 91 1.1 brezak * GUS on-board global registers 92 1.1 brezak */ 93 1.1 brezak 94 1.1 brezak #define GUSREG_DMA_CONTROL 0x41 95 1.1 brezak #define GUSREG_DMA_START 0x42 96 1.1 brezak #define GUSREG_DRAM_ADDR_LOW 0x43 97 1.1 brezak #define GUSREG_DRAM_ADDR_HIGH 0x44 98 1.1 brezak #define GUSREG_TIMER_CONTROL 0x45 99 1.1 brezak #define GUSREG_TIMER1_COUNT 0x46 /* count-up, then interrupt, 80usec */ 100 1.1 brezak #define GUSREG_TIMER2_COUNT 0x47 /* count-up, then interrupt, 320usec */ 101 1.1 brezak #define GUSREG_SAMPLE_FREQ 0x48 /* 9878400/(16*(rate+2)) */ 102 1.1 brezak #define GUSREG_SAMPLE_CONTROL 0x49 103 1.1 brezak #define GUSREG_JOYSTICK_TRIM 0x4b 104 1.1 brezak #define GUSREG_RESET 0x4c 105 1.1 brezak 106 1.1 brezak /* 107 1.1 brezak * GUS voice specific registers (some of which aren't!). Add 0x80 to these 108 1.1 brezak * registers for reads 109 1.1 brezak */ 110 1.1 brezak 111 1.1 brezak #define GUSREG_READ 0x80 112 1.1 brezak #define GUSREG_VOICE_CNTL 0x00 113 1.1 brezak #define GUSREG_FREQ_CONTROL 0x01 114 1.1 brezak #define GUSREG_START_ADDR_HIGH 0x02 115 1.1 brezak #define GUSREG_START_ADDR_LOW 0x03 116 1.1 brezak #define GUSREG_END_ADDR_HIGH 0x04 117 1.1 brezak #define GUSREG_END_ADDR_LOW 0x05 118 1.1 brezak #define GUSREG_VOLUME_RATE 0x06 119 1.1 brezak #define GUSREG_START_VOLUME 0x07 120 1.1 brezak #define GUSREG_END_VOLUME 0x08 121 1.1 brezak #define GUSREG_CUR_VOLUME 0x09 122 1.1 brezak #define GUSREG_CUR_ADDR_HIGH 0x0a 123 1.1 brezak #define GUSREG_CUR_ADDR_LOW 0x0b 124 1.1 brezak #define GUSREG_PAN_POS 0x0c 125 1.1 brezak #define GUSREG_VOLUME_CONTROL 0x0d 126 1.1 brezak #define GUSREG_ACTIVE_VOICES 0x0e /* voice-independent:set voice count */ 127 1.1 brezak #define GUSREG_IRQ_STATUS 0x8f /* voice-independent */ 128 1.1 brezak 129 1.1 brezak #define GUS_PAN_FULL_LEFT 0x0 130 1.1 brezak #define GUS_PAN_FULL_RIGHT 0xf 131 1.1 brezak 132 1.1 brezak /* 133 1.1 brezak * GUS Bitmasks for reset register 134 1.1 brezak */ 135 1.1 brezak 136 1.1 brezak #define GUSMASK_MASTER_RESET 0x01 137 1.1 brezak #define GUSMASK_DAC_ENABLE 0x02 138 1.1 brezak #define GUSMASK_IRQ_ENABLE 0x04 139 1.1 brezak 140 1.1 brezak /* 141 1.1 brezak * Bitmasks for IRQ status port 142 1.1 brezak */ 143 1.1 brezak 144 1.1 brezak #define GUSMASK_IRQ_MIDIXMIT 0x01 /* MIDI transmit IRQ */ 145 1.1 brezak #define GUSMASK_IRQ_MIDIRCVR 0x02 /* MIDI received IRQ */ 146 1.1 brezak #define GUSMASK_IRQ_TIMER1 0x04 /* timer 1 IRQ */ 147 1.1 brezak #define GUSMASK_IRQ_TIMER2 0x08 /* timer 2 IRQ */ 148 1.1 brezak #define GUSMASK_IRQ_RESERVED 0x10 /* Reserved (set to 0) */ 149 1.1 brezak #define GUSMASK_IRQ_VOICE 0x20 /* Wavetable IRQ (any voice) */ 150 1.1 brezak #define GUSMASK_IRQ_VOLUME 0x40 /* Volume ramp IRQ (any voc) */ 151 1.1 brezak #define GUSMASK_IRQ_DMATC 0x80 /* DMA transfer complete */ 152 1.1 brezak 153 1.1 brezak /* 154 1.1 brezak * Bitmasks for sampling control register 155 1.1 brezak */ 156 1.1 brezak #define GUSMASK_SAMPLE_START 0x01 /* start sampling */ 157 1.1 brezak #define GUSMASK_SAMPLE_STEREO 0x02 /* mono or stereo */ 158 1.1 brezak #define GUSMASK_SAMPLE_DATA16 0x04 /* 16-bit DMA channel */ 159 1.1 brezak #define GUSMASK_SAMPLE_IRQ 0x20 /* enable IRQ */ 160 1.1 brezak #define GUSMASK_SAMPLE_DMATC 0x40 /* DMA transfer complete */ 161 1.1 brezak #define GUSMASK_SAMPLE_INVBIT 0x80 /* invert MSbit */ 162 1.1 brezak 163 1.1 brezak /* 164 1.1 brezak * Bitmasks for IRQ status register (different than IRQ status _port_ - the 165 1.1 brezak * register is internal to the GUS) 166 1.1 brezak */ 167 1.1 brezak 168 1.1 brezak #define GUSMASK_WIRQ_VOLUME 0x40 /* Flag for volume interrupt */ 169 1.1 brezak #define GUSMASK_WIRQ_VOICE 0x80 /* Flag for voice interrupt */ 170 1.1 brezak #define GUSMASK_WIRQ_VOICEMASK 0x1f /* Bits holding voice # */ 171 1.1 brezak 172 1.1 brezak /* 173 1.1 brezak * GUS bitmasks for built-in mixer control (separate from the ICS or CS chips) 174 1.1 brezak */ 175 1.1 brezak 176 1.1 brezak #define GUSMASK_LINE_IN 0x01 /* 0=enable */ 177 1.1 brezak #define GUSMASK_LINE_OUT 0x02 /* 0=enable */ 178 1.1 brezak #define GUSMASK_MIC_IN 0x04 /* 1=enable */ 179 1.1 brezak #define GUSMASK_LATCHES 0x08 /* enable IRQ latches */ 180 1.1 brezak #define GUSMASK_COMBINE 0x10 /* combine Ch 1 IRQ & Ch 2 (MIDI) */ 181 1.1 brezak #define GUSMASK_MIDI_LOOPBACK 0x20 /* MIDI loopback */ 182 1.1 brezak #define GUSMASK_CONTROL_SEL 0x40 /* Select control register */ 183 1.1 brezak 184 1.1 brezak #define GUSMASK_BOTH_RQ 0x40 /* Combine both RQ lines */ 185 1.1 brezak 186 1.1 brezak /* 187 1.11 andvar * GUS bitmasks for DMA control 188 1.1 brezak */ 189 1.1 brezak 190 1.1 brezak #define GUSMASK_DMA_ENABLE 0x01 /* Enable DMA transfer */ 191 1.1 brezak #define GUSMASK_DMA_READ 0x02 /* 1=read, 0=write */ 192 1.10 andvar #define GUSMASK_DMA_WRITE 0x00 /* for consistency */ 193 1.1 brezak #define GUSMASK_DMA_WIDTH 0x04 /* Data transfer width */ 194 1.1 brezak #define GUSMASK_DMA_R0 0x00 /* Various DMA speeds */ 195 1.1 brezak #define GUSMASK_DMA_R1 0x08 196 1.1 brezak #define GUSMASK_DMA_R2 0x10 197 1.1 brezak #define GUSMASK_DMA_R3 0x18 198 1.1 brezak #define GUSMASK_DMA_IRQ 0x20 /* Enable DMA to IRQ */ 199 1.1 brezak #define GUSMASK_DMA_IRQPEND 0x40 /* DMA IRQ pending */ 200 1.1 brezak #define GUSMASK_DMA_DATA_SIZE 0x40 /* 0=8 bit, 1=16 bit */ 201 1.1 brezak #define GUSMASK_DMA_INVBIT 0x80 /* invert high bit */ 202 1.1 brezak 203 1.1 brezak /* 204 1.1 brezak * GUS bitmasks for voice control 205 1.1 brezak */ 206 1.1 brezak 207 1.1 brezak #define GUSMASK_VOICE_STOPPED 0x01 /* The voice is stopped */ 208 1.1 brezak #define GUSMASK_STOP_VOICE 0x02 /* Force voice to stop */ 209 1.1 brezak #define GUSMASK_DATA_SIZE16 0x04 /* 1=16 bit, 0=8 bit data */ 210 1.1 brezak #define GUSMASK_LOOP_ENABLE 0x08 /* Loop voice at end */ 211 1.1 brezak #define GUSMASK_VOICE_BIDIR 0x10 /* Bi-directional looping */ 212 1.1 brezak #define GUSMASK_VOICE_IRQ 0x20 /* Enable the voice IRQ */ 213 1.1 brezak #define GUSMASK_INCR_DIR 0x40 /* Direction of address incr */ 214 1.1 brezak #define GUSMASK_VOICE_IRQPEND 0x80 /* Pending IRQ for voice */ 215 1.1 brezak 216 1.1 brezak /* 217 1.1 brezak * Bitmasks for volume control 218 1.1 brezak */ 219 1.1 brezak 220 1.1 brezak #define GUSMASK_VOLUME_STOPPED 0x01 /* Volume ramping stopped */ 221 1.1 brezak #define GUSMASK_STOP_VOLUME 0x02 /* Manually stop volume */ 222 1.1 brezak #define GUSMASK_VOICE_ROLL 0x04 /* Roll over/low water condition */ 223 1.1 brezak #define GUSMASK_VOLUME_LOOP 0x08 /* Volume ramp looping */ 224 1.1 brezak #define GUSMASK_VOLUME_BIDIR 0x10 /* Bi-dir volume looping */ 225 1.1 brezak #define GUSMASK_VOLUME_IRQ 0x20 /* IRQ on end of volume ramp */ 226 1.1 brezak #define GUSMASK_VOLUME_DIR 0x40 /* Direction of volume ramp */ 227 1.1 brezak #define GUSMASK_VOLUME_IRQPEND 0x80 /* Pending volume IRQ */ 228 1.1 brezak #define MIDI_RESET 0x03 229 1.1 brezak 230 1.1 brezak /* 231 1.1 brezak * ICS Mixer registers 232 1.1 brezak */ 233 1.1 brezak 234 1.5 augustss #define GUS_IOH3_OFFSET 0x506 235 1.5 augustss #define GUS_NPORT3 1 236 1.5 augustss 237 1.5 augustss #define GUS_MIXER_SELECT (0x506-GUS_IOH3_OFFSET) /* read=board rev, wr=mixer */ 238 1.5 augustss #define GUS_BOARD_REV (0x506-GUS_IOH3_OFFSET) 239 1.5 augustss #define GUS_MIXER_DATA (0x106-GUS_IOH2_OFFSET) /* data for mixer control */ 240 1.1 brezak 241 1.1 brezak #define GUSMIX_CHAN_MIC ICSMIX_CHAN_0 242 1.1 brezak #define GUSMIX_CHAN_LINE ICSMIX_CHAN_1 243 1.1 brezak #define GUSMIX_CHAN_CD ICSMIX_CHAN_2 244 1.1 brezak #define GUSMIX_CHAN_DAC ICSMIX_CHAN_3 245 1.1 brezak #define GUSMIX_CHAN_MASTER ICSMIX_CHAN_5 246 1.1 brezak 247 1.1 brezak /* 248 1.1 brezak * Codec/Mixer registers 249 1.1 brezak */ 250 1.1 brezak 251 1.4 mikel #define GUS_MAX_CODEC_BASE 0x10C 252 1.4 mikel #define GUS_DAUGHTER_CODEC_BASE 0x530 253 1.4 mikel #define GUS_DAUGHTER_CODEC_BASE2 0x604 254 1.4 mikel #define GUS_DAUGHTER_CODEC_BASE3 0xE80 255 1.4 mikel #define GUS_DAUGHTER_CODEC_BASE4 0xF40 256 1.4 mikel 257 1.4 mikel #define GUS_CODEC_SELECT 0 258 1.4 mikel #define GUS_CODEC_DATA 1 259 1.4 mikel #define GUS_CODEC_STATUS 2 260 1.4 mikel #define GUS_CODEC_PIO 3 261 1.1 brezak 262 1.1 brezak #define GUS_MAX_CTRL 0x106 263 1.1 brezak #define GUS_MAX_BASEBITS 0xf /* sets middle nibble of 3X6 */ 264 1.1 brezak #define GUS_MAX_RECCHAN16 0x10 /* 0=8bit DMA read, 1=16bit DMA read */ 265 1.1 brezak #define GUS_MAX_PLAYCHAN16 0x20 /* 0=8bit, 1=16bit */ 266 1.1 brezak #define GUS_MAX_CODEC_ENABLE 0x40 /* 0=disable, 1=enable */ 267