1 /* $OpenBSD: emuxkivar.h,v 1.6 2003/04/26 08:01:42 jmc Exp $ */ 2 /* $NetBSD: emuxkivar.h,v 1.1 2001/10/17 18:39:41 jdolecek Exp $ */ 3 4 /*- 5 * Copyright (c) 2001 The NetBSD Foundation, Inc. 6 * All rights reserved. 7 * 8 * This code is derived from software contributed to The NetBSD Foundation 9 * by Yannick Montulet. 10 * 11 * Redistribution and use in source and binary forms, with or without 12 * modification, are permitted provided that the following conditions 13 * are met: 14 * 1. Redistributions of source code must retain the above copyright 15 * notice, this list of conditions and the following disclaimer. 16 * 2. Redistributions in binary form must reproduce the above copyright 17 * notice, this list of conditions and the following disclaimer in the 18 * documentation and/or other materials provided with the distribution. 19 * 3. All advertising materials mentioning features or use of this software 20 * must display the following acknowledgement: 21 * This product includes software developed by the NetBSD 22 * Foundation, Inc. and its contributors. 23 * 4. Neither the name of The NetBSD Foundation nor the names of its 24 * contributors may be used to endorse or promote products derived 25 * from this software without specific prior written permission. 26 * 27 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 28 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 29 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 30 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 31 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 32 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 33 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 34 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 35 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 36 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 37 * POSSIBILITY OF SUCH DAMAGE. 38 */ 39 40 #ifndef _DEV_PCI_EMU10K1VAR_H_ 41 #define _DEV_PCI_EMU10K1VAR_H_ 42 43 #define EMU_PCI_CBIO 0x10 44 #define EMU_SUBSYS_APS 0x40011102 45 46 /* 47 * dma memory management 48 */ 49 50 struct dmamem { 51 bus_dma_tag_t dmat; 52 bus_size_t size; 53 bus_size_t align; 54 bus_size_t bound; 55 bus_dma_segment_t *segs; 56 int nsegs; 57 int rsegs; 58 caddr_t kaddr; 59 bus_dmamap_t map; 60 }; 61 62 #define KERNADDR(ptr) ((void *)((ptr)->kaddr)) 63 #define DMASEGADDR(ptr, segno) ((ptr)->segs[segno].ds_addr) 64 #define DMAADDR(ptr) DMASEGADDR(ptr, 0) 65 #define DMASIZE(ptr) ((ptr)->size) 66 67 /* 68 * Emu10k1 hardware limits 69 */ 70 71 #define EMU_PTESIZE 4096 72 #define EMU_MAXPTE ((EMU_CHAN_PSST_LOOPSTARTADDR_MASK + 1) / \ 73 EMU_PTESIZE) 74 #define EMU_NUMCHAN 64 75 #define EMU_NUMRECSRCS 3 76 77 #define EMU_DMA_ALIGN 4096 78 #define EMU_DMAMEM_NSEG 1 79 80 /* 81 * Emu10k1 memory management 82 */ 83 84 struct emuxki_mem { 85 LIST_ENTRY(emuxki_mem) next; 86 struct dmamem *dmamem; 87 u_int16_t ptbidx; 88 #define EMU_RMEM 0xFFFF /* recording memory */ 89 }; 90 91 /* 92 * Emu10k1 play channel params 93 */ 94 95 struct emuxki_chanparms_fxsend { 96 struct { 97 u_int8_t level, dest; 98 } a, b, c, d; 99 }; 100 101 struct emuxki_chanparms_pitch { 102 u_int16_t initial;/* 4 bits of octave, 12 bits of fractional 103 * octave */ 104 u_int16_t current;/* 0x4000 == unity pitch shift */ 105 u_int16_t target; /* 0x4000 == unity pitch shift */ 106 u_int8_t envelope_amount; /* Signed 2's complement, +/- 107 * one octave peak extremes */ 108 }; 109 110 struct emuxki_chanparms_envelope { 111 u_int16_t current_state; /* 0x8000-n == 666*n usec delay */ 112 u_int8_t hold_time; /* 127-n == n*(volume ? 88.2 : 113 * 42)msec */ 114 u_int8_t attack_time; /* 0 = infinite, 1 = (volume ? 11 : 115 * 10.9) msec, 0x7f = 5.5msec */ 116 u_int8_t sustain_level; /* 127 = full, 0 = off, 0.75dB 117 * increments */ 118 u_int8_t decay_time; /* 0 = 43.7msec, 1 = 21.8msec, 0x7f = 119 * 22msec */ 120 }; 121 122 struct emuxki_chanparms_volume { 123 u_int16_t current, target; 124 struct emuxki_chanparms_envelope envelope; 125 }; 126 127 struct emuxki_chanparms_filter { 128 u_int16_t initial_cutoff_frequency; 129 /* 130 * 6 most significant bits are semitones, 2 least significant bits 131 * are fractions 132 */ 133 u_int16_t current_cutoff_frequency; 134 u_int16_t target_cutoff_frequency; 135 u_int8_t lowpass_resonance_height; 136 u_int8_t interpolation_ROM; /* 1 = full band, 7 = low 137 * pass */ 138 u_int8_t envelope_amount; /* Signed 2's complement, +/- 139 * six octaves peak extremes */ 140 u_int8_t LFO_modulation_depth; /* Signed 2's complement, +/- 141 * three octave extremes */ 142 }; 143 144 struct emuxki_chanparms_loop { 145 u_int32_t start; /* index in the PTB (in samples) */ 146 u_int32_t end; /* index in the PTB (in samples) */ 147 }; 148 149 struct emuxki_chanparms_modulation { 150 struct emuxki_chanparms_envelope envelope; 151 u_int16_t LFO_state; /* 0x8000-n = 666*n usec delay */ 152 }; 153 154 struct emuxki_chanparms_vibrato_LFO { 155 u_int16_t state; /* 0x8000-n == 666*n usec delay */ 156 u_int8_t modulation_depth; /* Signed 2's complement, +/- 157 * one octave extremes */ 158 u_int8_t vibrato_depth; /* Signed 2's complement, +/- one 159 * octave extremes */ 160 u_int8_t frequency; /* 0.039Hz steps, maximum of 9.85 Hz */ 161 }; 162 163 struct emuxki_channel { 164 u_int8_t num; /* voice number */ 165 struct emuxki_voice *voice; 166 struct emuxki_chanparms_fxsend fxsend; 167 struct emuxki_chanparms_pitch pitch; 168 u_int16_t initial_attenuation; /* 0.375dB steps */ 169 struct emuxki_chanparms_volume volume; 170 struct emuxki_chanparms_filter filter; 171 struct emuxki_chanparms_loop loop; 172 struct emuxki_chanparms_modulation modulation; 173 struct emuxki_chanparms_vibrato_LFO vibrato_LFO; 174 u_int8_t tremolo_depth; 175 }; 176 177 /* 178 * Voices, streams 179 */ 180 181 typedef enum { 182 EMU_RECSRC_MIC = 0, 183 EMU_RECSRC_ADC, 184 EMU_RECSRC_FX, 185 EMU_RECSRC_NOTSET 186 } emuxki_recsrc_t; 187 188 struct emuxki_voice { 189 struct emuxki_softc *sc; /* our softc */ 190 191 u_int8_t use; 192 #define EMU_VOICE_USE_PLAY (1 << 0) 193 u_int8_t state; 194 #define EMU_VOICE_STATE_STARTED (1 << 0) 195 u_int8_t stereo; 196 #define EMU_VOICE_STEREO_NOTSET 0xFF 197 u_int8_t b16; 198 u_int32_t sample_rate; 199 union { 200 struct emuxki_channel *chan[2]; 201 emuxki_recsrc_t source; 202 } dataloc; 203 struct emuxki_mem *buffer; 204 u_int16_t blksize;/* in samples */ 205 u_int16_t trigblk;/* blk on which to trigger inth */ 206 u_int16_t blkmod; /* Modulo value to wrap trigblk */ 207 u_int16_t timerate; 208 void (*inth) (void *); 209 void *inthparam; 210 LIST_ENTRY(emuxki_voice) next; 211 }; 212 213 #if 0 /* Not yet */ 214 /* 215 * I intend this to be able to manage things like AC-3 216 */ 217 struct emuxki_stream { 218 struct emu10k1 *emu; 219 u_int8_t nmono; 220 u_int8_t nstereo; 221 struct emuxki_voice *mono; 222 struct emuxki_voice *stereo; 223 LIST_ENTRY(emuxki_stream) next; 224 }; 225 #endif /* Not yet */ 226 227 struct emuxki_softc { 228 struct device sc_dev; 229 struct audio_device sc_audv; 230 enum { 231 EMUXKI_SBLIVE, EMUXKI_APS, EMUXKI_AUDIGY 232 } sc_type; 233 234 /* Autoconfig parameters */ 235 bus_space_tag_t sc_iot; 236 bus_space_handle_t sc_ioh; 237 bus_addr_t sc_iob; 238 bus_size_t sc_ios; 239 pci_chipset_tag_t sc_pc; /* PCI tag */ 240 bus_dma_tag_t sc_dmat; 241 void *sc_ih; /* interrupt handler */ 242 243 /* EMU10k1 device structures */ 244 LIST_HEAD(, emuxki_mem) mem; 245 246 struct dmamem *ptb; 247 struct dmamem *silentpage; 248 249 struct emuxki_channel *channel[EMU_NUMCHAN]; 250 struct emuxki_voice *recsrc[EMU_NUMRECSRCS]; 251 252 LIST_HEAD(, emuxki_voice) voices; 253 /* LIST_HEAD(, emuxki_stream) streams; */ 254 255 u_int8_t timerstate; 256 #define EMU_TIMER_STATE_ENABLED 1 257 258 struct ac97_host_if hostif; 259 struct ac97_codec_if *codecif; 260 struct device *sc_audev; 261 262 struct emuxki_voice *pvoice, *rvoice, *lvoice; 263 }; 264 265 #endif /* !_DEV_PCI_EMU10K1VAR_H_ */ 266