351 lines
10 KiB
C
351 lines
10 KiB
C
|
/*****************************************************************************
|
||
|
* common.h - Common code used by all the sb16 miniports.
|
||
|
*****************************************************************************
|
||
|
* Copyright (c) 1997-2000 Microsoft Corporation. All Rights Reserved.
|
||
|
*
|
||
|
* A combination of random functions that are used by all the miniports.
|
||
|
* This class also handles all the interrupts for the card.
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
/*
|
||
|
* THIS IS A BIT BROKEN FOR NOW. IT USES A SINGLETON OBJECT FOR WHICH THERE
|
||
|
* IS ONLY ONE INSTANCE PER DRIVER. THIS MEANS THERE CAN ONLY ONE CARD
|
||
|
* SUPPORTED IN ANY GIVEN MACHINE. THIS WILL BE FIXED.
|
||
|
*/
|
||
|
|
||
|
#ifndef _COMMON_H_
|
||
|
#define _COMMON_H_
|
||
|
|
||
|
#include "stdunk.h"
|
||
|
#include "portcls.h"
|
||
|
#include "DMusicKS.h"
|
||
|
#include "ksdebug.h"
|
||
|
#include "kcom.h"
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
/*****************************************************************************
|
||
|
* Constants
|
||
|
*/
|
||
|
|
||
|
//
|
||
|
// Definitions for extended caps information.
|
||
|
//
|
||
|
#define STATIC_PID_MSSB16\
|
||
|
0x1c2dfaf4, 0xad9b, 0x45b7, 0xa9, 0x6f, 0xf5, 0xdf, 0x7b, 0x7e, 0x46, 0x20
|
||
|
DEFINE_GUIDSTRUCT("1C2DFAF4-AD9B-45b7-A96F-F5DF7B7E4620", PID_MSSB16);
|
||
|
#define PID_MSSB16 DEFINE_GUIDNAMED(PID_MSSB16)
|
||
|
|
||
|
// This should match with the GUID in the inf. (ComponentId.GuidName)
|
||
|
#define STATIC_NAME_MSSB16\
|
||
|
0x9a601f1c, 0x1b41, 0x4981, 0x99, 0x14, 0xac, 0x68, 0xa3, 0xa9, 0xb0, 0x7
|
||
|
DEFINE_GUIDSTRUCT("9A601F1C-1B41-4981-9914-AC68A3A9B007", NAME_MSSB16);
|
||
|
#define NAME_MSSB16 DEFINE_GUIDNAMED(NAME_MSSB16)
|
||
|
|
||
|
#define MSSB16_VERSION 0x1
|
||
|
#define MSSB16_REVISION 0x0
|
||
|
|
||
|
//
|
||
|
// DSP/DMA constants
|
||
|
//
|
||
|
#define MAXLEN_DMA_BUFFER 0x4000
|
||
|
|
||
|
#define DSP_REG_CMSD0 0x00
|
||
|
#define DSP_REG_CMSR0 0x01
|
||
|
#define DSP_REG_CMSD1 0x02
|
||
|
#define DSP_REG_CMSR1 0x03
|
||
|
#define DSP_REG_MIXREG 0x04
|
||
|
#define DSP_REG_MIXDATA 0x05
|
||
|
#define DSP_REG_RESET 0x06
|
||
|
#define DSP_REG_FMD0 0x08
|
||
|
#define DSP_REG_FMR0 0x09
|
||
|
#define DSP_REG_READ 0x0A
|
||
|
#define DSP_REG_WRITE 0x0C
|
||
|
#define DSP_REG_DATAAVAIL 0x0E
|
||
|
|
||
|
#define DSP_REG_ACK8BIT 0x0E
|
||
|
#define DSP_REG_ACK16BIT 0x0F
|
||
|
|
||
|
//
|
||
|
// controller commands
|
||
|
//
|
||
|
#define DSP_CMD_WAVEWRPIO 0x10 // wave output (programmed I/O)
|
||
|
#define DSP_CMD_WAVEWR 0x14 // interrupt-driven 8 bit linear wave output
|
||
|
#define DSP_CMD_WAVEWRA 0x1C // auto mode 8 bit out
|
||
|
#define DSP_CMD_WAVERD 0x24 // interrupt-driven 8 bit linear wave input
|
||
|
#define DSP_CMD_WAVERDA 0x2C // auto mode 8 bit in
|
||
|
#define DSP_CMD_WAVEWRHS 0x90 // high speed mode write
|
||
|
#define DSP_CMD_WAVERDHS 0x98 // high speed mode read
|
||
|
#define DSP_CMD_SETSAMPRATE 0x40 // set sample rate
|
||
|
#define DSP_CMD_SETBLCKSIZE 0x48 // set block size
|
||
|
#define DSP_CMD_SPKRON 0xD1 // speaker on
|
||
|
#define DSP_CMD_SPKROFF 0xD3 // speaker off
|
||
|
#define DSP_CMD_SPKRSTATUS 0xD8 // speaker status (0=off, FF=on)
|
||
|
#define DSP_CMD_PAUSEDMA 0xD0 // pause DMA
|
||
|
#define DSP_CMD_CONTDMA 0xD4 // continue DMA
|
||
|
#define DSP_CMD_HALTAUTODMA 0xDA // stop DMA autoinit mode
|
||
|
#define DSP_CMD_INVERTER 0xE0 // byte inverter
|
||
|
#define DSP_CMD_GETDSPVER 0xE1 // get dsp version
|
||
|
#define DSP_CMD_GENERATEINT 0xF2 // cause sndblst to generate an interrupt.
|
||
|
|
||
|
//
|
||
|
// SB-16 support
|
||
|
//
|
||
|
#define DSP_CMD_SETDACRATE 0x41 // set SBPro-16 DAC rate
|
||
|
#define DSP_CMD_SETADCRATE 0x42 // set SBPro-16 ADC rate
|
||
|
#define DSP_CMD_STARTDAC16 0xB6 // start 16-bit DAC
|
||
|
#define DSP_CMD_STARTADC16 0xBE // start 16-bit ADC
|
||
|
#define DSP_CMD_STARTDAC8 0xC6 // start 8-bit DAC
|
||
|
#define DSP_CMD_STARTADC8 0xCE // start 8-bit ADC
|
||
|
#define DSP_CMD_PAUSEDMA16 0xD5 // pause 16-bit DMA
|
||
|
#define DSP_CMD_CONTDMA16 0xD6 // continue 16-bit DMA
|
||
|
#define DSP_CMD_HALTAUTODMA16 0xD9 // halt 16-bit DMA
|
||
|
|
||
|
//
|
||
|
// Indexed mixer registers
|
||
|
//
|
||
|
#define DSP_MIX_DATARESETIDX 0x00
|
||
|
|
||
|
#define DSP_MIX_MASTERVOLIDX_L 0x00
|
||
|
#define DSP_MIX_MASTERVOLIDX_R 0x01
|
||
|
#define DSP_MIX_VOICEVOLIDX_L 0x02
|
||
|
#define DSP_MIX_VOICEVOLIDX_R 0x03
|
||
|
#define DSP_MIX_FMVOLIDX_L 0x04
|
||
|
#define DSP_MIX_FMVOLIDX_R 0x05
|
||
|
#define DSP_MIX_CDVOLIDX_L 0x06
|
||
|
#define DSP_MIX_CDVOLIDX_R 0x07
|
||
|
#define DSP_MIX_LINEVOLIDX_L 0x08
|
||
|
#define DSP_MIX_LINEVOLIDX_R 0x09
|
||
|
#define DSP_MIX_MICVOLIDX 0x0A
|
||
|
#define DSP_MIX_SPKRVOLIDX 0x0B
|
||
|
#define DSP_MIX_OUTMIXIDX 0x0C
|
||
|
#define DSP_MIX_ADCMIXIDX_L 0x0D
|
||
|
#define DSP_MIX_ADCMIXIDX_R 0x0E
|
||
|
#define DSP_MIX_INGAINIDX_L 0x0F
|
||
|
#define DSP_MIX_INGAINIDX_R 0x10
|
||
|
#define DSP_MIX_OUTGAINIDX_L 0x11
|
||
|
#define DSP_MIX_OUTGAINIDX_R 0x12
|
||
|
#define DSP_MIX_AGCIDX 0x13
|
||
|
#define DSP_MIX_TREBLEIDX_L 0x14
|
||
|
#define DSP_MIX_TREBLEIDX_R 0x15
|
||
|
#define DSP_MIX_BASSIDX_L 0x16
|
||
|
#define DSP_MIX_BASSIDX_R 0x17
|
||
|
|
||
|
#define DSP_MIX_BASEIDX 0x30
|
||
|
#define DSP_MIX_MAXREGS (DSP_MIX_BASSIDX_R + 1)
|
||
|
|
||
|
#define DSP_MIX_IRQCONFIG 0x80
|
||
|
#define DSP_MIX_DMACONFIG 0x81
|
||
|
|
||
|
//
|
||
|
// Bit layout for DSP_MIX_OUTMIXIDX.
|
||
|
//
|
||
|
#define MIXBIT_MIC_LINEOUT 0
|
||
|
#define MIXBIT_CD_LINEOUT_R 1
|
||
|
#define MIXBIT_CD_LINEOUT_L 2
|
||
|
#define MIXBIT_LINEIN_LINEOUT_R 3
|
||
|
#define MIXBIT_LINEIN_LINEOUT_L 4
|
||
|
|
||
|
//
|
||
|
// Bit layout for DSP_MIX_ADCMIXIDX_L and DSP_MIX_ADCMIXIDX_R.
|
||
|
//
|
||
|
#define MIXBIT_MIC_WAVEIN 0
|
||
|
#define MIXBIT_CD_WAVEIN_R 1
|
||
|
#define MIXBIT_CD_WAVEIN_L 2
|
||
|
#define MIXBIT_LINEIN_WAVEIN_R 3
|
||
|
#define MIXBIT_LINEIN_WAVEIN_L 4
|
||
|
#define MIXBIT_SYNTH_WAVEIN_R 5
|
||
|
#define MIXBIT_SYNTH_WAVEIN_L 6
|
||
|
|
||
|
//
|
||
|
// Bit layout for MIXREG_MIC_AGC
|
||
|
//
|
||
|
#define MIXBIT_MIC_AGC 0
|
||
|
|
||
|
//
|
||
|
// MPU401 ports
|
||
|
//
|
||
|
#define MPU401_REG_STATUS 0x01 // Status register
|
||
|
#define MPU401_DRR 0x40 // Output ready (for command or data)
|
||
|
#define MPU401_DSR 0x80 // Input ready (for data)
|
||
|
|
||
|
#define MPU401_REG_DATA 0x00 // Data in
|
||
|
#define MPU401_REG_COMMAND 0x01 // Commands
|
||
|
#define MPU401_CMD_RESET 0xFF // Reset command
|
||
|
#define MPU401_CMD_UART 0x3F // Switch to UART mod
|
||
|
|
||
|
typedef struct
|
||
|
{
|
||
|
PWCHAR KeyName;
|
||
|
BYTE RegisterIndex;
|
||
|
BYTE RegisterSetting;
|
||
|
} MIXERSETTING,*PMIXERSETTING;
|
||
|
|
||
|
// {9B564276-A9B8-49a9-8456-3341CF46F9FC}
|
||
|
DEFINE_GUID(IID_IWaveMiniportSB16,
|
||
|
0x9b564276, 0xa9b8, 0x49a9, 0x84, 0x56, 0x33, 0x41, 0xcf, 0x46, 0xf9, 0xfc);
|
||
|
|
||
|
/*****************************************************************************
|
||
|
* IWaveMiniportSB16
|
||
|
*****************************************************************************
|
||
|
* Interface for wave miniport.
|
||
|
*/
|
||
|
DECLARE_INTERFACE_(IWaveMiniportSB16, IUnknown)
|
||
|
{
|
||
|
DEFINE_ABSTRACT_UNKNOWN() // For IUnknown
|
||
|
|
||
|
STDMETHOD_(void,RestoreSampleRate)
|
||
|
( THIS
|
||
|
) PURE;
|
||
|
STDMETHOD_(void,ServiceWaveISR)
|
||
|
( THIS
|
||
|
) PURE;
|
||
|
};
|
||
|
|
||
|
typedef IWaveMiniportSB16 *PWAVEMINIPORTSB16;
|
||
|
|
||
|
|
||
|
#ifdef EVENT_SUPPORT
|
||
|
// {885D00D1-E5E1-44c2-834B-64C4E1A79093}
|
||
|
DEFINE_GUID(IID_ITopoMiniportSB16,
|
||
|
0x885d00d1, 0xe5e1, 0x44c2, 0x83, 0x4b, 0x64, 0xc4, 0xe1, 0xa7, 0x90, 0x93);
|
||
|
|
||
|
/*****************************************************************************
|
||
|
* ITopoMiniportSB16
|
||
|
*****************************************************************************
|
||
|
* Interface for topology miniport.
|
||
|
*/
|
||
|
DECLARE_INTERFACE_(ITopoMiniportSB16, IUnknown)
|
||
|
{
|
||
|
DEFINE_ABSTRACT_UNKNOWN() // For IUnknown
|
||
|
|
||
|
STDMETHOD_(void,ServiceEvent)
|
||
|
( THIS
|
||
|
) PURE;
|
||
|
};
|
||
|
|
||
|
typedef ITopoMiniportSB16 *PTOPOMINIPORTSB16;
|
||
|
#endif
|
||
|
|
||
|
DEFINE_GUID(IID_IAdapterCommon,
|
||
|
0x7eda2950, 0xbf9f, 0x11d0, 0x87, 0x1f, 0x0, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
|
||
|
|
||
|
/*****************************************************************************
|
||
|
* IAdapterCommon
|
||
|
*****************************************************************************
|
||
|
* Interface for adapter common object.
|
||
|
*/
|
||
|
DECLARE_INTERFACE_(IAdapterCommon,IUnknown)
|
||
|
{
|
||
|
DEFINE_ABSTRACT_UNKNOWN() // For IUnknown
|
||
|
|
||
|
STDMETHOD_(NTSTATUS,Init)
|
||
|
( THIS_
|
||
|
IN PRESOURCELIST ResourceList,
|
||
|
IN PDEVICE_OBJECT DeviceObject
|
||
|
) PURE;
|
||
|
|
||
|
STDMETHOD_(PINTERRUPTSYNC,GetInterruptSync)
|
||
|
( THIS
|
||
|
) PURE;
|
||
|
|
||
|
STDMETHOD_(void,SetWaveMiniport)
|
||
|
( THIS_
|
||
|
IN PWAVEMINIPORTSB16 Miniport
|
||
|
) PURE;
|
||
|
|
||
|
STDMETHOD_(BYTE,ReadController)
|
||
|
( THIS
|
||
|
) PURE;
|
||
|
|
||
|
STDMETHOD_(BOOLEAN,WriteController)
|
||
|
( THIS_
|
||
|
IN BYTE Value
|
||
|
) PURE;
|
||
|
|
||
|
STDMETHOD_(NTSTATUS,ResetController)
|
||
|
( THIS
|
||
|
) PURE;
|
||
|
|
||
|
STDMETHOD_(void,MixerRegWrite)
|
||
|
( THIS_
|
||
|
IN BYTE Index,
|
||
|
IN BYTE Value
|
||
|
) PURE;
|
||
|
|
||
|
STDMETHOD_(BYTE,MixerRegRead)
|
||
|
( THIS_
|
||
|
IN BYTE Index
|
||
|
) PURE;
|
||
|
|
||
|
STDMETHOD_(void,MixerReset)
|
||
|
( THIS
|
||
|
) PURE;
|
||
|
|
||
|
STDMETHOD_(NTSTATUS,RestoreMixerSettingsFromRegistry)
|
||
|
( THIS
|
||
|
) PURE;
|
||
|
|
||
|
STDMETHOD_(NTSTATUS,SaveMixerSettingsToRegistry)
|
||
|
( THIS
|
||
|
) PURE;
|
||
|
|
||
|
#ifdef EVENT_SUPPORT
|
||
|
STDMETHOD_(void,SetTopologyMiniport)
|
||
|
( THIS_
|
||
|
IN PTOPOMINIPORTSB16 Miniport
|
||
|
) PURE;
|
||
|
#endif
|
||
|
};
|
||
|
|
||
|
typedef IAdapterCommon *PADAPTERCOMMON;
|
||
|
|
||
|
|
||
|
/*****************************************************************************
|
||
|
* NewAdapterCommon()
|
||
|
*****************************************************************************
|
||
|
* Create a new adapter common object.
|
||
|
*/
|
||
|
NTSTATUS
|
||
|
NewAdapterCommon
|
||
|
(
|
||
|
OUT PUNKNOWN * Unknown,
|
||
|
IN REFCLSID,
|
||
|
IN PUNKNOWN UnknownOuter OPTIONAL,
|
||
|
IN POOL_TYPE PoolType
|
||
|
);
|
||
|
|
||
|
/*****************************************************************************
|
||
|
* PropertyHandler_ComponentId
|
||
|
*****************************************************************************
|
||
|
* This is the propertyhandler for KSPROPERTY_GENERAL_COMPONENTID
|
||
|
*/
|
||
|
NTSTATUS
|
||
|
PropertyHandler_ComponentId
|
||
|
(
|
||
|
IN PPCPROPERTY_REQUEST PropertyRequest
|
||
|
);
|
||
|
|
||
|
/*****************************************************************************
|
||
|
* AutomationFilter
|
||
|
*****************************************************************************
|
||
|
* This is the automation table for miniport filter.
|
||
|
*/
|
||
|
static
|
||
|
PCPROPERTY_ITEM PropertiesFilter[] =
|
||
|
{
|
||
|
{
|
||
|
&KSPROPSETID_General,
|
||
|
KSPROPERTY_GENERAL_COMPONENTID,
|
||
|
KSPROPERTY_TYPE_GET | KSPROPERTY_TYPE_BASICSUPPORT,
|
||
|
PropertyHandler_ComponentId
|
||
|
},
|
||
|
};
|
||
|
|
||
|
DEFINE_PCAUTOMATION_TABLE_PROP(AutomationFilter, PropertiesFilter);
|
||
|
|
||
|
|
||
|
#endif //_COMMON_H_
|