⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 directif.cpp

📁 完整的基于Conxant平台的USB电视棒的WIN驱动程序。
💻 CPP
📖 第 1 页 / 共 5 页
字号:
/*+++ *******************************************************************\
*
*  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 + -