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

📄 tmbsl1306.c

📁 三星一体化数字高频头DNQS221PH261A驱动程序
💻 C
📖 第 1 页 / 共 2 页
字号:

		// store board if the config has been updated
		g1306Instance[TunerUnit].config.uBoard = uValue;
        break;

    case CPUMP:
        g1306Instance[TunerUnit].config.bCPump = (UInt8)uValue;
        break;
    default:
        return TMBSL_ERR_TUNER_BAD_PARAMETER;
    }

    return TM_OK;
}


//-----------------------------------------------------------------------------
// FUNCTION:    tmbsl1306GetConfig:
//
// DESCRIPTION: Get the config of the 1306
//
// RETURN:      TMBSL_ERR_TUNER_BAD_UNIT_NUMBER
//              TMBSL_ERR_TUNER_NOT_INITIALIZED
//              TM_OK
//
// NOTES:
//-----------------------------------------------------------------------------
//
tmErrorCode_t
tmbsl1306GetConfig(
    tmUnitSelect_t     TunerUnit,  //  I: Tuner unit number
    UInt32             uItemId,    //  I: Identifier of the item to modify
    UInt32*            puValue     //  I: Value to set for the config item
    )
{
    //----------------------
    // test input parameters
    //----------------------
    // test the instance number
    if (TunerUnit > MAX_UNITS)
        return TMBSL_ERR_TUNER_BAD_UNIT_NUMBER;

    // test the object
    if (g1306Instance[TunerUnit].init == False)
        return TMBSL_ERR_TUNER_NOT_INITIALIZED;

    //--------------
    // get the value
    //--------------
    switch((tm1306cfgIndex_t)uItemId)
    {
    case BOARD:
        *puValue = g1306Instance[TunerUnit].config.uBoard;
        break;
    case CPUMP:
        *puValue = g1306Instance[TunerUnit].config.bCPump;
        break;
    case GETNBOFUNIT:
        *puValue = MAX_UNITS;
        break;
    default:
        return TMBSL_ERR_TUNER_BAD_PARAMETER;
    }

    return TM_OK;
}


//-----------------------------------------------------------------------------
// FUNCTION:    tmbsl1306SetRf:
//
// DESCRIPTION: Set the PLL of the 1306
//
// RETURN:      TMBSL_ERR_TUNER_BAD_UNIT_NUMBER
//              TMBSL_ERR_TUNER_NOT_INITIALIZED
//              TMBSL_ERR_TUNER_BAD_PARAMETER
//              TMBSL_ERR_IIC_ERR
//              TM_OK
//
// NOTES:
//-----------------------------------------------------------------------------
//
tmErrorCode_t
tmbsl1306SetRf(
    tmUnitSelect_t  TunerUnit,     //  I: Tuner unit number
    UInt32          uRf            //  I: Frequency in hertz
    )
{
    //----------------------
    // test input parameters
    //----------------------
    // test the instance number
    if (TunerUnit > MAX_UNITS)
        return TMBSL_ERR_TUNER_BAD_UNIT_NUMBER;

    // test the object
    if (g1306Instance[TunerUnit].init == False)
        return TMBSL_ERR_TUNER_NOT_INITIALIZED;

    // don't test the RF to avoid side effect during scanning
    //if(uRf < RF_MIN || uRf > RF_MAX)
    //    return TMBSL_ERR_TUNER_BAD_PARAMETER;

    //--------------
    // set the value
    //--------------
    // calculate the tuner reg
    t1306CalcReg(&g1306Instance[TunerUnit], &uRf);
 //   printf("check1 time");
    // write in the tuner
	if (g1306Instance[TunerUnit].systemFunc.SY_Write(
        g1306Instance[TunerUnit].uHwAddress,
        0, NB_REGISTERS, g1306Instance[TunerUnit].pTunerReg) != 1)
        return TMBSL_ERR_IIC_ERR;
 //   printf("check2 time");
	//	printf("tuner Address %x",g1306Instance[TunerUnit].uHwAddress);
	// printf("data %x",g1306Instance[TunerUnit].pTunerReg->pTunerReg[2]);
	// store value
	g1306Instance[TunerUnit].uRfProg = uRf;

    return TM_OK;
}


//-----------------------------------------------------------------------------
// FUNCTION:    tmbsl1306GetRf:
//
// DESCRIPTION: Get the frequency programmed in the tuner
//
// RETURN:      TMBSL_ERR_TUNER_BAD_UNIT_NUMBER
//              TMBSL_ERR_TUNER_NOT_INITIALIZED
//              TM_OK
//
// NOTES:       The value returned is the one stored in the object
//-----------------------------------------------------------------------------
//
tmErrorCode_t
tmbsl1306GetRf(
    tmUnitSelect_t  TunerUnit,     //  I: Tuner unit number
    UInt32*         puRf           //  O: Frequency in hertz
    )
{
    //----------------------
    // test input parameters
    //----------------------
    // test the instance number
    if (TunerUnit > MAX_UNITS)
        return TMBSL_ERR_TUNER_BAD_UNIT_NUMBER;

    // test the object
    if (g1306Instance[TunerUnit].init == False)
        return TMBSL_ERR_TUNER_NOT_INITIALIZED;

    //--------------
    // get the value
    //--------------
    // the read function can't be used
    *puRf = g1306Instance[TunerUnit].uRfProg;

    return TM_OK;
}


//-----------------------------------------------------------------------------
// Internal functions:
//-----------------------------------------------------------------------------
//

//-----------------------------------------------------------------------------
// FUNCTION:    t1306CalcReg:
//
// DESCRIPTION: Calculate the value to set in the registers of the tuner
//
// RETURN:      always true
//
// NOTES:       This function doesn't write in the tuner
//-----------------------------------------------------------------------------
//
Bool
t1306CalcReg (
    ptm1306object_t p1306object,    // I: tuner object
    UInt32*         puRf            // IO: frequency in hertz
    )
{
    UInt32 uFreqPll;
    UInt32 u32val;
	UInt8 TUNERADDRESS = 0xC2;   //default 4 pin , address open(0xC2) circuit.
	UInt8 TUNERBYTE2 = 0x0B;
	UInt8 TUNERBYTE3 = 0xF5;
	UInt8 TUNERBYTE4 = 0xC2;     //normal 4MHz, 166.66kHz
	UInt8 TUNERBYTE5 = 0x78;     //CP 122uA, UHF
	UInt8 TUNERBYTE6 = 0x82;     //AGC 220nA, 118dBuVpp
    
	Int32 CP;
    UInt32 X_tal;
	UInt32 Ratio;
	Int32 point; // AGC takeover point ( internal ) or select external mode
    UInt32 RF_Step;
	UInt32 N;
	X_tal = 4000000;
    *puRf -= 36130000; /* return into RF Input check - IF */
	//printf(" Frequency %d",*puRf);
	//getch();
	if(*puRf <=56000000)
	{
	CP=2 ;  //54uA
	}
	else if(*puRf <=108000000)
	{
	CP=3;  //83uA
	}
	else if(*puRf <=120000000)
	{
	CP=4;  //122uA
	}
	else if(*puRf <=140000000)
	{
	CP=5; //163uA
	}
	else if(*puRf <=148000000)
	{
	CP=6; //254uA
	}
	else if(*puRf <=175000000)
	{
	CP=7; //400uA
	}
	else if(*puRf <=188000000)
	{
	CP=2 ;  //54uA
	}
	else if(*puRf <=260000000)
	{
	CP=3;  //83uA
	}
	else if(*puRf <=344000000)
	{
	CP=4;  //122uA
	}
	else if(*puRf <=368000000)
	{
	CP=5; //163uA
	}
	else if(*puRf <=436000000)
	{
	CP=6; //254uA
	}
	else if(*puRf <=471000000)
	{
	CP=7; //400uA
	}
	else if(*puRf <=568000000)
	{
	CP=4;  //122uA
	}
	else if(*puRf <=640000000)
	{
	CP=5; //163uA
	}
	else if(*puRf <=716000000)
	{
	CP=6; //254uA
	}
	else if(*puRf <=870000000)
	{
	CP=7; //400uA
	}
	else
	{
	}
	switch(CP)
	{
		case(1):
		TUNERBYTE5=TUNERBYTE5 & 0x1F;
		break;
		case(2):
		TUNERBYTE5=TUNERBYTE5 & 0x1F;
		TUNERBYTE5=TUNERBYTE5 | 0x20;
		break;
		case(3):
		TUNERBYTE5=TUNERBYTE5 & 0x1F;
		TUNERBYTE5=TUNERBYTE5 | 0x40;
		break;
		case(4):
		TUNERBYTE5=TUNERBYTE5 & 0x1F;
		TUNERBYTE5=TUNERBYTE5 | 0x60;
		break;
		case(5):
		TUNERBYTE5=TUNERBYTE5 & 0x1F;
		TUNERBYTE5=TUNERBYTE5 | 0x80;
		break;
		case(6):
		TUNERBYTE5=TUNERBYTE5 & 0x1F;
		TUNERBYTE5=TUNERBYTE5 | 0xA0;
		break;
		case(7):
		TUNERBYTE5=TUNERBYTE5 & 0x1F;
		TUNERBYTE5=TUNERBYTE5 | 0xC0;
		break;
		case(8):
		TUNERBYTE5=TUNERBYTE5 & 0x1F;
		TUNERBYTE5=TUNERBYTE5 | 0xE0;
		break;
		default:
		break;
	}

	if(*puRf <=175000000)
	{
	TUNERBYTE5 =(TUNERBYTE5&0xf0) + 0x01 ;  //VHF LOW
	}
	else if(*puRf <=471000000)
	{
	TUNERBYTE5 = (TUNERBYTE5 &0xf0) + 0x02;  //VHF
	}
	else if(*puRf <=900000000)
	{
	TUNERBYTE5 = (TUNERBYTE5 & 0xf0) + 0x04; //UHF
	}
	else
	{

	}
	/* part CP & Band control */



/*	printf("0 --> Ratio : 2MHz,  62.5 kHz step\n");
	printf("1 --> Ratio : 4MHz, 142.86kHz step\n");
	printf("2 --> Ratio : 4MHz, 166.67kHz step\n");
	printf("3 --> Ratio : 1MHz,  50   kHz step\n");
	printf("4 --> Ratio : 4MHz, 125   kHz step\n");
*/


		/* case(0x00): 62.5kHz step size QAM or Analogue Demod */
		TUNERBYTE4 = (TUNERBYTE4 & 0xF8);
		
		//break;
/*		case(0x01):
		TUNERBYTE4 = (TUNERBYTE4 & 0xF8);
		TUNERBYTE4 = (TUNERBYTE4 | 0x01);
		break;
		case(0x02):
		TUNERBYTE4 = (TUNERBYTE4 & 0xF8);
		TUNERBYTE4 = (TUNERBYTE4 | 0x02);
		break;
		case(0x03):
		TUNERBYTE4 = (TUNERBYTE4 & 0xF8);
		TUNERBYTE4 = (TUNERBYTE4 | 0x03);
		break;
		case(0x04):
		TUNERBYTE4 = (TUNERBYTE4 & 0xF8);
		TUNERBYTE4 = (TUNERBYTE4 | 0x04);
		break;
		default:
		break;
*/

		/* case(0x00): */
		Ratio = 64;
		//break;
/*		case(0x01):
		Ratio = 28.;
		break;
		case(0x02):
		Ratio = 24.;
		break;
		case(0x03):
		Ratio = 80.;
		break;
		case(0x04):
		Ratio = 32.;
*/


	//	OSC = *puRf + 36130000;
	    *puRf += 36130000; /* check + IF */

	RF_Step = X_tal/Ratio;
	p1306object->uPllStep = RF_Step;
    N = (UInt32) ( (*puRf/RF_Step) ) & 0x7FFF;

	if(((*puRf*10/RF_Step )  - (*puRf/RF_Step)*10) >= 5)
	N = N + 1;

       /*	printf("%f, %x",temp_val,(long)temp_val);
	getch();
	*/
	TUNERBYTE2 =  (0x7F) & (N>>8);
	TUNERBYTE3 = 0xFF & N;

	/* AGC part */
/*	printf("AGC take-over point\n");
	printf("0 --> 124dBuVpp\n");
	printf("1 --> 121dBuVpp\n");
	printf("2 --> 118dBuVpp, default mode at POR\n");
	printf("3 --> 115dBuVpp\n");
	printf("4 --> 112dBuVpp\n");
	printf("5 --> 109dBuVpp\n");
	printf("6 --> Iagc=0, External AGC\n");
	printf("7 --> Vagc=3.5V, Disabled\n");
*/
	point = 3; // 112dBuVpp  -- measurement
//	point = 7; // 112dBuVpp           max voltage adjustment. 炼沥侩.
	TUNERBYTE6 = (TUNERBYTE6&0xF8) | point;  //-- measurement
//	TUNERBYTE4 = (TUNERBYTE4 | 0xF0); //charge pump sinking current adjustment. 炼沥侩.

/*	printf("AGC time constant bit\n");
	printf("0 --> Iagc=220nA, T=2s with C=150nF(normal)\n");
	printf("1 --> Iagc=9uA, T=50ms with C=150nF\n");
*/
    //	if(AGC_T==1)
	//	TUNERBYTE6|=(AGC_T<<3);
	//else if(AGC_T==0)
		TUNERBYTE6&=(0xF7);

	p1306object->pTunerReg[0] = TUNERBYTE2;
	p1306object->pTunerReg[1] = TUNERBYTE3;
	p1306object->pTunerReg[2] = TUNERBYTE4;
	p1306object->pTunerReg[3] = TUNERBYTE5;
	p1306object->pTunerReg[4] = TUNERBYTE6;

#if 0
     /* TDA6651 200MHZ */
	p1306object->pTunerReg[0] = 0x05;
	p1306object->pTunerReg[1] = 0x89;
	p1306object->pTunerReg[2] = 0xc2;
	p1306object->pTunerReg[3] = 0x52;
	p1306object->pTunerReg[4] = 0x85; 
#endif

#if 1
    for(u32val=0;u32val<5;u32val++) 
	printf("data 0x%X 0x%X  ", u32val, p1306object->pTunerReg[u32val]); 
#endif    
	//----------
    // byte n... 
    //---------- 

    return True;
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -