From: <ad...@us...> - 2003-03-06 17:48:51
|
Update of /cvsroot/bdadev/NovaTDriver In directory sc8-pr-cvs1:/tmp/cvs-serv5973 Modified Files: automation.cpp automation.h device.cpp device.h driver.cpp l64781.cpp l64781.h Log Message: Added TPS change monitoring thread Index: automation.cpp =================================================================== RCS file: /cvsroot/bdadev/NovaTDriver/automation.cpp,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** automation.cpp 4 Mar 2003 08:02:19 -0000 1.5 --- automation.cpp 6 Mar 2003 17:48:42 -0000 1.6 *************** *** 41,58 **** NTSTATUS TunerFrequencyGet(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN PULONG pulProperty) { ! *pulProperty=(ULONG)GETCONTEXT(GETDEVICEFROMIRPPIN(pIrp))->tuner.frequency; return STATUS_SUCCESS; } NTSTATUS TunerFrequencyPut(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN PULONG pulProperty) { ! ULONG frequency=(ULONG)*pulProperty; PKSDEVICE device=GETDEVICEFROMIRPPIN(pIrp); ! // Validate here ! if(frequency!=GETCONTEXT(device)->tuner.frequency) { ! GETCONTEXT(device)->tuner.frequency=frequency; ! GETCONTEXT(device)->tuner.ChangeOutstanding = TRUE; ! GETCONTEXT(device)->demodulator.ChangeOutstanding = TRUE; } - _DbgPrintF(DEBUGLVL_TERSE, ("TunerFrequencyPut(%u)",frequency)); return STATUS_SUCCESS; } --- 41,62 ---- NTSTATUS TunerFrequencyGet(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN PULONG pulProperty) { ! _DbgPrintF(DEBUGLVL_TERSE, ("TunerFrequencyGet")); ! *pulProperty=GETCONTEXT(GETDEVICEFROMIRPPIN(pIrp))->tuner.frequency; return STATUS_SUCCESS; } + NTSTATUS TunerFrequencyPut(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN PULONG pulProperty) { ! _DbgPrintF(DEBUGLVL_TERSE, ("TunerFrequencyPut(%u)",*pulProperty)); ! if((*pulProperty==BDA_FREQUENCY_NOT_SET)|| ! (*pulProperty==BDA_FREQUENCY_NOT_DEFINED)) { ! return STATUS_SUCCESS; ! } PKSDEVICE device=GETDEVICEFROMIRPPIN(pIrp); ! if(*pulProperty!=GETCONTEXT(device)->tuner.frequency) { ! GETCONTEXT(device)->tuner.frequency=*pulProperty; ! GETCONTEXT(device)->tuner.ChangeOutstanding=TRUE; ! GETCONTEXT(device)->demodulator.ChangeOutstanding=TRUE; } return STATUS_SUCCESS; } *************** *** 60,77 **** NTSTATUS TunerFrequencyMultiplerGet(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN PULONG pulProperty) { ! *pulProperty=(ULONG)GETCONTEXT(GETDEVICEFROMIRPPIN(pIrp))->tuner.freq_mult; return STATUS_SUCCESS; } NTSTATUS TunerFrequencyMultiplerPut(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN PULONG pulProperty) { ! ULONG freq_mult=(ULONG)*pulProperty; PKSDEVICE device=GETDEVICEFROMIRPPIN(pIrp); ! // Validate here ! if(GETCONTEXT(device)->tuner.freq_mult!=freq_mult) { ! GETCONTEXT(device)->tuner.freq_mult=freq_mult; GETCONTEXT(device)->tuner.ChangeOutstanding = TRUE; GETCONTEXT(device)->demodulator.ChangeOutstanding = TRUE; } - _DbgPrintF(DEBUGLVL_TERSE, ("TunerFrequencyMultiplerPut(%u)",freq_mult)); return STATUS_SUCCESS; } --- 64,85 ---- NTSTATUS TunerFrequencyMultiplerGet(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN PULONG pulProperty) { ! _DbgPrintF(DEBUGLVL_TERSE, ("TunerFrequencyMultiplerGet")); ! *pulProperty=GETCONTEXT(GETDEVICEFROMIRPPIN(pIrp))->tuner.freq_mult; return STATUS_SUCCESS; } + NTSTATUS TunerFrequencyMultiplerPut(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN PULONG pulProperty) { ! _DbgPrintF(DEBUGLVL_TERSE, ("TunerFrequencyMultiplerPut(%u)",*pulProperty)); ! if((*pulProperty==BDA_FREQUENCY_MULTIPLIER_NOT_SET)|| ! (*pulProperty==BDA_FREQUENCY_MULTIPLIER_NOT_DEFINED)) { ! return STATUS_SUCCESS; ! } PKSDEVICE device=GETDEVICEFROMIRPPIN(pIrp); ! if(GETCONTEXT(device)->tuner.freq_mult!=*pulProperty) { ! GETCONTEXT(device)->tuner.freq_mult=*pulProperty; GETCONTEXT(device)->tuner.ChangeOutstanding = TRUE; GETCONTEXT(device)->demodulator.ChangeOutstanding = TRUE; } return STATUS_SUCCESS; } *************** *** 79,112 **** NTSTATUS TunerBandwidthGet(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN PULONG pulProperty) { *pulProperty=(ULONG)GETCONTEXT(GETDEVICEFROMIRPPIN(pIrp))->tuner.bandwidth; return STATUS_SUCCESS; } NTSTATUS TunerBandwidthPut(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN PULONG pulProperty) { ! ULONG bandwidth=(ULONG)*pulProperty; ! PKSDEVICE device=GETDEVICEFROMIRPPIN(pIrp); ! // Validate here // note that the tuner isn't effected by this setting but the // demodulator is so that's why we signal that that has changed ! if(GETCONTEXT(device)->tuner.bandwidth!=bandwidth) { ! GETCONTEXT(device)->tuner.bandwidth=bandwidth; } - GETCONTEXT(device)->demodulator.ChangeOutstanding = TRUE; - _DbgPrintF(DEBUGLVL_TERSE, ("TunerBandwidthPut(%u)",bandwidth)); return STATUS_SUCCESS; } ! NTSTATUS TunerSignalStrengthGet(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN PULONG pulProperty) { PKSDEVICE device=GETDEVICEFROMIRPPIN(pIrp); // In mDb or something ! *pulProperty=(LONG)L64781_SignalStrength(device); ! _DbgPrintF(DEBUGLVL_TERSE, ("TunerSignalStrengthGet, irp=0x%p, device=0x%p, strength=%i",pIrp,device,*pulProperty)); return STATUS_SUCCESS; } ! NTSTATUS TunerSignalPresentGet(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN PULONG pulProperty) { ! *pulProperty=(BOOL)L64781_HasSignal(GETDEVICEFROMIRPPIN(pIrp)); _DbgPrintF(DEBUGLVL_TERSE, ("TunerSignalStrengthGet (%d)",*pulProperty)); return STATUS_SUCCESS; --- 87,125 ---- NTSTATUS TunerBandwidthGet(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN PULONG pulProperty) { + _DbgPrintF(DEBUGLVL_TERSE, ("TunerBandwidthGet")); *pulProperty=(ULONG)GETCONTEXT(GETDEVICEFROMIRPPIN(pIrp))->tuner.bandwidth; return STATUS_SUCCESS; } + NTSTATUS TunerBandwidthPut(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN PULONG pulProperty) { ! _DbgPrintF(DEBUGLVL_TERSE, ("TunerBandwidthPut(%u)",*pulProperty)); ! if((*pulProperty==BDA_CHAN_BANDWITH_NOT_SET)|| ! (*pulProperty==BDA_CHAN_BANDWITH_NOT_DEFINED)) { ! return STATUS_SUCCESS; ! } // note that the tuner isn't effected by this setting but the // demodulator is so that's why we signal that that has changed ! PKSDEVICE device=GETDEVICEFROMIRPPIN(pIrp); ! if(GETCONTEXT(device)->tuner.bandwidth!=*pulProperty) { ! GETCONTEXT(device)->tuner.bandwidth=*pulProperty; ! GETCONTEXT(device)->demodulator.ChangeOutstanding=TRUE; } return STATUS_SUCCESS; } ! NTSTATUS TunerSignalStrengthGet(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN LONG* pulProperty) { PKSDEVICE device=GETDEVICEFROMIRPPIN(pIrp); // In mDb or something ! *pulProperty=L64781_SignalStrength(device); ! _DbgPrintF(DEBUGLVL_TERSE, ("TunerSignalStrengthGet (%i)", *pulProperty)); return STATUS_SUCCESS; } ! NTSTATUS TunerSignalPresentGet(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN BOOL* pulProperty) { ! PKSDEVICE device=GETDEVICEFROMIRPPIN(pIrp); ! *pulProperty=L64781_HasSignal(device); _DbgPrintF(DEBUGLVL_TERSE, ("TunerSignalStrengthGet (%d)",*pulProperty)); return STATUS_SUCCESS; *************** *** 114,221 **** // For Demodulator node ! NTSTATUS DemodSignalQualityGet(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN PULONG pulProperty) { ! *pulProperty=(LONG)((L64781_Signal2NoiseRatio(GETDEVICEFROMIRPPIN(pIrp))*100)/255); _DbgPrintF(DEBUGLVL_TERSE, ("DemodSignalQualityGet (%d)",*pulProperty)); return STATUS_SUCCESS; } ! NTSTATUS DemodSignalLockedGet(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN PULONG pulProperty) { ! *pulProperty=(BOOL)L64781_HasLock(GETDEVICEFROMIRPPIN(pIrp)); _DbgPrintF(DEBUGLVL_TERSE, ("DemodSignalLockedGet (%d)",*pulProperty)); return STATUS_SUCCESS; } ! NTSTATUS DemodModulationTypeGet(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN PULONG pulProperty) { *pulProperty=(ModulationType)GETCONTEXT(GETDEVICEFROMIRPPIN(pIrp))->demodulator.modulation; return STATUS_SUCCESS; } ! NTSTATUS DemodModulationTypePut(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN PULONG pulProperty) { ! ModulationType newtype=(ModulationType)*pulProperty; ! PKSDEVICE device=GETDEVICEFROMIRPPIN(pIrp); ! if((newtype!=BDA_MOD_QPSK)&&(newtype!=BDA_MOD_16QAM)&&(newtype!=BDA_MOD_64QAM)) { ! _DbgPrintF(DEBUGLVL_TERSE, ("Unknown Type setting to default(%u)", *pulProperty)); ! newtype = BDA_MOD_64QAM; } - if(GETCONTEXT(device)->demodulator.modulation!=newtype) { - GETCONTEXT(device)->demodulator.modulation=newtype; - } - GETCONTEXT(device)->demodulator.ChangeOutstanding = TRUE; - _DbgPrintF(DEBUGLVL_TERSE, ("DemodModulationTypePut(%u)",newtype)); return STATUS_SUCCESS; } ! NTSTATUS DemodInnerFecTypeGet(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN PULONG pulProperty) { *pulProperty=BDA_FEC_VITERBI; return STATUS_SUCCESS; } ! NTSTATUS DemodInnerFecTypePut(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN PULONG pulProperty) { ! _DbgPrintF(DEBUGLVL_TERSE, ("DemodInnerFecTypePut(%u)",*pulProperty)); return STATUS_SUCCESS; } ! NTSTATUS DemodInnerFecRateGet(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN PULONG pulProperty) { ! *pulProperty=(BinaryConvolutionCodeRate)GETCONTEXT(GETDEVICEFROMIRPPIN(pIrp))->demodulator.HP_coderate; return STATUS_SUCCESS; } ! NTSTATUS DemodInnerFecRatePut(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN PULONG pulProperty) { ! BinaryConvolutionCodeRate rate=(BinaryConvolutionCodeRate)*pulProperty; ! PKSDEVICE device=GETDEVICEFROMIRPPIN(pIrp); ! if((rate!=BDA_BCC_RATE_1_2)&& ! (rate!=BDA_BCC_RATE_2_3)&& ! (rate!=BDA_BCC_RATE_3_4)&& ! (rate!=BDA_BCC_RATE_5_6)&& ! (rate!=BDA_BCC_RATE_7_8)) { ! _DbgPrintF(DEBUGLVL_TERSE, ("Unknown Rate setting to default(%u)", *pulProperty)); ! rate = BDA_BCC_RATE_1_2; } - if(GETCONTEXT(device)->demodulator.HP_coderate!=rate) { - GETCONTEXT(device)->demodulator.HP_coderate=rate; - } - GETCONTEXT(device)->demodulator.ChangeOutstanding = TRUE; - _DbgPrintF(DEBUGLVL_TERSE, ("DemodInnerFecRatePut(%u)",rate)); return STATUS_SUCCESS; } ! NTSTATUS DemodOuterFecTypeGet(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN PULONG pulProperty) { *pulProperty=BDA_FEC_VITERBI; return STATUS_SUCCESS; } ! NTSTATUS DemodOuterFecTypePut(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN PULONG pulProperty) { _DbgPrintF(DEBUGLVL_TERSE, ("DemodOuterFecTypePut(%u)",*pulProperty)); return STATUS_SUCCESS; } ! NTSTATUS DemodOuterFecRateGet(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN PULONG pulProperty) { ! *pulProperty=(BinaryConvolutionCodeRate)GETCONTEXT(GETDEVICEFROMIRPPIN(pIrp))->demodulator.LP_coderate; return STATUS_SUCCESS; } ! NTSTATUS DemodOuterFecRatePut(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN PULONG pulProperty) { ! BinaryConvolutionCodeRate rate=(BinaryConvolutionCodeRate)*pulProperty; ! PKSDEVICE device=GETDEVICEFROMIRPPIN(pIrp); ! if((rate!=BDA_BCC_RATE_1_2)&& ! (rate!=BDA_BCC_RATE_2_3)&& ! (rate!=BDA_BCC_RATE_3_4)&& ! (rate!=BDA_BCC_RATE_5_6)&& ! (rate!=BDA_BCC_RATE_7_8)) { ! _DbgPrintF(DEBUGLVL_TERSE, ("Unknown Rate setting to default(%u)", *pulProperty)); ! rate = BDA_BCC_RATE_NOT_SET; } - if(GETCONTEXT(device)->demodulator.LP_coderate!=rate) { - GETCONTEXT(device)->demodulator.LP_coderate=rate; - } - GETCONTEXT(device)->demodulator.ChangeOutstanding = TRUE; - _DbgPrintF(DEBUGLVL_TERSE, ("DemodOuterFecRatePut(%u)",rate)); return STATUS_SUCCESS; } --- 127,286 ---- // For Demodulator node ! NTSTATUS DemodSignalQualityGet(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN LONG* pulProperty) { ! *pulProperty=(L64781_Signal2NoiseRatio(GETDEVICEFROMIRPPIN(pIrp))*100)/255; _DbgPrintF(DEBUGLVL_TERSE, ("DemodSignalQualityGet (%d)",*pulProperty)); return STATUS_SUCCESS; } ! NTSTATUS DemodSignalLockedGet(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN BOOL* pulProperty) { ! *pulProperty=L64781_HasLock(GETDEVICEFROMIRPPIN(pIrp)); _DbgPrintF(DEBUGLVL_TERSE, ("DemodSignalLockedGet (%d)",*pulProperty)); return STATUS_SUCCESS; } ! NTSTATUS DemodModulationTypeGet(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN ModulationType* pulProperty) { + _DbgPrintF(DEBUGLVL_TERSE, ("DemodModulationTypeGet")); *pulProperty=(ModulationType)GETCONTEXT(GETDEVICEFROMIRPPIN(pIrp))->demodulator.modulation; return STATUS_SUCCESS; } ! ! NTSTATUS DemodModulationTypePut(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN ModulationType* pulProperty) { ! _DbgPrintF(DEBUGLVL_TERSE, ("DemodModulationTypePut(%d)",*pulProperty)); ! if(*pulProperty < BDA_MOD_NOT_SET || ! *pulProperty >= BDA_MOD_MAX) { ! return STATUS_INVALID_PARAMETER; ! } ! // just return straight away if we are passed Not Set ! if(*pulProperty == BDA_MOD_NOT_SET) { ! return STATUS_SUCCESS; ! } ! if((*pulProperty!=BDA_MOD_QPSK)&&(*pulProperty!=BDA_MOD_16QAM)&&(*pulProperty!=BDA_MOD_64QAM)) { ! _DbgPrintF(DEBUGLVL_TERSE, ("Unknown Modulation Type : Leave existing value")); ! } else { ! PKSDEVICE device=GETDEVICEFROMIRPPIN(pIrp); ! if(GETCONTEXT(device)->demodulator.modulation!=*pulProperty) { ! GETCONTEXT(device)->demodulator.modulation=*pulProperty; ! GETCONTEXT(device)->demodulator.ChangeOutstanding=TRUE; ! } } return STATUS_SUCCESS; } ! NTSTATUS DemodInnerFecTypeGet(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN FECMethod* pulProperty) { + _DbgPrintF(DEBUGLVL_TERSE, ("DemodInnerFecTypeGet")); *pulProperty=BDA_FEC_VITERBI; return STATUS_SUCCESS; } ! ! NTSTATUS DemodInnerFecTypePut(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN FECMethod* pulProperty) { ! _DbgPrintF(DEBUGLVL_TERSE, ("DemodInnerFecTypePut(%d)",*pulProperty)); ! if(*pulProperty < BDA_FEC_METHOD_NOT_SET || ! *pulProperty >= BDA_FEC_MAX) { ! return STATUS_INVALID_PARAMETER; ! } ! // just return straight away if we are passed Not Set ! if(*pulProperty == BDA_FEC_METHOD_NOT_SET) { ! return STATUS_SUCCESS; ! } ! if(*pulProperty!=BDA_FEC_VITERBI) { ! _DbgPrintF(DEBUGLVL_TERSE, ("Unknown FEC Type")); ! } return STATUS_SUCCESS; } ! NTSTATUS DemodInnerFecRateGet(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN BinaryConvolutionCodeRate* pulProperty) { ! _DbgPrintF(DEBUGLVL_TERSE, ("DemodInnerFecRateGet")); ! *pulProperty=GETCONTEXT(GETDEVICEFROMIRPPIN(pIrp))->demodulator.HP_coderate; return STATUS_SUCCESS; } ! ! NTSTATUS DemodInnerFecRatePut(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN BinaryConvolutionCodeRate* pulProperty) { ! _DbgPrintF(DEBUGLVL_TERSE, ("DemodInnerFecRatePut(%d)",*pulProperty)); ! if(*pulProperty < BDA_BCC_RATE_NOT_SET || ! *pulProperty >= BDA_BCC_RATE_MAX) { ! return STATUS_INVALID_PARAMETER; ! } ! // just return straight away if we are passed Not Set ! if(*pulProperty == BDA_BCC_RATE_NOT_SET) { ! return STATUS_SUCCESS; ! } ! if((*pulProperty!=BDA_BCC_RATE_1_2)&& ! (*pulProperty!=BDA_BCC_RATE_2_3)&& ! (*pulProperty!=BDA_BCC_RATE_3_4)&& ! (*pulProperty!=BDA_BCC_RATE_5_6)&& ! (*pulProperty!=BDA_BCC_RATE_7_8)) { ! _DbgPrintF(DEBUGLVL_TERSE, ("Unknown Inner Rate : Leave existing value")); ! } else { ! PKSDEVICE device=GETDEVICEFROMIRPPIN(pIrp); ! if(GETCONTEXT(device)->demodulator.HP_coderate!=*pulProperty) { ! GETCONTEXT(device)->demodulator.HP_coderate=*pulProperty; ! GETCONTEXT(device)->demodulator.ChangeOutstanding=TRUE; ! } } return STATUS_SUCCESS; } ! NTSTATUS DemodOuterFecTypeGet(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN FECMethod* pulProperty) { + _DbgPrintF(DEBUGLVL_TERSE, ("DemodOuterFecTypeGet")); *pulProperty=BDA_FEC_VITERBI; return STATUS_SUCCESS; } ! ! NTSTATUS DemodOuterFecTypePut(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN FECMethod* pulProperty) { _DbgPrintF(DEBUGLVL_TERSE, ("DemodOuterFecTypePut(%u)",*pulProperty)); + if(*pulProperty < BDA_FEC_METHOD_NOT_SET || + *pulProperty >= BDA_FEC_MAX) { + return STATUS_INVALID_PARAMETER; + } + // just return straight away if we are passed Not Set + if(*pulProperty == BDA_FEC_METHOD_NOT_SET) { + return STATUS_SUCCESS; + } + if(*pulProperty!=BDA_FEC_VITERBI) { + _DbgPrintF(DEBUGLVL_TERSE, ("Unknown FEC Type")); + } return STATUS_SUCCESS; } ! NTSTATUS DemodOuterFecRateGet(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN BinaryConvolutionCodeRate* pulProperty) { ! _DbgPrintF(DEBUGLVL_TERSE, ("DemodOuterFecRateGet")); ! *pulProperty=GETCONTEXT(GETDEVICEFROMIRPPIN(pIrp))->demodulator.LP_coderate; return STATUS_SUCCESS; } ! NTSTATUS DemodOuterFecRatePut(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN BinaryConvolutionCodeRate* pulProperty) { ! _DbgPrintF(DEBUGLVL_TERSE, ("DemodOuterFecRatePut(%u)",pulProperty)); ! if(*pulProperty < BDA_BCC_RATE_NOT_SET || ! *pulProperty >= BDA_BCC_RATE_MAX) { ! return STATUS_INVALID_PARAMETER; ! } ! // just return straight away if we are passed Not Set ! if(*pulProperty == BDA_BCC_RATE_NOT_SET) { ! return STATUS_SUCCESS; ! } ! if((*pulProperty!=BDA_BCC_RATE_1_2)&& ! (*pulProperty!=BDA_BCC_RATE_2_3)&& ! (*pulProperty!=BDA_BCC_RATE_3_4)&& ! (*pulProperty!=BDA_BCC_RATE_5_6)&& ! (*pulProperty!=BDA_BCC_RATE_7_8)) { ! _DbgPrintF(DEBUGLVL_TERSE, ("Unknown Outer Rate : Leave existing value")); ! } else { ! PKSDEVICE device=GETDEVICEFROMIRPPIN(pIrp); ! if(GETCONTEXT(device)->demodulator.LP_coderate!=*pulProperty) { ! GETCONTEXT(device)->demodulator.LP_coderate=*pulProperty; ! GETCONTEXT(device)->demodulator.ChangeOutstanding=TRUE; ! } } return STATUS_SUCCESS; } *************** *** 223,290 **** NTSTATUS DemodSymbolRateGet(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN PULONG pulProperty) { ! *pulProperty=(ULONG)GETCONTEXT(GETDEVICEFROMIRPPIN(pIrp))->dummy.symbolRate; return STATUS_SUCCESS; } NTSTATUS DemodSymbolRatePut(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN PULONG pulProperty) { PKSDEVICE device=GETDEVICEFROMIRPPIN(pIrp); ! // Validate here GETCONTEXT(device)->dummy.symbolRate=(ULONG)*pulProperty; - //GETCONTEXT(device)->demodulator.ChangeOutstanding = TRUE; - _DbgPrintF(DEBUGLVL_TERSE, ("DemodSymbolRatePut(%u)",*pulProperty)); return STATUS_SUCCESS; } ! NTSTATUS DemodGuardIntervalGet(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN PULONG pulProperty) { ! *pulProperty=(GuardInterval)GETCONTEXT(GETDEVICEFROMIRPPIN(pIrp))->demodulator.guard_interval; return STATUS_SUCCESS; } ! NTSTATUS DemodGuardIntervalPut(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN PULONG pulProperty) { ! GuardInterval guard_interval=(GuardInterval)*pulProperty; ! PKSDEVICE device=GETDEVICEFROMIRPPIN(pIrp); ! // Validate here ! if(GETCONTEXT(device)->demodulator.guard_interval!=guard_interval) { ! GETCONTEXT(device)->demodulator.guard_interval=guard_interval; ! } ! GETCONTEXT(device)->demodulator.ChangeOutstanding = TRUE; ! _DbgPrintF(DEBUGLVL_TERSE, ("DemodGuardIntervalPut(%i)",guard_interval)); return STATUS_SUCCESS; } ! NTSTATUS DemodTransmissionModeGet(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN PULONG pulProperty) { ! *pulProperty=(TransmissionMode)GETCONTEXT(GETDEVICEFROMIRPPIN(pIrp))->demodulator.transmit_mode; return STATUS_SUCCESS; } ! NTSTATUS DemodTransmissionModePut(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN PULONG pulProperty) { ! TransmissionMode transmit_mode=(TransmissionMode)*pulProperty; ! PKSDEVICE device=GETDEVICEFROMIRPPIN(pIrp); ! // Validate here ! if(GETCONTEXT(device)->demodulator.transmit_mode!=transmit_mode) { ! GETCONTEXT(device)->demodulator.transmit_mode=transmit_mode; ! } ! GETCONTEXT(device)->demodulator.ChangeOutstanding = TRUE; ! _DbgPrintF(DEBUGLVL_TERSE, ("DemodTransmissionModePut(%i)",transmit_mode)); return STATUS_SUCCESS; } ! NTSTATUS DemodSpectralInversionGet(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN PULONG pulProperty) { *pulProperty=(SpectralInversion)GETCONTEXT(GETDEVICEFROMIRPPIN(pIrp))->demodulator.inversion; return STATUS_SUCCESS; } ! NTSTATUS DemodSpectralInversionPut(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN PULONG pulProperty) { ! SpectralInversion inversion=(SpectralInversion)*pulProperty; ! PKSDEVICE device=GETDEVICEFROMIRPPIN(pIrp); ! // Validate here ! if(GETCONTEXT(device)->demodulator.inversion!=inversion) { ! GETCONTEXT(device)->demodulator.inversion=inversion; ! } ! GETCONTEXT(device)->demodulator.ChangeOutstanding = TRUE; ! _DbgPrintF(DEBUGLVL_TERSE, ("DemodSpectralInversionPut(%i)",inversion)); return STATUS_SUCCESS; } --- 288,395 ---- NTSTATUS DemodSymbolRateGet(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN PULONG pulProperty) { ! _DbgPrintF(DEBUGLVL_TERSE, ("DemodSymbolRateGet")); ! *pulProperty=GETCONTEXT(GETDEVICEFROMIRPPIN(pIrp))->dummy.symbolRate; return STATUS_SUCCESS; } NTSTATUS DemodSymbolRatePut(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN PULONG pulProperty) { + _DbgPrintF(DEBUGLVL_TERSE, ("DemodSymbolRatePut(%u)",*pulProperty)); PKSDEVICE device=GETDEVICEFROMIRPPIN(pIrp); ! // \todo Validate here GETCONTEXT(device)->dummy.symbolRate=(ULONG)*pulProperty; return STATUS_SUCCESS; } ! NTSTATUS DemodGuardIntervalGet(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN GuardInterval* pulProperty) { ! _DbgPrintF(DEBUGLVL_TERSE, ("DemodGuardIntervalGet")); ! *pulProperty=GETCONTEXT(GETDEVICEFROMIRPPIN(pIrp))->demodulator.guard_interval; return STATUS_SUCCESS; } ! NTSTATUS DemodGuardIntervalPut(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN GuardInterval* pulProperty) { ! _DbgPrintF(DEBUGLVL_TERSE, ("DemodGuardIntervalPut(%d)",*pulProperty)); ! if(*pulProperty < BDA_GUARD_NOT_SET || ! *pulProperty >= BDA_GUARD_MAX) { ! return STATUS_INVALID_PARAMETER; ! } ! // just return straight away if we are passed Not Set ! if(*pulProperty == BDA_GUARD_NOT_SET) { ! return STATUS_SUCCESS; ! } ! if((*pulProperty!=BDA_GUARD_1_32)&& ! (*pulProperty!=BDA_GUARD_1_16)&& ! (*pulProperty!=BDA_GUARD_1_8)&& ! (*pulProperty!=BDA_GUARD_1_4)) { ! _DbgPrintF(DEBUGLVL_TERSE, ("Unknown Guard Interval : Leave existing value")); ! } else { ! PKSDEVICE device=GETDEVICEFROMIRPPIN(pIrp); ! // Validate here ! if(GETCONTEXT(device)->demodulator.guard_interval!=*pulProperty) { ! GETCONTEXT(device)->demodulator.guard_interval=*pulProperty; ! GETCONTEXT(device)->demodulator.ChangeOutstanding=TRUE; ! } ! } return STATUS_SUCCESS; } ! NTSTATUS DemodTransmissionModeGet(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN TransmissionMode* pulProperty) { ! _DbgPrintF(DEBUGLVL_TERSE, ("DemodTransmissionModeGet")); ! *pulProperty=GETCONTEXT(GETDEVICEFROMIRPPIN(pIrp))->demodulator.transmit_mode; return STATUS_SUCCESS; } ! NTSTATUS DemodTransmissionModePut(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN TransmissionMode* pulProperty) { ! _DbgPrintF(DEBUGLVL_TERSE, ("DemodTransmissionModePut(%i)",*pulProperty)); ! if(*pulProperty < BDA_XMIT_MODE_NOT_SET || ! *pulProperty >= BDA_XMIT_MODE_MAX) { ! return STATUS_INVALID_PARAMETER; ! } ! // just return straight away if we are passed Not Set ! if(*pulProperty == BDA_XMIT_MODE_NOT_SET) { ! return STATUS_SUCCESS; ! } ! if((*pulProperty!=BDA_XMIT_MODE_2K)&& ! (*pulProperty!=BDA_XMIT_MODE_8K)) { ! _DbgPrintF(DEBUGLVL_TERSE, ("Unknown Transmission Mode : Leave existing value")); ! } else { ! PKSDEVICE device=GETDEVICEFROMIRPPIN(pIrp); ! if(GETCONTEXT(device)->demodulator.transmit_mode!=*pulProperty) { ! GETCONTEXT(device)->demodulator.transmit_mode=*pulProperty; ! GETCONTEXT(device)->demodulator.ChangeOutstanding=TRUE; ! } ! } return STATUS_SUCCESS; } ! NTSTATUS DemodSpectralInversionGet(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN SpectralInversion* pulProperty) { + _DbgPrintF(DEBUGLVL_TERSE, ("DemodSpectralInversionGet")); *pulProperty=(SpectralInversion)GETCONTEXT(GETDEVICEFROMIRPPIN(pIrp))->demodulator.inversion; return STATUS_SUCCESS; } ! NTSTATUS DemodSpectralInversionPut(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN SpectralInversion* pulProperty) { ! _DbgPrintF(DEBUGLVL_TERSE, ("DemodSpectralInversionPut(%i)",*pulProperty)); ! if(*pulProperty < BDA_SPECTRAL_INVERSION_NOT_SET || ! *pulProperty >= BDA_SPECTRAL_INVERSION_MAX) { ! return STATUS_INVALID_PARAMETER; ! } ! // just return straight away if we are passed Not Set ! if(*pulProperty == BDA_SPECTRAL_INVERSION_NOT_SET) { ! return STATUS_SUCCESS; ! } ! if((*pulProperty!=BDA_SPECTRAL_INVERSION_AUTOMATIC)&& ! (*pulProperty!=BDA_SPECTRAL_INVERSION_NORMAL)&& ! (*pulProperty!=BDA_SPECTRAL_INVERSION_INVERTED)) { ! _DbgPrintF(DEBUGLVL_TERSE, ("Unknown Spectral Inversion : Leave existing value")); ! } else { ! PKSDEVICE device=GETDEVICEFROMIRPPIN(pIrp); ! if(GETCONTEXT(device)->demodulator.inversion!=*pulProperty) { ! GETCONTEXT(device)->demodulator.inversion=*pulProperty; ! GETCONTEXT(device)->demodulator.ChangeOutstanding=TRUE; ! } ! } return STATUS_SUCCESS; } *************** *** 326,337 **** --- 431,450 ---- // so don't bother updating the hardware if we are stopped if(GETCONTEXT(device)->cur_state != KSSTATE_STOP) { + // make sure we don't try and access the i2c bus at the same + // time as the monitoring thread + ExAcquireFastMutex(&GETCONTEXT(device)->i2cMutex); // Commit alterations only if there are changes if(GETCONTEXT(device)->tuner.ChangeOutstanding == TRUE) { Tuner_SetFrequency(device); } + if(GETCONTEXT(device)->demodulator.ChangeOutstanding == TRUE) { + L64781_UpdateParameters(device); + } + ExReleaseFastMutex(&GETCONTEXT(device)->i2cMutex); } } return BdaCommitChanges(pIrp); } + NTSTATUS FilterGetChangeState(IN PIRP pIrp,IN PKSMETHOD pKSMethod,OUT PULONG pulChangeState) { *************** *** 356,359 **** --- 469,475 ---- /*****************************************************************************\ * $Log$ + * Revision 1.6 2003/03/06 17:48:42 adcockj + * Added TPS change monitoring thread + * * Revision 1.5 2003/03/04 08:02:19 adcockj * Interim Checkin Index: automation.h =================================================================== RCS file: /cvsroot/bdadev/NovaTDriver/automation.h,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** automation.h 17 Feb 2003 11:07:12 -0000 1.2 --- automation.h 6 Mar 2003 17:48:42 -0000 1.3 *************** *** 10,41 **** NTSTATUS TunerBandwidthGet(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN PULONG pulProperty); NTSTATUS TunerBandwidthPut(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN PULONG pulProperty); ! NTSTATUS TunerSignalStrengthGet(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN PULONG pulProperty); ! #define TunerSignalStrengthPut NULL ! NTSTATUS TunerSignalPresentGet(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN PULONG pulProperty); ! #define TunerSignalPresentPut NULL // For Demodulator node ! NTSTATUS DemodSignalQualityGet(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN PULONG pulProperty); ! #define DemodSignalQualityPut NULL ! NTSTATUS DemodSignalLockedGet(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN PULONG pulProperty); ! #define DemodSignalLockedPut NULL ! NTSTATUS DemodModulationTypeGet(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN PULONG pulProperty); ! NTSTATUS DemodModulationTypePut(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN PULONG pulProperty); ! NTSTATUS DemodInnerFecTypeGet(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN PULONG pulProperty); ! NTSTATUS DemodInnerFecTypePut(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN PULONG pulProperty); ! NTSTATUS DemodInnerFecRateGet(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN PULONG pulProperty); ! NTSTATUS DemodInnerFecRatePut(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN PULONG pulProperty); ! NTSTATUS DemodOuterFecTypeGet(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN PULONG pulProperty); ! NTSTATUS DemodOuterFecTypePut(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN PULONG pulProperty); ! NTSTATUS DemodOuterFecRateGet(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN PULONG pulProperty); ! NTSTATUS DemodOuterFecRatePut(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN PULONG pulProperty); NTSTATUS DemodSymbolRateGet(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN PULONG pulProperty); NTSTATUS DemodSymbolRatePut(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN PULONG pulProperty); ! NTSTATUS DemodGuardIntervalGet(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN PULONG pulProperty); ! NTSTATUS DemodGuardIntervalPut(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN PULONG pulProperty); ! NTSTATUS DemodTransmissionModeGet(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN PULONG pulProperty); ! NTSTATUS DemodTransmissionModePut(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN PULONG pulProperty); ! NTSTATUS DemodSpectralInversionGet(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN PULONG pulProperty); ! NTSTATUS DemodSpectralInversionPut(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN PULONG pulProperty); // For filter --- 10,37 ---- NTSTATUS TunerBandwidthGet(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN PULONG pulProperty); NTSTATUS TunerBandwidthPut(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN PULONG pulProperty); ! NTSTATUS TunerSignalStrengthGet(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN LONG* pulProperty); ! NTSTATUS TunerSignalPresentGet(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN BOOL* pulProperty); // For Demodulator node ! NTSTATUS DemodSignalQualityGet(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN LONG* pulProperty); ! NTSTATUS DemodSignalLockedGet(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN BOOL* pulProperty); ! NTSTATUS DemodModulationTypeGet(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN ModulationType* pulProperty); ! NTSTATUS DemodModulationTypePut(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN ModulationType* pulProperty); ! NTSTATUS DemodInnerFecTypeGet(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN FECMethod* pulProperty); ! NTSTATUS DemodInnerFecTypePut(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN FECMethod* pulProperty); ! NTSTATUS DemodInnerFecRateGet(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN BinaryConvolutionCodeRate* pulProperty); ! NTSTATUS DemodInnerFecRatePut(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN BinaryConvolutionCodeRate* pulProperty); ! NTSTATUS DemodOuterFecTypeGet(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN FECMethod* pulProperty); ! NTSTATUS DemodOuterFecTypePut(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN FECMethod* pulProperty); ! NTSTATUS DemodOuterFecRateGet(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN BinaryConvolutionCodeRate* pulProperty); ! NTSTATUS DemodOuterFecRatePut(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN BinaryConvolutionCodeRate* pulProperty); NTSTATUS DemodSymbolRateGet(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN PULONG pulProperty); NTSTATUS DemodSymbolRatePut(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN PULONG pulProperty); ! NTSTATUS DemodGuardIntervalGet(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN GuardInterval* pulProperty); ! NTSTATUS DemodGuardIntervalPut(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN GuardInterval* pulProperty); ! NTSTATUS DemodTransmissionModeGet(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN TransmissionMode* pulProperty); ! NTSTATUS DemodTransmissionModePut(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN TransmissionMode* pulProperty); ! NTSTATUS DemodSpectralInversionGet(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN SpectralInversion* pulProperty); ! NTSTATUS DemodSpectralInversionPut(IN PIRP pIrp,IN PKSPROPERTY pKSProperty,IN SpectralInversion* pulProperty); // For filter Index: device.cpp =================================================================== RCS file: /cvsroot/bdadev/NovaTDriver/device.cpp,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** device.cpp 4 Mar 2003 08:02:20 -0000 1.5 --- device.cpp 6 Mar 2003 17:48:42 -0000 1.6 *************** *** 58,61 **** --- 58,64 ---- if(result!=STATUS_SUCCESS) ExFreePool(device->Context); KeInitializeDpc(&GETCONTEXT(device)->dpc,DeviceDPCRoutine,device); + ExInitializeFastMutex(&GETCONTEXT(device)->i2cMutex); + KeInitializeEvent(&GETCONTEXT(device)->monitorThreadKill, NotificationEvent, FALSE); + GETCONTEXT(device)->monitorThread = NULL; // Prepare tuner type and I2C addresses, assuming they're always the same on Nova-T boards GETCONTEXT(device)->demod_address=I2C_L64781; *************** *** 171,174 **** --- 174,179 ---- _DbgPrintF(DEBUGLVL_TERSE, ("DeviceStop()")); + // confirm that the monitoring thread has stopped + StopMonitoringThread((PKSDEVICE)GETCONTEXT(device)); // Stop tuner, L64781 and SAA7146 from any current functions L64781_Close(device); *************** *** 229,232 **** --- 234,290 ---- return STATUS_SUCCESS; } + #pragma code_seg() + VOID MonitorThreadProc(IN PKSDEVICE device) + { + NTSTATUS result; + while(TRUE) { + LARGE_INTEGER TimeOut; + // hopefully this is half a second and we'll try not to use up too much + // processor while in here but we need to check if we need to update + // the demod parameters based on a newly received TPS block + // we could also check for errors and possibly AFC here as well + TimeOut.QuadPart = 5000; + result=KeWaitForSingleObject(&GETCONTEXT(device)->monitorThreadKill, Executive, KernelMode, FALSE, &TimeOut); + if(result==STATUS_TIMEOUT) { + // make sure we don't try and access the i2c bus at the same + // time as the user is trying to retune + ExAcquireFastMutex(&GETCONTEXT(device)->i2cMutex); + L64781_CheckForTPSUpdate(device); + ExReleaseFastMutex(&GETCONTEXT(device)->i2cMutex); + } + // if we exited the above for any other reason then + // get out of this thread as either we have been signaled or + // there is a problem + else { + break; + } + } + PsTerminateSystemThread(STATUS_SUCCESS); + } + #pragma code_seg("page") + void StartMonitoringThread(IN PKSDEVICE device) + { + NTSTATUS result; + HANDLE hThread; + KeClearEvent(&GETCONTEXT(device)->monitorThreadKill); + result = PsCreateSystemThread(&hThread, THREAD_ALL_ACCESS, + NULL, NULL, NULL, (PKSTART_ROUTINE)MonitorThreadProc, device); + if (!NT_SUCCESS(result)) { + PrintString(device,"StartMonitoringThread: Failed to start thread",result); + return; + } + ObReferenceObjectByHandle(hThread, THREAD_ALL_ACCESS, NULL, KernelMode, (PVOID*) &GETCONTEXT(device)->monitorThread, NULL); + ZwClose(hThread); + return; + } + void StopMonitoringThread(IN PKSDEVICE device) + { + if(GETCONTEXT(device)->monitorThread != NULL) { + KeSetEvent(&GETCONTEXT(device)->monitorThreadKill, 0, FALSE); + KeWaitForSingleObject(&GETCONTEXT(device)->monitorThread, Executive, KernelMode, FALSE, NULL); + ObDereferenceObject(&GETCONTEXT(device)->monitorThread); + GETCONTEXT(device)->monitorThread = NULL; + } + } NTSTATUS OutputSetDeviceState(IN PKSPIN Pin,IN KSSTATE ToState,IN KSSTATE FromState) { *************** *** 252,260 **** return result; } - // Temp Tuner_SetFrequency((PKSDEVICE)Pin->Context); ! // And now, continue } ! if((ToState==KSSTATE_STOP)&&(FromState!=KSSTATE_STOP)) SAA7146_StopStream((PKSDEVICE)Pin->Context); if(ToState==KSSTATE_RUN) { GETCONTEXT(Pin->Context)->sendDiscontinuity = true; --- 310,321 ---- return result; } Tuner_SetFrequency((PKSDEVICE)Pin->Context); ! L64781_UpdateParameters((PKSDEVICE)Pin->Context); ! StartMonitoringThread((PKSDEVICE)Pin->Context); } ! if((ToState==KSSTATE_STOP)&&(FromState!=KSSTATE_STOP)) { ! StopMonitoringThread((PKSDEVICE)Pin->Context); ! SAA7146_StopStream((PKSDEVICE)Pin->Context); ! } if(ToState==KSSTATE_RUN) { GETCONTEXT(Pin->Context)->sendDiscontinuity = true; *************** *** 267,270 **** --- 328,334 ---- /*****************************************************************************\ * $Log$ + * Revision 1.6 2003/03/06 17:48:42 adcockj + * Added TPS change monitoring thread + * * Revision 1.5 2003/03/04 08:02:20 adcockj * Interim Checkin Index: device.h =================================================================== RCS file: /cvsroot/bdadev/NovaTDriver/device.h,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** device.h 4 Mar 2003 08:02:20 -0000 1.3 --- device.h 6 Mar 2003 17:48:43 -0000 1.4 *************** *** 29,32 **** --- 29,35 ---- int counter; bool sendDiscontinuity; + KEVENT monitorThreadKill; + PKTHREAD monitorThread; + FAST_MUTEX i2cMutex; // I2C bus data unsigned char demod_address; // Address of L64781 demodulator *************** *** 64,67 **** --- 67,72 ---- NTSTATUS OutputClose(IN PKSPIN Pin,IN PIRP Irp); NTSTATUS OutputSetDeviceState(IN PKSPIN Pin,IN KSSTATE ToState,IN KSSTATE FromState); + + void StopMonitoringThread(IN PKSDEVICE device); #endif // __DEVICE_H__ Index: driver.cpp =================================================================== RCS file: /cvsroot/bdadev/NovaTDriver/driver.cpp,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** driver.cpp 4 Mar 2003 08:02:21 -0000 1.5 --- driver.cpp 6 Mar 2003 17:48:43 -0000 1.6 *************** *** 69,77 **** DEFINE_KSPROPERTY_ITEM_BDA_SIGNAL_STRENGTH( TunerSignalStrengthGet, ! TunerSignalStrengthPut ), DEFINE_KSPROPERTY_ITEM_BDA_SIGNAL_PRESENT( TunerSignalPresentGet,//CAntennaPin::GetSignalStatus, ! TunerSignalPresentPut ), }; --- 69,77 ---- DEFINE_KSPROPERTY_ITEM_BDA_SIGNAL_STRENGTH( TunerSignalStrengthGet, ! NULL ), DEFINE_KSPROPERTY_ITEM_BDA_SIGNAL_PRESENT( TunerSignalPresentGet,//CAntennaPin::GetSignalStatus, ! NULL ), }; *************** *** 107,115 **** DEFINE_KSPROPERTY_ITEM_BDA_SIGNAL_QUALITY( DemodSignalQualityGet, ! DemodSignalQualityPut ), DEFINE_KSPROPERTY_ITEM_BDA_SIGNAL_LOCKED( DemodSignalLockedGet,//CTransportPin::GetSignalStatus, ! DemodSignalLockedPut ), }; --- 107,115 ---- DEFINE_KSPROPERTY_ITEM_BDA_SIGNAL_QUALITY( DemodSignalQualityGet, ! NULL ), DEFINE_KSPROPERTY_ITEM_BDA_SIGNAL_LOCKED( DemodSignalLockedGet,//CTransportPin::GetSignalStatus, ! NULL ), }; *************** *** 524,527 **** --- 524,529 ---- }; + #pragma code_seg("init") + // Driver entry point extern "C" NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath) *************** *** 533,536 **** --- 535,541 ---- /*****************************************************************************\ * $Log$ + * Revision 1.6 2003/03/06 17:48:43 adcockj + * Added TPS change monitoring thread + * * Revision 1.5 2003/03/04 08:02:21 adcockj * Interim Checkin Index: l64781.cpp =================================================================== RCS file: /cvsroot/bdadev/NovaTDriver/l64781.cpp,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** l64781.cpp 4 Mar 2003 08:02:22 -0000 1.5 --- l64781.cpp 6 Mar 2003 17:48:43 -0000 1.6 *************** *** 32,35 **** --- 32,36 ---- #pragma code_seg("PAGE") + static const unsigned __int32 ppm=8000; unsigned __int8 L64781_ReadRegister(PKSDEVICE device,unsigned __int8 reg) *************** *** 66,72 **** void L64781_Apply_TPS(PKSDEVICE device) { - L64781_WriteRegister(device,0x2a,0x00); L64781_WriteRegister(device,0x2a,0x01); ! L64781_WriteRegister(device,0x2a,0x02); } --- 67,72 ---- void L64781_Apply_TPS(PKSDEVICE device) { L64781_WriteRegister(device,0x2a,0x01); ! L64781_WriteRegister(device,0x2a,0x00); } *************** *** 114,119 **** data->demodulator.HP_coderate=BDA_BCC_RATE_2_3; data->demodulator.modulation=BDA_MOD_64QAM; - data->demodulator.HP_coderate=BDA_BCC_RATE_1_2; - data->demodulator.modulation=BDA_MOD_16QAM; data->demodulator.transmit_mode=BDA_XMIT_MODE_2K; data->demodulator.guard_interval=BDA_GUARD_1_32; --- 114,117 ---- *************** *** 171,214 **** return (avg_quality<<8)|avg_quality; } ! void L64781_UpdateParameters(PKSDEVICE device) { ! // static const unsigned __int8 vcr_tab[]={7,1,2,3,5,7,8}; ! static const unsigned __int8 fec_tab[]={7,0,1,2,9,3,10,4}; ! static const unsigned __int8 qam_tab[]={2,4,0,6}; ! static const unsigned __int8 bw_tab[]={8,7,6}; static const unsigned __int8 guard_tab[]={1,2,4,8}; - static const unsigned __int32 ppm=8000; - DEVICE_CONTEXT *data=GETCONTEXT(device); - unsigned __int32 ddfs_offset_fixed; - unsigned __int32 init_freq; unsigned __int32 spi_bias; ! unsigned __int8 val0x04; ! unsigned __int8 val0x05; ! unsigned __int8 val0x06; ! int p_bandwidth,p_constellation,p_hp_coderate,p_guardinterval,p_lp_coderate,p_transmissionmode; ! _DbgPrintF(DEBUGLVL_TERSE, ("L64781 updating")); ! val0x04 = L64781_ReadRegister(device, 0x04); ! val0x05 = L64781_ReadRegister(device, 0x05); ! val0x06 = L64781_ReadRegister(device, 0x06); ! _DbgPrintF(DEBUGLVL_TERSE, ("L64781 Last Read TPS %02x %02x %02x", val0x04, val0x05, val0x06)); ! // All parameters are checked by automation functions, so no need to check here ! // Now translate Microsoft constants into the constants the Linux code originally wanted ! switch(data->tuner.bandwidth) { case 6: ! p_bandwidth=2; break; case 7: ! p_bandwidth=1; break; default: case 8: ! p_bandwidth=0; break; } switch(data->demodulator.modulation) { - default: case BDA_MOD_QPSK: p_constellation=0; --- 169,244 ---- return (avg_quality<<8)|avg_quality; } ! void L64781_UpdateSPIBias(PKSDEVICE device,int bandwidth,int constellation,int transmissionmode,int hp_coderate,int guardinterval, int inverted) { ! _DbgPrintF(DEBUGLVL_TERSE, ("L64781 Parameters: bandwidth(%i), constellation(%i), transmission(%i), HPcoderate(%i), GuardInterval(%i)",bandwidth,constellation,transmissionmode,hp_coderate,guardinterval)); ! ! static const unsigned __int8 fec_tab[]={1,2,3,5,7,}; ! static const unsigned __int8 qam_tab[]={2,4,6}; static const unsigned __int8 guard_tab[]={1,2,4,8}; unsigned __int32 spi_bias; ! unsigned __int64 qwSPIBias; ! // From Linux source - SPI bias calculation is slightly modified to fit in 32bit, will work for high ppm only... ! //spi_bias=378*(1<<10); ! //spi_bias*=16; ! //spi_bias*=bandwidth; ! //spi_bias*=qam_tab[constellation]; ! //spi_bias/=(fec_tab[hp_coderate]+1); ! //spi_bias/=(guard_tab[guardinterval]+32); ! //spi_bias*=(unsigned __int64)1000; ! //spi_bias/=(unsigned __int64)1000+ppm/1000; ! //spi_bias*=fec_tab[hp_coderate]; ! //spi_bias = MulDiv(spi_bias, 1000, 1000); ! // this is accurate and should work for any ppm ! qwSPIBias=1512 * fec_tab[hp_coderate] * qam_tab[constellation]; ! qwSPIBias*=((1<<10) * 32 * bandwidth * 1000000); ! qwSPIBias/=((fec_tab[hp_coderate] + 1) * (guard_tab[guardinterval]+32)); ! qwSPIBias/=(8 * (1000000 + ppm)); ! spi_bias = (unsigned __int32)qwSPIBias; ! L64781_WriteRegister(device,0x1B,spi_bias&0xFF); ! L64781_WriteRegister(device,0x1C,(spi_bias>>8)&0xFF); ! L64781_WriteRegister(device,0x1D,((spi_bias>>16)&0x7F)|(inverted?0x80:0x00)); ! ! _DbgPrintF(DEBUGLVL_TERSE, ("L64781 SPI Bias (%d)",spi_bias)); ! } ! int L64781_ConvertBandwidth(ULONG Bandwidth) ! { ! int retVal; ! switch(Bandwidth) { ! case 6000000: ! case 6000: case 6: ! return 6; break; + case 7000000: + case 7000: case 7: ! return 7; break; default: + case 8000000: + case 8000: case 8: ! return 8; break; } + } + void L64781_UpdateParameters(PKSDEVICE device) + { + DEVICE_CONTEXT *data=GETCONTEXT(device); + unsigned __int8 val0x04; + unsigned __int8 val0x05; + unsigned __int8 val0x06; + int p_bandwidth,p_constellation,p_hp_coderate,p_guardinterval,p_lp_coderate,p_transmissionmode,p_inverted; + unsigned __int32 ddfs_offset_fixed; + unsigned __int32 init_freq; + + // All parameters are checked by automation functions, so no need to check here + // Now translate Microsoft constants into the constants + // in the form of the TPS registers or in the way the original linux code has them + p_bandwidth=L64781_ConvertBandwidth(data->tuner.bandwidth); switch(data->demodulator.modulation) { case BDA_MOD_QPSK: p_constellation=0; *************** *** 217,260 **** p_constellation=1; break; case BDA_MOD_64QAM: ! p_constellation=3; break; } ! if(data->demodulator.transmit_mode==BDA_XMIT_MODE_8K) p_transmissionmode=1; ! else p_transmissionmode=0; switch(data->demodulator.HP_coderate) { case BDA_BCC_RATE_1_2: ! p_hp_coderate=1; break; case BDA_BCC_RATE_3_4: ! p_hp_coderate=3; break; case BDA_BCC_RATE_5_6: ! p_hp_coderate=4; break; case BDA_BCC_RATE_7_8: ! p_hp_coderate=5; break; default: case BDA_BCC_RATE_2_3: ! p_hp_coderate=2; break; } switch(data->demodulator.LP_coderate) { case BDA_BCC_RATE_2_3: ! p_lp_coderate=2; break; case BDA_BCC_RATE_3_4: ! p_lp_coderate=3; break; case BDA_BCC_RATE_5_6: ! p_lp_coderate=4; break; case BDA_BCC_RATE_7_8: ! p_lp_coderate=5; break; default: case BDA_BCC_RATE_1_2: ! p_lp_coderate=1; break; } --- 247,290 ---- p_constellation=1; break; + default: case BDA_MOD_64QAM: ! p_constellation=2; break; } ! p_transmissionmode=((data->demodulator.transmit_mode==BDA_XMIT_MODE_8K)?1:0); switch(data->demodulator.HP_coderate) { case BDA_BCC_RATE_1_2: ! p_hp_coderate=0; break; case BDA_BCC_RATE_3_4: ! p_hp_coderate=2; break; case BDA_BCC_RATE_5_6: ! p_hp_coderate=3; break; case BDA_BCC_RATE_7_8: ! p_hp_coderate=4; break; default: case BDA_BCC_RATE_2_3: ! p_hp_coderate=1; break; } switch(data->demodulator.LP_coderate) { case BDA_BCC_RATE_2_3: ! p_lp_coderate=1; break; case BDA_BCC_RATE_3_4: ! p_lp_coderate=2; break; case BDA_BCC_RATE_5_6: ! p_lp_coderate=3; break; case BDA_BCC_RATE_7_8: ! p_lp_coderate=4; break; default: case BDA_BCC_RATE_1_2: ! p_lp_coderate=0; break; } *************** *** 275,331 **** } _DbgPrintF(DEBUGLVL_TERSE, ("L64781 Values: bandwidth(%i), constellation(%i), transmission(%i), HPcoderate(%i), LPcoderate(%i), GuardInterval(%i)",data->tuner.bandwidth,data->demodulator.modulation,data->demodulator.transmit_mode,data->demodulator.HP_coderate,data->demodulator.LP_coderate,data->demodulator.guard_interval)); ! _DbgPrintF(DEBUGLVL_TERSE, ("L64781 Parameters: bandwidth(%i), constellation(%i), transmission(%i), HPcoderate(%i), LPcoderate(%i), GuardInterval(%i)",p_bandwidth,p_constellation,p_transmissionmode,p_hp_coderate,p_lp_coderate,p_guardinterval)); ! // Actually do it ! ddfs_offset_fixed=0x4000-(ppm<<16)/bw_tab[p_bandwidth]/1000000; ! // From Linux source - This works up to 20000 ppm, it overflows if too large ppm! ! init_freq=(((8UL<<24)+(8UL<<19)/25*ppm/(15625/25))/bw_tab[p_bandwidth]&0xFFFFFF); ! // From Linux source - SPI bias calculation is slightly modified to fit in 32bit, will work for high ppm only... ! spi_bias=378*(1<<10); ! spi_bias*=16; ! spi_bias*=bw_tab[p_bandwidth]; ! spi_bias*=qam_tab[p_constellation]; ! // spi_bias/=(vcr_tab[p_hp_coderate]+1); ! spi_bias/=(p_hp_coderate+1); ! spi_bias/=(guard_tab[p_guardinterval]+32); ! spi_bias*=(unsigned __int64)1000; ! spi_bias/=(unsigned __int64)1000+ppm/1000; ! // spi_bias*=vcr_tab[p_hp_coderate]; ! spi_bias*=p_hp_coderate; val0x04=(p_transmissionmode<<2)|p_guardinterval; ! val0x05=p_hp_coderate-1; ! // val0x05=fec_tab[p_hp_coderate]; ! if(data->demodulator.HierarchyInformation!=HIERARCHY_NONE) val0x05|=(p_lp_coderate-1)<<3; val0x06=(data->demodulator.HierarchyInformation<<2)|p_constellation; ! //L64781_WriteRegister(device,0x04,val0x04); ! //L64781_WriteRegister(device,0x05,val0x05); ! //L64781_WriteRegister(device,0x06,val0x06); _DbgPrintF(DEBUGLVL_TERSE, ("L64781 Write TPS %02x %02x %02x", val0x04, val0x05, val0x06)); ! L64781_Reset_AFC(device); // From Linux source - Technical manual section 2.6.1, TIM_IIR_GAIN optimal values L64781_WriteRegister(device,0x15,data->demodulator.transmit_mode==BDA_XMIT_MODE_2K?1:3); - L64781_WriteRegister(device,0x16,init_freq&0xFF); - L64781_WriteRegister(device,0x17,(init_freq>>8)&0xFF); - L64781_WriteRegister(device,0x18,(init_freq>>16)&0xFF); ! L64781_WriteRegister(device,0x1B,spi_bias&0xFF); ! L64781_WriteRegister(device,0x1C,(spi_bias>>8)&0xFF); ! L64781_WriteRegister(device,0x1D,((spi_bias>>16)&0x7F)|(data->demodulator.inversion==BDA_SPECTRAL_INVERSION_INVERTED?0x80:0x00)); L64781_WriteRegister(device,0x22,ddfs_offset_fixed&0xFF); L64781_WriteRegister(device,0x23,(ddfs_offset_fixed>>8)&0x3F); ! _DbgPrintF(DEBUGLVL_TERSE, ("L64781 Write InitFreq %06x", init_freq)); ! _DbgPrintF(DEBUGLVL_TERSE, ("L64781 Write SPI Bias %06x", spi_bias)); ! _DbgPrintF(DEBUGLVL_TERSE, ("L64781 Write ddfs Offset %04x", ddfs_offset_fixed)); ! L64781_ReadRegister(device,0x00); // Clear interrupt register ! L64781_ReadRegister(device,0x01); // DTO ! L64781_WriteRegister(device,0x02,0x01); ! L64781_WriteRegister(device,0x03,0x00); ! L64781_Apply_TPS(device); data->demodulator.ChangeOutstanding = FALSE; --- 305,350 ---- } _DbgPrintF(DEBUGLVL_TERSE, ("L64781 Values: bandwidth(%i), constellation(%i), transmission(%i), HPcoderate(%i), LPcoderate(%i), GuardInterval(%i)",data->tuner.bandwidth,data->demodulator.modulation,data->demodulator.transmit_mode,data->demodulator.HP_coderate,data->demodulator.LP_coderate,data->demodulator.guard_interval)); ! val0x04=(p_transmissionmode<<2)|p_guardinterval; ! val0x05=(unsigned __int8)p_hp_coderate; ! if(data->demodulator.HierarchyInformation!=HIERARCHY_NONE) { ! val0x05|=(p_lp_coderate<<3); ! } val0x06=(data->demodulator.HierarchyInformation<<2)|p_constellation; ! ! L64781_WriteRegister(device,0x04,val0x04); ! L64781_WriteRegister(device,0x05,val0x05); ! L64781_WriteRegister(device,0x06,val0x06); _DbgPrintF(DEBUGLVL_TERSE, ("L64781 Write TPS %02x %02x %02x", val0x04, val0x05, val0x06)); ! p_inverted=(data->demodulator.inversion==BDA_SPECTRAL_INVERSION_INVERTED); ! ! L64781_Apply_TPS(device); ! L64781_Reset_AFC(device); + + // setup demod paramters that don't depend on the TPS settings + // From Linux source - Technical manual section 2.6.1, TIM_IIR_GAIN optimal values L64781_WriteRegister(device,0x15,data->demodulator.transmit_mode==BDA_XMIT_MODE_2K?1:3); ! ddfs_offset_fixed=0x4000-(ppm<<16)/p_bandwidth/1000000; L64781_WriteRegister(device,0x22,ddfs_offset_fixed&0xFF); L64781_WriteRegister(device,0x23,(ddfs_offset_fixed>>8)&0x3F); ! // From Linux source - This works up to 20000 ppm, it overflows if too large ppm! ! init_freq=(((8UL<<24)+(8UL<<19)/25*ppm/(15625/25))/p_bandwidth&0xFFFFFF); ! L64781_WriteRegister(device,0x16,init_freq&0xFF); ! L64781_WriteRegister(device,0x17,(init_freq>>8)&0xFF); ! L64781_WriteRegister(device,0x18,(init_freq>>16)&0xFF); ! // setup demod paramters that do depend on the TPS settings ! L64781_UpdateSPIBias(device,p_bandwidth,p_constellation,p_transmissionmode,p_hp_coderate,p_guardinterval,p_inverted); ! ! L64781_ReadRegister(device,0x00); // Clear interrupt register ! L64781_ReadRegister(device,0x01); // DTO data->demodulator.ChangeOutstanding = FALSE; *************** *** 333,339 **** --- 352,399 ---- _DbgPrintF(DEBUGLVL_TERSE, ("L64781 updated")); } + void L64781_CheckForTPSUpdate(PKSDEVICE device) + { + // see if the TPS interrupt has been triggered + if(L64781_ReadRegister(device,0x00) & 0x01) + { + DEVICE_CONTEXT *data=GETCONTEXT(device); + unsigned __int8 val0x04; + unsigned __int8 val0x05; + unsigned __int8 val0x06; + int p_bandwidth,p_constellation,p_hp_coderate,p_guardinterval,p_lp_coderate,p_transmissionmode,p_inverted; + + p_bandwidth=L64781_ConvertBandwidth(data->tuner.bandwidth); + + // if it has then work out what it is telling us + val0x04 = L64781_ReadRegister(device, 0x04); + val0x05 = L64781_ReadRegister(device, 0x05); + val0x06 = L64781_ReadRegister(device, 0x06); + + _DbgPrintF(DEBUGLVL_TERSE, ("L64781 Incoming TPS %02x %02x %02x", val0x04, val0x05, val0x06)); + + p_constellation=(val0x06 & 0x03); + p_transmissionmode=((data->demodulator.transmit_mode==BDA_XMIT_MODE_8K)?1:0); + p_hp_coderate=(val0x05 & 0x07); + p_guardinterval=(val0x04 & 0x03); + p_inverted=(data->demodulator.inversion==BDA_SPECTRAL_INVERSION_INVERTED); + // write back the values received + L64781_WriteRegister(device,0x04,val0x04); + L64781_WriteRegister(device,0x05,val0x05); + L64781_WriteRegister(device,0x06,val0x06); + + // then set up the demod parameters that depend on the new settings + L64781_UpdateSPIBias(device,p_bandwidth,p_constellation,p_transmissionmode,p_hp_coderate,p_guardinterval,p_inverted); + + L64781_Apply_TPS(device); + + L64781_ReadRegister(device,0x00); // Clear interrupt register + } + } /*****************************************************************************\ * $Log$ + * Revision 1.6 2003/03/06 17:48:43 adcockj + * Added TPS change monitoring thread + * * Revision 1.5 2003/03/04 08:02:22 adcockj * Interim Checkin Index: l64781.h =================================================================== RCS file: /cvsroot/bdadev/NovaTDriver/l64781.h,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** l64781.h 27 Feb 2003 16:50:53 -0000 1.3 --- l64781.h 6 Mar 2003 17:48:43 -0000 1.4 *************** *** 34,40 **** int L64781_Signal2NoiseRatio(PKSDEVICE device); void L64781_UpdateParameters(PKSDEVICE device); #define L64781_HasSignal(device) (_L64781_SignalStrength(device)>5) ! #define L64781_HasLock(device) (L64781_SignalState(device)&0x7f) #endif // __L64781_H__ --- 34,41 ---- int L64781_Signal2NoiseRatio(PKSDEVICE device); void L64781_UpdateParameters(PKSDEVICE device); + void L64781_CheckForTPSUpdate(PKSDEVICE device); #define L64781_HasSignal(device) (_L64781_SignalStrength(device)>5) ! #define L64781_HasLock(device) ((L64781_SignalState(device)&0x7f)!=0) #endif // __L64781_H__ |