Annotation of sys/dev/isa/essreg.h, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: essreg.h,v 1.3 2001/01/29 06:27:59 mickey Exp $ */
! 2: /* $NetBSD: essreg.h,v 1.12 1999/06/18 20:25:23 augustss Exp $ */
! 3: /*
! 4: * Copyright 1997
! 5: * Digital Equipment Corporation. All rights reserved.
! 6: *
! 7: * This software is furnished under license and may be used and
! 8: * copied only in accordance with the following terms and conditions.
! 9: * Subject to these conditions, you may download, copy, install,
! 10: * use, modify and distribute this software in source and/or binary
! 11: * form. No title or ownership is transferred hereby.
! 12: *
! 13: * 1) Any source code used, modified or distributed must reproduce
! 14: * and retain this copyright notice and list of conditions as
! 15: * they appear in the source file.
! 16: *
! 17: * 2) No right is granted to use any trade name, trademark, or logo of
! 18: * Digital Equipment Corporation. Neither the "Digital Equipment
! 19: * Corporation" name nor any trademark or logo of Digital Equipment
! 20: * Corporation may be used to endorse or promote products derived
! 21: * from this software without the prior written permission of
! 22: * Digital Equipment Corporation.
! 23: *
! 24: * 3) This software is provided "AS-IS" and any express or implied
! 25: * warranties, including but not limited to, any implied warranties
! 26: * of merchantability, fitness for a particular purpose, or
! 27: * non-infringement are disclaimed. In no event shall DIGITAL be
! 28: * liable for any damages whatsoever, and in particular, DIGITAL
! 29: * shall not be liable for special, indirect, consequential, or
! 30: * incidental damages or damages for lost profits, loss of
! 31: * revenue or loss of use, whether such damages arise in contract,
! 32: * negligence, tort, under statute, in equity, at law or otherwise,
! 33: * even if advised of the possibility of such damage.
! 34: */
! 35:
! 36: /*
! 37: ** @(#) $RCSfile: essreg.h,v $ $Revision: 1.3 $ (SHARK) $Date: 2001/01/29 06:27:59 $
! 38: **
! 39: **++
! 40: **
! 41: ** essreg.h
! 42: **
! 43: ** FACILITY:
! 44: **
! 45: ** DIGITAL Network Appliance Reference Design (DNARD)
! 46: **
! 47: ** MODULE DESCRIPTION:
! 48: **
! 49: ** This module contains the constant definitions for the device
! 50: ** registers on the ESS Technologies 1888/1887/888 sound chip.
! 51: **
! 52: ** AUTHORS:
! 53: **
! 54: ** Blair Fidler Software Engineering Australia
! 55: ** Gold Coast, Australia.
! 56: **
! 57: ** CREATION DATE:
! 58: **
! 59: ** March 10, 1997.
! 60: **
! 61: ** MODIFICATION HISTORY:
! 62: **
! 63: **--
! 64: */
! 65:
! 66: /*
! 67: * DSP commands. This unit handles MIDI and audio capabilities.
! 68: * The DSP can be reset, data/commands can be read or written to it,
! 69: * and it can generate interrupts. Interrupts are generated for MIDI
! 70: * input or DMA completion. They seem to have neglected the fact
! 71: * that it would be nice to have a MIDI transmission complete interrupt.
! 72: * Worse, the DMA engine is half-duplex. This means you need to do
! 73: * (timed) programmed I/O to be able to record and play simulataneously.
! 74: */
! 75: #define ESS_ACMD_DAC8WRITE 0x10 /* direct-mode 8-bit DAC write */
! 76: #define ESS_ACMD_DAC16WRITE 0x11 /* direct-mode 16-bit DAC write */
! 77: #define ESS_ACMD_DMA8OUT 0x14 /* 8-bit linear DMA output */
! 78: #define ESS_ACMD_DMA16OUT 0x15 /* 16-bit linear DMA output */
! 79: #define ESS_ACMD_AUTODMA8OUT 0x1C /* auto-init 8-bit linear DMA output */
! 80: #define ESS_ACMD_AUTODMA16OUT 0x1D /* auto-init 16-bit linear DMA output */
! 81: #define ESS_ACMD_ADC8READ 0x20 /* direct-mode 8-bit ADC read */
! 82: #define ESS_ACMD_ADC16READ 0x21 /* direct-mode 16-bit ADC read */
! 83: #define ESS_ACMD_DMA8IN 0x24 /* 8-bit linear DMA input */
! 84: #define ESS_ACMD_DMA16IN 0x25 /* 16-bit linear DMA input */
! 85: #define ESS_ACMD_AUTODMA8IN 0x2C /* auto-init 8-bit linear DMA input */
! 86: #define ESS_ACMD_AUTODMA16IN 0x2D /* auto-init 16-bit linear DMA input */
! 87: #define ESS_ACMD_SETTIMECONST1 0x40 /* set time constant (1MHz base) */
! 88: #define ESS_ACMD_SETTIMECONST15 0x41 /* set time constant (1.5MHz base) */
! 89: #define ESS_ACMD_SETFILTER 0x42 /* set filter clock independently */
! 90: #define ESS_ACMD_BLOCKSIZE 0x48 /* set blk size for high speed xfer */
! 91:
! 92: #define ESS_ACMD_DMA4OUT 0x74 /* 4-bit ADPCM DMA output */
! 93: #define ESS_ACMD_DMA4OUTREF 0x75 /* 4-bit ADPCM DMA output with ref */
! 94: #define ESS_ACMD_DMA2_6OUT 0x76 /* 2.6-bit ADPCM DMA output */
! 95: #define ESS_ACMD_DMA2_6OUTREF 0x77 /* 2.6-bit ADPCM DMA output with ref */
! 96: #define ESS_ACMD_DMA2OUT 0x7A /* 2-bit ADPCM DMA output */
! 97: #define ESS_ACMD_DMA2OUTREF 0x7B /* 2-bit ADPCM DMA output with ref */
! 98: #define ESS_ACMD_SILENCEOUT 0x80 /* output a block of silence */
! 99: #define ESS_ACMD_START_AUTO_OUT 0x90 /* start auto-init 8-bit DMA output */
! 100: #define ESS_ACMD_START_OUT 0x91 /* start 8-bit DMA output */
! 101: #define ESS_ACMD_START_AUTO_IN 0x98 /* start auto-init 8-bit DMA input */
! 102: #define ESS_ACMD_START_IN 0x99 /* start 8-bit DMA input */
! 103:
! 104: #define ESS_XCMD_SAMPLE_RATE 0xA1 /* sample rate for Audio1 channel */
! 105: #define ESS_XCMD_FILTER_CLOCK 0xA2 /* filter clock for Audio1 channel*/
! 106: #define ESS_XCMD_XFER_COUNTLO 0xA4 /* */
! 107: #define ESS_XCMD_XFER_COUNTHI 0xA5 /* */
! 108: #define ESS_XCMD_AUDIO_CTRL 0xA8 /* */
! 109: #define ESS_AUDIO_CTRL_MONITOR 0x08 /* 0=disable/1=enable */
! 110: #define ESS_AUDIO_CTRL_MONO 0x02 /* 0=disable/1=enable */
! 111: #define ESS_AUDIO_CTRL_STEREO 0x01 /* 0=disable/1=enable */
! 112: #define ESS_XCMD_PREAMP_CTRL 0xA9 /* */
! 113: #define ESS_PREAMP_CTRL_ENABLE 0x04
! 114:
! 115: #define ESS_XCMD_IRQ_CTRL 0xB1 /* legacy audio interrupt control */
! 116: #define ESS_IRQ_CTRL_INTRA 0x00
! 117: #define ESS_IRQ_CTRL_INTRB 0x04
! 118: #define ESS_IRQ_CTRL_INTRC 0x08
! 119: #define ESS_IRQ_CTRL_INTRD 0x0C
! 120: #define ESS_IRQ_CTRL_MASK 0x10
! 121: #define ESS_IRQ_CTRL_EXT 0x40
! 122: #define ESS_XCMD_DRQ_CTRL 0xB2 /* audio DRQ control */
! 123: #define ESS_DRQ_CTRL_DRQA 0x04
! 124: #define ESS_DRQ_CTRL_DRQB 0x08
! 125: #define ESS_DRQ_CTRL_DRQC 0x0C
! 126: #define ESS_DRQ_CTRL_PU 0x10
! 127: #define ESS_DRQ_CTRL_EXT 0x40
! 128: #define ESS_XCMD_VOLIN_CTRL 0xB4 /* stereo input volume control */
! 129: #define ESS_1788_XCMD_AUDIO_CTRL0 0xB6
! 130: #define ESS_CTRL0_SIGNED 0x00
! 131: #define ESS_CTRL0_UNSIGNED 0x80
! 132: #define ESS_XCMD_AUDIO1_CTRL1 0xB7 /* */
! 133: #define ESS_AUDIO1_CTRL1_FIFO_CONNECT 0x80 /* 1=connected */
! 134: #define ESS_AUDIO1_CTRL1_FIFO_MONO 0x40 /* 0=stereo/1=mono */
! 135: #define ESS_AUDIO1_CTRL1_FIFO_SIGNED 0x20 /* 0=unsigned/1=signed */
! 136: #define ESS_AUDIO1_CTRL1_FIFO_STEREO 0x08 /* 0=mono/1=stereo */
! 137: #define ESS_AUDIO1_CTRL1_FIFO_SIZE 0x04 /* 0=8-bit/1=16-bit */
! 138: #define ESS_XCMD_AUDIO1_CTRL2 0xB8 /* */
! 139: #define ESS_AUDIO1_CTRL2_FIFO_ENABLE 0x01 /* 0=disable/1=enable */
! 140: #define ESS_AUDIO1_CTRL2_DMA_READ 0x02 /* 0=DMA write/1=DMA read */
! 141: #define ESS_AUDIO1_CTRL2_AUTO_INIT 0x04
! 142: #define ESS_AUDIO1_CTRL2_ADC_ENABLE 0x08 /* 0=DAC mode/1=ADC mode */
! 143: #define ESS_XCMD_DEMAND_CTRL 0xB9 /* */
! 144: #define ESS_DEMAND_CTRL_SINGLE 0x00 /* 1-byte transfers */
! 145: #define ESS_DEMAND_CTRL_DEMAND_2 0x01 /* 2-byte transfers */
! 146: #define ESS_DEMAND_CTRL_DEMAND_4 0x02 /* 4-byte transfers */
! 147:
! 148: #define ESS_ACMD_ENABLE_EXT 0xC6 /* enable ESS extension commands */
! 149: #define ESS_ACMD_DISABLE_EXT 0xC7 /* enable ESS extension commands */
! 150:
! 151: #define ESS_ACMD_PAUSE_DMA 0xD0 /* pause DMA */
! 152: #define ESS_ACMD_ENABLE_SPKR 0xD1 /* enable Audio1 DAC input to mixer */
! 153: #define ESS_ACMD_DISABLE_SPKR 0xD3 /* disable Audio1 DAC input to mixer */
! 154: #define ESS_ACMD_CONT_DMA 0xD4 /* continue paused DMA */
! 155: #define ESS_ACMD_SPKR_STATUS 0xD8 /* return Audio1 DAC status: */
! 156: #define ESS_SPKR_OFF 0x00
! 157: #define ESS_SPKR_ON 0xFF
! 158: #define ESS_ACMD_VERSION 0xE1 /* get version number */
! 159: #define ESS_ACMD_LEGACY_ID 0xE7 /* get legacy ES688/ES1688 ID bytes */
! 160:
! 161: #define ESS_MINRATE 4000
! 162: #define ESS_MAXRATE 44100
! 163:
! 164: /*
! 165: * Macros to detect valid hardware configuration data.
! 166: */
! 167: #define ESS_BASE_VALID(base) ((base) == 0x220 || (base) == 0x230 || (base) == 0x240 || (base) == 0x250)
! 168: #define ESS_IRQ1_VALID(irq) ((irq) == 5 || (irq) == 7 || (irq) == 9 || (irq) == 10)
! 169:
! 170: #define ESS_IRQ2_VALID(irq) ((irq) == 15)
! 171:
! 172: #define ESS_IRQ12_VALID(irq) ((irq) == 5 || (irq) == 7 || (irq) == 9 || (irq) == 10 || (irq) == 15)
! 173:
! 174: #define ESS_DRQ1_VALID(chan) ((chan) == 0 || (chan) == 1 || (chan) == 3)
! 175:
! 176: #define ESS_DRQ2_VALID(chan) ((chan) == 0 || (chan) == 1 || (chan) == 3 || (chan) == 5)
! 177:
! 178: #define ESS_USE_AUDIO1(model) (((model) == ESS_1788) || ((model) == ESS_1868) || ((model) ==ESS_1878) || ((model) == ESS_1869) || ((model) == ESS_1879))
! 179:
! 180: /*
! 181: * Macros to manipulate gain values
! 182: */
! 183: #define ESS_4BIT_GAIN(x) ((x) & 0xf0)
! 184: #define ESS_3BIT_GAIN(x) (((x) & 0xe0) >> 1)
! 185: #define ESS_STEREO_GAIN(l, r) ((l) | ((r) >> 4))
! 186: #define ESS_MONO_GAIN(x) ((x) >> 4)
! 187:
! 188: #ifdef ESS_AMODE_LOW
! 189: /*
! 190: * Registers used to configure ESS chip via Read Key Sequence
! 191: */
! 192: #define ESS_CONFIG_KEY_BASE 0x229
! 193: #define ESS_CONFIG_KEY_PORTS 3
! 194: #else
! 195: /*
! 196: * Registers used to configure ESS chip via System Control Register (SCR)
! 197: */
! 198: #define ESS_SCR_ACCESS_BASE 0xF9
! 199: #define ESS_SCR_ACCESS_PORTS 3
! 200: #define ESS_SCR_LOCK 0
! 201: #define ESS_SCR_UNLOCK 2
! 202:
! 203: #define ESS_SCR_BASE 0xE0
! 204: #define ESS_SCR_PORTS 2
! 205: #define ESS_SCR_INDEX 0
! 206: #define ESS_SCR_DATA 1
! 207:
! 208: /*
! 209: * Bit definitions for SCR
! 210: */
! 211: #define ESS_SCR_AUDIO_ENABLE 0x04
! 212: #define ESS_SCR_AUDIO_220 0x00
! 213: #define ESS_SCR_AUDIO_230 0x01
! 214: #define ESS_SCR_AUDIO_240 0x02
! 215: #define ESS_SCR_AUDIO_250 0x03
! 216: #endif
! 217:
! 218: /*****************************************************************************/
! 219: /* DSP Timeout Definitions */
! 220: /*****************************************************************************/
! 221: #define ESS_READ_TIMEOUT 5000 /* number of times to try a read, 5ms*/
! 222: #define ESS_WRITE_TIMEOUT 5000 /* number of times to try a write, 5ms */
! 223:
! 224:
! 225: #define ESS_NPORT 16
! 226: #define ESS_DSP_RESET 0x06
! 227: #define ESS_RESET_EXT 0x03 /* reset and use second DMA */
! 228: #define ESS_MAGIC 0xAA /* response to successful reset */
! 229:
! 230: #define ESS_DSP_READ 0x0A
! 231: #define ESS_DSP_WRITE 0x0C
! 232:
! 233: #define ESS_CLEAR_INTR 0x0E
! 234:
! 235: #define ESS_DSP_RW_STATUS 0x0C
! 236: #define ESS_DSP_WRITE_BUSY 0x80
! 237: #define ESS_DSP_READ_READY 0x40
! 238: #define ESS_DSP_READ_FULL 0x20 /* FIFO full */
! 239: #define ESS_DSP_READ_EMPTY 0x10 /* FIFO empty */
! 240: #define ESS_DSP_READ_HALF 0x08 /* FIFO half-empty */
! 241: #define ESS_DSP_READ_IRQ 0x04 /* IRQ generated */
! 242: #define ESS_DSP_READ_HALF_IRQ 0x02 /* " from half-empty flag change */
! 243: #define ESS_DSP_READ_OFLOW 0x01 /* " from DMA counter overflow */
! 244: #define ESS_DSP_READ_ANYIRQ (ESS_DSP_READ_IRQ | \
! 245: ESS_DSP_READ_HALF_IRQ | \
! 246: ESS_DSP_READ_OFLOW)
! 247:
! 248: #define ESS_MIX_REG_SELECT 0x04
! 249: #define ESS_MIX_REG_DATA 0x05
! 250: #define ESS_MIX_RESET 0x00 /* mixer reset port and value */
! 251:
! 252:
! 253: /*
! 254: * ESS Mixer registers
! 255: */
! 256: #define ESS_MREG_VOLUME_VOICE 0x14
! 257: #define ESS_MREG_VOLUME_MIC 0x1A
! 258: #define ESS_MREG_ADC_SOURCE 0x1C
! 259: #define ESS_SOURCE_MIC 0x00
! 260: #define ESS_SOURCE_CD 0x02
! 261: #define ESS_SOURCE_LINE 0x06
! 262: #define ESS_SOURCE_MIXER 0x07
! 263: #define ESS_MREG_VOLUME_MASTER 0x32
! 264: #define ESS_MREG_VOLUME_SYNTH 0x36
! 265: #define ESS_MREG_VOLUME_CD 0x38
! 266: #define ESS_MREG_VOLUME_AUXB 0x3A
! 267: #define ESS_MREG_VOLUME_PCSPKR 0x3C
! 268: #define ESS_MREG_VOLUME_LINE 0x3E
! 269: #define ESS_MREG_VOLUME_LEFT 0x60
! 270: #define ESS_MREG_VOLUME_RIGHT 0x62
! 271: #define ESS_VOLUME_MUTE 0x40
! 272: #define ESS_MREG_VOLUME_CTRL 0x64
! 273: #define ESS_MREG_SAMPLE_RATE 0x70 /* sample rate for Audio2 channel */
! 274: #define ESS_MREG_FILTER_CLOCK 0x72 /* filter clock for Audio2 channel */
! 275: #define ESS_MREG_XFER_COUNTLO 0x74 /* low-byte of DMA transfer size */
! 276: #define ESS_MREG_XFER_COUNTHI 0x76 /* high-byte of DMA transfer size */
! 277: #define ESS_MREG_AUDIO2_CTRL1 0x78 /* control register 1 for Audio2: */
! 278: #define ESS_AUDIO2_CTRL1_SINGLE 0x00
! 279: #define ESS_AUDIO2_CTRL1_DEMAND_2 0x40
! 280: #define ESS_AUDIO2_CTRL1_DEMAND_4 0x80
! 281: #define ESS_AUDIO2_CTRL1_DEMAND_8 0xC0
! 282: #define ESS_AUDIO2_CTRL1_XFER_SIZE 0x20 /* 0=8-bit/1=16-bit */
! 283: #define ESS_AUDIO2_CTRL1_AUTO_INIT 0x10
! 284: #define ESS_AUDIO2_CTRL1_FIFO_ENABLE 0x02 /* 0=disable/1=enable */
! 285: #define ESS_AUDIO2_CTRL1_DAC_ENABLE 0x01 /* 0=disable/1=enable */
! 286: #define ESS_MREG_AUDIO2_CTRL2 0x7A /* control register 2 for Audio2: */
! 287: #define ESS_AUDIO2_CTRL2_FIFO_SIZE 0x01 /* 0=8-bit/1=16-bit */
! 288: #define ESS_AUDIO2_CTRL2_CHANNELS 0x02 /* 0=mono/1=stereo */
! 289: #define ESS_AUDIO2_CTRL2_FIFO_SIGNED 0x04 /* 0=unsigned/1=signed */
! 290: #define ESS_AUDIO2_CTRL2_DMA_ENABLE 0x20 /* 0=disable/1=enable */
! 291: #define ESS_AUDIO2_CTRL2_IRQ2_ENABLE 0x40
! 292: #define ESS_AUDIO2_CTRL2_IRQ_LATCH 0x80
! 293: #define ESS_MREG_AUDIO2_CTRL3 0x7D
! 294: #define ESS_AUDIO2_CTRL3_DRQA 0x00
! 295: #define ESS_AUDIO2_CTRL3_DRQB 0x01
! 296: #define ESS_AUDIO2_CTRL3_DRQC 0x02
! 297: #define ESS_AUDIO2_CTRL3_DRQD 0x03
! 298: #define ESS_AUDIO2_CTRL3_DRQ_PD 0x04
! 299: #define ESS_MREG_INTR_ST 0x7F
! 300: #define ESS_IS_SELECT_IRQ 0x01
! 301: #define ESS_IS_ES1888 0x00
! 302: #define ESS_IS_INTRA 0x02
! 303: #define ESS_IS_INTRB 0x04
! 304: #define ESS_IS_INTRC 0x06
! 305: #define ESS_IS_INTRD 0x08
! 306: #define ESS_IS_INTRE 0x0A
CVSweb