|
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__
|