[BACK]Return to emuxkivar.h CVS log [TXT][DIR] Up to [local] / sys / dev / pci

Annotation of sys/dev/pci/emuxkivar.h, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: emuxkivar.h,v 1.7 2005/11/30 22:17:47 brad 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, e, f, g, h;
                     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 = 0x00, EMUXKI_AUDIGY = 0x01, EMUXKI_AUDIGY2 = 0x02,
                    232:                EMUXKI_LIVE_5_1 = 0x04, EMUXKI_APS = 0x08
                    233:        } sc_type;
                    234:
                    235:        /* Autoconfig parameters */
                    236:        bus_space_tag_t         sc_iot;
                    237:        bus_space_handle_t      sc_ioh;
                    238:        bus_addr_t              sc_iob;
                    239:        bus_size_t              sc_ios;
                    240:        pci_chipset_tag_t       sc_pc;          /* PCI tag */
                    241:        bus_dma_tag_t           sc_dmat;
                    242:        void                    *sc_ih;         /* interrupt handler */
                    243:
                    244:        /* EMU10k1 device structures */
                    245:        LIST_HEAD(, emuxki_mem) mem;
                    246:
                    247:        struct dmamem           *ptb;
                    248:        struct dmamem           *silentpage;
                    249:
                    250:        struct emuxki_channel   *channel[EMU_NUMCHAN];
                    251:        struct emuxki_voice     *recsrc[EMU_NUMRECSRCS];
                    252:
                    253:        LIST_HEAD(, emuxki_voice) voices;
                    254:        /* LIST_HEAD(, emuxki_stream)   streams; */
                    255:
                    256:        u_int8_t                timerstate;
                    257: #define        EMU_TIMER_STATE_ENABLED 1
                    258:
                    259:        struct ac97_host_if     hostif;
                    260:        struct ac97_codec_if    *codecif;
                    261:        struct device           *sc_audev;
                    262:
                    263:        struct emuxki_voice     *pvoice, *rvoice, *lvoice;
                    264: };
                    265:
                    266: #endif                         /* !_DEV_PCI_EMU10K1VAR_H_ */

CVSweb