📄 tmbsl10046.c
字号:
g10046Instance[demodUnit].sConfig.bAgcIfMax = 0x80;
break;
case 0x0800:
g10046Instance[demodUnit].sConfig.uIF = 36000000;
g10046Instance[demodUnit].sConfig.bAgcTun = 0;
g10046Instance[demodUnit].sConfig.bAgcIfMax = 0xff;
break;
default:
// board not supported
return TM_ERR_NOT_SUPPORTED;
}
break;
case OM5754_BOARD_DEF:
// sub-board
switch(uValue & 0xff00)
{
case 0x0000:
g10046Instance[demodUnit].sConfig.uIF = 36130000;
g10046Instance[demodUnit].sConfig.bAgcTun = 0;
g10046Instance[demodUnit].sConfig.bAgcIfMax = 0xff;
break;
default:
// board not supported
return TM_ERR_NOT_SUPPORTED;
}
break;
case CUSTOM_BOARD_DEF:
// do nothing more than setting the default values
break;
default:
// board not supported
return TM_ERR_NOT_SUPPORTED;
}
// store board if the config has been updated
g10046Instance[demodUnit].sConfig.uBoard = uValue;
break;
case XTALL:
g10046Instance[demodUnit].sConfig.uXtall = uValue;
break;
case PLLMFACTOR:
g10046Instance[demodUnit].sConfig.bPLL_MFactor = (UInt8)uValue;
break;
case PLLNFACTOR:
g10046Instance[demodUnit].sConfig.bPLL_NFactor = (UInt8)uValue;
break;
case PLLPFACTOR:
g10046Instance[demodUnit].sConfig.bPLL_PFactor = (UInt8)uValue;
break;
case BERDEPTH:
g10046Instance[demodUnit].sConfig.bBerDepth = (UInt8)uValue;
break;
case IQSWAPPED:
g10046Instance[demodUnit].sConfig.bIQ_Swapped = (UInt8)uValue;
break;
case EXTOFFSET:
g10046Instance[demodUnit].sConfig.bExtOffset = (UInt8)uValue;
break;
case OFFSET125K:
g10046Instance[demodUnit].sConfig.bOffset125k = (UInt8)uValue;
break;
case IF:
g10046Instance[demodUnit].sConfig.uIF = (UInt32)uValue;
break;
case WATCHDOG:
g10046Instance[demodUnit].sConfig.bWatchdog = (UInt8)uValue;
break;
case NBRETRY:
g10046Instance[demodUnit].sConfig.bNbRetry = (UInt8)uValue;
break;
case PULSEKILLER:
g10046Instance[demodUnit].sConfig.bPulseKiller = (UInt8)uValue;
break;
case XTALL100PPM:
g10046Instance[demodUnit].sConfig.bXtall100ppm = (UInt8)uValue;
break;
case AGCTUN:
g10046Instance[demodUnit].sConfig.bAgcTun = (UInt8)uValue;
break;
case AGCPOLATUN:
g10046Instance[demodUnit].sConfig.bAgcPolaTun = (UInt8)uValue;
break;
case AGCPOLAIF:
g10046Instance[demodUnit].sConfig.bAgcPolaIf = (UInt8)uValue;
break;
case AGCTUNMAX:
g10046Instance[demodUnit].sConfig.bAgcTunMax = (UInt8)uValue;
break;
case AGCTUNMIN:
g10046Instance[demodUnit].sConfig.bAgcTunMin = (UInt8)uValue;
break;
case AGCIFMAX:
g10046Instance[demodUnit].sConfig.bAgcIfMax = (UInt8)uValue;
break;
case AGCIFMIN:
g10046Instance[demodUnit].sConfig.bAgcIfMin = (UInt8)uValue;
break;
case OUTPOCLK:
g10046Instance[demodUnit].sConfig.bOUT_Poclk = (UInt8)uValue;
break;
case OUTPARASER:
g10046Instance[demodUnit].sConfig.bOUT_ParaSer = (UInt8)uValue;
break;
case OUTMSBLSB:
g10046Instance[demodUnit].sConfig.bOUT_MsbLsb = (UInt8)uValue;
break;
case OUTMODEAB:
g10046Instance[demodUnit].sConfig.bOUT_ModeAB = (UInt8)uValue;
break;
case OUTPARADIV:
g10046Instance[demodUnit].sConfig.bOUT_ParaDiv = (UInt8)uValue;
break;
// backdoor functions
case FEINIT:
// init
Tda10046WriteInit(&g10046Instance[demodUnit]);
break;
case SWITCH:
if (uValue)
// tuner and eeprom are accessible
g10046Instance[demodUnit].systemFunc.SY_WriteBit(
g10046Instance[demodUnit].uDemodHwAdd,
TDA10046_CONF_C4_IND, TDA10046_CONFC4_BPI2CTUNEEP_BIT,
TDA10046_CONFC4_BPI2CTUNEEP_BIT);
else
// tuner and eeprom are deconnected from the I2C bus
g10046Instance[demodUnit].systemFunc.SY_WriteBit(
g10046Instance[demodUnit].uDemodHwAdd,
TDA10046_CONF_C4_IND, TDA10046_CONFC4_BPI2CTUNEEP_BIT, 0);
break;
case STARTIQ:
// DSP command
puByteBuffer[0] = 0x6A;
puByteBuffer[1] = 0x02;
// use DSP multi-purpose registers - workaround HW BUG
g10046Instance[demodUnit].systemFunc.SY_Write(
g10046Instance[demodUnit].uDemodHwAdd,
TDA10046_DSP_ADR_LSB_IND, 1, &puByteBuffer[1]);
g10046Instance[demodUnit].systemFunc.SY_Write(
g10046Instance[demodUnit].uDemodHwAdd,
TDA10046_DSP_ADR_MSB_IND, 1, &puByteBuffer[0]);
// check acknowledgment
g10046Instance[demodUnit].systemFunc.SY_Read(
g10046Instance[demodUnit].uDemodHwAdd,
TDA10046_DSP_REG_MSB_IND, 2, puByteBuffer);
if (puByteBuffer[0] != 0x6A || puByteBuffer[1] != 0x00)
return TM_FALSE;
break;
case STOPIQ:
case STOPREPIMP:
// DSP command
puByteBuffer[0] = 0x6A;
puByteBuffer[1] = 0x00;
// use DSP multi-purpose registers - workaround HW BUG
g10046Instance[demodUnit].systemFunc.SY_Write(
g10046Instance[demodUnit].uDemodHwAdd,
TDA10046_DSP_ADR_LSB_IND, 1, &puByteBuffer[1]);
g10046Instance[demodUnit].systemFunc.SY_Write(
g10046Instance[demodUnit].uDemodHwAdd,
TDA10046_DSP_ADR_MSB_IND, 1, &puByteBuffer[0]);
break;
case SETCARRIERHIGH:
g10046Instance[demodUnit].uCarrierHigh = uValue;
g10046Instance[demodUnit].uCarrier = g10046Instance[demodUnit].uCarrierLow;
break;
case SETCARRIERLOW:
g10046Instance[demodUnit].uCarrierLow = uValue;
g10046Instance[demodUnit].uCarrier = g10046Instance[demodUnit].uCarrierLow;
break;
case SETCARRIERSTEP:
g10046Instance[demodUnit].uCarrierStep = uValue;
g10046Instance[demodUnit].uCarrier = g10046Instance[demodUnit].uCarrierLow;
break;
case STARTREPIMP:
// DSP command
puByteBuffer[0] = 0x6A;
puByteBuffer[1] = 0x01;
// use DSP multi-purpose registers - workaround HW BUG
g10046Instance[demodUnit].systemFunc.SY_Write(
g10046Instance[demodUnit].uDemodHwAdd,
TDA10046_DSP_ADR_LSB_IND, 1, &puByteBuffer[1]);
g10046Instance[demodUnit].systemFunc.SY_Write(
g10046Instance[demodUnit].uDemodHwAdd,
TDA10046_DSP_ADR_MSB_IND, 1, &puByteBuffer[0]);
// check acknowledgment
g10046Instance[demodUnit].systemFunc.SY_Read(
g10046Instance[demodUnit].uDemodHwAdd,
TDA10046_DSP_REG_MSB_IND, 2, puByteBuffer);
if (puByteBuffer[0] != 0x6A || puByteBuffer[1] != 0x00)
return TM_FALSE;
break;
default:
return TM_ERR_BAD_PARAMETER;
}
// start algo
g10046Instance[demodUnit].sApiFlags.iStartAlgo = True;
return TM_OK;
}
//-----------------------------------------------------------------------------
// FUNCTION: tmbsl10046GetConfig:
//
// DESCRIPTION: Get the config of the 10046
//
// RETURN: TMBSL_ERR_DEMOD_BAD_UNIT_NUMBER
// TMBSL_ERR_DEMOD_NOT_INITIALIZED
// TM_ERR_BAD_PARAMETER
// TM_OK
//
// NOTES: This function can be removed if needed
//-----------------------------------------------------------------------------
//
tmErrorCode_t
tmbsl10046GetConfig(
tmUnitSelect_t demodUnit, // I: Demod unit number
UInt32 uItemId, // I: Identifier of the item to modify
UInt32* puValue // O: Value to set for the config item
)
{
UInt32 uByte;
UInt32 puByteBuffer[2];
//----------------------
// test input parameters
//----------------------
// test the instance number
if (demodUnit > TDA10046_MAX_UNITS)
return TMBSL_ERR_DEMOD_BAD_UNIT_NUMBER;
// test the object
if (g10046Instance[demodUnit].sApiFlags.iInit == False)
return TMBSL_ERR_DEMOD_NOT_INITIALIZED;
//----------------------
// Implementation
//----------------------
// get the value
switch((tm10046cfgIndex_t)uItemId)
{
// Board config
case BOARD:
*puValue = g10046Instance[demodUnit].sConfig.uBoard;
break;
case STANDARD:
*puValue = tmhalFEStandardDVBT;
break;
case XTALL:
*puValue = g10046Instance[demodUnit].sConfig.uXtall;
break;
case PLLMFACTOR:
*puValue = g10046Instance[demodUnit].sConfig.bPLL_MFactor;
break;
case PLLNFACTOR:
*puValue = g10046Instance[demodUnit].sConfig.bPLL_NFactor;
break;
case PLLPFACTOR:
*puValue = g10046Instance[demodUnit].sConfig.bPLL_PFactor;
break;
case BERDEPTH:
*puValue = g10046Instance[demodUnit].sConfig.bBerDepth;
break;
case IQSWAPPED:
*puValue = g10046Instance[demodUnit].sConfig.bIQ_Swapped;
break;
case EXTOFFSET:
*puValue = g10046Instance[demodUnit].sConfig.bExtOffset;
break;
case OFFSET125K:
*puValue = g10046Instance[demodUnit].sConfig.bOffset125k;
break;
case IF:
*puValue = g10046Instance[demodUnit].sConfig.uIF;
break;
case WATCHDOG:
*puValue = g10046Instance[demodUnit].sConfig.bWatchdog;
break;
case NBRETRY:
*puValue = g10046Instance[demodUnit].sConfig.bNbRetry;
break;
case PULSEKILLER:
*puValue = g10046Instance[demodUnit].sConfig.bPulseKiller;
break;
case XTALL100PPM:
*puValue = g10046Instance[demodUnit].sConfig.bXtall100ppm;
break;
case AGCTUN:
*puValue = g10046Instance[demodUnit].sConfig.bAgcTun;
break;
case AGCPOLATUN:
*puValue = g10046Instance[demodUnit].sConfig.bAgcPolaTun;
break;
case AGCPOLAIF:
*puValue = g10046Instance[demodUnit].sConfig.bAgcPolaIf;
break;
case AGCTUNMAX:
*puValue = g10046Instance[demodUnit].sConfig.bAgcTunMax;
break;
case AGCTUNMIN:
*puValue = g10046Instance[demodUnit].sConfig.bAgcTunMin;
break;
case AGCIFMAX:
*puValue = g10046Instance[demodUnit].sConfig.bAgcIfMax;
break;
case AGCIFMIN:
*puValue = g10046Instance[demodUnit].sConfig.bAgcIfMin;
break;
case OUTPOCLK:
*puValue = g10046Instance[demodUnit].sConfig.bOUT_Poclk;
break;
case OUTPARASER:
*puValue = g10046Instance[demodUnit].sConfig.bOUT_ParaSer;
break;
case OUTMSBLSB:
*puValue = g10046Instance[demodUnit].sConfig.bOUT_MsbLsb;
break;
case OUTMODEAB:
*puValue = g10046Instance[demodUnit].sConfig.bOUT_ModeAB;
break;
case OUTPARADIV:
*puValue = g10046Instance[demodUnit].sConfig.bOUT_ParaDiv;
break;
// backdoor functions
case IDENTITY:
g10046Instance[demodUnit].systemFunc.SY_Read(
g10046Instance[demodUnit].uDemodHwAdd,
TDA10046_IDENTITY_IND, 1, &uByte);
if (uByte != 0x46)
*puValue = False;
else
*puValue = True;
break;
case READSYNC:
g10046Instance[demodUnit].systemFunc.SY_Read(
g10046Instance[demodUnit].uDemodHwAdd,
TDA10046_SYNC_STATUS_IND, 1, puValue);
break;
case READAGC:
g10046Instance[demodUnit].systemFunc.SY_Read(
g10046Instance[demodUnit].uDemodHwAdd,
TDA10046_AGC_IF_LEVEL_IND, 1, &uByte);
*puValue = uByte << 16;
g10046Instance[demodUnit].systemFunc.SY_Read(
g10046Instance[demodUnit].uDemodHwAdd,
TDA10046_AGC_TUN_LEVEL_IND, 1, &uByte);
*puValue |= uByte << 8;
g10046Instance[demodUnit].systemFunc.SY_Read(
g10046Instance[demodUnit].uDemodHwAdd,
TDA10046_DIG_AGC_LEVEL_IND, 1, &uByte);
*puValue |= uByte;
break;
case GETNBOFUNIT:
*puValue = TDA10046_MAX_UNITS;
break;
case READIQ:
return tmbsl10046GetIQ(demodUnit, puValue);
case READCBER:
return tmbsl10046GetCBER(demodUnit, puValue);
case READCONF:
return tmbsl10046GetConfidence(demodUnit, puValue);
case READREPIMP:
return tmbsl10046GetImpulResp(demodUnit, puValue);
case READREPFREQ:
return tmbsl10046GetFreqResp(demodUnit, puValue);
case READCELLID:
g10046Instance[demodUnit].systemFunc.SY_Read(
g10046Instance[demodUnit].uDemodHwAdd,
TDA10046_CELL_ID_MSB_IND, 2, puByteBuffer);
*puValue = puByteBuffer[0] << 8 | puByteBuffer[1];
break;
case READDSPVERSION:
// DSP command
uByte = 0x67;
// use DSP multi-purpose registers
g10046Instance[demodUnit].systemFunc.SY_Write(
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -