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

📄 tea5760_drv.c

📁 是FM芯片 TEA5760的驱动代码 在ADS上面编译通过的.
💻 C
📖 第 1 页 / 共 2 页
字号:
  // set feq.
  philips_fm.wb[1] = (uint8)((command1_pll>>8)&0x0000003f);
  philips_fm.wb[2] = (uint8)(command1_pll&0x000000ff);

  kal_prompt_trace(MOD_MMI,"%s,%s,%d: Optimizer curf:%x, pll: %x ", __FILE__,__func__,__LINE__,curf,command1_pll);

  // send to philips chip register
  retcode = Philips_FM_Send(philips_fm.wb, 7, PHILIPS_I2C_WADDRESS);

  //wait for RF == 1 
  retcode = Philips_FM_Send_checkRF();
  if ( retcode < 0 )
  {
	   kal_prompt_trace(MOD_MMI,"%s,%s,%d: Check RF Error,retcode:%d", __FILE__,__func__,__LINE__,retcode);
 	   FM_Debug_Print_Bin((uint8 *)__FILE__,(uint8 *)__func__,__LINE__,(uint8 *)"HIINJECT READ DATA",philips_fm.rb,16);
       return OPTIMIZER_HI_SIDE_TIMEOUT_ERROR;
  }

  // SAVE LEVEL HIGHT.
  philips_fm.hi_level = ((philips_fm.rb[9]>>4)&0x0f);


  // Send command2_pll
  FetchCommandData();
  // 1. set LO INJECT PLL
  command2_pll = GetPllFromFrequency((curf-45), LO_SIDE_INJECTION);
  philips_fm.wb[4] = (philips_fm.wb[4] & (~FM_HLSI))| FM_MUTE; // HLSI = 1, MUTE = 1
  // 2 set feq.
  philips_fm.wb[1] = (uint8)((command2_pll>>8)&0x0000003f);
  philips_fm.wb[2] = (uint8)(command2_pll&0x000000ff);

  // 3 send to philips chip register
  retcode = Philips_FM_Send(philips_fm.wb, 7, PHILIPS_I2C_WADDRESS);
  //wait for RF == 1 
  retcode = Philips_FM_Send_checkRF();
  if ( retcode < 0 )
  {
	   kal_prompt_trace(MOD_MMI,"%s,%s,%d: Check RF Error,retcode:", __FILE__,__func__,__LINE__,retcode);
 	   FM_Debug_Print_Bin((uint8 *)__FILE__,(uint8 *)__func__,__LINE__,(uint8 *)"HIINJECT READ DATA",philips_fm.rb,16);
       return OPTIMIZER_LO_SIDE_TIMEOUT_ERROR;
  }

  // SAVE LEVEL HIGHT.
  philips_fm.lo_level = ((philips_fm.rb[9]>>4)&0x0f);
  return 0;
}

void FMDrv_SetFreq( int16 curf )
{
    int16 retcode;
	uint8 fm_hlsi;
	uint32 command_pll;
	uint16 i;
	uint32 used_curf;
	
    kal_prompt_trace(MOD_MMI,"%s:%d: Entry Function: %s",__FILE__,__LINE__,__func__);


    used_curf = curf*10;
	
    kal_prompt_trace(MOD_MMI,"%s:%d: %s, used_curf = %x",__FILE__,__LINE__,__func__,used_curf);

    // 开始PRESET流程
    
    retcode = FM_Philips_optimizer(used_curf);
    if ( retcode < 0 )
    {
        // Error. See Errcode
        kal_prompt_trace(MOD_MMI,"%s:%s:%d: set feq error: %d\n",__FILE__,__func__,__LINE__,retcode);
		return;
    }
    kal_prompt_trace(MOD_MMI,"%s:%s:%d: set feq done,FEQ = %d\n",__FILE__,__func__,__LINE__,used_curf);
    
    fm_hlsi = (philips_fm.hi_level < philips_fm.lo_level)? 1: 0;
    
    //fm_hlsi = 1;
	
    // set command.
    FetchCommandData();
    // 2. set LO INJECT PLL
    if ( fm_hlsi)
    {
        command_pll = GetPllFromFrequency(used_curf, HI_SIDE_INJECTION);
    }
    else
    {
        command_pll = GetPllFromFrequency(used_curf, LO_SIDE_INJECTION);  
    }
    philips_fm.wb[4] = (philips_fm.wb[4] & ~(FM_MUTE));
    //set HLSI
    if ( fm_hlsi)
    {
      philips_fm.wb[4] |= FM_HLSI;
    }
    else
    {
      philips_fm.wb[4] &= (~FM_HLSI);  
    }
    // set feq.
    philips_fm.wb[1] = (uint8)((command_pll>>8)&0x0000003f);
    philips_fm.wb[2] = (uint8)(command_pll&0x000000ff);

    // send to philips chip register
    retcode = Philips_FM_Send(philips_fm.wb, 7, PHILIPS_I2C_WADDRESS);

    if ( retcode < 0 )
    {
	    kal_prompt_trace(MOD_MMI,"%s:%s:%d: set register error,code = %d\n",__FILE__,__func__,__LINE__,retcode);    
    }

/*
    for( i = 0; i < 1000; i++);

    Philips_FM_Read(philips_fm.rb,16,PHILIPS_I2C_RADDRESS);

	FM_Debug_Print_Bin((uint8 *)__FILE__,(uint8 *)__func__,__LINE__,(uint8 *)"SET FEQ Data",philips_fm.rb,16);

    kal_prompt_trace(MOD_MMI,"%s:%d: Exit Function: %s",__FILE__,__LINE__,__func__);
*/
    return;
}

uint8 FMDrv_GetSigLvl(int16 curf)
{
  	int16 retcode;
	uint8 fm_hlsi;
	uint32 command_pll;
	uint8 frrflag;
	uint16 i;
	uint16 used_freq;
	uint8  if_value;
	uint8  search_directory;

	
    kal_prompt_trace(MOD_MMI,"%s:%d: Entry Function: %s",__FILE__,__LINE__,__func__);

	used_freq = curf*10;  // 875 --> 8750

	#if 0
/*
    retcode = FM_Philips_optimizer(curf);
    if ( retcode < 0 )
    {
        // Error. See Errcode
        kal_prompt_trace(MOD_MMI,"%s:%s:%d: set feq error: %d\n",__FILE__,__func__,__LINE__,retcode);
		return 0;  // Error, return 0 , FIXME!!!
    }
    kal_prompt_trace(MOD_MMI,"%s:%s:%d: set feq done,FEQ = %d\n",__FILE__,__func__,__LINE__,curf);
*/
    fm_hlsi = (philips_fm.hi_level < philips_fm.lo_level)? 1: 0;
    // set command.
    FetchCommandData();
    // 2. set LO INJECT PLL
    if ( fm_hlsi)
    {
        command_pll = GetPllFromFrequency(curf, HI_SIDE_INJECTION);
    }
    else
    {
        command_pll = GetPllFromFrequency(curf, LO_SIDE_INJECTION);  
    }
    philips_fm.wb[4] = (philips_fm.wb[4] | FM_MUTE );
    //set HLSI
    if ( fm_hlsi)
    {
      philips_fm.wb[4] |= FM_HLSI;
    }
    else
    {
      philips_fm.wb[4] &= (~FM_HLSI);  
    }
    // set feq.
    philips_fm.wb[1] = (uint8)((command_pll>>8)&0x0000003f);
    philips_fm.wb[2] = (uint8)(command_pll&0x000000ff);

    // send to philips chip register
    retcode = Philips_FM_Send(philips_fm.wb, 7, PHILIPS_I2C_WADDRESS);

    if ( retcode < 0 )
    {
	    kal_prompt_trace(MOD_MMI,"%s:%s:%d: set register error,code = %d\n",__FILE__,__func__,__LINE__,retcode);    
 		return 0;  // Error, return 0 , FIXME!!!
    }
    //wait for RF == 1 
    retcode = Philips_FM_Send_checkRF();
    if ( retcode < 0 )
    {
	     kal_prompt_trace(MOD_MMI,"%s,%s,%d: Check RF Error,retcode:", __FILE__,__func__,__LINE__,retcode);
 	     FM_Debug_Print_Bin((uint8 *)__FILE__,(uint8 *)__func__,__LINE__,(uint8 *)"HIINJECT READ DATA",philips_fm.rb,16);
         return 0;
    }

    kal_prompt_trace(MOD_MMI,"%s:%d: Function: %s, Level: %d",__FILE__,__LINE__,__func__,((philips_fm.rb[9]>>4)&0x0f));
#endif
  
    if ( 1 )  
    {
        search_directory = 1; //up
        fm_hlsi = 0;
    }
	else
	{
        search_directory = 0; //down
        fm_hlsi = 1;
	}

    if ( fm_hlsi)
    {
       command_pll = GetPllFromFrequency(used_freq, HI_SIDE_INJECTION);
    }
	else
    {
       command_pll = GetPllFromFrequency(used_freq, LO_SIDE_INJECTION);
    }

	FetchCommandData();

    philips_fm.wb[4] = (philips_fm.wb[4] | (FM_MUTE));
    //set HLSI
    if ( fm_hlsi)
    {
      philips_fm.wb[1] &= ~(FM_SUD);
      philips_fm.wb[4] |= FM_HLSI;
    }
    else
    {
      philips_fm.wb[1] |= FM_SUD;
      philips_fm.wb[4] &= (~FM_HLSI);  
    }

	// Threshold
	philips_fm.wb[4] |= 0x20; // 00100000
	// SETTING searching mode
	philips_fm.wb[1] |= FM_SM;
    // set feq.
    philips_fm.wb[1] |= (uint8)((command_pll>>8)&0x0000003f);
    philips_fm.wb[2] = (uint8)(command_pll&0x000000ff);

	//FM_Debug_Print_Bin((uint8 *)__FILE__,(uint8 *)__func__,__LINE__,(uint8 *)"Vaild stop send",philips_fm.wb,7);

    // send to philips chip register
    retcode = Philips_FM_Send(philips_fm.wb, 7, PHILIPS_I2C_WADDRESS);

    if ( retcode < 0 )
    {
	    kal_prompt_trace(MOD_MMI,"%s:%s:%d: set register error,code = %d\n",__FILE__,__func__,__LINE__,retcode);    
		return 0; // FLASE
    }

    //wait for RF == 1 
    retcode = Philips_FM_Send_checkRF();
	if ( retcode < 0 )
	{
	     kal_prompt_trace(MOD_MMI,"%s,%s,%d: Check RF Error,retcode:%d", __FILE__,__func__,__LINE__,retcode);
         return 0;
	}
	//FM_Debug_Print_Bin((uint8 *)__FILE__,(uint8 *)__func__,__LINE__,(uint8 *)"Read vaild stop",philips_fm.rb,16);
    kal_prompt_trace(MOD_MMI,"%s:%s:%d: Feq = %d IF Count = %x, Level = %x ",__FILE__,__func__,__LINE__,used_freq,(philips_fm.rb[8]>>1),(philips_fm.rb[9]>>4));    
	
	// IF check
	if_value = (philips_fm.rb[8]>>1);

	if ( if_value <= 0x31 || if_value >= 0x3e )
	{
	    // not in condition check.
	    kal_prompt_trace(MOD_MMI,"%s,%s,%d: %x not in IF condition check. ",__FILE__,__func__,__LINE__,if_value);
		return 0;
	}

	philips_fm.hi_level = (philips_fm.rb[9]>>4);

/*
	if ( philips_fm.hi_level < 5 ) // FIXME!!
	{
		return 0;
	}
*/

	fm_hlsi = ( fm_hlsi )? 0:1;

    if ( fm_hlsi)
    {
       command_pll = GetPllFromFrequency(used_freq, HI_SIDE_INJECTION);
    }
	else
    {
       command_pll = GetPllFromFrequency(used_freq, LO_SIDE_INJECTION);
    }


	FetchCommandData();

    philips_fm.wb[4] = (philips_fm.wb[4] | (FM_MUTE));
    //set HLSI
    if ( fm_hlsi)
    {
      philips_fm.wb[1] &= ~(FM_SUD);
      philips_fm.wb[4] |= FM_HLSI;
    }
    else
    {
      philips_fm.wb[1] |= FM_SUD;
      philips_fm.wb[4] &= (~FM_HLSI);  
    }
	// SETTING searching mode
	philips_fm.wb[1] &= ~(FM_SM);
    // set feq.
    philips_fm.wb[1] |= (uint8)((command_pll>>8)&0x0000003f);
    philips_fm.wb[2] = (uint8)(command_pll&0x000000ff);

 //	FM_Debug_Print_Bin((uint8 *)__FILE__,(uint8 *)__func__,__LINE__,(uint8 *)"Vaild stop send2",philips_fm.wb,7);
   // send to philips chip register
    retcode = Philips_FM_Send(philips_fm.wb, 7, PHILIPS_I2C_WADDRESS);

    if ( retcode < 0 )
    {
	    kal_prompt_trace(MOD_MMI,"%s:%s:%d: set register error,code = %d\n",__FILE__,__func__,__LINE__,retcode);    
		return 0; // FLASE
    }

    //wait for RF == 1 
    retcode = Philips_FM_Send_checkRF();
	if ( retcode < 0 )
	{
	     kal_prompt_trace(MOD_MMI,"%s,%s,%d: Check RF Error,retcode:%d", __FILE__,__func__,__LINE__,retcode);
         return 0;
	}
    kal_prompt_trace(MOD_MMI,"%s:%s:%d: FEQ = %d IF Count2 = %x, Level = %x ",__FILE__,__func__,__LINE__,used_freq,(philips_fm.rb[8]>>1),(philips_fm.rb[9]>>4));    

	//FM_Debug_Print_Bin((uint8 *)__FILE__,(uint8 *)__func__,__LINE__,(uint8 *)"Read vaild stop2",philips_fm.rb,16);
	// IF check
	if_value = (philips_fm.rb[8]>>1);

	if ( if_value <= 0x31 || if_value >= 0x3e )
	{
	    // not in condition check.
	    kal_prompt_trace(MOD_MMI,"%s,%s,%d: %x not in IF condition check.",__FILE__,__func__,__LINE__,if_value);
		return 0;
	}

	philips_fm.lo_level = (philips_fm.rb[9]>>4);

/*
	if ( philips_fm.lo_level < 5 ) // FIXME!!
	{
		return 0;
	}
*/

    if ( philips_fm.lo_level > philips_fm.hi_level )
    {
    	if_value = philips_fm.lo_level - philips_fm.hi_level;
    }
	else
	{
    	if_value = philips_fm.hi_level - philips_fm.lo_level;
	}
		
    if ( if_value > 2 )
    {
    	return 0;
    }

    kal_prompt_trace(MOD_MMI,"%s:%d: Exit Function: %s",__FILE__,__LINE__,__func__);
	
    return (philips_fm.lo_level > philips_fm.hi_level)?philips_fm.lo_level : philips_fm.hi_level;
}


void FMDrv_Mute(uint8 mute)
{
   int16 retcode;
   
   FetchCommandData();
   if ( mute )
   {
     philips_fm.wb[4] |= FM_MUTE;
   }
   else
   {
     philips_fm.wb[4] &= ~(FM_MUTE);
   }
   	
   retcode = Philips_FM_Send(philips_fm.wb, 7, PHILIPS_I2C_WADDRESS);
   return;
}

void FMDrv_ChipInit()
{
   GPO_ModeSetup(4,3);  //32k gpo4
   GPIO_InitIO(0,4);

   /*
   GPIO_ModeSetup(6,0);
   GPIO_InitIO(1,6);    //zkh 2007 9 27 
   GPIO_WriteIO(1,6);

   GPIO_ModeSetup(19,0);
   GPIO_InitIO(1,19);  
   GPIO_WriteIO(1,19);  //Eable
   */
   return;       
}

bool FMDrv_IsChipValid( void )
{

	return true;

}


void FMDrv_SetVolumeLevel(uint8 volume)//gaorui mod
{
     SerialVolumeReset();
     for( ;volume > 0;volume --)
	 {
    	SerialVolumeUp();
     }
}


static int16 Philips_FM_Send_checkRF(void)
{
    uint8  frrflag;
	uint16 i;
	int16  retcode;
    //wait for RF == 1 

    frrflag = 0;
    for ( i = 0; i < 8; i++)
    {
 		kal_sleep_task(20); // sleep 4.6 ms
 		// Read Data from Register.
  		retcode = Philips_FM_Read(philips_fm.rb, 16, PHILIPS_I2C_RADDRESS);
		if ( retcode < 0 )
		{
	        kal_prompt_trace(MOD_MMI,"%s,%s,%d:Optimizer Read Register Error,retcode:", __FILE__,__func__,__LINE__,retcode);
			return CHECK_PHILIPSFM_RF_READ_ERR; //fixme!!
		}
        // check FRRFLAG
        if ( philips_fm.rb[0]&0x02 ) // FRRFLAG == 1 
        {
           //tunner state machine is ready.
           frrflag++;
           break;
        }
    }

    if ( frrflag == 0 )
    {
       // TIMEOUT ERROR
       return CHECK_PHILIPSFM_RF_TIMEOUT; // Fixme!!
    }
	
    // check  band limit has been reached or timeout
    if ( philips_fm.rb[0]&0x01 )
    {
        // Error
	    kal_prompt_trace(MOD_MMI,"%s,%s,%d: Chip search limit reach. ", __FILE__,__func__,__LINE__);
        return CHECK_PHILIPSFM_REATCH_LIMIT;
    }

    return 0;
}


static void FM_Debug_Print_Bin(uint8 *filename, uint8 *function, uint16 line_number, uint8 *debug_info,uint8 *data, uint16 length)
{
   uint16 i;
   for ( i = 0; i < length; i++)
   {
       kal_prompt_trace(MOD_MMI,"%s:%s:%d: %s:i = [%d] data = [%x]\n",filename,function,line_number,debug_info,i,data[i]);
   }
   kal_prompt_trace(MOD_MMI,"==============================================");

}
static void FM_Debug_Print_String(uint8 *filename, uint8 *function, uint16 line_number, uint8 *debug_info,uint8 *data)
{
   kal_prompt_trace(MOD_MMI,"%s:%s:%d: %s:%s\n",filename,function,line_number,debug_info,data);
   kal_prompt_trace(MOD_MMI,"==============================================");

}

#endif

⌨️ 快捷键说明

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