📄 wdmtuner.cpp
字号:
{
// there is unsupported hardware was found
uiError = WDMMINI_UNKNOWNHARDWARE;
FAIL;
}
m_pTVTunerPinsMediumInfo = ( PKSPIN_MEDIUM) \
::ExAllocatePool( NonPagedPool, sizeof( KSPIN_MEDIUM) * m_ulNumberOfPins);
if( m_pTVTunerPinsMediumInfo == NULL)
{
uiError = WDMMINI_ERROR_MEMORYALLOCATION;
FAIL;
}
m_pTVTunerPinsDirectionInfo = ( PBOOL) \
::ExAllocatePool( NonPagedPool, sizeof( BOOL) * m_ulNumberOfPins);
if( m_pTVTunerPinsDirectionInfo == NULL)
{
uiError = WDMMINI_ERROR_MEMORYALLOCATION;
FAIL;
}
m_pI2CScript = pCScript;
SetWDMTunerKSProperties();
SetWDMTunerKSTopology();
// Set run-time WDM properties at the last
m_ulVideoStandard = ( m_ulNumberOfStandards == 1) ?
// unknown standard or the only one
m_wdmTunerCaps.ulStandardsSupported : 0x0L;
m_ulTunerInput = 0L; // unknown input or the only one
m_ulTuningFrequency = 0L; // unknown tuning frequency
#ifndef ATI_TVAUDIO_SUPPORT
{
// this code is needed to initilaize TVAudio path off the tuner
// if there is no separate MiniDriver for TVAudio is assumed
UINT uiAudioConfiguration;
UCHAR uchAudioI2CAddress;
if( m_CATIConfiguration.GetAudioConfiguration( &uiAudioConfiguration,
&uchAudioI2CAddress))
{
m_CATIConfiguration.InitializeAudioConfiguration( pCScript,
uiAudioConfiguration,
uchAudioI2CAddress);
}
}
#endif // ATI_TVAUDIO_SUPPORT
* puiErrorCode = WDMMINI_NOERROR;
OutputDebugTrace(( "CATIWDMTuner:CATIWDMTuner() exit\n"));
return;
} END_ENSURE;
* puiErrorCode = uiError;
OutputDebugError(( "CATIWDMTuner:CATIWDMTuner() Error = %x\n", uiError));
}
/*^^*
* SetTunerCapabilities()
* Purpose : Sets the capabilities ( RO properties) based upon the Tuner Id
*
* Inputs : UINT puiTunerId : Tuner Id
*
* Outputs : returns TRUE, if there is a supported Tuner Id specified;
* also sets the following WDM Tuner properities:
* Author : IKLEBANOV
*^^*/
BOOL CATIWDMTuner::SetTunerWDMCapabilities( UINT uiTunerId)
{
::RtlZeroMemory( &m_wdmTunerCaps, sizeof( ATI_KSPROPERTY_TUNER_CAPS));
m_ulIntermediateFrequency = 0x0L;
switch( uiTunerId)
{
case 0x01: // FI1236 NTSC M/N North America
m_ulNumberOfStandards = 3;
m_wdmTunerCaps.ulStandardsSupported = KS_AnalogVideo_NTSC_M |
KS_AnalogVideo_PAL_M |
KS_AnalogVideo_PAL_N;
m_wdmTunerCaps.ulNumberOfInputs = 1;
m_wdmTunerCaps.ulMinFrequency = 54000000L;
m_wdmTunerCaps.ulMaxFrequency = 801250000L;
m_ulIntermediateFrequency = 45750000L;
m_ulSupportedModes = KSPROPERTY_TUNER_MODE_TV;
m_ulNumberOfPins = 2;
break;
case 0x02: // FI1236J NTSC M/N Japan
m_ulNumberOfStandards = 1;
m_wdmTunerCaps.ulStandardsSupported = KS_AnalogVideo_NTSC_M_J;
m_wdmTunerCaps.ulNumberOfInputs = 1;
m_wdmTunerCaps.ulMinFrequency = 54000000L;
m_wdmTunerCaps.ulMaxFrequency = 765250000L;
m_ulIntermediateFrequency = 45750000L;
m_ulSupportedModes = KSPROPERTY_TUNER_MODE_TV;
m_ulNumberOfPins = 2;
break;
case 0x03: // FI1216 PAL B/G
m_ulNumberOfStandards = 2;
m_wdmTunerCaps.ulStandardsSupported = KS_AnalogVideo_PAL_B |
KS_AnalogVideo_PAL_G;
m_wdmTunerCaps.ulNumberOfInputs = 1;
m_wdmTunerCaps.ulMinFrequency = 54000000L;
m_wdmTunerCaps.ulMaxFrequency = 855250000L;
m_ulIntermediateFrequency = 38900000L;
m_ulSupportedModes = KSPROPERTY_TUNER_MODE_TV;
m_ulNumberOfPins = 2;
break;
case 0x04: // FI1246 MK2 PAL I
m_ulNumberOfStandards = 1;
m_wdmTunerCaps.ulStandardsSupported = KS_AnalogVideo_PAL_I;
m_wdmTunerCaps.ulNumberOfInputs = 1;
m_wdmTunerCaps.ulMinFrequency = 45750000L;
m_wdmTunerCaps.ulMaxFrequency = 855250000L;
m_ulIntermediateFrequency = 38900000L;
m_ulSupportedModes = KSPROPERTY_TUNER_MODE_TV;
m_ulNumberOfPins = 2;
break;
case 0x05: // FI1216 PAL B/G, SECAM L/L'
m_ulNumberOfStandards = 3;
m_wdmTunerCaps.ulStandardsSupported = KS_AnalogVideo_PAL_B |
KS_AnalogVideo_PAL_G |
KS_AnalogVideo_SECAM_L;
m_wdmTunerCaps.ulNumberOfInputs = 1;
m_wdmTunerCaps.ulMinFrequency = 54000000L;
m_wdmTunerCaps.ulMaxFrequency = 855250000L;
m_ulIntermediateFrequency = 38900000L;
m_ulSupportedModes = KSPROPERTY_TUNER_MODE_TV;
m_ulNumberOfPins = 2;
break;
case 0x06: // FR1236MK2 NTSC M/N North America + Japan
m_ulNumberOfStandards = 4;
m_wdmTunerCaps.ulStandardsSupported = KS_AnalogVideo_NTSC_M |
KS_AnalogVideo_PAL_M |
KS_AnalogVideo_NTSC_M_J |
KS_AnalogVideo_PAL_N;
m_wdmTunerCaps.ulNumberOfInputs = 1;
m_wdmTunerCaps.ulMinFrequency = 54000000L;
m_wdmTunerCaps.ulMaxFrequency = 801250000L;
m_ulIntermediateFrequency = 45750000L;
m_ulSupportedModes = KSPROPERTY_TUNER_MODE_TV;
m_ulNumberOfPins = 2;
break;
case 0x07: // FI1256 PAL D/K China
m_ulNumberOfStandards = 1;
m_wdmTunerCaps.ulStandardsSupported = KS_AnalogVideo_PAL_D |
KS_AnalogVideo_SECAM_D;
m_wdmTunerCaps.ulNumberOfInputs = 1;
m_wdmTunerCaps.ulMinFrequency = 48250000L;
m_wdmTunerCaps.ulMaxFrequency = 855250000L;
m_ulIntermediateFrequency = 38000000L;
m_ulSupportedModes = KSPROPERTY_TUNER_MODE_TV;
m_ulNumberOfPins = 2;
break;
case 0x08: // NTSC North America NEC FM Tuner
m_ulNumberOfStandards = 3;
m_wdmTunerCaps.ulStandardsSupported = KS_AnalogVideo_NTSC_M |
KS_AnalogVideo_PAL_M |
KS_AnalogVideo_PAL_N;
m_wdmTunerCaps.ulNumberOfInputs = 2;
m_wdmTunerCaps.ulMinFrequency = 54000000L;
m_wdmTunerCaps.ulMaxFrequency = 801250000L;
m_ulIntermediateFrequency = 45750000L;
m_ulSupportedModes = KSPROPERTY_TUNER_MODE_TV |
KSPROPERTY_TUNER_MODE_FM_RADIO;
m_ulNumberOfPins = 2;
break;
case 0x10: // NTSC North America Alps Tuner
case 0x11: // NTSC North America Alps Tuner
m_ulNumberOfStandards = 3;
m_wdmTunerCaps.ulStandardsSupported = KS_AnalogVideo_NTSC_M |
KS_AnalogVideo_PAL_M |
KS_AnalogVideo_PAL_N;
m_wdmTunerCaps.ulNumberOfInputs = 1;
m_wdmTunerCaps.ulMinFrequency = 54000000L;
m_wdmTunerCaps.ulMaxFrequency = 801250000L;
m_ulIntermediateFrequency = 45750000L;
m_ulSupportedModes = KSPROPERTY_TUNER_MODE_TV;
m_ulNumberOfPins = 2;
break;
case 0x12: // NTSC North America Alps Tuner with FM
m_ulNumberOfStandards = 3;
m_wdmTunerCaps.ulStandardsSupported = KS_AnalogVideo_NTSC_M |
KS_AnalogVideo_PAL_M |
KS_AnalogVideo_PAL_N;
m_wdmTunerCaps.ulNumberOfInputs = 1;
m_wdmTunerCaps.ulMinFrequency = 54000000L;
m_wdmTunerCaps.ulMaxFrequency = 801250000L;
m_ulIntermediateFrequency = 45750000L;
m_ulSupportedModes = KSPROPERTY_TUNER_MODE_TV |
KSPROPERTY_TUNER_MODE_FM_RADIO;
m_ulNumberOfPins = 2;
break;
case 0x0D: // Temic 4006 FN5 PAL B/G + PAL/I + PAL D + SECAM D/K
m_ulNumberOfStandards = 6;
m_wdmTunerCaps.ulStandardsSupported = KS_AnalogVideo_PAL_B |
KS_AnalogVideo_PAL_G |
KS_AnalogVideo_PAL_I |
KS_AnalogVideo_PAL_D |
KS_AnalogVideo_SECAM_D |
KS_AnalogVideo_SECAM_K;
m_wdmTunerCaps.ulNumberOfInputs = 1;
m_wdmTunerCaps.ulMinFrequency = 45000000L;
m_wdmTunerCaps.ulMaxFrequency = 868000000L;
m_ulIntermediateFrequency = 38900000L;
m_ulSupportedModes = KSPROPERTY_TUNER_MODE_TV;
m_ulNumberOfPins = 2;
break;
default:
return( FALSE);
}
m_ulTunerMode = KSPROPERTY_TUNER_MODE_TV;
m_wdmTunerCaps.ulTuningGranularity = 62500L;
m_wdmTunerCaps.ulSettlingTime = 150;
m_wdmTunerCaps.ulStrategy = KS_TUNER_STRATEGY_PLL;
return( TRUE);
}
/*^^*
* AdapterSetPowerState()
* Purpose : Sets Power Managemeny mode
*
* Inputs : PHW_STREAM_REQUEST_BLOCK pSrb : pointer to the current Srb
*
* Outputs : NTSTATUS as the result of operation
* Author : TOM
*^^*/
NTSTATUS CATIWDMTuner::AdapterSetPowerState( PHW_STREAM_REQUEST_BLOCK pSrb)
{
PADAPTER_DATA_EXTENSION pPrivateData =
( PADAPTER_DATA_EXTENSION)(( PHW_STREAM_REQUEST_BLOCK)pSrb)->HwDeviceExtension;
CI2CScript * pCScript = &pPrivateData->CScript;
DEVICE_POWER_STATE nDeviceState = pSrb->CommandData.DeviceState;
LARGE_INTEGER liWakeUpTime;
NTSTATUS ntStatus;
m_pPendingDeviceSrb = pSrb;
ntStatus = STATUS_ADAPTER_HARDWARE_ERROR;
switch( nDeviceState)
{
case PowerDeviceD0:
case PowerDeviceD3:
if( nDeviceState != m_ulPowerState)
{
m_CATIConfiguration.SetTunerPowerState( m_pI2CScript,
( nDeviceState == PowerDeviceD0 ? TRUE : FALSE));
// if transition form D3 to D0 we have to restore frequency
if(( nDeviceState == PowerDeviceD0) && ( m_ulPowerState == PowerDeviceD3))
{
// we have to wait approx. 10ms for tuner to power up
liWakeUpTime.QuadPart = ATIHARDWARE_TUNER_WAKEUP_DELAY;
KeDelayExecutionThread( KernelMode, FALSE, &liWakeUpTime);
// now we have to restore frequency
if( SetTunerFrequency( m_ulTuningFrequency))
ntStatus = STATUS_SUCCESS;
else
ntStatus = STATUS_ADAPTER_HARDWARE_ERROR;
}
else
ntStatus = STATUS_SUCCESS;
m_ulPowerState = nDeviceState;
}
else
ntStatus = STATUS_SUCCESS;
break;
case PowerDeviceD1:
case PowerDeviceD2:
ntStatus = STATUS_SUCCESS;
break;
default:
ntStatus = STATUS_INVALID_PARAMETER;
break;
}
return( ntStatus);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -