📄 directif.cpp
字号:
/*+++ *******************************************************************\
*
* Copyright and Disclaimer:
*
* ---------------------------------------------------------------
* This software is provided "AS IS" without warranty of any kind,
* either expressed or implied, including but not limited to the
* implied warranties of noninfringement, merchantability and/or
* fitness for a particular purpose.
* ---------------------------------------------------------------
*
* Copyright (c) 2008 Conexant Systems, Inc.
* All rights reserved.
*
\******************************************************************* ---*/
#include "directif.h"
#include "device.h"
#include "debug.h"
#include "registryAccess.h"
#include "miscfuncs.h"
#include "hammerhead_registers.h"
static void
pauseThread( int ms );
/**
* Pauses the thread execution.
*
* @param ms An int number of milliseconds to wait.
*/
static void
pauseThread( int ms )
{
LARGE_INTEGER Interval;
// Convert the input interval from units of milliseconds to units
// of 100ns.
Interval.QuadPart = (LONGLONG)(ms);
Interval.QuadPart *= 10000; // number of 100 ns intervals in 1 ms
Interval.QuadPart *= -1; // negative value indicates relative wait
// Tell the system to wait. KeDelayExecutionThread() is documented as
// the safe way to wait for extended periods (more than 50us).
NTSTATUS Status = KeDelayExecutionThread(
KernelMode,
FALSE,
&Interval );
}
/////////////////////////////////////////////////////////////////////////////////////////
DirectIF::DirectIF(DEVICE_OBJECT* p_do, Device *p_device,SyncRegIo* p_registers, BOOL enableAGCalgorithm):
_p_device (p_device),
_p_registers(p_registers),
_mode(KSPROPERTY_TUNER_MODE_TV),
_enableAGCalgorithm(enableAGCalgorithm)
{
DbgLog(("DirectIF::DirectIF\n"));
_standard = KS_AnalogVideo_NTSC_M;
}
/////////////////////////////////////////////////////////////////////////////////////////
DirectIF::~DirectIF()
{
DbgLog(("DirectIF::~DirectIF\n"));
}
/////////////////////////////////////////////////////////////////////////////////////////
VOID DirectIF::initialize()
{
DbgLog(("DirectIF::initialize\n"));
setStandard(_standard);
}
/////////////////////////////////////////////////////////////////////////////////////////
VOID DirectIF::powerUp()
{
DbgLog(("DirectIF::powerUp\n"));
setStandard(_standard);
}
VOID DirectIF::powerDown()
{
DbgLog(("DirectIF::powerDown\n"));
//todo: finish this
}
/////////////////////////////////////////////////////////////////////////////////////////
VOID DirectIF::setStandard(DWORD standard, ULONG mode)
{
if (mode!=_mode)
{
_mode = mode;
if (mode == KSPROPERTY_TUNER_MODE_FM_RADIO)
{
_p_registers->writeDword(DIF_MISC_CTRL, 0x7a080000);
//disable group delay compensation filter
_p_registers->writeDword(DIF_COMP_FLT_CTRL, 0x00000000);
//set the center frequency of the A/V separation filter for center freq = 5.5 MHz
_p_registers->writeDword(DIF_AV_SEP_CTRL, 0x01312B13);
}
else
{
setStandard(standard);
}
}
}
/////////////////////////////////////////////////////////////////////////////////////////
VOID DirectIF::ResetAGCafterChannelChange()
{
DWORD misc_ctrl = 0;
_p_registers->readDword(DIF_MISC_CTRL, &misc_ctrl);
_p_registers->writeDword(DIF_MISC_CTRL, 0x02000001);
sleep(10);
_p_registers->writeDword(DIF_MISC_CTRL, 0x0A000001);
_p_registers->writeDword(DIF_MISC_CTRL, 0x1A000001);
_p_registers->writeDword(DIF_MISC_CTRL, 0x3A000001);
_p_registers->writeDword(DIF_MISC_CTRL, misc_ctrl);
}
/////////////////////////////////////////////////////////////////////////////////////////
VOID DirectIF::setStandard(DWORD standard)
{
DWORD dif_misc_ctrl_value = 0;
DbgLog(("DirectIF::setStandard to %lx\n",standard));
_p_registers->readDword(DIF_MISC_CTRL, &dif_misc_ctrl_value);
_standard = standard;
ConfigureC2HHforLowIF(_mode);
switch (standard)
{
case DIF_USE_BASEBAND: // Baseband
// There is a different SRC_PHASE_INC value for baseband vs. DIF
_p_registers->writeDword(DIF_SRC_PHASE_INC, 0xDF7DF83);
_p_registers->readDword(DIF_MISC_CTRL, &dif_misc_ctrl_value);
dif_misc_ctrl_value |= FLD_DIF_DIF_BYPASS;
_p_registers->writeDword(DIF_MISC_CTRL, dif_misc_ctrl_value);
break;
case KS_AnalogVideo_PAL_B:
case KS_AnalogVideo_PAL_G:
_p_registers->RegMaskWrite( 32, DIF_PLL_CTRL, 0, 31, 0x6503bc0c);
_p_registers->RegMaskWrite( 32, DIF_PLL_CTRL1, 0, 31, 0xbd038c85);
_p_registers->RegMaskWrite( 32, DIF_PLL_CTRL2, 0, 31, 0x1db4640a);
_p_registers->RegMaskWrite( 32, DIF_PLL_CTRL3, 0, 31, 0x00008800);
_p_registers->RegMaskWrite( 32, DIF_AGC_IF_REF, 0, 31, 0x44400380);
_p_registers->RegMaskWrite( 32, DIF_AGC_CTRL_IF, 0, 31, 0xDA302600);
_p_registers->RegMaskWrite( 32, DIF_AGC_CTRL_INT, 0, 31, 0xDA261700);
_p_registers->RegMaskWrite( 32, DIF_AGC_CTRL_RF, 0, 31, 0xDA262600);
_p_registers->RegMaskWrite( 32, DIF_AGC_IF_INT_CURRENT, 0, 31, 0x26001700);
_p_registers->RegMaskWrite( 32, DIF_AGC_RF_CURRENT, 0, 31, 0x00002660);
_p_registers->RegMaskWrite( 32, DIF_VIDEO_AGC_CTRL, 0, 31, 0x0c800800);
_p_registers->RegMaskWrite( 32, DIF_VID_AUD_OVERRIDE, 0, 31, 0x27000100);
_p_registers->RegMaskWrite( 32, DIF_AV_SEP_CTRL, 0, 31, 0x3F3530EC);
_p_registers->RegMaskWrite( 32, DIF_COMP_FLT_CTRL, 0, 31, 0x00A653A8);
_p_registers->RegMaskWrite( 32, DIF_SRC_PHASE_INC, 0, 31, 0x1befbf06);
_p_registers->RegMaskWrite( 32, DIF_SRC_GAIN_CONTROL, 0, 31, 0x000035e8);
_p_registers->RegMaskWrite( 32, DIF_RPT_VARIANCE, 0, 31, 0x00000000);
// Save the Spec Inversion value
dif_misc_ctrl_value &= FLD_DIF_SPEC_INV;
dif_misc_ctrl_value |=0x3a013F11;
break;
case KS_AnalogVideo_PAL_D:
_p_registers->RegMaskWrite( 32, DIF_PLL_CTRL, 0, 31, 0x6503bc0c);
_p_registers->RegMaskWrite( 32, DIF_PLL_CTRL1, 0, 31, 0xbd038c85);
_p_registers->RegMaskWrite( 32, DIF_PLL_CTRL2, 0, 31, 0x1db4640a);
_p_registers->RegMaskWrite( 32, DIF_PLL_CTRL3, 0, 31, 0x00008800);
_p_registers->RegMaskWrite( 32, DIF_AGC_IF_REF, 0, 31, 0x44400380);
_p_registers->RegMaskWrite( 32, DIF_AGC_CTRL_IF, 0, 31, 0xDA302600);
_p_registers->RegMaskWrite( 32, DIF_AGC_CTRL_INT, 0, 31, 0xDA261700);
_p_registers->RegMaskWrite( 32, DIF_AGC_CTRL_RF, 0, 31, 0xDA262600);
_p_registers->RegMaskWrite( 32, DIF_AGC_IF_INT_CURRENT, 0, 31, 0x26001700);
_p_registers->RegMaskWrite( 32, DIF_AGC_RF_CURRENT, 0, 31, 0x00002660);
_p_registers->RegMaskWrite( 32, DIF_VIDEO_AGC_CTRL, 0, 31, 0x0c800800);
_p_registers->RegMaskWrite( 32, DIF_VID_AUD_OVERRIDE, 0, 31, 0x27000100);
_p_registers->RegMaskWrite( 32, DIF_AV_SEP_CTRL, 0, 31, 0x3F3934EA);
_p_registers->RegMaskWrite( 32, DIF_COMP_FLT_CTRL, 0, 31, 0x00000000);
_p_registers->RegMaskWrite( 32, DIF_SRC_PHASE_INC, 0, 31, 0x1befbf06);
_p_registers->RegMaskWrite( 32, DIF_SRC_GAIN_CONTROL, 0, 31, 0x000035e8);
_p_registers->RegMaskWrite( 32, DIF_RPT_VARIANCE, 0, 31, 0x00000000);
// Save the Spec Inversion value
dif_misc_ctrl_value &= FLD_DIF_SPEC_INV;
dif_misc_ctrl_value |=0x3a023F11;
break;
case KS_AnalogVideo_PAL_I:
_p_registers->RegMaskWrite( 32, DIF_PLL_CTRL, 0, 31, 0x6503bc0c);
_p_registers->RegMaskWrite( 32, DIF_PLL_CTRL1, 0, 31, 0xbd038c85);
_p_registers->RegMaskWrite( 32, DIF_PLL_CTRL2, 0, 31, 0x1db4640a);
_p_registers->RegMaskWrite( 32, DIF_PLL_CTRL3, 0, 31, 0x00008800);
_p_registers->RegMaskWrite( 32, DIF_AGC_IF_REF, 0, 31, 0x44400380);
_p_registers->RegMaskWrite( 32, DIF_AGC_CTRL_IF, 0, 31, 0xDA302600);
_p_registers->RegMaskWrite( 32, DIF_AGC_CTRL_INT, 0, 31, 0xDA261700);
_p_registers->RegMaskWrite( 32, DIF_AGC_CTRL_RF, 0, 31, 0xDA262600);
_p_registers->RegMaskWrite( 32, DIF_AGC_IF_INT_CURRENT, 0, 31, 0x26001700);
_p_registers->RegMaskWrite( 32, DIF_AGC_RF_CURRENT, 0, 31, 0x00002660);
_p_registers->RegMaskWrite( 32, DIF_VIDEO_AGC_CTRL, 0, 31, 0x0c800800);
_p_registers->RegMaskWrite( 32, DIF_VID_AUD_OVERRIDE, 0, 31, 0x27000100);
_p_registers->RegMaskWrite( 32, DIF_AV_SEP_CTRL, 0, 31, 0x5F39A934);
_p_registers->RegMaskWrite( 32, DIF_COMP_FLT_CTRL, 0, 31, 0x00000000);
_p_registers->RegMaskWrite( 32, DIF_SRC_PHASE_INC, 0, 31, 0x1befbf06);
_p_registers->RegMaskWrite( 32, DIF_SRC_GAIN_CONTROL, 0, 31, 0x000035e8);
_p_registers->RegMaskWrite( 32, DIF_RPT_VARIANCE, 0, 31, 0x00000000);
// Save the Spec Inversion value
dif_misc_ctrl_value &= FLD_DIF_SPEC_INV;
dif_misc_ctrl_value |=0x3a033F11;
break;
case KS_AnalogVideo_PAL_M:
// 28 Nov 2006 as per Allan Boerner for improved Low Frequency Phase Noise
_p_registers->writeDword(DIF_PLL_CTRL, 0xFF01FF0C);
_p_registers->writeDword(DIF_PLL_CTRL1, 0xbd038c85);
_p_registers->writeDword(DIF_PLL_CTRL2, 0x1db4640a);
_p_registers->writeDword(DIF_PLL_CTRL3, 0x00008800);
_p_registers->writeDword(DIF_AGC_IF_REF, 0x44400600);
_p_registers->writeDword(DIF_AGC_IF_INT_CURRENT,0x26001700);
_p_registers->writeDword(DIF_AGC_RF_CURRENT, 0x00002660);
_p_registers->writeDword(DIF_VIDEO_AGC_CTRL, 0x0c800800);
_p_registers->writeDword(DIF_VID_AUD_OVERRIDE, 0x27000100);
_p_registers->writeDword(DIF_AV_SEP_CTRL, 0x012c405d);
_p_registers->writeDword(DIF_COMP_FLT_CTRL, 0x009f50c1);
_p_registers->writeDword(DIF_MISC_CTRL, 0x3a280040);
_p_registers->writeDword(DIF_SRC_PHASE_INC, 0x1befbf06);
_p_registers->writeDword(DIF_SRC_GAIN_CONTROL, 0x000035e8);
_p_registers->writeDword(DIF_SOFT_RST_CTRL_REVB,0x00000000);
dif_misc_ctrl_value = 0x3A0A0000;
break;
case KS_AnalogVideo_PAL_N:
// 28 Nov 2006 as per Allan Boerner for improved Low Frequency Phase Noise
_p_registers->writeDword(DIF_PLL_CTRL, 0xFF01FF0C);
_p_registers->writeDword(DIF_PLL_CTRL1, 0xbd038c85);
_p_registers->writeDword(DIF_PLL_CTRL2, 0x1db4640a);
_p_registers->writeDword(DIF_PLL_CTRL3, 0x00008800);
_p_registers->writeDword(DIF_AGC_IF_REF, 0x44400600);
_p_registers->writeDword(DIF_AGC_IF_INT_CURRENT,0x26001700);
_p_registers->writeDword(DIF_AGC_RF_CURRENT, 0x00002660);
_p_registers->writeDword(DIF_VIDEO_AGC_CTRL, 0x0c800800);
_p_registers->writeDword(DIF_VID_AUD_OVERRIDE, 0x27000100);
_p_registers->writeDword(DIF_AV_SEP_CTRL, 0x413530EC);
_p_registers->writeDword(DIF_COMP_FLT_CTRL, 0x009f50c1);
_p_registers->writeDword(DIF_SRC_PHASE_INC, 0x1befbf06);
_p_registers->writeDword(DIF_SRC_GAIN_CONTROL, 0x000035e8);
_p_registers->writeDword(DIF_SOFT_RST_CTRL_REVB,0x00000000);
dif_misc_ctrl_value = 0x3a090040;
break;
case KS_AnalogVideo_SECAM_B:
case KS_AnalogVideo_SECAM_D:
case KS_AnalogVideo_SECAM_L:
_p_registers->RegMaskWrite( 32, DIF_PLL_CTRL, 0, 31, 0x6503bc0c);
_p_registers->RegMaskWrite( 32, DIF_PLL_CTRL1, 0, 31, 0xbd038c85);
_p_registers->RegMaskWrite( 32, DIF_PLL_CTRL2, 0, 31, 0x1db4640a);
_p_registers->RegMaskWrite( 32, DIF_PLL_CTRL3, 0, 31, 0x00008800);
_p_registers->RegMaskWrite( 32, DIF_AGC_IF_REF, 0, 31, 0x88800380);
_p_registers->RegMaskWrite( 32, DIF_AGC_CTRL_IF, 0, 31, 0xe0262600);
_p_registers->RegMaskWrite( 32, DIF_AGC_CTRL_INT, 0, 31, 0xc2171700);
_p_registers->RegMaskWrite( 32, DIF_AGC_CTRL_RF, 0, 31, 0xc2262600);
_p_registers->RegMaskWrite( 32, DIF_AGC_IF_INT_CURRENT, 0, 31, 0x26001700);
_p_registers->RegMaskWrite( 32, DIF_AGC_RF_CURRENT, 0, 31, 0x00002660);
_p_registers->RegMaskWrite( 32, DIF_VID_AUD_OVERRIDE, 0, 31, 0x27000100);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -