windows-nt/Source/XPSP1/NT/drivers/wdm/bda/samples/mauitune/philtune.h
2020-09-26 16:20:57 +08:00

768 lines
17 KiB
C++

#include "common.h"
#include "ksvsb.h"
#include "i2script.h"
#include "gpio.h"
#include "tunerdef.h"
#include "bdadebug.h"
#include "wdmdrv.h"
#include "mpoc.h"
#include "util.h"
#include "tuner.h"
#include "vsb1.h"
#include "vsb2.h"
#define DYNAMIC_TOPOLOGY TRUE
#define ANTENNA TRUE
#define IsEqualGUID(rguid1, rguid2) (!memcmp(rguid1, rguid2, sizeof(GUID)))
/**************************************************************/
/* Driver Name - Change this to reflect your executable name! */
/**************************************************************/
#define MODULENAME "PhilTune"
#define MODULENAMEUNICODE L"PhilTune"
#define STR_MODULENAME MODULENAME
// This defines the name of the WMI device that manages service IOCTLS
#define DEVICENAME (L"\\\\.\\" MODULENAMEUNICODE)
#define SYMBOLICNAME (L"\\DosDevices\\" MODULENAMEUNICODE)
// This structure represents what the underlying device can do.
//
// Note - It is possible to set conflicting settings. In this case
// it is the responsibilty of the CheckChanges code to return an
// error. Only a self-consistent tuner resource should be submitted to
// the underlying device.
//
typedef struct _PHILIPS_TUNER_RESOURCE
{
GUID guidDemodulatorNode;
ULONG ulhzCarrierFrequency;// The channel frequency without
// The IMFrequency added in.
} PHILIPS_TUNER_RESOURCE, * PPHILIPS_TUNER_RESOURCE;
#define MAX_FILTER_PINS 2
typedef struct _PHILIPS_PIN_INFO
{
ULONG ulPinType;
ULONG ulIdConnectedPin;
} PHILIPS_PIN_INFO, * PPHILIPS_PIN_INFO;
extern const KSDEVICE_DESCRIPTOR DeviceDescriptor;
class CFilter {
public:
//
// AVStream Filter Dispatch Functions
//
static
STDMETHODIMP_(NTSTATUS)
Create(
IN OUT PKSFILTER Filter,
IN PIRP Irp
);
static
STDMETHODIMP_(NTSTATUS)
FilterClose(
IN OUT PKSFILTER Filter,
IN PIRP Irp
);
static
STDMETHODIMP
Process(
IN PKSFILTER Filter,
IN PKSPROCESSPIN_INDEXENTRY ProcessPinsIndex
);
//
// KSMETHODSETID_BdaChangeSync - Filter change sync methods
//
static
STDMETHODIMP_(NTSTATUS)
StartChanges(
IN PIRP pIrp,
IN PKSMETHOD pKSMethod,
OPTIONAL PVOID pvIgnored
);
static
STDMETHODIMP_(NTSTATUS)
CheckChanges(
IN PIRP pIrp,
IN PKSMETHOD pKSMethod,
OPTIONAL PVOID pvIgnored
);
static
STDMETHODIMP_(NTSTATUS)
CommitChanges(
IN PIRP pIrp,
IN PKSMETHOD pKSMethod,
OPTIONAL PVOID pvIgnored
);
static
STDMETHODIMP_(NTSTATUS)
GetChangeState(
IN PIRP pIrp,
IN PKSMETHOD pKSMethod,
OUT PULONG pulChangeState
);
//
// KSMETHODSETID_BdaDeviceConfiguration - Methods to modify filter topology.
//
static
STDMETHODIMP_(NTSTATUS)
CreateTopology(
IN PIRP pIrp,
IN PKSMETHOD pKSMethod,
OPTIONAL PVOID pvIgnored
);
//
// PROPSETID_VSB - Private Property Set
//
static
STDMETHODIMP_(NTSTATUS)
GetVsbCapabilitiesProperty(
IN PIRP pIrp,
IN PKSPROPERTY pKSProperty,
OUT PKSPROPERTY_VSB_CAP_S pProperty
);
static
STDMETHODIMP_(NTSTATUS)
SetVsbCapabilitiesProperty(
IN PIRP pIrp,
IN PKSPROPERTY pKSProperty,
IN PKSPROPERTY_VSB_CAP_S pProperty
);
static
STDMETHODIMP_(NTSTATUS)
GetVsbRegisterProperty(
IN PIRP pIrp,
IN PKSPROPERTY pKSProperty,
OUT PKSPROPERTY_VSB_REG_CTRL_S pProperty
);
static
STDMETHODIMP_(NTSTATUS)
SetVsbRegisterProperty(
IN PIRP pIrp,
IN PKSPROPERTY pKSProperty,
IN PKSPROPERTY_VSB_REG_CTRL_S pProperty
);
static
STDMETHODIMP_(NTSTATUS)
GetVsbCoefficientProperty(
IN PIRP pIrp,
IN PKSPROPERTY pKSProperty,
OUT PKSPROPERTY_VSB_COEFF_CTRL_S pProperty
);
static
STDMETHODIMP_(NTSTATUS)
SetVsbCoefficientProperty(
IN PIRP pIrp,
IN PKSPROPERTY pKSProperty,
IN PKSPROPERTY_VSB_COEFF_CTRL_S pProperty
);
static
STDMETHODIMP_(NTSTATUS)
GetVsbDiagControlProperty(
IN PIRP pIrp,
IN PKSPROPERTY pKSProperty,
OUT PKSPROPERTY_VSB_DIAG_CTRL_S pProperty
);
static
STDMETHODIMP_(NTSTATUS)
SetVsbDiagControlProperty(
IN PIRP pIrp,
IN PKSPROPERTY pKSProperty,
IN PKSPROPERTY_VSB_DIAG_CTRL_S pProperty
);
static
STDMETHODIMP_(NTSTATUS)
SetVsbQualityControlProperty(
IN PIRP pIrp,
IN PKSPROPERTY pKSProperty,
IN PKSPROPERTY_VSB_CTRL_S pProperty
);
static
STDMETHODIMP_(NTSTATUS)
SetVsbResetProperty(
IN PIRP pIrp,
IN PKSPROPERTY pKSProperty,
IN PKSPROPERTY_VSB_CTRL_S pProperty
);
STDMETHODIMP_(BDA_CHANGE_STATE)
ChangeState();
STDMETHODIMP_(class CDevice *)
GetDevice() { return m_pDevice;};
STDMETHODIMP_(NTSTATUS)
ChangeFrequency(
IN ULONG ulhzCarrierFrequency
)
{
//$Review - Should we validate the frequency here?
//
m_NewTunerResource.ulhzCarrierFrequency = ulhzCarrierFrequency;
m_BdaChangeState = BDA_CHANGES_PENDING;
return STATUS_SUCCESS;
};
STDMETHODIMP_(NTSTATUS)
ChangeDemodulator(
IN const GUID * pguidNetworkType
);
STDMETHODIMP_(NTSTATUS)
SetDeviceState(
KSSTATE newKsState
)
{
m_KsState = newKsState;
return STATUS_SUCCESS;
};
STDMETHODIMP_(NTSTATUS)
AcquireResources();
STDMETHODIMP_(NTSTATUS)
ReleaseResources();
private:
class CDevice * m_pDevice;
// Topology information
//
// We know the maximum number of pins that this filter
// can create. The Id of the pin we want information for is
// the index into the PinInfo array.
//
ULONG m_ulcPins;
PPHILIPS_PIN_INFO m_rgPinInfo[MAX_FILTER_PINS];
// Filter Properties
//
ULONG m_ulExampleProperty;
ULONG m_ulSignalSource;
GUID m_guidTuningSpace;
GUID m_guidNetworkType;
ULONG m_ulSignalState;
// Filter Resources
//
KSSTATE m_KsState;
BDA_CHANGE_STATE m_BdaChangeState;
PHILIPS_TUNER_RESOURCE m_CurTunerResource;
ULONG m_ulCurResourceID;
PHILIPS_TUNER_RESOURCE m_NewTunerResource;
ULONG m_ulNewResourceID;
};
class CDevice {
public:
//
// AVStream Device Dispatch Functions
//
static
STDMETHODIMP_(NTSTATUS)
Create(
IN PKSDEVICE pKSDevice
);
static
STDMETHODIMP_(NTSTATUS)
Start(
IN PKSDEVICE pKSDevice,
IN PIRP pIrp,
IN PCM_RESOURCE_LIST pTranslatedResourceList OPTIONAL,
IN PCM_RESOURCE_LIST pUntranslatedResourceList OPTIONAL
);
static
STDMETHODIMP
PnpStop(
IN PKSDEVICE pKSDevice,
IN PIRP pIrp
);
static
STDMETHODIMP
PnpRemove(
IN PKSDEVICE pKSDevice,
IN PIRP pIrp
);
//
// Utility functions
//
NTSTATUS
GetRegistryULONG(
PWCHAR pwcKeyName,
PULONG pulValue
);
NTSTATUS
AcquireResources(
PPHILIPS_TUNER_RESOURCE pNewTunerResource,
PULONG pulAquiredResourceID
);
NTSTATUS
ReleaseResources(
ULONG ulResourceID
);
//
// VSB property related methods
//
//$TCP - Add these to the resource
//
NTSTATUS VsbReset(UINT uiReset);
NTSTATUS SetVsbCapabilities(PKSPROPERTY_VSB_CAP_S p_Caps);
NTSTATUS GetVsbCapabilities(PKSPROPERTY_VSB_CAP_S p_Caps);
NTSTATUS
AccessRegisterList(
PKSPROPERTY_VSB_REG_CTRL_S p_RegCtrl,
UINT uiOperation);
NTSTATUS
AccessVsbCoeffList(
PKSPROPERTY_VSB_COEFF_CTRL_S p_VsbCoeff,
UINT uiOperation);
NTSTATUS SetVsbDiagMode(ULONG ulOperationMode, VSBDIAGTYPE ulType);
NTSTATUS GetVsbDiagMode(ULONG *p_ulOperationMode, ULONG *p_ulType);
NTSTATUS VsbQuality(UINT uiQu);
// Tuner property related methods
//OOL GetTunerModeCapbilities(KSPROPERTY_TUNER_MODE_CAPS_S *p_TunerModeCaps);
NTSTATUS GetTunerMode(ULONG *p_ulMode);
NTSTATUS GetTunerVideoStandard(ULONG *p_ulStandard);
NTSTATUS GetTunerStatus(PTunerStatusType p_Status);
NTSTATUS GetTunerInput(ULONG *p_ulTunerInput);
NTSTATUS SetTunerMode(ULONG ulModeToSet);
NTSTATUS GetTunerFrequency(ULONG *p_ulFreq);
NTSTATUS SetTunerFrequency(ULONG *p_ulFreq);
NTSTATUS SetTunerVideoStandard(ULONG ulStandard);
NTSTATUS SetTunerInput(ULONG ulInput);
//$REVIEW - Should this be done in Ring 0? - TCP
//
BOOL CreateQualityCheckThread();
void TimerRoutine();
void QualityCheckThread();
// void STREAMAPI TimerRoutine();
// void STREAMAPI QualityCheckThread();
public:
CVSBDemod *m_pDemod;
CTuner *m_pTuner;
BoardInfoType m_BoardInfo;
private:
PKSDEVICE m_pKSDevice;
CGpio * m_pGpio;
CI2CScript * m_pI2CScript;
CPhilTimer m_QualityCheckTimer;
BOOL m_bFirstEntry;
BOOL m_bQualityCheckActiveFlag;
// Signal Quality check parameters
UINT m_uiQualityCheckMode;
UINT m_uiQualityCheckModeAck;
CMutex m_QualityCheckMutex;
UINT m_State1Cnt;
BOOL m_bHangCheckFlag;
// Data in Misc./Mode Register
UCHAR m_ucModeInit;
UINT m_uiOutputMode;
Register m_MpocRegisters;
PHILIPS_TUNER_RESOURCE m_CurTunerResource;
NTSTATUS InitFromRegistry();
NTSTATUS SetBoard(UINT uiBoardID);
NTSTATUS BoardInitialize();
NTSTATUS ModeInit();
UINT SetRegisterList(RegisterType *p_Registers,
UINT uiNumRegisters);
UINT GetRegisterList(RegisterType *p_Registers,
UINT uiNumRegisters,
UINT uiRegisterType);
NTSTATUS MapErrorToNTSTATUS(UINT err);
// MPOC related functions
NTSTATUS MpocInit();
NTSTATUS SetMpocIFMode(ULONG ulMode);
NTSTATUS GetMpocVersion(UINT *p_version);
NTSTATUS GetMpocStatus(UINT StatusType, UINT *puiStatus);
};
class CAntennaPin {
public:
static
STDMETHODIMP_(NTSTATUS)
PinCreate(
IN OUT PKSPIN Pin,
IN PIRP Irp
);
static
STDMETHODIMP_(NTSTATUS)
PinClose(
IN OUT PKSPIN Pin,
IN PIRP Irp
);
static
STDMETHODIMP_(NTSTATUS)
PinSetDeviceState(
IN PKSPIN Pin,
IN KSSTATE ToState,
IN KSSTATE FromState
);
static
STDMETHODIMP_(NTSTATUS)
GetSignalSource(
IN PIRP Irp,
IN PKSPROPERTY pKSProperty,
IN PULONG pulProperty
);
static
STDMETHODIMP_(NTSTATUS)
PutSignalSource(
IN PIRP Irp,
IN PKSPROPERTY pKSProperty,
IN PULONG pulProperty
);
static
STDMETHODIMP_(NTSTATUS)
GetTuningSpace(
IN PIRP Irp,
IN PKSPROPERTY pKSProperty,
IN PGUID pguidProperty
);
static
STDMETHODIMP_(NTSTATUS)
PutTuningSpace(
IN PIRP Irp,
IN PKSPROPERTY pKSProperty,
IN PGUID pguidProperty
);
static
STDMETHODIMP_(NTSTATUS)
GetNetworkType(
IN PIRP Irp,
IN PKSPROPERTY pKSProperty,
IN PGUID pguidProperty
);
static
STDMETHODIMP_(NTSTATUS)
PutNetworkType(
IN PIRP Irp,
IN PKSPROPERTY pKSProperty,
IN PGUID pguidProperty
);
static
STDMETHODIMP_(NTSTATUS)
GetSignalState(
IN PIRP Irp,
IN PKSPROPERTY pKSProperty,
IN PULONG pulProperty
);
static
STDMETHODIMP_(NTSTATUS)
PutSignalState(
IN PIRP Irp,
IN PKSPROPERTY pKSProperty,
IN PULONG pulProperty
);
static
STDMETHODIMP_(NTSTATUS)
GetCenterFrequency(
IN PIRP Irp,
IN PKSPROPERTY pKSProperty,
IN PULONG pulProperty
);
static
STDMETHODIMP_(NTSTATUS)
PutCenterFrequency(
IN PIRP Irp,
IN PKSPROPERTY pKSProperty,
IN PULONG pulProperty
);
STDMETHODIMP_(class CFilter *)
GetFilter() { return m_pFilter;};
STDMETHODIMP_(void)
SetFilter(class CFilter * pFilter) { m_pFilter = pFilter;};
private:
class CFilter* m_pFilter;
ULONG ulReserved;
KSSTATE m_KsState;
// BDA Signal Properties
//
ULONG m_ulSignalSource;
GUID m_guidTuningSpace;
GUID m_guidNetworkType;
ULONG m_ulSignalState;
// RF Tuner Node Properties
//
BOOLEAN m_fFrequencyChanged;
ULONG m_ulCurrentFrequency;
ULONG m_ulPendingFrequency;
};
class CTransportPin
{
public:
static
STDMETHODIMP_(NTSTATUS)
PinCreate(
IN OUT PKSPIN Pin,
IN PIRP Irp
);
static
STDMETHODIMP_(NTSTATUS)
PinClose(
IN OUT PKSPIN Pin,
IN PIRP Irp
);
static
STDMETHODIMP_(NTSTATUS)
GetSignalSource(
IN PIRP Irp,
IN PKSPROPERTY pKSProperty,
IN PULONG pulProperty
);
static
STDMETHODIMP_(NTSTATUS)
PutSignalSource(
IN PIRP Irp,
IN PKSPROPERTY pKSProperty,
IN PULONG pulProperty
);
static
STDMETHODIMP_(NTSTATUS)
GetTuningSpace(
IN PIRP Irp,
IN PKSPROPERTY pKSProperty,
IN PGUID pguidProperty
);
static
STDMETHODIMP_(NTSTATUS)
PutTuningSpace(
IN PIRP Irp,
IN PKSPROPERTY pKSProperty,
IN PGUID pguidProperty
);
static
STDMETHODIMP_(NTSTATUS)
GetNetworkType(
IN PIRP Irp,
IN PKSPROPERTY pKSProperty,
IN PGUID pguidProperty
);
static
STDMETHODIMP_(NTSTATUS)
PutNetworkType(
IN PIRP Irp,
IN PKSPROPERTY pKSProperty,
IN PGUID pguidProperty
);
static
STDMETHODIMP_(NTSTATUS)
GetSignalState(
IN PIRP Irp,
IN PKSPROPERTY pKSProperty,
IN PULONG pulProperty
);
static
STDMETHODIMP_(NTSTATUS)
PutSignalState(
IN PIRP Irp,
IN PKSPROPERTY pKSProperty,
IN PULONG pulProperty
);
STDMETHODIMP_(class CFilter *)
GetFilter() { return m_pFilter;};
STDMETHODIMP_(void)
SetFilter(class CFilter * pFilter) { m_pFilter = pFilter;};
static
STDMETHODIMP_(NTSTATUS)
StartDemodulation(
IN PIRP Irp,
IN PKSPROPERTY pKSProperty,
IN PULONG pulProperty
);
static
STDMETHODIMP_(NTSTATUS)
StopDemodulation(
IN PIRP Irp,
IN PKSPROPERTY pKSProperty,
IN PULONG pulProperty
);
private:
KSSTATE m_KsState;
CFilter * m_pFilter;
// BDA Signal Properties
//
ULONG m_ulSignalSource;
GUID m_guidTuningSpace;
GUID m_guidNetworkType;
ULONG m_ulSignalState;
};
//
// Helper routines
//
NTSTATUS
PinSetDeviceState(
IN PKSPIN Pin,
IN KSSTATE ToState,
IN KSSTATE FromState
);
__inline CFilter *
FilterFromIRP(
PIRP pIrp
)
{
PKSFILTER pKSFilter;
pKSFilter = KsGetFilterFromIrp( pIrp);
if (!pKSFilter || !pKSFilter->Context)
{
return NULL;
}
return reinterpret_cast<CFilter*>(pKSFilter->Context);
}
__inline CAntennaPin *
AntennaPinFromIRP(
PIRP pIrp
)
{
PKSPIN pKSPin;
pKSPin = KsGetPinFromIrp( pIrp);
if (!pKSPin || !pKSPin->Context)
{
return NULL;
}
return reinterpret_cast<CAntennaPin*>(pKSPin->Context);
}
__inline CTransportPin *
TransportPinFromIRP(
PIRP pIrp
)
{
PKSPIN pKSPin;
pKSPin = KsGetPinFromIrp( pIrp);
if (!pKSPin || !pKSPin->Context)
{
return NULL;
}
return reinterpret_cast<CTransportPin*>(pKSPin->Context);
}
//
// Data declarations
//
extern const BDA_FILTER_TEMPLATE TunerBdaFilterTemplate;
extern const KSFILTER_DESCRIPTOR InitialTunerFilterDescriptor;
extern const KSFILTER_DESCRIPTOR TemplateTunerFilterDescriptor;