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

📄 thresher.cpp

📁 完整的基于Conxant平台的USB电视棒的WIN驱动程序。
💻 CPP
📖 第 1 页 / 共 3 页
字号:
/*+++ *******************************************************************\
*
*  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 "Thresher.h"
#include "hammerhead_registers.h"
#include "DirectIF.h"
#include "device.h"
#include "i2cIF.h"
#include "debug.h"
#include "crossbarprop.h"
#include "registryAccess.h"
#include "miscfuncs.h"
#include "Colibri.h"

ULONG SharpnessDefault  =   50;
ULONG SaturationDefault = 5000;
ULONG BrightnessDefault = 5000;
ULONG ContrastDefault   = 5000;
ULONG HueDefault        = 5000;

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 );
}


/////////////////////////////////////////////////////////////////////////////////////////
Thresher::Thresher(Device *p_device,
                   DWORD   video_standard,
                   SyncRegIo *p_registers,
                   DirectIF *p_DIF,
                   Colibri *p_colibri):
_p_registers(p_registers),
_width(720),
_height(480),
_preserved_brightness(0),
_preserved_saturation(0),
_preserved_contrast(0),
_video_muted(false),
_powered_up(true),
_p_colibri(p_colibri)
{
    _video_input = VIDEO_INPUT_COMPOSITE;
    _input_mux = 0x02;

    _video_standard = KS_AnalogVideo_NTSC_M;
    _video_mode = VIDEO_MODE_NTSC;

    _saturation = SaturationDefault;
    _hue = HueDefault;
    _brightness = BrightnessDefault;
    _contrast = ContrastDefault;
    _sharpness = SharpnessDefault;

    _p_DIF = p_DIF;

    _p_device = p_device;

    setVideoStandard(video_standard);
    setBrightness(BrightnessDefault);
    setContrast(ContrastDefault);
    setSharpness(SharpnessDefault);
    setSaturation(SaturationDefault);
    setHue(HueDefault);

    setResolution(720, 480);

    setVideoInput(_video_input, _input_mux);

    // Initialize some registers
    initializeThresher();

}

/////////////////////////////////////////////////////////////////////////////////////////
Thresher::~Thresher()
{
}

/////////////////////////////////////////////////////////////////////////////////////////
VOID Thresher::initializeRegistersAutoDetect()
{
    _p_registers->lock();    

    DWORD value;    

    _p_registers->readDword(AFE_DIAG_CTRL3, &value);
    value |= 0x00000001;    // enable TUNE_FIL_RST
    _p_registers->writeDword(AFE_DIAG_CTRL3, value);
    value &= 0xFFFFFFFE;    // disable TUNE_FIL_RST
    _p_registers->writeDword(AFE_DIAG_CTRL3, value);

    // reset thresher
    _p_registers->writeDword(SOFT_RST_CTRL, FLD_VD_SOFT_RST);
    _p_registers->writeDword(SOFT_RST_CTRL, 0x00000000);
    
    // Restore video muted
    //
    if (_video_muted)
    {
        videoMute();
    }
    else
    {
        videoUnmute();
    }

    _p_registers->readDword(HTL_CTRL, &value);
    value &= 0xFFF00000;    // clear Kd Ki default values
    value |= 0x00000802;    // change Kd Ki values
    _p_registers->writeDword(HTL_CTRL, value);

    // Disable auto config of registers
    _p_registers->readModifyWriteDword(MODE_CTRL, FLD_ACFG_DIS, _p_registers->Set_Field(FLD_ACFG_DIS, 1));

    // set slow color locking mode in mode ctrl
    _p_registers->readDword(MODE_CTRL, &value);
    value &= 0xFFFFE7FF; // clear auto-lock speed and fast carrier lock
    _p_registers->writeDword(MODE_CTRL, value);

    // SET PLL_MAX_OFFSET = 0X1000 FOR WIDER LOCK RANGE.
    _p_registers->readDword(PLL_CTRL, &value);
     value &= 0xFFFF0000;
     value |= 0x00001000;
    _p_registers->writeDword(PLL_CTRL, value);

    // Set Chroma, need check
    _p_registers->readModifyWriteDword(CHROMA_CTRL, FLD_C_LPF_EN , 0x00);

    // Set vip 1.1 output mode
    _p_registers->readModifyWriteDword(OUT_CTRL1, FLD_OUT_MODE, OUT_MODE_VIP11);

    // Set raw VBI mode
    _p_registers->readModifyWriteDword(OUT_CTRL1,FLD_VBIHACTRAW_EN, FLD_VBIHACTRAW_EN );

    //Set the video input.  The setting in MODE_CTRL gets lost when we do the above setup
    setVideoInput(_video_input, _input_mux);

    //////////////////////////////////////////////////////////////////////////
    ////jerry_xu add for nice image
    _p_registers->readDword(MODE_CTRL, &value);
    value |=FLD_CKILLEN;
    _p_registers->writeDword(MODE_CTRL, value);	
    //////////////////////////////////////////////////////////////////////////    
    _p_registers->writeDword(DIF_MISC_CTRL, FLD_DIF_DIF_BYPASS);   // set DIF bypass

    // we should enable the VBI_GATE_EN bit; otherwise, it will fail to
    // detect MV PSP Type 1 when the signal comes thru the RF tuner.
    // TODO:  need check, waiting for validation results
    //_p_registers->readDword(DFE_CTRL1, &value);
    //value |= FLD_VBI_GATE_EN;
    //_p_registers->writeDword(DFE_CTRL1, value);
    
    //// This setting will ensure the contrast is adjusted properly when MV introduced.
    //_p_registers->readDword(CRUSH_CTRL, &value);
    //value &= 0xFFFF81FF;
    //value |= 0x00103E00;
    //_p_registers->writeDword(CRUSH_CTRL, value);

    _p_registers->unlock();

}

///////////////////////////////////////////////////////////////////////////////////////
VOID Thresher::initializeRegisters_NTSC()
{
     DWORD value;

    _p_registers->lock();
    
    //First set it up to auto detect the video standard
    initializeRegistersAutoDetect();

    //Since a couple of registers do not get the correct values when they
    // get autoset, disable it for a few registers and set them manually.
    
    // Enable auto config of registers
    _p_registers->readModifyWriteDword(MODE_CTRL, FLD_ACFG_DIS, _p_registers->Set_Field(FLD_ACFG_DIS, 0));

    //Set the mode control register to not auto set registers 0x470-47F
    _p_registers->readDword(MODE_CTRL, &value);
    //Set video format to NTSC
    value &= 0xfffffff0;

    if(_video_standard == KS_AnalogVideo_PAL_M )
    {
        value |= 0x00000005; // set PAL_M
    }
    else
    {
        value |= 0x00000001; // set NTSC-M
    }

    _p_registers->writeDword(MODE_CTRL, value);

    // Disable auto config of registers
    _p_registers->readModifyWriteDword(MODE_CTRL, FLD_ACFG_DIS, _p_registers->Set_Field(FLD_ACFG_DIS, 1));
    
    // set blend slope = 8 for optimal comb filter performance w. small text.
    _p_registers->readDword(SRC_COMB_CFG, &value);
    value &= 0x7FFFFFFF;  //disable two line check mode.
    _p_registers->writeDword(SRC_COMB_CFG, value);
    
    //Enable Sliced CC
    _p_registers->writeDword(VBI_LINE_CTRL3, 0x66000000); 

    _p_registers->unlock();
}


///////////////////////////////////////////////////////////////////////////////////////
VOID Thresher::initializeRegisters_PAL()
{
    _p_registers->lock();

    //First set it up to auto detect the video standard
    initializeRegistersAutoDetect();

    //Since a couple of registers do not get the correct values when they
    // get autoset, disable it for a few registers and set them manually.
    
    // Enable auto config of registers
    _p_registers->readModifyWriteDword(MODE_CTRL, FLD_ACFG_DIS, _p_registers->Set_Field(FLD_ACFG_DIS, 0));

    //Set the mode control register to not auto set registers 0x470-47F
    DWORD value;
    _p_registers->readDword(MODE_CTRL, &value);
    //Set video format to PAL
    value &= 0xfffffff0;
    value |= 0x00000004;
    _p_registers->writeDword(MODE_CTRL, value);

    // video improvement
    _p_registers->readModifyWriteDword(MODE_CTRL, FLD_AUTO_SC_LOCK, _p_registers->Set_Field(FLD_AUTO_SC_LOCK, 1));
    _p_registers->readModifyWriteDword(MODE_CTRL, FLD_MAN_SC_FAST_LOCK, _p_registers->Set_Field(FLD_MAN_SC_FAST_LOCK, 1));
    _p_registers->readModifyWriteDword(MODE_CTRL, FLD_FAST_LOCK_MD, _p_registers->Set_Field(FLD_FAST_LOCK_MD, 1));

    // Disable auto config of registers
    _p_registers->readModifyWriteDword(MODE_CTRL, FLD_ACFG_DIS, _p_registers->Set_Field(FLD_ACFG_DIS, 1));

    
    // set blend slope = 8 for optimal comb filter performance w. small text.
    _p_registers->readDword(SRC_COMB_CFG, &value);
    value &= 0x7FFFFFFF;  //disable two line check mode.
    _p_registers->writeDword(SRC_COMB_CFG, value);

    //Disable Sliced CC
    _p_registers->writeDword(VBI_LINE_CTRL3, 0x00000000); 

    _p_registers->unlock();

}

/////////////////////////////////////////////////////////////////////////////////////////
VOID Thresher::initializeRegisters_SECAM()
{
    _p_registers->lock();

    initializeRegistersAutoDetect();

    //Since a couple of registers do not get the correct values when they
    // get autoset, disable it for a few registers and set them manually.

    // TODO, need check
    // enable auto config of registers
    _p_registers->readModifyWriteDword(MODE_CTRL, FLD_ACFG_DIS, _p_registers->Set_Field(FLD_ACFG_DIS, 0));

    //Set the mode control register to not auto set registers 0x470-47F
    DWORD value;
    _p_registers->readDword(MODE_CTRL, &value);
    //Set video format to SECAM
    value &= 0xfffffff0;
    value |= 0x0000000C;
    _p_registers->writeDword(MODE_CTRL, value);

    // video improvement
    _p_registers->readModifyWriteDword(MODE_CTRL, FLD_AUTO_SC_LOCK, _p_registers->Set_Field(FLD_AUTO_SC_LOCK, 1));
    _p_registers->readModifyWriteDword(MODE_CTRL, FLD_MAN_SC_FAST_LOCK, _p_registers->Set_Field(FLD_MAN_SC_FAST_LOCK, 1));
    _p_registers->readModifyWriteDword(MODE_CTRL, FLD_FAST_LOCK_MD, _p_registers->Set_Field(FLD_FAST_LOCK_MD, 1));

    //[Jason] as per KY to improve secam video
    _p_registers->readDword(DFE_CTRL1 , &value);    
    value &= 0x000fff00;
    value |= 0xE8200013;
    _p_registers->writeDword(DFE_CTRL1, value);
    
    // Disable auto config of registers
    _p_registers->readModifyWriteDword(MODE_CTRL, FLD_ACFG_DIS, _p_registers->Set_Field(FLD_ACFG_DIS, 1));

    // set blend slope = 8 for optimal comb filter performance w. small text.
    _p_registers->readDword(SRC_COMB_CFG, &value);
    value &= 0x7FFFFFFF;  //disable two line check mode.
    _p_registers->writeDword(SRC_COMB_CFG, value);

    //Disable Sliced CC
    _p_registers->writeDword(VBI_LINE_CTRL3, 0x00000000); 

    _p_registers->unlock();
}

/////////////////////////////////////////////////////////////////////////////////////////
VOID Thresher::initializeRegisters_PAL_N()
{
    DWORD value = 0;

    _p_registers->lock();

    initializeRegisters_PAL();
    
    // Enable auto config of registers
    _p_registers->readModifyWriteDword(MODE_CTRL, FLD_ACFG_DIS, _p_registers->Set_Field(FLD_ACFG_DIS, 0));

    _p_registers->readDword(MODE_CTRL, &value);
    value &= 0xfffffff0;         // Set video format to PAL-N
    value |= 0x47;
    _p_registers->writeDword(MODE_CTRL, value);
    
    // Disable auto config of registers
    _p_registers->readModifyWriteDword(MODE_CTRL, FLD_ACFG_DIS, _p_registers->Set_Field(FLD_ACFG_DIS, 1));

    _p_registers->unlock();
}

/////////////////////////////////////////////////////////////////////////////////////////
VOID Thresher::initializeRegisters_PAL_NC()
{
    _p_registers->lock();

    initializeRegisters_PAL_N();


    _p_registers->unlock();
}

/////////////////////////////////////////////////////////////////////////////////////////
VOID Thresher::notifyPreChannelChange()
{
    // We will be disabling the agc gains so grey out the Video. 
    if ((_enable_grey_video_at_channel_change) && (!_video_muted)) // only if we are not already muted
    {
        videoSetGrey( TRUE);
    }
    // Disable auto config of registers
    _p_registers->readModifyWriteDword(MODE_CTRL, FLD_ACFG_DIS, _p_registers->Set_Field(FLD_ACFG_DIS, 1));
    // disable Color Killer and Chroma AGC
    _p_registers->readModifyWriteDword(MODE_CTRL, FLD_CAGCEN, _p_registers->Set_Field(FLD_CAGCEN, 0));
    _p_registers->readModifyWriteDword(MODE_CTRL, FLD_CKILLEN, _p_registers->Set_Field(FLD_CKILLEN, 0));

}

/////////////////////////////////////////////////////////////////////////////////////////
VOID Thresher::EnableACGEnAndCKillen(BOOLEAN fld_CAGCEN, BOOLEAN fld_CKILLEN)
{
    // Disable auto config of registers
    _p_registers->readModifyWriteDword(MODE_CTRL, FLD_ACFG_DIS, _p_registers->Set_Field(FLD_ACFG_DIS, 1));
    // enable Color Killer and Chroma AGC
    _p_registers->readModifyWriteDword(MODE_CTRL, FLD_CAGCEN, _p_registers->Set_Field(FLD_CAGCEN, (fld_CAGCEN ? 1 : 0)));
    _p_registers->readModifyWriteDword(MODE_CTRL, FLD_CKILLEN, _p_registers->Set_Field(FLD_CKILLEN, (fld_CKILLEN ? 1 : 0)));
}


/////////////////////////////////////////////////////////////////////////////////////////
VOID Thresher::notifyPostChannelChange()
{   
    //_p_DIF->ResetAGCafterChannelChange();
}


/////////////////////////////////////////////////////////////////////////////////////////

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -