421 lines
13 KiB
C++
421 lines
13 KiB
C++
//////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// (C) Philips Semiconductors-CSU and Microsoft 1999
|
|
// All rights are reserved. Reproduction in whole or in part is prohibited
|
|
// without the written consent of the copyright owner.
|
|
//
|
|
// Philips reserves the right to make changes without notice at any time.
|
|
// Philips makes no warranty, expressed, implied or statutory, including but
|
|
// not limited to any implied warranty of merchantibility or fitness for any
|
|
// particular purpose, or that the use will not infringe any third party
|
|
// patent, copyright or trademark. Philips must not be liable for any loss
|
|
// or damage arising from its use.
|
|
//
|
|
// TUNERPROP.CPP
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
#include "philtune.h"
|
|
|
|
#define MPOC_TUNER_ATSC 0x0
|
|
#define MPOC_TUNER_NTSC 0x3
|
|
|
|
#if 0
|
|
/*
|
|
* GetTunerModeCapbilities()
|
|
* Inputs: KSPROPERTY_TUNER_MODE_CAPS_S *p_tuner_mode_cap : pointer to
|
|
* mode capability structure of the tuner
|
|
* Outputs: Filled KSPROPERTY_TUNER_MODE_CAPS_S
|
|
* Returns: BOOL: returns TRUE, if the operation succeeds else FALSE
|
|
* Description: Returns the mode capabilities of tuner for a particluar mode.
|
|
*/
|
|
NTSTATUS CDevice::GetTunerModeCapbilities(KSPROPERTY_TUNER_MODE_CAPS_S *p_TunerModeCaps)
|
|
{
|
|
m_pTuner->GetModeCapabilities((TunerModeCapsType *)&p_TunerModeCaps->Mode);
|
|
return STATUS_SUCCESS;
|
|
}
|
|
#endif
|
|
|
|
/*
|
|
* GetTunerMode ()
|
|
* Inputs: ULONG *p_ulMode : pointer to mode
|
|
* Outputs: Fills p_ulMode
|
|
* Returns: BOOL: returns TRUE, if the operation succeeds else FALSE
|
|
* Description: Returns the current tuner mode. Called in response to
|
|
* property ID KSPROPERTY_TUNER_MODE by GetProperty(). The modes could be
|
|
* either ATSC or TV (NTSC).
|
|
*/
|
|
NTSTATUS CDevice::GetTunerMode(ULONG *p_ulMode)
|
|
{
|
|
m_pTuner->GetMode(p_ulMode);
|
|
return STATUS_SUCCESS;
|
|
|
|
}
|
|
|
|
/*
|
|
* GetTunerVideoStandard ()
|
|
* Inputs: ULONG *p_ulStandard : pointer to standard
|
|
* Outputs: Fills p_ulStandard
|
|
* Returns: BOOL: returns TRUE, if the operation succeeds else FALSE
|
|
* Description: Returns the current standard. Applicable only for TV mode.
|
|
*/
|
|
NTSTATUS CDevice::GetTunerVideoStandard(ULONG *p_ulStandard)
|
|
{
|
|
m_pTuner->GetVideoStandard(p_ulStandard);
|
|
return STATUS_SUCCESS;
|
|
|
|
}
|
|
|
|
|
|
/*
|
|
* GetTunerStatus ()
|
|
* Inputs: PTunerStatusType *p_status : pointer to status
|
|
* Outputs: Fills p_status
|
|
* Returns: BOOL: returns TRUE, if the operation succeeds else FALSE
|
|
* Description: Returns the status of the tuner.
|
|
*/
|
|
NTSTATUS CDevice::GetTunerStatus(PTunerStatusType p_Status)
|
|
{
|
|
NTSTATUS nStatus = STATUS_SUCCESS;
|
|
long lPLLOffset = 0;
|
|
BOOL bBusy = FALSE;
|
|
|
|
if (m_pTuner->GetPLLOffsetBusyStatus(&lPLLOffset, &bBusy))
|
|
{
|
|
|
|
p_Status->Busy = bBusy;
|
|
if(bBusy)
|
|
{
|
|
// If tuner is busy , return FALSE
|
|
p_Status->Busy = TRUE;
|
|
_DbgPrintF( DEBUGLVL_ERROR,("CDevice:GetStatus() fails\n"));
|
|
return STATUS_DEVICE_BUSY;
|
|
}
|
|
|
|
if(m_BoardInfo.uiIFStage == IF_MPOC)
|
|
{
|
|
GetMpocStatus(MPOC_STATUS_PLL_OFFSET, (UINT *)(&p_Status->PLLOffset));
|
|
if(p_Status->PLLOffset == 0)
|
|
p_Status->PLLOffset = -2;
|
|
else if(p_Status->PLLOffset == 1)
|
|
p_Status->PLLOffset = 2;
|
|
else
|
|
p_Status->PLLOffset = 0;
|
|
}
|
|
else
|
|
p_Status->PLLOffset = lPLLOffset;
|
|
|
|
m_pTuner->GetFrequency(&p_Status->CurrentFrequency);
|
|
p_Status->SignalStrength = m_pDemod->IsVSBLocked();
|
|
|
|
}
|
|
else
|
|
nStatus = STATUS_UNSUCCESSFUL;
|
|
|
|
_DbgPrintF( DEBUGLVL_VERBOSE,("CDevice::GetTunerStatus() Busy = %d, Offset = %d Frequency = %ld\n",bBusy, p_Status->PLLOffset, p_Status->CurrentFrequency));
|
|
|
|
return nStatus;
|
|
|
|
}
|
|
|
|
|
|
/*
|
|
* GetTunerInput ()
|
|
* Inputs: ULONG *p_ulTuner_input : pointer to tuner input index
|
|
* Outputs: Fills p_ulTuner_input
|
|
* Returns: BOOL: returns TRUE, if the operation succeeds else FALSE
|
|
* Description: Returns the current tuner input index. The input index is 0 based.
|
|
*/
|
|
NTSTATUS CDevice::GetTunerInput(ULONG *p_ulTunerInput)
|
|
{
|
|
m_pTuner->GetInput(p_ulTunerInput);
|
|
return STATUS_SUCCESS;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
* SetTunerMode()
|
|
* Inputs: ULONG ulModeToSet : an operation mode required to be set
|
|
* Outputs:
|
|
* Returns: NTSTATUS: returns STATUS_SUCCESS, if the operation succeeds
|
|
* Description: Set device into tuner mode requested.
|
|
* Do required I2C or GPIO writes to do a mode change for the chips.
|
|
* On 1st entry into this section, create a new thread to check hang and
|
|
* signal quality. In ATSC mode, enable signal quality check & in NTSC mode,
|
|
* disable signal quality check.
|
|
* Called in response to property ID KSPROPERTY_TUNER_MODE by SetProperty().
|
|
*/
|
|
NTSTATUS CDevice::SetTunerMode(ULONG ulModeToSet)
|
|
{
|
|
UCHAR ucPin;
|
|
UCHAR ucValue;
|
|
BOOL bResult = TRUE;
|
|
ULONG ulPrevMode;
|
|
UINT uiResult;
|
|
UCHAR ucDataWr[4];
|
|
NTSTATUS nStatus;
|
|
|
|
m_pTuner->GetMode(&ulPrevMode);
|
|
nStatus = m_pTuner->SetMode(ulModeToSet);
|
|
if (!NT_SUCCESS( nStatus))
|
|
{
|
|
return STATUS_INVALID_PARAMETER;
|
|
}
|
|
|
|
_DbgPrintF( DEBUGLVL_VERBOSE,("CDevice::SetTunerMode: prev Mode = %d CurentMode = %d",
|
|
ulPrevMode, ulModeToSet));
|
|
|
|
// Take actions based on board ID
|
|
if (m_BoardInfo.uiBoardID == BOARD_CONEY)
|
|
{
|
|
// Based on mode, set GPIO pins.
|
|
// GPIO pin 2 = HIGH for ATSC
|
|
// LOW for NTSC
|
|
// In ATSC mode - the first time create a thread to check
|
|
// signal quality and hang check . At other times enable the thread.
|
|
// in TV mode, disable the thread.
|
|
ucPin = GPIO_TUNER_MODE_SELECT_PIN; // use as a PinMask
|
|
if (ulModeToSet == KSPROPERTY_TUNER_MODE_ATSC)
|
|
{
|
|
ucValue = GPIO_TUNER_MODE_ATSC;
|
|
if(!m_pGpio->WriteGPIO(&ucPin, &ucValue))
|
|
{ _DbgPrintF( DEBUGLVL_ERROR,("CDevice: GPIO write failed"));
|
|
nStatus = STATUS_ADAPTER_HARDWARE_ERROR;
|
|
goto errexit;
|
|
}
|
|
if(!(m_pDemod->SetOutputMode(m_uiOutputMode)))
|
|
{
|
|
nStatus = STATUS_ADAPTER_HARDWARE_ERROR;
|
|
goto errexit;
|
|
}
|
|
}
|
|
else if(ulModeToSet == KSPROPERTY_TUNER_MODE_TV)
|
|
{
|
|
ucValue = GPIO_TUNER_MODE_NTSC;
|
|
if(!m_pGpio->WriteGPIO(&ucPin, &ucValue))
|
|
{
|
|
_DbgPrintF( DEBUGLVL_ERROR,("CDevice: GPIO write failed"));
|
|
nStatus = STATUS_ADAPTER_HARDWARE_ERROR;
|
|
goto errexit;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
_DbgPrintF( DEBUGLVL_ERROR,("CDevice:SetTunerMode: Invalid Mode"));
|
|
nStatus = STATUS_INVALID_PARAMETER_1;
|
|
goto errexit;
|
|
}
|
|
}
|
|
else if(m_BoardInfo.uiBoardID == BOARD_CATALINA)
|
|
{
|
|
|
|
if (ulModeToSet == KSPROPERTY_TUNER_MODE_TV)
|
|
{
|
|
if(!(m_pDemod->SetOutputMode(VSB_OUTPUT_MODE_ITU656)))
|
|
{
|
|
nStatus = STATUS_ADAPTER_HARDWARE_ERROR;
|
|
goto errexit;
|
|
}
|
|
|
|
// Set MiscRegister Tuner AGC to external (bit 4 = 1)
|
|
// Set MiscRegister PLD mode to NTSC ( bit 5-7 = 010)
|
|
// Set Misc Register DTV IF disable (bit 2 = 0)
|
|
// Set Misc Register NTSC IF enable (bit 3 = 1)
|
|
ucDataWr[0] = m_ucModeInit;
|
|
ucDataWr[0] &= 0x03;
|
|
ucDataWr[0] |= 0x58;
|
|
m_pI2CScript->WriteSeq(CATALINA_MISC_CONTROL_REGISTER, ucDataWr, 1);
|
|
m_ucModeInit = ucDataWr[0];
|
|
|
|
}
|
|
else if (ulModeToSet == KSPROPERTY_TUNER_MODE_ATSC)
|
|
{
|
|
if(!(m_pDemod->SetOutputMode(m_uiOutputMode)))
|
|
{
|
|
nStatus = STATUS_ADAPTER_HARDWARE_ERROR;
|
|
goto errexit;
|
|
}
|
|
|
|
// Set MiscRegister Tuner AGC to internal (bit 4 = 0)
|
|
// Set MiscRegister PLD mode to DTV ( bit 5-7 = 000)
|
|
// Set Misc Register DTV IF enable (bit 2 = 1)
|
|
// Set Misc Register NTSC IF disable (bit 3 = 0)
|
|
ucDataWr[0] = m_ucModeInit;
|
|
ucDataWr[0] &= 0x03;
|
|
ucDataWr[0] |= 0x04;
|
|
if(m_uiOutputMode == VSB_OUTPUT_MODE_DIAGNOSTIC)
|
|
ucDataWr[0] |= 0x80;
|
|
m_pI2CScript->WriteSeq(CATALINA_MISC_CONTROL_REGISTER, ucDataWr, 1);
|
|
m_ucModeInit = ucDataWr[0];
|
|
|
|
}
|
|
else
|
|
{
|
|
_DbgPrintF( DEBUGLVL_ERROR,("CDevice:SetTunerMode: Invalid Mode"));
|
|
nStatus = STATUS_INVALID_PARAMETER_1;
|
|
goto errexit;
|
|
}
|
|
_DbgPrintF( DEBUGLVL_VERBOSE,("CDevice:SetTunerMode: Misc Reg = %x", m_ucModeInit));
|
|
// SendTunerMode(ulModeToSet);
|
|
//Set Mode in MPOC
|
|
nStatus = SetMpocIFMode(ulModeToSet);
|
|
if (!NT_SUCCESS( nStatus))
|
|
{
|
|
_DbgPrintF( DEBUGLVL_ERROR,("CDevice:SetTunerMode: Cannot set MPOC IF Mode"));
|
|
goto errexit;
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
// TRAP;
|
|
// _DbgPrintF( DEBUGLVL_VERBOSE,("CDevice:SetTunerMode: Invalid Board ID"));
|
|
// FAIL;
|
|
}
|
|
|
|
if((m_BoardInfo.uiVsbChipVersion >> 8) == VSB1)
|
|
{
|
|
if (ulModeToSet == KSPROPERTY_TUNER_MODE_ATSC)
|
|
{
|
|
if (m_bFirstEntry == TRUE)
|
|
{
|
|
m_bFirstEntry = FALSE;
|
|
// Create a new thread to constantly monitor the quality of
|
|
// the input signal and check hang
|
|
|
|
CreateQualityCheckThread();
|
|
}
|
|
// Get Mutex and enable QCM
|
|
m_QualityCheckMutex.Lock();
|
|
m_uiQualityCheckMode = QCM_ENABLE;
|
|
m_QualityCheckMutex.Unlock();
|
|
|
|
}
|
|
else if(ulModeToSet == KSPROPERTY_TUNER_MODE_TV)
|
|
{
|
|
if (m_bFirstEntry == FALSE)
|
|
{
|
|
// Get Mutex and enable QCM
|
|
m_QualityCheckMutex.Lock();
|
|
m_uiQualityCheckMode = QCM_DISABLE;
|
|
m_QualityCheckMutex.Unlock();
|
|
}
|
|
}
|
|
else
|
|
{}
|
|
}
|
|
m_pDemod->IsVSBLocked();
|
|
// Mini: Test
|
|
VsbStatusType Status;
|
|
m_pDemod->GetStatus(&Status);
|
|
return STATUS_SUCCESS;
|
|
|
|
errexit:
|
|
// If the mode cannot be changed , restore the previous mode
|
|
uiResult = m_pTuner->SetMode(ulPrevMode);
|
|
return nStatus;
|
|
}
|
|
|
|
|
|
/*
|
|
* GetTunerFrequency ()
|
|
* Inputs: ULONG *p_ulFreq: pointer to frequency
|
|
* Outputs: Filled *p_ulfreq
|
|
* Return: NTSTATUS: returns STATUS_SUCCESS
|
|
* Description: Gets the tuner frequency parameters.
|
|
*/
|
|
NTSTATUS CDevice::GetTunerFrequency(ULONG *p_ulFreq)
|
|
{
|
|
m_pTuner->GetFrequency(p_ulFreq);
|
|
return STATUS_SUCCESS;
|
|
}
|
|
|
|
|
|
/*
|
|
* SetTunerFrequency()
|
|
* Inputs: ULONG *p_ulFreq: pointer to frequency
|
|
* Outputs:
|
|
* Return: NTSTATUS: returns STATUS_SUCCESS, if the operation succeeds
|
|
* else STATUS_UNSUCCESSFUL
|
|
* Description: Set the frequency parameters and change to tuner frequency
|
|
* specified. In ATSC mode, introduce a small delay (~400ms) to let the VSB
|
|
* settle. If the quality check thread is created, disable it.
|
|
*/
|
|
NTSTATUS CDevice::SetTunerFrequency(ULONG *p_ulFreq)
|
|
{
|
|
UINT uiQcm;
|
|
BOOL bResult;
|
|
|
|
if((m_BoardInfo.uiVsbChipVersion >> 8) == VSB1)
|
|
{
|
|
if (m_bFirstEntry == FALSE)
|
|
{
|
|
// Disable Quality Check mode
|
|
m_QualityCheckMutex.Lock();
|
|
uiQcm = m_uiQualityCheckMode;
|
|
m_uiQualityCheckMode = QCM_DISABLE;
|
|
m_QualityCheckMutex.Unlock();
|
|
_DbgPrintF( DEBUGLVL_VERBOSE,("CDevice::GetTunerFrequency(): Disable QCM\n"));
|
|
|
|
// Wait for ~400ms to let the Tuner and VSB settle down
|
|
//Delay(400000);
|
|
}
|
|
|
|
bResult = m_pTuner->SetFrequency(*p_ulFreq);
|
|
|
|
if (m_bFirstEntry == FALSE)
|
|
{
|
|
// Restore Quality Check mode
|
|
m_QualityCheckMutex.Lock();
|
|
m_uiQualityCheckMode = uiQcm;
|
|
m_QualityCheckMutex.Unlock();
|
|
}
|
|
}
|
|
else
|
|
bResult = m_pTuner->SetFrequency(*p_ulFreq);
|
|
|
|
m_pDemod->IsVSBLocked();
|
|
|
|
if(bResult) return STATUS_SUCCESS;
|
|
else return STATUS_UNSUCCESSFUL;
|
|
}
|
|
|
|
|
|
/*
|
|
* SetTunerVideoStandard ()
|
|
* Inputs: ULONG ulStandard : a standard required to be set
|
|
* Outputs:
|
|
* Return: NTSTATUS: returns STATUS_SUCCESS, if the operation succeeds
|
|
* else STATUS_UNSUCCESSFUL
|
|
* Description: Set Tuner Video standard.
|
|
*/
|
|
NTSTATUS CDevice::SetTunerVideoStandard(ULONG ulStandard)
|
|
{
|
|
if(!m_pTuner->SetVideoStandard(ulStandard))
|
|
return STATUS_UNSUCCESSFUL;
|
|
else
|
|
return STATUS_SUCCESS;
|
|
}
|
|
|
|
/*
|
|
* SetTunerInput
|
|
* Inputs: ULONG ulInput : input number required to be set as an active
|
|
* (begins from 0)
|
|
* Outputs:
|
|
* Return: NTSTATUS: returns STATUS_SUCCESS, if the operation succeeds
|
|
* else STATUS_UNSUCCESSFUL
|
|
* Description: Set Tuner input to that requested.
|
|
*/
|
|
NTSTATUS CDevice::SetTunerInput(ULONG ulInput)
|
|
{
|
|
if(!m_pTuner->SetInput(ulInput))
|
|
return STATUS_UNSUCCESSFUL;
|
|
else
|
|
return STATUS_SUCCESS;
|
|
}
|
|
|
|
|
|
|