⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tmbsl10046.c

📁 TDA10046驱动源代码.TDA10046是PHILIPS的一款DVB-T TUNER
💻 C
📖 第 1 页 / 共 5 页
字号:
                    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 + -