|
|
//////////////////////////////////////////////////////////////////////////////
//
// (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; }
|