📄 emu10k1.h
字号:
#ifndef __SOUND_EMU10K1_H#define __SOUND_EMU10K1_H/* * Copyright (c) by Jaroslav Kysela <perex@perex.cz>, * Creative Labs, Inc. * Definitions for EMU10K1 (SB Live!) chips * * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */#ifdef __KERNEL__#include <sound/pcm.h>#include <sound/rawmidi.h>#include <sound/hwdep.h>#include <sound/ac97_codec.h>#include <sound/util_mem.h>#include <sound/pcm-indirect.h>#include <sound/timer.h>#include <linux/interrupt.h>#include <linux/mutex.h>#include <asm/io.h>/* ------------------- DEFINES -------------------- */#define EMUPAGESIZE 4096#define MAXREQVOICES 8#define MAXPAGES 8192#define RESERVED 0#define NUM_MIDI 16#define NUM_G 64 /* use all channels */#define NUM_FXSENDS 4#define NUM_EFX_PLAYBACK 16/* FIXME? - according to the OSS driver the EMU10K1 needs a 29 bit DMA mask */#define EMU10K1_DMA_MASK 0x7fffffffUL /* 31bit */#define AUDIGY_DMA_MASK 0x7fffffffUL /* 31bit FIXME - 32 should work? */ /* See ALSA bug #1276 - rlrevell */#define TMEMSIZE 256*1024#define TMEMSIZEREG 4#define IP_TO_CP(ip) ((ip == 0) ? 0 : (((0x00001000uL | (ip & 0x00000FFFL)) << (((ip >> 12) & 0x000FL) + 4)) & 0xFFFF0000uL))// Audigy specify registers are prefixed with 'A_'/************************************************************************************************//* PCI function 0 registers, address = <val> + PCIBASE0 *//************************************************************************************************/#define PTR 0x00 /* Indexed register set pointer register */ /* NOTE: The CHANNELNUM and ADDRESS words can */ /* be modified independently of each other. */#define PTR_CHANNELNUM_MASK 0x0000003f /* For each per-channel register, indicates the */ /* channel number of the register to be */ /* accessed. For non per-channel registers the */ /* value should be set to zero. */#define PTR_ADDRESS_MASK 0x07ff0000 /* Register index */#define A_PTR_ADDRESS_MASK 0x0fff0000#define DATA 0x04 /* Indexed register set data register */#define IPR 0x08 /* Global interrupt pending register */ /* Clear pending interrupts by writing a 1 to */ /* the relevant bits and zero to the other bits */#define IPR_P16V 0x80000000 /* Bit set when the CA0151 P16V chip wishes to interrupt */#define IPR_GPIOMSG 0x20000000 /* GPIO message interrupt (RE'd, still not sure which INTE bits enable it) *//* The next two interrupts are for the midi port on the Audigy Drive (A_MPU1) */#define IPR_A_MIDITRANSBUFEMPTY2 0x10000000 /* MIDI UART transmit buffer empty */#define IPR_A_MIDIRECVBUFEMPTY2 0x08000000 /* MIDI UART receive buffer empty */#define IPR_SPDIFBUFFULL 0x04000000 /* SPDIF capture related, 10k2 only? (RE) */#define IPR_SPDIFBUFHALFFULL 0x02000000 /* SPDIF capture related? (RE) */#define IPR_SAMPLERATETRACKER 0x01000000 /* Sample rate tracker lock status change */#define IPR_FXDSP 0x00800000 /* Enable FX DSP interrupts */#define IPR_FORCEINT 0x00400000 /* Force Sound Blaster interrupt */#define IPR_PCIERROR 0x00200000 /* PCI bus error */#define IPR_VOLINCR 0x00100000 /* Volume increment button pressed */#define IPR_VOLDECR 0x00080000 /* Volume decrement button pressed */#define IPR_MUTE 0x00040000 /* Mute button pressed */#define IPR_MICBUFFULL 0x00020000 /* Microphone buffer full */#define IPR_MICBUFHALFFULL 0x00010000 /* Microphone buffer half full */#define IPR_ADCBUFFULL 0x00008000 /* ADC buffer full */#define IPR_ADCBUFHALFFULL 0x00004000 /* ADC buffer half full */#define IPR_EFXBUFFULL 0x00002000 /* Effects buffer full */#define IPR_EFXBUFHALFFULL 0x00001000 /* Effects buffer half full */#define IPR_GPSPDIFSTATUSCHANGE 0x00000800 /* GPSPDIF channel status change */#define IPR_CDROMSTATUSCHANGE 0x00000400 /* CD-ROM channel status change */#define IPR_INTERVALTIMER 0x00000200 /* Interval timer terminal count */#define IPR_MIDITRANSBUFEMPTY 0x00000100 /* MIDI UART transmit buffer empty */#define IPR_MIDIRECVBUFEMPTY 0x00000080 /* MIDI UART receive buffer empty */#define IPR_CHANNELLOOP 0x00000040 /* Channel (half) loop interrupt(s) pending */#define IPR_CHANNELNUMBERMASK 0x0000003f /* When IPR_CHANNELLOOP is set, indicates the */ /* highest set channel in CLIPL, CLIPH, HLIPL, */ /* or HLIPH. When IP is written with CL set, */ /* the bit in H/CLIPL or H/CLIPH corresponding */ /* to the CIN value written will be cleared. */#define INTE 0x0c /* Interrupt enable register */#define INTE_VIRTUALSB_MASK 0xc0000000 /* Virtual Soundblaster I/O port capture */#define INTE_VIRTUALSB_220 0x00000000 /* Capture at I/O base address 0x220-0x22f */#define INTE_VIRTUALSB_240 0x40000000 /* Capture at I/O base address 0x240 */#define INTE_VIRTUALSB_260 0x80000000 /* Capture at I/O base address 0x260 */#define INTE_VIRTUALSB_280 0xc0000000 /* Capture at I/O base address 0x280 */#define INTE_VIRTUALMPU_MASK 0x30000000 /* Virtual MPU I/O port capture */#define INTE_VIRTUALMPU_300 0x00000000 /* Capture at I/O base address 0x300-0x301 */#define INTE_VIRTUALMPU_310 0x10000000 /* Capture at I/O base address 0x310 */#define INTE_VIRTUALMPU_320 0x20000000 /* Capture at I/O base address 0x320 */#define INTE_VIRTUALMPU_330 0x30000000 /* Capture at I/O base address 0x330 */#define INTE_MASTERDMAENABLE 0x08000000 /* Master DMA emulation at 0x000-0x00f */#define INTE_SLAVEDMAENABLE 0x04000000 /* Slave DMA emulation at 0x0c0-0x0df */#define INTE_MASTERPICENABLE 0x02000000 /* Master PIC emulation at 0x020-0x021 */#define INTE_SLAVEPICENABLE 0x01000000 /* Slave PIC emulation at 0x0a0-0x0a1 */#define INTE_VSBENABLE 0x00800000 /* Enable virtual Soundblaster */#define INTE_ADLIBENABLE 0x00400000 /* Enable AdLib emulation at 0x388-0x38b */#define INTE_MPUENABLE 0x00200000 /* Enable virtual MPU */#define INTE_FORCEINT 0x00100000 /* Continuously assert INTAN */#define INTE_MRHANDENABLE 0x00080000 /* Enable the "Mr. Hand" logic */ /* NOTE: There is no reason to use this under */ /* Linux, and it will cause odd hardware */ /* behavior and possibly random segfaults and */ /* lockups if enabled. *//* The next two interrupts are for the midi port on the Audigy Drive (A_MPU1) */#define INTE_A_MIDITXENABLE2 0x00020000 /* Enable MIDI transmit-buffer-empty interrupts */#define INTE_A_MIDIRXENABLE2 0x00010000 /* Enable MIDI receive-buffer-empty interrupts */#define INTE_SAMPLERATETRACKER 0x00002000 /* Enable sample rate tracker interrupts */ /* NOTE: This bit must always be enabled */#define INTE_FXDSPENABLE 0x00001000 /* Enable FX DSP interrupts */#define INTE_PCIERRORENABLE 0x00000800 /* Enable PCI bus error interrupts */#define INTE_VOLINCRENABLE 0x00000400 /* Enable volume increment button interrupts */#define INTE_VOLDECRENABLE 0x00000200 /* Enable volume decrement button interrupts */#define INTE_MUTEENABLE 0x00000100 /* Enable mute button interrupts */#define INTE_MICBUFENABLE 0x00000080 /* Enable microphone buffer interrupts */#define INTE_ADCBUFENABLE 0x00000040 /* Enable ADC buffer interrupts */#define INTE_EFXBUFENABLE 0x00000020 /* Enable Effects buffer interrupts */#define INTE_GPSPDIFENABLE 0x00000010 /* Enable GPSPDIF status interrupts */#define INTE_CDSPDIFENABLE 0x00000008 /* Enable CDSPDIF status interrupts */#define INTE_INTERVALTIMERENB 0x00000004 /* Enable interval timer interrupts */#define INTE_MIDITXENABLE 0x00000002 /* Enable MIDI transmit-buffer-empty interrupts */#define INTE_MIDIRXENABLE 0x00000001 /* Enable MIDI receive-buffer-empty interrupts */#define WC 0x10 /* Wall Clock register */#define WC_SAMPLECOUNTER_MASK 0x03FFFFC0 /* Sample periods elapsed since reset */#define WC_SAMPLECOUNTER 0x14060010#define WC_CURRENTCHANNEL 0x0000003F /* Channel [0..63] currently being serviced */ /* NOTE: Each channel takes 1/64th of a sample */ /* period to be serviced. */#define HCFG 0x14 /* Hardware config register */ /* NOTE: There is no reason to use the legacy */ /* SoundBlaster emulation stuff described below */ /* under Linux, and all kinds of weird hardware */ /* behavior can result if you try. Don't. */#define HCFG_LEGACYFUNC_MASK 0xe0000000 /* Legacy function number */#define HCFG_LEGACYFUNC_MPU 0x00000000 /* Legacy MPU */#define HCFG_LEGACYFUNC_SB 0x40000000 /* Legacy SB */#define HCFG_LEGACYFUNC_AD 0x60000000 /* Legacy AD */#define HCFG_LEGACYFUNC_MPIC 0x80000000 /* Legacy MPIC */#define HCFG_LEGACYFUNC_MDMA 0xa0000000 /* Legacy MDMA */#define HCFG_LEGACYFUNC_SPCI 0xc0000000 /* Legacy SPCI */#define HCFG_LEGACYFUNC_SDMA 0xe0000000 /* Legacy SDMA */#define HCFG_IOCAPTUREADDR 0x1f000000 /* The 4 LSBs of the captured I/O address. */#define HCFG_LEGACYWRITE 0x00800000 /* 1 = write, 0 = read */#define HCFG_LEGACYWORD 0x00400000 /* 1 = word, 0 = byte */#define HCFG_LEGACYINT 0x00200000 /* 1 = legacy event captured. Write 1 to clear. */ /* NOTE: The rest of the bits in this register */ /* _are_ relevant under Linux. */#define HCFG_PUSH_BUTTON_ENABLE 0x00100000 /* Enables Volume Inc/Dec and Mute functions */#define HCFG_BAUD_RATE 0x00080000 /* 0 = 48kHz, 1 = 44.1kHz */#define HCFG_EXPANDED_MEM 0x00040000 /* 1 = any 16M of 4G addr, 0 = 32M of 2G addr */#define HCFG_CODECFORMAT_MASK 0x00030000 /* CODEC format *//* Specific to Alice2, CA0102 */#define HCFG_CODECFORMAT_AC97_1 0x00000000 /* AC97 CODEC format -- Ver 1.03 */#define HCFG_CODECFORMAT_AC97_2 0x00010000 /* AC97 CODEC format -- Ver 2.1 */#define HCFG_AUTOMUTE_ASYNC 0x00008000 /* When set, the async sample rate convertors */ /* will automatically mute their output when */ /* they are not rate-locked to the external */ /* async audio source */#define HCFG_AUTOMUTE_SPDIF 0x00004000 /* When set, the async sample rate convertors */ /* will automatically mute their output when */ /* the SPDIF V-bit indicates invalid audio */#define HCFG_EMU32_SLAVE 0x00002000 /* 0 = Master, 1 = Slave. Slave for EMU1010 */#define HCFG_SLOW_RAMP 0x00001000 /* Increases Send Smoothing time constant *//* 0x00000800 not used on Alice2 */#define HCFG_PHASE_TRACK_MASK 0x00000700 /* When set, forces corresponding input to */ /* phase track the previous input. */ /* I2S0 can phase track the last S/PDIF input */#define HCFG_I2S_ASRC_ENABLE 0x00000070 /* When set, enables asynchronous sample rate */ /* conversion for the corresponding */ /* I2S format input *//* Rest of HCFG 0x0000000f same as below. LOCKSOUNDCACHE etc. *//* Older chips */#define HCFG_CODECFORMAT_AC97 0x00000000 /* AC97 CODEC format -- Primary Output */#define HCFG_CODECFORMAT_I2S 0x00010000 /* I2S CODEC format -- Secondary (Rear) Output */#define HCFG_GPINPUT0 0x00004000 /* External pin112 */#define HCFG_GPINPUT1 0x00002000 /* External pin110 */#define HCFG_GPOUTPUT_MASK 0x00001c00 /* External pins which may be controlled */#define HCFG_GPOUT0 0x00001000 /* External pin? (spdif enable on 5.1) */#define HCFG_GPOUT1 0x00000800 /* External pin? (IR) */#define HCFG_GPOUT2 0x00000400 /* External pin? (IR) */#define HCFG_JOYENABLE 0x00000200 /* Internal joystick enable */#define HCFG_PHASETRACKENABLE 0x00000100 /* Phase tracking enable */ /* 1 = Force all 3 async digital inputs to use */ /* the same async sample rate tracker (ZVIDEO) */#define HCFG_AC3ENABLE_MASK 0x000000e0 /* AC3 async input control - Not implemented */#define HCFG_AC3ENABLE_ZVIDEO 0x00000080 /* Channels 0 and 1 replace ZVIDEO */#define HCFG_AC3ENABLE_CDSPDIF 0x00000040 /* Channels 0 and 1 replace CDSPDIF */#define HCFG_AC3ENABLE_GPSPDIF 0x00000020 /* Channels 0 and 1 replace GPSPDIF */#define HCFG_AUTOMUTE 0x00000010 /* When set, the async sample rate convertors */ /* will automatically mute their output when */ /* they are not rate-locked to the external */ /* async audio source */#define HCFG_LOCKSOUNDCACHE 0x00000008 /* 1 = Cancel bustmaster accesses to soundcache */ /* NOTE: This should generally never be used. */#define HCFG_LOCKTANKCACHE_MASK 0x00000004 /* 1 = Cancel bustmaster accesses to tankcache */ /* NOTE: This should generally never be used. */#define HCFG_LOCKTANKCACHE 0x01020014#define HCFG_MUTEBUTTONENABLE 0x00000002 /* 1 = Master mute button sets AUDIOENABLE = 0. */ /* NOTE: This is a 'cheap' way to implement a */ /* master mute function on the mute button, and */ /* in general should not be used unless a more */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -