Leaked source code of windows server 2003
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
//==========================================================================;
//
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
// KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
// PURPOSE.
//
// Copyright (c) 1992 - 1996 Microsoft Corporation. All Rights Reserved.
//
//==========================================================================;
extern "C" { #include "strmini.h"
#include "ksmedia.h"
#include "wdmdebug.h"
}
#include "wdmdrv.h"
#include "atitunep.h"
#include "aticonfg.h"
#include "tunerhdw.h"
/*^^*
* GetTunerPLLOffsetBusyStatus() * Purpose : Returns tuner Busy status and PLLOffset, if the tuner is not busy * The function reads the hardware in order to accomplish the task * The operation might be carried on either synchronously or asynchronously * Inputs : PLONG plPLLOffset : a pointer to write a PLLOffset value * PBOOL pbBusyStatus : a pointer to write a Busy status * * Outputs : BOOL : returns TRUE, if the operation succeded * Author : IKLEBANOV *^^*/ BOOL CATIWDMTuner::GetTunerPLLOffsetBusyStatus( PLONG plPLLOffset, PBOOL pbBusyStatus) { UCHAR uchI2CValue; I2CPacket i2cPacket; BOOL bResult;
i2cPacket.uchChipAddress = m_uchTunerI2CAddress; i2cPacket.cbReadCount = 1; i2cPacket.cbWriteCount = 0; i2cPacket.puchReadBuffer = &uchI2CValue; i2cPacket.puchWriteBuffer = NULL; i2cPacket.usFlags = 0;
bResult = m_pI2CScript->PerformI2CPacketOperation( &i2cPacket); if( bResult) bResult = ( i2cPacket.uchI2CResult == I2C_STATUS_NOERROR);
if( bResult) { * pbBusyStatus = !(( BOOL)( uchI2CValue & 0x40)); // bit 6 - PLL locked indicator
if( !( * pbBusyStatus)) { uchI2CValue &= 0x07; // only 3 LSBits are PLLOffset
// let's map the result into MS defined values from -2 to 2
* plPLLOffset = uchI2CValue - 2; } }
return( bResult); }
/*^^*
* SetTunerMode() * Purpose : Sets one of the possible Tuner modes to operate * Inputs : ULONG ulModeToSet : an operation mode required to be set * * Outputs : BOOL : returns TRUE, if the operation succeded * Author : IKLEBANOV *^^*/ BOOL CATIWDMTuner::SetTunerMode( ULONG ulModeToSet) {
return( TRUE); }
/*^^*
* SetTunerVideoStandard() * Purpose : Sets one of the possible Tuner standards as an active one * Inputs : ULONG ulStandard : a standard required to be set * * Outputs : BOOL : returns TRUE, if the operation succeded * Author : IKLEBANOV *^^*/ BOOL CATIWDMTuner::SetTunerVideoStandard( ULONG ulStandard) {
return( TRUE); }
/*^^*
* SetTunerFrequency() * Purpose : Sets a new Tuner frequency * The operation might be carried on either synchronously or asynchronously * Inputs : ULONG ulFrequency : a frequency required to be set * * Outputs : BOOL : returns TRUE, if the operation succeded * Author : IKLEBANOV *^^*/ BOOL CATIWDMTuner::SetTunerFrequency( ULONG ulFrequency) { ULONG ulFrequenceDivider; USHORT usControlCode; UCHAR auchI2CBuffer[4]; I2CPacket i2cPacket; BOOL bResult;
ASSERT( m_ulIntermediateFrequency != 0L); // Set the video carrier frequency by controlling the programmable divider
// N = ( 16 * ( FreqRF + FreqIntermediate)) / 1000000
ulFrequenceDivider = ( ulFrequency + m_ulIntermediateFrequency); ulFrequenceDivider /= ( 1000000 / 16);
usControlCode = GetTunerControlCode( ulFrequenceDivider); if( !usControlCode) return( FALSE); auchI2CBuffer[0] = ( UCHAR)( ulFrequenceDivider >> 8); auchI2CBuffer[1] = ( UCHAR)ulFrequenceDivider; auchI2CBuffer[2] = ( UCHAR)( usControlCode >> 8); auchI2CBuffer[3] = ( UCHAR)usControlCode;
i2cPacket.uchChipAddress = m_uchTunerI2CAddress; i2cPacket.cbReadCount = 0; i2cPacket.cbWriteCount = 4; i2cPacket.puchReadBuffer = NULL; i2cPacket.puchWriteBuffer = auchI2CBuffer; i2cPacket.usFlags = 0;
bResult = m_pI2CScript->PerformI2CPacketOperation( &i2cPacket);
if( bResult) bResult = ( i2cPacket.uchI2CResult == I2C_STATUS_NOERROR) ? TRUE : FALSE;
return( bResult); }
/*^^*
* SetTunerInput() * Purpose : Sets one of the possible Tuner inputs as an active one * Inputs : ULONG nInput : input number required to be set as an active ( begins from 0) * * Outputs : BOOL : returns TRUE, if the operation succeded * Author : IKLEBANOV *^^*/ BOOL CATIWDMTuner::SetTunerInput( ULONG nInput) { // no real things to do at all
return( TRUE); }
/*^^*
* GetTunerControlCode() * Purpose : Determines the Tuner control code to be send to tuner with a new frequency value * * Inputs : ULONG ulFrequencyDivider : new frequency divider * * Outputs : USHORT : value, the tuner should be programmed, when the new frequency is set * id the is no valid uiTunerId is passed as paramter, 0 is returned * Author : IKLEBANOV *^^*/ USHORT CATIWDMTuner::GetTunerControlCode( ULONG ulFrequencyDivider) { USHORT usLowBandFrequencyHigh, usMiddleBandFrequencyHigh; USHORT usLowBandControl, usMiddleBandControl, usHighBandControl; USHORT usControlCode = 0;
usLowBandFrequencyHigh = kUpperLowBand; usMiddleBandFrequencyHigh = kUpperMidBand; usLowBandControl = kLowBand; usMiddleBandControl = kMidBand; usHighBandControl = kHighBand; switch( m_uiTunerId) { case 0x01 : // NTSC N/A
case 0x02 : // NTSC Japan
case 0x06 : // NTSC Japan Philips MK2, PAL
// these tuners support NTSC standard
if(( m_ulVideoStandard == KS_AnalogVideo_NTSC_M) && (( ulFrequencyDivider == kAirChannel63) || ( ulFrequencyDivider == kAirChannel64))) { // special case for TEMIC tuner
return( kTemicControl); } break;
case 0x08 : // FM Tuner
usLowBandControl = kLowBand_NTSC_FM; usMiddleBandControl = kMidBand_NTSC_FM; usHighBandControl = kHighBand_NTSC_FM; break; case 0x03 : // PAL B/G
case 0x04 : // PAL I
break; case 0x05 : // SECAM & PAL B/G
if ( m_ulVideoStandard == KS_AnalogVideo_SECAM_L) { usLowBandFrequencyHigh = kUpperLowBand_SECAM; usMiddleBandFrequencyHigh = kUpperMidBand_SECAM; usLowBandControl = kLowBand_SECAM; usMiddleBandControl = kMidBand_SECAM; usHighBandControl = kHighBand_SECAM; } else { usLowBandControl = kLowBand_PALBG; usMiddleBandControl = kMidBand_PALBG; usHighBandControl = kHighBand_PALBG; } break; case 0x07 : // PAL D China
usLowBandFrequencyHigh = kUpperLowBand_PALD; usMiddleBandFrequencyHigh = kUpperMidBand_PALD; break; case 0x10: // NTSC NA Alps Tuner
case 0x11: case 0x12: usLowBandFrequencyHigh = kUpperLowBand_ALPS; usMiddleBandFrequencyHigh = kUpperMidBand_ALPS; usLowBandControl = kLowBand_ALPS; usMiddleBandControl = kMidBand_ALPS; usHighBandControl = kHighBand_ALPS; break;
case 0x0D: // PAL B/G + PAL/I + PAL D + SECAM D/K
break;
default : return( usControlCode); } if( ulFrequencyDivider <= ( ULONG)usLowBandFrequencyHigh) usControlCode = usLowBandControl; else { if( ulFrequencyDivider <= ( ULONG)usMiddleBandFrequencyHigh) usControlCode = usMiddleBandControl; else usControlCode = usHighBandControl; }
return( usControlCode); }
|