/* Info: Downconverter frequency is out of range (may be reason for MT_DPC_UNLOCK) */
#define MT2063_DNC_RANGE (0x08000000)
-#define MAX_UDATA (4294967295) /* max value storable in u32 */
-
-#define MT2063_TUNER_CNT (1) /* total num of MicroTuner tuners */
-#define MT2063_I2C (0xC0)
-
/*
* Data Types
*/
**
*****************************************************************************/
-/* Version of this module */
-#define MT2063_SPUR_VERSION 10201 /* Version 01.21 */
/* Implement ceiling, floor functions. */
#define ceil(n, d) (((n) < 0) ? (-((-(n))/(d))) : (n)/(d) + ((n)%(d) != 0))
s32 max_;
};
-#if MT2063_TUNER_CNT > 1
-static struct MT2063_AvoidSpursData_t *TunerList[MT2063_TUNER_CNT];
-static u32 TunerCount = 0;
-#endif
static u32 MT2063_RegisterTuner(struct MT2063_AvoidSpursData_t *pAS_Info)
{
-#if MT2063_TUNER_CNT == 1
pAS_Info->nAS_Algorithm = 1;
return 0;
-#else
- u32 index;
-
- pAS_Info->nAS_Algorithm = 2;
-
- /*
- ** Check to see if tuner is already registered
- */
- for (index = 0; index < TunerCount; index++) {
- if (TunerList[index] == pAS_Info) {
- return 0; /* Already here - no problem */
- }
- }
-
- /*
- ** Add tuner to list - if there is room.
- */
- if (TunerCount < MT2063_TUNER_CNT) {
- TunerList[TunerCount] = pAS_Info;
- TunerCount++;
- return 0;
- } else
- return -ENODEV;
-#endif
}
static void MT2063_UnRegisterTuner(struct MT2063_AvoidSpursData_t *pAS_Info)
{
-#if MT2063_TUNER_CNT > 1
- u32 index;
-
- for (index = 0; index < TunerCount; index++) {
- if (TunerList[index] == pAS_Info) {
- TunerList[index] = TunerList[--TunerCount];
- }
- }
-#endif
}
/*
static void MT2063_ResetExclZones(struct MT2063_AvoidSpursData_t *pAS_Info)
{
u32 center;
-#if MT2063_TUNER_CNT > 1
- u32 index;
- struct MT2063_AvoidSpursData_t *adj;
-#endif
pAS_Info->nZones = 0; /* this clears the used list */
pAS_Info->usedZones = NULL; /* reset ptr */
MT2063_AddExclZone(pAS_Info, 1882820000 - pAS_Info->f_in, 1884220000 - pAS_Info->f_in); /* Ctr = 1883.52 */
MT2063_AddExclZone(pAS_Info, 1881092000 - pAS_Info->f_in, 1882492000 - pAS_Info->f_in); /* Ctr = 1881.792 */
}
-#if MT2063_TUNER_CNT > 1
- /*
- ** Iterate through all adjacent tuners and exclude frequencies related to them
- */
- for (index = 0; index < TunerCount; ++index) {
- adj = TunerList[index];
- if (pAS_Info == adj) /* skip over our own data, don't process it */
- continue;
-
- /*
- ** Add 1st IF exclusion zone covering adjacent tuner's LO2
- ** at "adjfLO2 + f_out" +/- m_MinLOSpacing
- */
- if (adj->f_LO2 != 0)
- MT2063_AddExclZone(pAS_Info,
- (adj->f_LO2 + pAS_Info->f_out) -
- pAS_Info->f_min_LO_Separation,
- (adj->f_LO2 + pAS_Info->f_out) +
- pAS_Info->f_min_LO_Separation);
-
- /*
- ** Add 1st IF exclusion zone covering adjacent tuner's LO1
- ** at "adjfLO1 - f_in" +/- m_MinLOSpacing
- */
- if (adj->f_LO1 != 0)
- MT2063_AddExclZone(pAS_Info,
- (adj->f_LO1 - pAS_Info->f_in) -
- pAS_Info->f_min_LO_Separation,
- (adj->f_LO1 - pAS_Info->f_in) +
- pAS_Info->f_min_LO_Separation);
- }
-#endif
}
static struct MT2063_ExclZone_t *InsertNode(struct MT2063_AvoidSpursData_t
return (a >= b) ? a : b;
}
-#if MT2063_TUNER_CNT > 1
-static s32 RoundAwayFromZero(s32 n, s32 d)
-{
- return (n < 0) ? floor(n, d) : ceil(n, d);
-}
-
-/****************************************************************************
-**
-** Name: IsSpurInAdjTunerBand
-**
-** Description: Checks to see if a spur will be present within the IF's
-** bandwidth or near the zero IF.
-** (fIFOut +/- fIFBW/2, -fIFOut +/- fIFBW/2)
-** and
-** (0 +/- fZIFBW/2)
-**
-** ma mb me mf mc md
-** <--+-+-+-----------------+-+-+-----------------+-+-+-->
-** | ^ 0 ^ |
-** ^ b=-fIFOut+fIFBW/2 -b=+fIFOut-fIFBW/2 ^
-** a=-fIFOut-fIFBW/2 -a=+fIFOut+fIFBW/2
-**
-** Note that some equations are doubled to prevent round-off
-** problems when calculating fIFBW/2
-**
-** The spur frequencies are computed as:
-**
-** fSpur = n * f1 - m * f2 - fOffset
-**
-** Parameters: f1 - The 1st local oscillator (LO) frequency
-** of the tuner whose output we are examining
-** f2 - The 1st local oscillator (LO) frequency
-** of the adjacent tuner
-** fOffset - The 2nd local oscillator of the tuner whose
-** output we are examining
-** fIFOut - Output IF center frequency
-** fIFBW - Output IF Bandwidth
-** nMaxH - max # of LO harmonics to search
-** fp - If spur, positive distance to spur-free band edge (returned)
-** fm - If spur, negative distance to spur-free band edge (returned)
-**
-** Returns: 1 if an LO spur would be present, otherwise 0.
-**
-** Dependencies: None.
-**
-** Revision History:
-**
-** SCR Date Author Description
-** -------------------------------------------------------------------------
-** N/A 01-21-2005 JWS Original, adapted from MT_DoubleConversion.
-** 115 03-23-2007 DAD Fix declaration of spur due to truncation
-** errors.
-** 137 06-18-2007 DAD Ver 1.16: Fix possible divide-by-0 error for
-** multi-tuners that have
-** (delta IF1) > (f_out-f_outbw/2).
-** 177 S 02-26-2008 RSK Ver 1.18: Corrected calculation using LO1 > MAX/2
-** Type casts added to preserve correct sign.
-**
-****************************************************************************/
-static u32 IsSpurInAdjTunerBand(u32 bIsMyOutput,
- u32 f1,
- u32 f2,
- u32 fOffset,
- u32 fIFOut,
- u32 fIFBW,
- u32 fZIFBW,
- u32 nMaxH, u32 * fp, u32 * fm)
-{
- u32 bSpurFound = 0;
-
- const u32 fHalf_IFBW = fIFBW / 2;
- const u32 fHalf_ZIFBW = fZIFBW / 2;
-
- /* Calculate a scale factor for all frequencies, so that our
- calculations all stay within 31 bits */
- const u32 f_Scale =
- ((f1 +
- (fOffset + fIFOut +
- fHalf_IFBW) / nMaxH) / (MAX_UDATA / 2 / nMaxH)) + 1;
-
- /*
- ** After this scaling, _f1, _f2, and _f3 are guaranteed to fit into
- ** signed data types (smaller than MAX_UDATA/2)
- */
- const s32 _f1 = (s32) (f1 / f_Scale);
- const s32 _f2 = (s32) (f2 / f_Scale);
- const s32 _f3 = (s32) (fOffset / f_Scale);
-
- const s32 c = (s32) (fIFOut - fHalf_IFBW) / (s32) f_Scale;
- const s32 d = (s32) ((fIFOut + fHalf_IFBW) / f_Scale);
- const s32 f = (s32) (fHalf_ZIFBW / f_Scale);
-
- s32 ma, mb, mc, md, me, mf;
-
- s32 fp_ = 0;
- s32 fm_ = 0;
- s32 n;
-
- /*
- ** If the other tuner does not have an LO frequency defined,
- ** assume that we cannot interfere with it
- */
- if (f2 == 0)
- return 0;
-
- /* Check out all multiples of f1 from -nMaxH to +nMaxH */
- for (n = -(s32) nMaxH; n <= (s32) nMaxH; ++n) {
- const s32 nf1 = n * _f1;
- md = (_f3 + d - nf1) / _f2;
-
- /* If # f2 harmonics > nMaxH, then no spurs present */
- if (md <= -(s32) nMaxH)
- break;
-
- ma = (_f3 - d - nf1) / _f2;
- if ((ma == md) || (ma >= (s32) (nMaxH)))
- continue;
-
- mc = (_f3 + c - nf1) / _f2;
- if (mc != md) {
- const s32 m = (n < 0) ? md : mc;
- const s32 fspur = (nf1 + m * _f2 - _f3);
- const s32 den = (bIsMyOutput ? n - 1 : n);
- if (den == 0) {
- fp_ = (d - fspur) * f_Scale;
- fm_ = (fspur - c) * f_Scale;
- } else {
- fp_ =
- (s32) RoundAwayFromZero((d - fspur) *
- f_Scale, den);
- fm_ =
- (s32) RoundAwayFromZero((fspur - c) *
- f_Scale, den);
- }
- if (((u32) abs(fm_) >= f_Scale)
- && ((u32) abs(fp_) >= f_Scale)) {
- bSpurFound = 1;
- break;
- }
- }
-
- /* Location of Zero-IF-spur to be checked */
- mf = (_f3 + f - nf1) / _f2;
- me = (_f3 - f - nf1) / _f2;
- if (me != mf) {
- const s32 m = (n < 0) ? mf : me;
- const s32 fspur = (nf1 + m * _f2 - _f3);
- const s32 den = (bIsMyOutput ? n - 1 : n);
- if (den == 0) {
- fp_ = (d - fspur) * f_Scale;
- fm_ = (fspur - c) * f_Scale;
- } else {
- fp_ =
- (s32) RoundAwayFromZero((f - fspur) *
- f_Scale, den);
- fm_ =
- (s32) RoundAwayFromZero((fspur + f) *
- f_Scale, den);
- }
- if (((u32) abs(fm_) >= f_Scale)
- && ((u32) abs(fp_) >= f_Scale)) {
- bSpurFound = 1;
- break;
- }
- }
-
- mb = (_f3 - c - nf1) / _f2;
- if (ma != mb) {
- const s32 m = (n < 0) ? mb : ma;
- const s32 fspur = (nf1 + m * _f2 - _f3);
- const s32 den = (bIsMyOutput ? n - 1 : n);
- if (den == 0) {
- fp_ = (d - fspur) * f_Scale;
- fm_ = (fspur - c) * f_Scale;
- } else {
- fp_ =
- (s32) RoundAwayFromZero((-c - fspur) *
- f_Scale, den);
- fm_ =
- (s32) RoundAwayFromZero((fspur + d) *
- f_Scale, den);
- }
- if (((u32) abs(fm_) >= f_Scale)
- && ((u32) abs(fp_) >= f_Scale)) {
- bSpurFound = 1;
- break;
- }
- }
- }
-
- /*
- ** Verify that fm & fp are both positive
- ** Add one to ensure next 1st IF choice is not right on the edge
- */
- if (fp_ < 0) {
- *fp = -fm_ + 1;
- *fm = -fp_ + 1;
- } else if (fp_ > 0) {
- *fp = fp_ + 1;
- *fm = fm_ + 1;
- } else {
- *fp = 1;
- *fm = abs(fm_) + 1;
- }
-
- return bSpurFound;
-}
-#endif
-
/****************************************************************************
**
** Name: IsSpurInBand
const u32 d = pAS_Info->f_out + pAS_Info->f_out_bw / 2;
const u32 c = d - pAS_Info->f_out_bw;
const u32 f = pAS_Info->f_zif_bw / 2;
- const u32 f_Scale = (f_LO1 / (MAX_UDATA / 2 / pAS_Info->maxH1)) + 1;
+ const u32 f_Scale = (f_LO1 / (UINT_MAX / 2 / pAS_Info->maxH1)) + 1;
s32 f_nsLO1, f_nsLO2;
s32 f_Spur;
u32 ma, mb, mc, md, me, mf;
u32 lo_gcd, gd_Scale, gc_Scale, gf_Scale, hgds, hgfs, hgcs;
-#if MT2063_TUNER_CNT > 1
- u32 index;
-
- struct MT2063_AvoidSpursData_t *adj;
-#endif
*fm = 0;
/*
}
}
-#if MT2063_TUNER_CNT > 1
- /* If no spur found, see if there are more tuners on the same board */
- for (index = 0; index < TunerCount; ++index) {
- adj = TunerList[index];
- if (pAS_Info == adj) /* skip over our own data, don't process it */
- continue;
-
- /* Look for LO-related spurs from the adjacent tuner generated into my IF output */
- if (IsSpurInAdjTunerBand(1, /* check my IF output */
- pAS_Info->f_LO1, /* my fLO1 */
- adj->f_LO1, /* the other tuner's fLO1 */
- pAS_Info->f_LO2, /* my fLO2 */
- pAS_Info->f_out, /* my fOut */
- pAS_Info->f_out_bw, /* my output IF bandwidth */
- pAS_Info->f_zif_bw, /* my Zero-IF bandwidth */
- pAS_Info->maxH2, fp, /* minimum amount to move LO's positive */
- fm)) /* miminum amount to move LO's negative */
- return 1;
- /* Look for LO-related spurs from my tuner generated into the adjacent tuner's IF output */
- if (IsSpurInAdjTunerBand(0, /* check his IF output */
- pAS_Info->f_LO1, /* my fLO1 */
- adj->f_LO1, /* the other tuner's fLO1 */
- adj->f_LO2, /* the other tuner's fLO2 */
- adj->f_out, /* the other tuner's fOut */
- adj->f_out_bw, /* the other tuner's output IF bandwidth */
- pAS_Info->f_zif_bw, /* the other tuner's Zero-IF bandwidth */
- adj->maxH2, fp, /* minimum amount to move LO's positive */
- fm)) /* miminum amount to move LO's negative */
- return 1;
- }
-#endif
/* No spurs found */
return 0;
}