📄 thresher.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 "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 + -