📄 drv399e.c
字号:
gain-= 16;
else
integrator |= 0x80;
integrator |= (U8)(gain & 0x1F) << 2;
return integrator;
}
/*****************************************************
**FUNCTION :: FE_399_CalcAGC0Gain
**ACTION :: Compute the AGC0 gain
**PARAMS IN :: regvalue ==> register value
**PARAMS OUT:: NONE
**RETURN :: AGC0 gain
*****************************************************/
S32 FE_399_CalcAGC0Gain(U8 regvalue)
{
S32 gain = 0;
if((regvalue>0)&&(regvalue<10))
{
gain = (S32)((regvalue - 1)%4) * 6;
if(regvalue < 5)
gain -= 20;
else if(regvalue == 9)
gain += 24;
}
return gain;
}
#ifndef STTUNER_MINIDRIVER
/*****************************************************
**FUNCTION :: FE_399_GetVcoState
**ACTION :: return the status of the VCO
**PARAMS IN :: hChip ==> handle to the chip
**PARAMS OUT:: NONE
**RETURN :: the current state of the VCO
*****************************************************/
FE_399_VCO_STATE_t FE_399_GetVcoState(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle)
{
FE_399_VCO_STATE_t vcostate = VCO_LOCKED;
if(STTUNER_IOREG_GetField(DeviceMap,IOHandle,F399_VLOW) == 0) /* VCO is too low */
vcostate = VCO_TOO_LOW;
else if(STTUNER_IOREG_GetField(DeviceMap,IOHandle,F399_VHIGH) == 1) /* VCO is too high */
vcostate = VCO_TOO_HIGH;
return vcostate;
}
#endif
#ifdef STTUNER_MINIDRIVER
FE_399_VCO_STATE_t FE_399_GetVcoState( )
{
U8 Data1, Data2;
FE_399_VCO_STATE_t vcostate = VCO_LOCKED;
STTUNER_IODIRECT_ReadWrite(STTUNER_IO_SA_READ, R399_SYSCTRL, F399_VLOW, F399_VLOW_L, &Data1, 1, FALSE);
STTUNER_IODIRECT_ReadWrite(STTUNER_IO_SA_READ, R399_SYSCTRL, F399_VHIGH, F399_VHIGH_L, &Data2, 1, FALSE);
if(Data1 == 0) /* VCO is too low */
vcostate = VCO_TOO_LOW;
else if(Data2 == 1) /* VCO is too high */
vcostate = VCO_TOO_HIGH;
return vcostate;
}
#endif
/*****************************************************
**FUNCTION :: FE_399_StartSynt
**ACTION :: start STV0399 analog synthesizer
**PARAMS IN :: hChip ==> handle to the chip
**PARAMS OUT:: NONE
**RETURN :: NONE
*****************************************************/
#ifndef STTUNER_MINIDRIVER
void FE_399_StartSynt(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle)
{
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F399_BYP,0);
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F399_DIS,1);
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F399_DIS,0);
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F399_BYP,1);
}
#endif
#ifdef STTUNER_MINIDRIVER
void FE_399_StartSynt( )
{
U8 Data;
Data = 0;
STTUNER_IODIRECT_ReadWrite(STTUNER_IO_SA_WRITE, R399_SYNTCTRL, F399_BYP, F399_BYP_L, &Data, 1, FALSE);
Data = 1;
STTUNER_IODIRECT_ReadWrite(STTUNER_IO_SA_WRITE, R399_SYNTCTRL, F399_DIS, F399_DIS_L, &Data, 1, FALSE);
Data = 0;
STTUNER_IODIRECT_ReadWrite(STTUNER_IO_SA_WRITE, R399_SYNTCTRL, F399_DIS, F399_DIS_L, &Data, 1, FALSE);
Data = 1;
STTUNER_IODIRECT_ReadWrite(STTUNER_IO_SA_WRITE, R399_SYNTCTRL, F399_BYP, F399_BYP_L, &Data, 1, FALSE);
}
#endif
#ifdef STTUNER_MINIDRIVER
void FE_399_Synt( )
{
U8 Data;
Data = 1;
STTUNER_IODIRECT_ReadWrite(STTUNER_IO_SA_WRITE, R399_SYNTCTRL2, F399_RESET_FILT, F399_RESET_FILT_L, &Data, 1, FALSE);
Data = 1;
STTUNER_IODIRECT_ReadWrite(STTUNER_IO_SA_WRITE, R399_SYNTCTRL2, F399_RESET_FILT, F399_RESET_FILT_L, &Data, 1, FALSE);
}
#endif
#ifndef STTUNER_MINIDRIVER
void FE_399_Synt(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle )
{
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F399_RESET_FILT,1);
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F399_RESET_FILT,0);
}
#endif
/*--------------------------------------------------------------------------
--------------------------------------------------------------------------
--------------------------------------------------------------------------
**FUNCTION :: FE_399_CalcSyntFreqInt
**ACTION :: compute the STV0399 digital synthetizer frequency (with integers)
**PARAMS IN :: hChip ==> handle to the chip
** mdiv ==> mdiv divider value
** ipe ==> ipe divider value
**PARAMS OUT:: NONE
**RETURN :: Synthesizer frequency (Hz)
-----------------------------------------------------------------------------
-----------------------------------------------------------------------------
-----------------------------------------------------------------------------*/
U32 FE_399_CalcSyntFreqInt(S32 quartz,S32 mdiv,U32 ipe,U32 pll_mc)
{
U32 frequency = 0;
/*frequency = 1057*(pll_mc)*(((32*quartz)/4)/((((32767*(mdiv+33)-ipe))/31)));*//*original line*/
frequency = 1057*(pll_mc)*((8*quartz)/((((32767*(mdiv+33)-ipe))/31)));
return frequency;
}
/*--------------------------------------------------------------------------
--------------------------------------------------------------------------
--------------------------------------------------------------------------
**FUNCTION :: FE_399_CalcSyntFreqFloat
**ACTION :: compute the STV0399 digital synthetizer frequency (with floats)
**PARAMS IN :: hChip ==> handle to the chip
** mdiv ==> mdiv divider value
** ipe ==> ipe divider value
**PARAMS OUT:: NONE
**RETURN :: Synthesizer frequency (Hz)
-----------------------------------------------------------------------------
-----------------------------------------------------------------------------
-----------------------------------------------------------------------------*/
/*
U32 FE_399_CalcSyntFreqFloat(S32 quartz,S32 mdiv,U32 ipe,U32 pll_mc)
{
U32 frequency;
*/
/*frequency = (U32)((32.0)*((pll_mc*(double)quartz/4.0)/(mdiv+33.0-(double)(ipe)/32767.0)));*/ /*original line */
/* frequency = (U32)((32)*((pll_mc*quartz/4)/(mdiv+33-(ipe)/32767)));
return frequency;
}
*/
/*----------------------------------------------------------------
------------------------------------------------------------------
------------------------------------------------------------------
**FUNCTION :: FE_399_SetSyntFreq
**ACTION :: Set the STV0399 synthetizer frequency
**PARAMS IN :: hChip ==> handle to the chip
** Quartz ==> quartz frequency (Hz)
** Target ==> target frequency (Hz)
**PARAMS OUT:: NONE
**RETURN :: Synthesizer frequency (Hz)
------------------------------------------------------------------*/
#ifndef STTUNER_MINIDRIVER
U32 FE_399_SetSyntFreq(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle,U32 Quartz, U32 Target)
{
U32 ipe = 32767;
S32 mdiv = 0;
U32 pll_mc = 32;
pll_mc = FE_399_Get_PLL_mult_coeff(DeviceMap,IOHandle);
if((Target >= 202000000) && (Target <= 450000000) && Quartz)
{
mdiv = (4*(((2*pll_mc)*Quartz)/(Target/10000)))/10000 - 32;
ipe = (32767 * ((mdiv+33)*10000 - 4*(((2*pll_mc)*Quartz)/(Target/10000))))/10000;
/* round ipe divider */
if ( ((ipe & 0x03ff) > 0x01ff) || (ipe < 0x03ff) )
ipe |= 0x03ff;
else
ipe = (ipe & 0xfc00) - 1;
/* Set analog synthesizer */
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F399_MD,mdiv);
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F399_PE_MSB,MSB(ipe));
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F399_PE_LSB,LSB(ipe));
}
else
{
mdiv = STTUNER_IOREG_GetField(DeviceMap,IOHandle,F399_MD);
ipe = MAKEWORD(STTUNER_IOREG_GetField(DeviceMap,IOHandle,F399_PE_MSB),STTUNER_IOREG_GetField(DeviceMap,IOHandle,F399_PE_LSB));
}
return FE_399_CalcSyntFreqInt(Quartz,mdiv,ipe,pll_mc);
}
#endif
#ifdef STTUNER_MINIDRIVER
U32 FE_399_SetSyntFreq(U32 Quartz, U32 Target)
{
U8 Data, nsbuffer[2];
U32 ipe = 32767;
S32 mdiv = 0, temp = 0;
U32 pll_mc = 32;
pll_mc = FE_399_Get_PLL_mult_coeff( );
if((Target >= 202000000) && (Target <= 450000000) && Quartz)
{
mdiv = (4*(((2*pll_mc)*Quartz)/(Target/10000)))/10000 - 32;
ipe = (32767 * ((mdiv+33)*10000 - 4*(((2*pll_mc)*Quartz)/(Target/10000))))/10000;
/* round ipe divider */
if ( ((ipe & 0x03ff) > 0x01ff) || (ipe < 0x03ff) )
ipe |= 0x03ff;
else
ipe = (ipe & 0xfc00) - 1;
/* Set analog synthesizer */
temp = (mdiv > 0 ) ? mdiv : mdiv + (1 << 5);
Data = (U8)temp;
STTUNER_IODIRECT_ReadWrite(STTUNER_IO_SA_WRITE, R399_ACOARSE, F399_MD, F399_MD_L, &Data, 1, FALSE);
nsbuffer[0] = ((ipe) & 0xff00)>>8;
nsbuffer[1] = ((ipe) & 0x00ff);
STTUNER_IODIRECT_ReadWrite(STTUNER_IO_SA_WRITE, R399_AFINEMSB, 0, 0, nsbuffer, 2, FALSE);
}
else
{
STTUNER_IODIRECT_ReadWrite(STTUNER_IO_SA_READ, R399_ACOARSE, F399_MD, F399_MD_L, &Data, 1, FALSE);
mdiv = (S32)(Data - (1 << 5));
/*mdiv = Data;*/
STTUNER_IODIRECT_ReadWrite(STTUNER_IO_SA_READ, R399_AFINEMSB, 0, 0, nsbuffer, 2, FALSE);
ipe = MAKEWORD(nsbuffer[0],nsbuffer[1]);
}
return FE_399_CalcSyntFreqInt(Quartz,mdiv,ipe,pll_mc);
}
#endif
/*----------------------------------------------------------------
------------------------------------------------------------------
------------------------------------------------------------------
**FUNCTION :: FE_399_Get_PLL_mult_coeff
------------------------------------------------------------------*/
#ifndef STTUNER_MINIDRIVER
U32 FE_399_Get_PLL_mult_coeff(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle)
{
U32 pll_div;
switch(STTUNER_IOREG_GetField(DeviceMap, IOHandle,F399_PLL_DIV))
{
default:
pll_div = 32;
break;
case 2:
pll_div = 30;
break;
case 4:
pll_div = 32;
break;
case 6:
pll_div = 31;
break;
case 8:
pll_div = 34;
break;
case 12:
pll_div = 33;
break;
}
return pll_div;
}
#endif
#ifdef STTUNER_MINIDRIVER
U32 FE_399_Get_PLL_mult_coeff( )
{
U32 pll_div;
U8 Data;
STTUNER_IODIRECT_ReadWrite(STTUNER_IO_SA_READ, R399_DCLK1, F399_PLL_DIV, F399_PLL_DIV_L, &Data, 1, FALSE);
switch(Data)
{
default:
pll_div = 32;
break;
case 2:
pll_div = 30;
break;
case 4:
pll_div = 32;
break;
case 6:
pll_div = 31;
break;
case 8:
pll_div = 34;
break;
case 12:
pll_div = 33;
break;
}
return pll_div;
}
#endif
/*----------------------------------------------------------------
------------------------------------------------------------------
------------------------------------------------------------------
**FUNCTION :: FE_399_GetSyntFreq
**ACTION :: Set the STV0399 digital synthetizer frequency
**PARAMS IN :: hChip ==> handle to the chip
** Quartz ==> quartz frequency (Hz)
**PARAMS OUT:: NONE
**RETURN :: Synthesizer frequency (Hz)
------------------------------------------------------------------*/
#ifndef STTUNER_MINIDRIVER
U32 FE_399_GetSyntFreq(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle,U32 Quartz)
{
S8 mdiv;
U32 ipe,Fout,pll_mc;
/* analog synthesizer */
mdiv = STTUNER_IOREG_GetField(DeviceMap,IOHandle,F399_MD);
ipe = MAKEWORD(STTUNER_IOREG_GetField(DeviceMap,IOHandle,F399_PE_MSB),STTUNER_IOREG_GetField(DeviceMap,IOHandle,F399_PE_LSB));
pll_mc = FE_399_Get_PLL_mult_coeff(DeviceMap,IOHandle);
/*Fout = FE_399_CalcSyntFreqFloat(Quartz,mdiv,ipe,pll_mc);*/
Fout = FE_399_CalcSyntFreqInt(Quartz,mdiv,ipe,pll_mc);
return Fout;
}
#endif
#ifdef STTUNER_MINIDRIVER
U32 FE_399_GetSyntFreq(U32 Quartz)
{
U8 Data, nsbuffer[2];
S32 mdiv;
U32 ipe,
Fout,pll_mc;
/* analog synthesizer */
STTUNER_IODIRECT_ReadWrite(STTUNER_IO_SA_READ, R399_ACOARSE, F399_MD, F399_MD_L, &Data, 1, FALSE);
mdiv = Data;
STTUNER_IODIRECT_ReadWrite(STTUNER_IO_SA_READ, R399_AFINEMSB, 0, 0, nsbuffer, 2, FALSE);
ipe = MAKEWORD(nsbuffer[0],nsbuffer[1]);
pll_mc = FE_399_Get_PLL_mult_coeff( );
Fout = FE_399_CalcSyntFreqInt(Quartz,mdiv,ipe,pll_mc);
return Fout;
}
#endif
/*****************************************************
**FUNCTION :: FE_399_SetDivRatio
**ACTION :: Set the STV0399 synthesizer first divider ratio
**PARAMS IN :: hChip ==> handle to the chip
** Ratio ==> Divider Ratio (1..15)
**PARAMS OUT:: NONE
**RETURN :: NONE
*****************************************************/
#ifndef STTUNER_MINIDRIVER
void FE_399_SetDivRatio(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle, U8 Ratio)
{
U8 byte = 0x01;
U32 mode;
if((Ratio & 0x01) == 0x01)
byte = 0x03;
byte <<= ((Ratio/2)-1);
mode = STTUNER_IOREG_GetField(DeviceMap,IOHandle,F399_CMD_DIV_DIG);
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F399_BYP,0); /* Synthesizer bypass */
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F399_CMD_DIV_DIG,0); /* Divider bypass */
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F399_CMD_DIV,0); /* Reset divider */
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F399_CMD_DIV,byte); /* Set divider */
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F399_CMD_DIV_DIG,mode); /* Enable divider */
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F399_BYP,1); /* Enable synthesizer*/
}
#endif
#ifdef STTUNER_MINIDRIVER
void FE_399_SetDivRatio(U8 Ratio)
{
U8 byte = 0x01, Data;
U32 mode;
if((Ratio & 0x01) == 0x01)
byte = 0x03;
byte <<= ((Ratio/2)-1);
STTUNER_IODIRECT_ReadWrite(STTUNER_IO_SA_READ, R399_DCLK1, F399_CMD_DIV_DIG, F399_CMD_DIV_DIG_L, &Data, 1, FALSE);
mode = Data;
Data = 0;
STTUNER_IODIRECT_ReadWrite(STTUNER_IO_SA_WRITE, R399_SYNTCTRL, F399_BYP, F399_BYP_L, &Data, 1, FALSE);
Data = 0;
STTUNER_IODIRECT_ReadWrite(STTUNER_IO_SA_WRITE, R399_DCLK1, F399_CMD_DIV_DIG, F399_CMD_DIV_DIG_L, &Data, 1, FALSE);
Data = 0;
STTUNER_IODIRECT_ReadWrite(STTUNER_IO_SA_WRITE, R399_DCLK2, F399_CMD_DIV, F399_CMD_DIV_L, &Data, 1, FALSE);
Data = byte;
STTUNER_IODIRECT_ReadWrite(STTUNER_IO_SA_WRITE, R399_DCLK2, F399_CMD_DIV, F399_CMD_DIV_L, &Data, 1, FALSE);
Data = mode;
STTUNER_IODIRECT_ReadWrite(STTUNER_IO_SA_WRITE, R399_DCLK1, F399_CMD_DIV_DIG, F399_CMD_DIV_DIG_L, &Data, 1, FALSE);
Data = 1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -