387 lines
9.2 KiB
C++
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_
|
|
|