|
|
1.1 ! root 1: ! 2: /*++ BUILD Version: 0002 // Increment this if a change has global effects ! 3: ! 4: ! 5: Copyright (c) 1992 Microsoft Corporation ! 6: ! 7: Module Name: ! 8: ! 9: hardware.h ! 10: ! 11: Abstract: ! 12: ! 13: This include file defines constants and types for ! 14: the Sound Blaster card. ! 15: ! 16: Author: ! 17: ! 18: Robin Speed (RobinSp) 20-Oct-92 ! 19: ! 20: Revision History: ! 21: ! 22: --*/ ! 23: ! 24: // ! 25: // Configuration info ! 26: // ! 27: ! 28: #define INTERRUPT_MODE Latched ! 29: #define IRQ_SHARABLE FALSE ! 30: #define SOUND_DEF_DMACHANNEL 1 // DMA channel no ! 31: #define SOUND_DEF_INT 7 ! 32: #define SOUND_DEF_PORT 0x220 ! 33: ! 34: #define SB_BASE_PORT 0x220 ! 35: ! 36: ! 37: #define NUMBER_OF_SOUND_PORTS (0xf) ! 38: ! 39: // ! 40: // Don't support pre dsp version 1 ! 41: // ! 42: ! 43: #define MIN_DSP_VERSION 0x0100 ! 44: ! 45: // ! 46: // Defaults ! 47: // ! 48: ! 49: #define WAVE_INPUT_DEFAULT_RATE 11025 // Samples per second ! 50: #define WAVE_OUTPUT_DEFAULT_RATE 11025 // Samples per second ! 51: ! 52: // ! 53: // Port offsets from the base address ! 54: // ! 55: ! 56: #define MIX_ADDR_PORT 0x04 // Mixer ports ! 57: ! 58: #define VOICE_VOL_REG 0x04 // The mixer registers to use to set vol ! 59: #define MIC_MIX_REG 0x0A ! 60: #define LINEIN_VOL_REG 0x2E ! 61: #define SYNTH_VOL_REG 0x26 ! 62: #define OUTPUT_SETTING_REG 0x0E ! 63: ! 64: #define MIX_DATA_PORT 0x05 // Where to write volume ! 65: ! 66: #define DATA_AVAIL_PORT 0x0E // data available port offset ! 67: #define DATA_STATUS_PORT 0x0C // write data staus port ! 68: #define DATA_PORT 0x0A // data port offset ! 69: #define RESET_PORT 0x06 // dsp reset port ! 70: ! 71: // ! 72: // Version checking ! 73: // ! 74: ! 75: #define SB1(pHw) ((pHw)->DSPVersion < 0x200) ! 76: #define SB2(pHw) ((pHw)->DSPVersion >= 0x200) ! 77: #define SBPRO(pHw) ((pHw)->DSPVersion >= 0x300) ! 78: ! 79: // ! 80: // DSP commands ! 81: // ! 82: ! 83: #define DSP_GET_VERSION 0xE1 // dsp version command ! 84: #define DSP_SPEAKER_ON 0xD1 // speaker on command ! 85: #define DSP_SPEAKER_OFF 0xD3 // speaker off command ! 86: #define DSP_SET_SAMPLE_RATE 0x40 // set the sample rate ! 87: #define DSP_SET_BLOCK_SIZE 0x48 // set dma block size ! 88: #define DSP_WRITE 0x14 // Start non-auto DMA ! 89: #define DSP_WRITE_AUTO 0x1C // auto init output mode ! 90: #define DSP_READ 0x24 // Start non-auto read ! 91: #define DSP_READ_AUTO 0x2C // auto init mode input ! 92: #define DSP_HALT_DMA 0xD0 // stop dma ! 93: #define DSP_CONTINUE_DMA 0xD4 // continue halted dma ! 94: #define DSP_STOP_AUTO 0xDA // exit from auto init mode ! 95: #define DSP_MIDI_READ 0x31 // Interrupt driver midi input ! 96: #define DSP_MIDI_READ_UART 0x35 // Interrupt driver midi input (uart mode) ! 97: #define DSP_MIDI_TS_READ 0x37 // Midi time-stamped read ! 98: #define DSP_MIDI_WRITE 0x38 // Midi output ! 99: #define DSP_GENERATE_INT 0xF2 // Special code to generate a interrupt ! 100: ! 101: // ! 102: // Hardware state data ! 103: // ! 104: ! 105: typedef struct { ! 106: ULONG Key; // For debugging ! 107: #define HARDWARE_KEY (*(ULONG *)"Hw ") ! 108: ! 109: // ! 110: // Configuration ! 111: // ! 112: ! 113: USHORT DSPVersion; // Card version ! 114: BOOLEAN ThunderBoard; // it's a Thunderboard ! 115: ! 116: PUCHAR PortBase; // base port address for sound ! 117: KSPIN_LOCK HwSpinLock; // Make sure we can write ! 118: // or read after checking status ! 119: // before someone else gets in! ! 120: // (could it be a spectrum?) ! 121: ! 122: UCHAR Half; // For keeping in synch for SB1 ! 123: BOOLEAN SpeakerOn; // Speaker is on - prevent crash ! 124: // restarting DMA from Dpc routine ! 125: #if DBG ! 126: BOOLEAN LockHeld; // Get spin lock right ! 127: #endif // DBG ! 128: ! 129: // ! 130: // Hardware data ! 131: // ! 132: ! 133: BOOLEAN Stereo; // Was format stereo last time? ! 134: UCHAR Format; // Current wave format sent to device ! 135: UCHAR InputSource; // Where is input configured to? ! 136: } SOUND_HARDWARE, *PSOUND_HARDWARE; ! 137: ! 138: // ! 139: // Macros to assist in safely using our spin lock ! 140: // ! 141: ! 142: #if DBG ! 143: #define HwEnter(pHw) \ ! 144: { \ ! 145: KIRQL OldIrql; \ ! 146: KeAcquireSpinLock(&(pHw)->HwSpinLock, &OldIrql);\ ! 147: ASSERT((pHw)->LockHeld == FALSE); \ ! 148: (pHw)->LockHeld = TRUE; ! 149: ! 150: #define HwLeave(pHw) \ ! 151: ASSERT((pHw)->LockHeld == TRUE); \ ! 152: (pHw)->LockHeld = FALSE; \ ! 153: KeReleaseSpinLock(&(pHw)->HwSpinLock, OldIrql);\ ! 154: } ! 155: #else ! 156: #define HwEnter(pHw) \ ! 157: { \ ! 158: KIRQL OldIrql; \ ! 159: ASSERT((pHw)->LockHeld == FALSE); \ ! 160: KeAcquireSpinLock(&(pHw)->HwSpinLock, &OldIrql); ! 161: ! 162: #define HwLeave(pHw) \ ! 163: ASSERT((pHw)->LockHeld == TRUE); \ ! 164: KeReleaseSpinLock(&(pHw)->HwSpinLock, OldIrql);\ ! 165: } ! 166: #endif ! 167: ! 168: // ! 169: // Devices - these values are also used as array indices ! 170: // ! 171: ! 172: typedef enum { ! 173: WaveInDevice = 0, ! 174: WaveOutDevice, ! 175: MidiOutDevice, ! 176: MidiInDevice, ! 177: LineInDevice, ! 178: #ifdef MICMIX ! 179: MicDevice, ! 180: #endif // MICMIX ! 181: #ifdef MASTERVOLUME ! 182: MasterVolumeDevice, ! 183: #endif // MASTERVOLUME ! 184: NumberOfDevices ! 185: } SOUND_DEVICES; ! 186: ! 187: // ! 188: // macros for doing port reads ! 189: // ! 190: ! 191: #define INPORT(pHw, port) \ ! 192: READ_PORT_UCHAR((PUCHAR)((pHw->PortBase) + (port))) ! 193: ! 194: #define OUTPORT(pHw, port, data) \ ! 195: WRITE_PORT_UCHAR((PUCHAR)((pHw->PortBase) + (port)), (UCHAR)(data)) ! 196: ! 197: ! 198: // ! 199: // Exported routines ! 200: // ! 201: VOID ! 202: HwSetVolume( ! 203: IN PLOCAL_DEVICE_INFO pLDI ! 204: ); ! 205: UCHAR ! 206: dspRead( ! 207: IN PSOUND_HARDWARE pHw ! 208: ); ! 209: BOOLEAN ! 210: dspReset( ! 211: PSOUND_HARDWARE pHw ! 212: ); ! 213: BOOLEAN ! 214: dspWrite( ! 215: PSOUND_HARDWARE pHw, ! 216: UCHAR value ! 217: ); ! 218: USHORT ! 219: dspGetVersion( ! 220: PSOUND_HARDWARE pHw ! 221: ); ! 222: BOOLEAN ! 223: dspSpeakerOn( ! 224: PSOUND_HARDWARE pHw ! 225: ); ! 226: BOOLEAN ! 227: dspSpeakerOff( ! 228: PSOUND_HARDWARE pHw ! 229: ); ! 230: ! 231: ! 232: ! 233: /**************************************************************************** ! 234: * ! 235: * Definitions for Media Vision Pro Audio Spectrum ! 236: * ! 237: ****************************************************************************/ ! 238: ! 239: //========================================================================== ! 240: // ! 241: // Definitions from pasdef.h ! 242: // ! 243: //========================================================================== ! 244: ! 245: // ! 246: // THESE DEFINITIONS FOR CAPABILITIES FILED ! 247: // ! 248: ! 249: ! 250: #define DEFAULT_BASE 0x388 // default base I/O address of Pro AudioSpectrum ! 251: ! 252: //// THESE ARE BASE REGISTER ATES ! 253: ! 254: // ! 255: // Used only during initialization ! 256: // ! 257: ! 258: #define PCM_CONTROL 0x0f8a // ! 259: ! 260: #define ENHANCED_SCSI_DETECT_REG 0x7f89 // ! 261: ! 262: #define SYSTEM_CONFIG_1 0x8388 // ! 263: #define SYSTEM_CONFIG_2 0x8389 // ! 264: #define SYSTEM_CONFIG_3 0x838a // ! 265: #define SYSTEM_CONFIG_4 0x838b // ! 266: ! 267: #define IO_PORT_CONFIG_1 0xf388 // ! 268: #define IO_PORT_CONFIG_2 0xf389 // ! 269: #define IO_PORT_CONFIG_3 0xf38a // ! 270: ! 271: #define COMPATIBLE_REGISTER_ENABLE 0xf788 // SB and MPU emulation ! 272: #define EMULATION_ADDRESS_POINTER 0xf789 // D0-D3 is SB; D4-D7 is MPU ! 273: ! 274: #define EMULATION_INTERRUPT_POINTER 0xfb8a // MPU and SB IRQ and SB DMA settings ! 275: ! 276: #define CHIP_REV 0xff88 // MV101 chip revision number ! 277: #define MASTER_MODE_READ 0xff8b // aka Master Address Pointer ! 278: ! 279: // ! 280: // Used for volume setting ! 281: // ! 282: ! 283: #define MIXER_508_REG 0x078b // Mixer 508 1 port ! 284: ! 285: #define SERIAL_MIXER 0x0b88 // for Pas 1 and Pas 8 ! 286: #define FEATURE_ENABLE 0x0b88 // for Pas 16 boards only ! 287: #define INTERRUPT_ENABLE 0x0b89 // ! 288: #define FILTER_REGISTER 0x0b8a // ! 289: #define INTERRUPT_CTRL_REG 0x0b8b // ! 290: ! 291: ! 292: // ! 293: // Only one of each of these ! 294: // ! 295: ! 296: #define PAS_2_WAKE_UP_REG 0x9a01 // aka Master Address Pointer ! 297: ! 298: ! 299: // ! 300: // Not used here ! 301: // ! 302: ! 303: #define TIMEOUT_COUNTER 0x4388 // ! 304: #define TIMEOUT_STATUS 0x4389 // ! 305: #define WAIT_STATE 0xbf88 // ! 306: #define PRESCALE_DIVIDER 0xbf8A // ! 307: ! 308: #define SLAVE_MODE_READ 0xef8b // bits D0-D1 ! 309: ! 310: ! 311: ! 312: #define READ_PAS(pGDI, port) \ ! 313: READ_PORT_UCHAR((PUCHAR)((port) ^ (pGDI->TranslateCode))) ! 314: ! 315: #define WRITE_PAS(pGDI, port, data) \ ! 316: WRITE_PORT_UCHAR((PUCHAR)((port) ^ (pGDI->TranslateCode)), (UCHAR)(data)) ! 317: ! 318: ! 319: // useful bit definitions ! 320: #define D0 (1<<0) ! 321: #define D1 (1<<1) ! 322: #define D2 (1<<2) ! 323: #define D3 (1<<3) ! 324: #define D4 (1<<4) ! 325: #define D5 (1<<5) ! 326: #define D6 (1<<6) ! 327: #define D7 (1<<7) ! 328: ! 329: ! 330: //// BIT FIELDS FOR COMPATIBLE_REGISTER_ENABLE ! 331: #define MPU_ENABLE_BIT D0 ! 332: #define SB_ENABLE_BIT D1 ! 333: #define SB_IRQ_ENABLE_BIT D2 // read only ! 334: ! 335: //// BIT FIELDS FOR FEATURE_ENABLE (0xb88) ! 336: #define PCM_FEATURE_ENABLE D0 ! 337: #define FM_FEATURE_ENABLE D1 ! 338: #define MIXER_FEATURE_ENABLE D2 ! 339: #define SB_FEATURE_ENABLE D4 ! 340: ! 341: /// BIT FIELDS FOR PCM CONTROL ! 342: #define PCM_STEREO D0+D3 ! 343: #define PCM_DAC D4 ! 344: #define PCM_MONO D5 ! 345: #define PCM_ENGINE D6 ! 346: #define PCM_DRQ D7 ! 347: ! 348: /// BIT FIELDS FOR SYSTEM CONFIG 3 ! 349: #define C3_ENHANCED_TIMER D0 ! 350: #define C3_SB_CLOCK_EMUL D1 // don't set! see Brian Colvin ! 351: #define C3_VCO_INVERT D2 ! 352: #define C3_INVERT_BCLK D3 ! 353: #define C3_SYNC_PULSE D4 ! 354: #define C3_PSEUDO_PCM_STEREO D5 ! 355: ! 356: /// BIT FIELDS FOR INTERRUPT ENABLE ! 357: #define INT_LEFT_FM D0 ! 358: #define INT_RIGHT_FM D1 ! 359: #define INT_SB D1 ! 360: #define INT_SAMPLE_RATE D2 ! 361: #define INT_SAMPLE_BUFFER D3 ! 362: #define INT_MIDI D4 ! 363: ! 364: ! 365: ! 366: /// BIT FIELDS FOR COMPATIBLE REGISTER ENABLE ! 367: #define COMPAT_MPU D0 ! 368: #define COMPAT_SB D1 ! 369: ! 370: ! 371: /// IRQ POINTER VALUES FOR EMULATION INTERRUPT POINTER ! 372: #define EMUL_IRQ_NONE 0 ! 373: #define EMUL_IRQ_2 1 ! 374: #define EMUL_IRQ_3 2 ! 375: #define EMUL_IRQ_5 3 ! 376: #define EMUL_IRQ_7 4 ! 377: #define EMUL_IRQ_10 5 ! 378: #define EMUL_IRQ_11 6 ! 379: #define EMUL_IRQ_12 7 ! 380: ! 381: /// DMA POINTER VALUES FOR EMULATION DMA POINTER ! 382: #define EMUL_DMA_NONE 0 ! 383: #define EMUL_DMA_1 1 ! 384: #define EMUL_DMA_2 2 ! 385: #define EMUL_DMA_3 3 ! 386: ! 387: ! 388: /// BIT VALUES FOR FILTER REGISTER ! 389: #define FILTER_NOMUTE D5 ! 390: ! 391: ! 392: #define MIXCROSSCAPS_NORMAL_STEREO 0 // Left->Left, Right->Right ! 393: #define MIXCROSSCAPS_RIGHT_TO_BOTH 1 // Right->Left, Right->Right ! 394: #define MIXCROSSCAPS_LEFT_TO_BOTH 2 // Left->Left, Left->Right ! 395: #define MIXCROSSCAPS_REVERSE_STEREO 4 // Left->Right, Right->Left ! 396: #define MIXCROSSCAPS_RIGHT_TO_LEFT 8 // Right->Left, Right->Right ! 397: #define MIXCROSSCAPS_LEFT_TO_RIGHT 0x10 // Left->Left, Left->Right ! 398: ! 399: #define OUT_AMPLIFIER 0 ! 400: #define OUT_PCM 1 ! 401: ! 402: #define _LEFT 1 ! 403: #define _RIGHT 2 ! 404: ! 405: #define _BASS 0 ! 406: #define _TREBLE 1 ! 407: ! 408: ! 409: #define MV_508_ADDRESS D7 ! 410: #define MV_508_INPUT D4 ! 411: #define MV_508_SWAP D6 ! 412: #define MV_508_BASS (D0+D1) ! 413: #define MV_508_TREBLE (D2) ! 414: #define MV_508_EQMODE (D2+D0) ! 415: ! 416: #define MV_508_LOUDNESS D2 ! 417: #define MV_508_ENHANCE (D1+D0) ! 418: ! 419: /// DEFINES FOR SERIAL MIXER ! 420: #define NATIONAL_SELECTMUTE_REG 0x40 ! 421: #define NATIONAL_LOUD_ENH_REG 0x41 ! 422: #define NATIONAL_BASS_REG 0x42 ! 423: #define NATIONAL_TREB_REG 0x43 ! 424: #define NATIONAL_LEFT_VOL_REG 0x44 ! 425: #define NATIONAL_RIGHT_VOL_REG 0x45 ! 426: #define NATIONAL_MODESELECT_REG 0x46 ! 427: ! 428: #define NATIONAL_COMMAND D7 ! 429: #define NATIONAL_LOUDNESS D0 ! 430: #define NATIONAL_ENHANCE D1 ! 431: ! 432: #define SERIAL_MIX_LEVEL D0 ! 433: #define SERIAL_MIX_CLOCK D1 ! 434: #define SERIAL_MIX_STROBE D2 ! 435: #define SERIAL_MIX_MASTER D4 ! 436: #define SERIAL_MIX_REALSOUND D6 ! 437: #define SERIAL_MIX_DUALFM D7 ! 438: ! 439: ! 440: // FILTER_REGISTER ! 441: #define fFIdatabits 0x1f // 00011111B filter select and decode field bits ! 442: #define fFImutebits D5 // filter mute field bit ! 443: #define fFIpcmbits (D7+D6) // 11000000B filter sample rate field bits ! 444: #define bFImute D5 // filter mute bit ! 445: #define bFIsrate D6 // filter sample rate timer mask ! 446: #define bFIsbuff D7 // filter sample buffer counter mask ! 447: ! 448: #define FILTERMAX 6 // six possible settings ! 449: ! 450: #define FILTER_MUTE 0 // mute - goes to PC speaker ! 451: #define FILTER_LEVEL_1 1 // 20hz to 2.9khz ! 452: #define FILTER_LEVEL_2 2 // 20hz to 5.9khz ! 453: #define FILTER_LEVEL_3 3 // 20hz to 8.9khz ! 454: #define FILTER_LEVEL_4 4 // 20hz to 11.9khz ! 455: #define FILTER_LEVEL_5 5 // 20hz to 15.9khz ! 456: #define FILTER_LEVEL_6 6 // 20hz to 17.8khz ! 457: ! 458: ! 459: /// SLAVE_MODE_READ BITS ! 460: #define SLAVE_MODE_OPL3 D2 ! 461: #define SLAVE_MODE_16 D3 ! 462: ! 463: ! 464: #define PASX_IN(pFI, port) \ ! 465: READ_PORT_UCHAR(pFI->PROBase + ( (port) ^ pFI->TranslateCode) ) ! 466: ! 467: #define PASX_OUT(pFI, port, data) \ ! 468: WRITE_PORT_UCHAR(pFI->PROBase + ((port) ^ pFI->TranslateCode), (UCHAR)(data)) ! 469: ! 470: ! 471: //========================================================================== ! 472: // ! 473: // Definitions from patch.h (mixer stuff) ! 474: // ! 475: //========================================================================== ! 476: ! 477: // INPUT LINES ! 478: #define IN_SYNTHESIZER 0 ! 479: #define IN_MIXER 1 ! 480: #define IN_EXTERNAL 2 ! 481: #define IN_INTERNAL 3 ! 482: #define IN_MICROPHONE 4 ! 483: #define IN_PCM 5 ! 484: #define IN_PC_SPEAKER 6 ! 485: #define IN_SNDBLASTER 7 ! 486: ! 487: #define OUT_AMPLIFIER 0 ! 488: #define OUT_PCM 1 ! 489: ! 490: #define NUM_IN_PATCHES 9 ! 491: #define NUM_OUT_PATCHES 3 ! 492: ! 493: ! 494: //========================================================================== ! 495: // ! 496: // Definitions from findpas.h (card searching) ! 497: // ! 498: //========================================================================== ! 499: ! 500: ! 501: ! 502: typedef struct { ! 503: USHORT wBoardRev; ! 504: USHORT wChipRev; ! 505: union ! 506: { ! 507: struct /* Our PAS_16 gives */ ! 508: { ! 509: unsigned long CDInterfaceType:2; /* 3 */ ! 510: unsigned long EnhancedSCSI:1; /* 0 - not enhanced SCSI*/ ! 511: unsigned long DAC16:1; /* 1 DAC16 */ ! 512: ! 513: unsigned long OPL_3:1; /* 1 OPL3 */ ! 514: unsigned long Mixer_508:1; /* 1 Mixer 508 */ ! 515: unsigned long DualDAC:1; /* 1 Dual DAC */ ! 516: unsigned long MPU401:1; /* 0 NO mpu401 */ ! 517: ! 518: unsigned long Slot16:1; /* 1 - slot 16 */ ! 519: unsigned long MCA:1; /* 0 - not MCA */ ! 520: unsigned long CDPC:1; /* 0 - not CDPC */ ! 521: unsigned long SoundBlaster:1; /* 1 - sound blaster */ ! 522: ! 523: unsigned long SCSI_IO_16:1; /* 1 - ? */ ! 524: unsigned long reserved:2; ! 525: unsigned long Did_HW_Init:1; /* 0 - ? */ ! 526: unsigned long unused:16; ! 527: } CapsBits; ! 528: ULONG dwCaps; ! 529: } Caps; ! 530: ULONG ProPort; ! 531: UCHAR ProDMA; ! 532: UCHAR ProIRQ; ! 533: USHORT SBPort; ! 534: UCHAR SBDMA; ! 535: UCHAR SBIRQ; ! 536: USHORT MPUPort; ! 537: UCHAR MPUIRQ; ! 538: UCHAR CDIRQ; ! 539: ULONG TranslateCode; ! 540: UCHAR ReservedB1; ! 541: UCHAR ReservedB2; ! 542: PUCHAR PROBase; ! 543: } FOUNDINFO, *PFOUNDINFO; ! 544: ! 545: ! 546: // these version numbers are found in 0B8Bh ! 547: #define PAS_VERSION_1 0x000 // original ! 548: #define PAS_PLUS 0x001 // Pro Audio Spectrum Plus with SCSI ! 549: #define PAS_SIXTEEN 0x001 // Pro Audio Spectrum 16 with SCSI ! 550: #define PAS_CDPC 0x007 // CDPC 05/06/92 mmq ! 551: #define BOARD_REV_MASK 07 ! 552: ! 553: ! 554: #define CHIP_REV_B 0x002 ! 555: #define CHIP_REV_D 0x004 ! 556: ! 557: #define NO_PAS_INSTALLED 0x000 // can't find board ! 558: ! 559: ! 560: // CD interface type definitions ! 561: #define NO_INTERFACE 0 ! 562: #define MITSUMI_TYPE 1 ! 563: #define SONY_TYPE 2 ! 564: #define SCSI_TYPE 3
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.