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

387 lines
9.2 KiB
C++

/********************************************************************************
** Copyright (c) 1998-2000 Microsoft Corporation. All Rights Reserved.
**
** Portions Copyright (c) 1998-1999 Intel Corporation
**
********************************************************************************/
#ifndef _COMMON_H_
#define _COMMON_H_
#include "shared.h"
/*****************************************************************************
* Structs
*****************************************************************************
*/
//
// Contains pin and node configuration of the AC97 codec.
//
typedef struct
{
// For nodes.
struct
{
BOOL bNodeConfig;
} Nodes[NODEC_TOP_ELEMENT];
// For pins.
struct
{
BOOL bPinConfig;
PWCHAR sRegistryName;
} Pins[PINC_TOP_ELEMENT];
} tHardwareConfig;
//
// We cache the AC97 registers. Additionally, we want some default values
// when the driver comes up first that are different from the HW default
// values. The string in the structure is the name of the registry entry
// that can be used instead of the hard coded default value.
//
typedef struct
{
WORD wCache;
WORD wFlags;
PWCHAR sRegistryName;
WORD wWantedDefault;
} tAC97Registers;
/*****************************************************************************
* Constants
*****************************************************************************
*/
//
// This means shadow register are to be read at least once to initialize.
//
const WORD SHREG_INVALID = 0x0001;
//
// This means shadow register should be overwritten with default value at
// driver init.
//
const WORD SHREG_INIT = 0x0002;
//
// This constant is used to prevent register caching.
//
const WORD SHREG_NOCACHE = 0x0004;
/*****************************************************************************
* Classes
*****************************************************************************
*/
/*****************************************************************************
* CAdapterCommon
*****************************************************************************
* This is the common adapter object shared by all miniports to access the
* hardware.
*/
class CAdapterCommon : public IAdapterCommon,
public IAdapterPowerManagement,
public CUnknown
{
private:
static tAC97Registers m_stAC97Registers[64]; // The shadow registers.
static tHardwareConfig m_stHardwareConfig; // The hardware configuration.
PDEVICE_OBJECT m_pDeviceObject; // Device object used for registry access.
PWORD m_pCodecBase; // The AC97 I/O port address.
PUCHAR m_pBusMasterBase; // The Bus Master base address.
BOOL m_bDirectRead; // Used during init time.
DEVICE_POWER_STATE m_PowerState; // Current power state of the device.
PMINIPORTTOPOLOGYICH m_Topology; // Miniport Topology pointer.
/*************************************************************************
* CAdapterCommon methods
*************************************************************************
*/
//
// Resets AC97 audio registers.
//
NTSTATUS InitAC97 (void);
//
// Checks for existance of registers.
//
NTSTATUS ProbeHWConfig (void);
//
// Checks for 6th bit support in the volume control.
//
NTSTATUS Check6thBitSupport (IN AC97Register, IN TopoNodeConfig);
//
// Returns true if you should disable the input or output pin.
//
BOOL DisableAC97Pin (IN TopoPinConfig);
#if (DBG)
//
// Dumps the probed configuration.
//
void DumpConfig (void);
#endif
//
// Sets AC97 registers to default.
//
NTSTATUS SetAC97Default (void);
//
// Aquires the semaphore for AC97 register access.
//
NTSTATUS AcquireCodecSemiphore (void);
//
// Checks if there is a AC97 link between ICH and codec.
//
NTSTATUS PrimaryCodecReady (void);
//
// Powers up the Codec.
//
NTSTATUS PowerUpCodec (void);
//
// Saves native audio bus master control registers values to be used
// upon suspend.
//
NTSTATUS ReadNABMCtrlRegs (void);
//
// Writes back native audio bus master control resgister to be used upon
// resume.
//
NTSTATUS RestoreNABMCtrlRegs (void);
public:
DECLARE_STD_UNKNOWN();
DEFINE_STD_CONSTRUCTOR(CAdapterCommon);
~CAdapterCommon();
/*************************************************************************
* IAdapterPowerManagement methods
*************************************************************************
*/
IMP_IAdapterPowerManagement;
/*************************************************************************
* IAdapterCommon methods
*************************************************************************
*/
//
// Initialize the adapter common object -> initialize and probe HW.
//
STDMETHODIMP_(NTSTATUS) Init
(
IN PRESOURCELIST ResourceList,
IN PDEVICE_OBJECT DeviceObject
);
//
// Returns if pin exists.
//
STDMETHODIMP_(BOOL) GetPinConfig
(
IN TopoPinConfig pin
)
{
return m_stHardwareConfig.Pins[pin].bPinConfig;
};
//
// Sets the pin configuration (exist/not exist).
//
STDMETHODIMP_(void) SetPinConfig
(
IN TopoPinConfig pin,
IN BOOL config
)
{
m_stHardwareConfig.Pins[pin].bPinConfig = config;
};
//
// Return if node exists.
//
STDMETHODIMP_(BOOL) GetNodeConfig
(
IN TopoNodeConfig node
)
{
return m_stHardwareConfig.Nodes[node].bNodeConfig;
};
//
// Sets the node configuration (exist/not exist).
//
STDMETHODIMP_(void) SetNodeConfig
(
IN TopoNodeConfig node,
IN BOOL config
)
{
m_stHardwareConfig.Nodes[node].bNodeConfig = config;
};
//
// Returns the AC97 register that is assosiated with the node.
//
STDMETHODIMP_(AC97Register) GetNodeReg
( IN TopoNodes node
)
{
return stMapNodeToReg[node].reg;
};
//
// Returns the AC97 register mask that is assosiated with the node.
//
STDMETHODIMP_(WORD) GetNodeMask
(
IN TopoNodes node
)
{
return stMapNodeToReg[node].mask;
};
//
// Reads a AC97 register.
//
STDMETHODIMP_(NTSTATUS) ReadCodecRegister
(
IN AC97Register Register,
OUT PWORD wData
);
//
// Writes a AC97 register.
//
STDMETHODIMP_(NTSTATUS) WriteCodecRegister
(
IN AC97Register Register,
IN WORD wData,
IN WORD wMask
);
//
// Reads a 8 bit ICH bus master register.
//
STDMETHODIMP_(UCHAR) ReadBMControlRegister8
(
IN ULONG ulOffset
);
//
// Reads a 16 bit ICH bus master register.
//
STDMETHODIMP_(USHORT) ReadBMControlRegister16
(
IN ULONG ulOffset
);
//
// Reads a 32 bit ICH bus master register.
//
STDMETHODIMP_(ULONG) ReadBMControlRegister32
(
IN ULONG ulOffset
);
//
// Writes a 8 bit ICH bus master register.
//
STDMETHODIMP_(void) WriteBMControlRegister
(
IN ULONG ulOffset,
IN UCHAR Value
);
//
// writes a 16 bit ICH bus master register.
//
STDMETHODIMP_(void) WriteBMControlRegister
(
IN ULONG ulOffset,
IN USHORT Value
);
// writes a 32 bit ICH bus master register.
STDMETHODIMP_(void) WriteBMControlRegister
(
IN ULONG ulOffset,
IN ULONG Value
);
//
// Write back cached mixer values to codec registers.
//
STDMETHODIMP_(NTSTATUS) RestoreCodecRegisters();
//
// Programs a sample rate.
//
STDMETHODIMP_(NTSTATUS) ProgramSampleRate
(
IN AC97Register Register,
IN DWORD dwSampleRate
);
//
// Stores the topology pointer. Used for DRM only.
//
STDMETHODIMP_(void) SetMiniportTopology (PMINIPORTTOPOLOGYICH topo)
{
m_Topology = topo;
};
//
// Returns the topology pointer. Used for DRM only.
//
STDMETHODIMP_(PMINIPORTTOPOLOGYICH) GetMiniportTopology (void)
{
return m_Topology;
};
//
// This function reads the default channel config and is called only by the
// wave miniport.
//
STDMETHODIMP_(void) ReadChannelConfigDefault
(
PDWORD pdwChannelConfig,
PWORD pwChannels
);
//
// This function writes the default channel config and is called only by the
// wave miniport.
//
STDMETHODIMP_(void) WriteChannelConfigDefault
(
DWORD dwChannelConfig
);
/*************************************************************************
* Friends
*************************************************************************
*/
friend NTSTATUS NewAdapterCommon
(
OUT PADAPTERCOMMON *OutAdapterCommon,
IN PRESOURCELIST ResourceList
);
};
#endif //_COMMON_H_