windows-nt/Source/XPSP1/NT/drivers/ddk/wdmaudio/sb16/common.h
2020-09-26 16:20:57 +08:00

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_