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

📄 hw_rockcodec.c

📁 RK27驱动
💻 C
字号:
/*********************************************************************************
*		   Copyright (C),2004-2005,  Fuzhou Rockchip Co.,Ltd.
*							  All Rights Reserved
*									 V1.00
* FileName : 	Hw_codec.c
* Author	: 	lzy
* Description: 
* History	 :		  
*			<author>		<time>	   <version>	   <desc>
*			 lzy		   07/6/29 	  1.0			 ORG
*
$Log: HW_rockcodec.c,v $
Revision 1.1.1.1  2008/03/06 13:29:04  Lingzhaojun
no message

Revision 1.1.1.1  2007/12/21 02:34:33  Lingzhaojun
12.21

Revision 1.2  2007/12/14 15:09:29  Hanjiang
rm972 pp后的版本上传

Revision 1.1.1.1  2007/12/11 14:19:28  cvsadmin
no message

Revision 1.2  2007/12/04 13:46:03  Fangzhenfu
新 SDK 整合完后上传!!!

Revision 1.1.1.1  2007/12/01 01:30:06  Lingzhaojun
no message

Revision 1.8  2007/11/26 14:36:00  Huangxinyu
针对VX979的修改

Revision 1.7  2007/11/21 09:09:07  Huangzufang
录音提交

Revision 1.6  2007/11/17 06:12:55  Linzhengyuan
修改Codec_mode 更改的bug,最大音量调整为40

Revision 1.5  2007/11/10 04:22:42  Huangxinyu
调试修改

Revision 1.4  2007/10/17 01:48:16  Huangxinyu
修改发现的bug

Revision 1.3  2007/10/15 09:03:44  Huangxinyu
根据RK27提交修改driver

Revision 1.2  2007/10/08 02:38:40  Lingzhaojun
添加版本自动注释脚本


*********************************************************************************/

#include "hw_include.h"
#include "Hw_rockcodec.h"
#if (CODEC_TYPE == INTERNAL_CODEC)


#define  Codec_IICAdress        (0x27<<1)	
#define  Codec_IICSpeed   	200
#define  MAX_OUTLEVEL 		0x09
static UINT32  Codec_mode;	


static void CodecCommandSet(UINT8 uCmd, UINT8 uData)
{
    I2C_Init(Codec_IICAdress, Codec_IICSpeed);
    
    I2C_Write(uCmd,  &uData,  1, NormalMode);
    
    I2C_Deinit();

}

void CodecGainSet(unsigned char i)              // add by huang hzf
{
    switch(i) {
        case 1:
        CodecCommandSet(CGR10,  0x00);
        break;
        case 2:
        CodecCommandSet(CGR10,  0x33);
        break;
        case 3:
        CodecCommandSet(CGR10,  0x77);
        break;
        case 4:
        CodecCommandSet(CGR10,  0xCC);
        break;
        case 5:
        CodecCommandSet(CGR10,  0xFF);
        break;
        default:
           break;
        }       
}

/* --------------------------------------------------------------------------
*  FUNCTION:    Codec_RampUp:
* 
*  DESCRIPTION: Initial codec when power up
* 
*  RETURN:      NONE
* 
*  NOTES: 	
*  -------------------------------------------------------------------------- */
void Codec_RampUp(void)
{
#if defined( CODEC_LOW_EN )
    GPIO_SetPinLevel(CODEC_INITIAL_PIN, GPIO_LOW);
#else
    GPIO_SetPinLevel(CODEC_INITIAL_PIN, GPIO_HIGH);
#endif
}

/* --------------------------------------------------------------------------
*  FUNCTION:    Codec_RampDown:
* 
*  DESCRIPTION: Initial codec when power up
* 
*  RETURN:      NONE
* 
*  NOTES: 	
*  -------------------------------------------------------------------------- */
void Codec_RampDown(void)
{
#if defined( CODEC_LOW_EN )
    GPIO_SetPinLevel(CODEC_INITIAL_PIN, GPIO_HIGH);
#else
    GPIO_SetPinLevel(CODEC_INITIAL_PIN, GPIO_LOW);
#endif
}

/* --------------------------------------------------------------------------
*  FUNCTION:    Codec_PowOnInitial:
* 
*  DESCRIPTION: Initial codec when power up
* 
*  RETURN:      NONE
* 
*  NOTES:
*  -------------------------------------------------------------------------- */
void Codec_PowerOnInitial(void)
{
    IOMUX_SetI2SType(INTERNAL_CODEC);
/*#if defined( CODEC_LOW_EN )
    GPIO_SetPinLevel(CODEC_INITIAL_PIN, GPIO_HIGH);
#else
    GPIO_SetPinLevel(CODEC_INITIAL_PIN, GPIO_LOW);
#endif*/

//  SB =0 ,  SB_SLEEP = 1 set codec normal work    
    CodecCommandSet(PMR2, SB_SLEEP|GIM|SB_MC);							// set codec sleep
  
    CodecCommandSet(AICR, DAC_SERIAL|ADC_SERIAL|DAC_I2S|ADC_I2S);	
    CodecCommandSet(CR1, SB_MICBIAS|DAC_MUTE|DACSEL);		    // 
    CodecCommandSet(CR2, DAC_ADWL16|ADC_ADWL16|ADC_HPF);
    CodecCommandSet(CCR1, CRYSTAL_12M);						// 12M input
    CodecCommandSet(CCR2,  (FREQ441kHz<<4)|FREQ441kHz);      	//44.1KHZ   for ADC and DAC
    CodecCommandSet(CRR,   RATIO_8|KFast_32|TRESH_128);

    Codec_SetVolumet(0);
    CodecCommandSet(CGR6, 0x1f |GAIN_BYLEFT);               // set mic input  volume  GOSL and GOSR  CGR7 = CGR6
    CodecCommandSet(TR1,   NOSC);
//    CodecCommandSet(ICR,   0xff);								// mask all interrrupt
    CodecCommandSet(PMR1, SB_OUT|SB_MIX|SB_ADC|SB_IN1|SB_IN2|SB_MIC|SB_IND);	

    DelayMs_nops(10);
    
//     SB =0  SB_SLEEP = 0
    CodecCommandSet(PMR2, GIM|SB_MC);
    DelayMs_nops(10);
//  SB_DAC = 0,  set DAC active
    CodecCommandSet(PMR1, SB_OUT|SB_MIX|SB_ADC|SB_IN1|SB_IN2|SB_MIC|SB_IND);	

    DelayMs_nops(10);
//  SB_MIX = 0,  set mixer active
    CodecCommandSet(PMR1, SB_OUT|SB_ADC|SB_IN1|SB_IN2|SB_MIC|SB_IND);	

    DelayMs_nops(10);
//  SB_out = 0,  set output stage active
    CodecCommandSet(PMR1, SB_ADC|SB_IN1|SB_IN2|SB_MIC|SB_IND);	

//    Codec_RampUp();
//    DelayMs_nops(10);
    
}



/* --------------------------------------------------------------------------
*  FUNCTION:    	Codec_DeIitial:
*  DESCRIPTION:   power off audio codec
*  INPUT:        	NONE
*  RETURN:     	NONE
*  NOTES:      		
*  -------------------------------------------------------------------------- */
 void Codec_DeIitial(void)
{
    CodecCommandSet(PMR2,   SB|SB_SLEEP); 
}

/* --------------------------------------------------------------------------
*  FUNCTION:    Codec_SetMode:
* 
*  DESCRIPTION:  setup codec input/output to application mode
*  INPUT:        CodecMode_en_t	Codec_DACout/Codec_FMin/Codec_LineADC/Codec_MICAdc/Codec_Standby
*  RETURN:      NONE
*  NOTES:      if exit from application, like FM or MIC , please set codec to standby mode
*  -------------------------------------------------------------------------- */
void Codec_SetMode(CodecMode_en_t Codecmode)
{

	switch (Codecmode)
	{
	
		case Codec_DACout:
			{
				Codec_mode = SB_MICBIAS|DACSEL;
				CodecCommandSet(CR1,   Codec_mode|DAC_MUTE|HP_DIS);
                USDELAY(10);
				CodecCommandSet(PMR1, SB_ADC|SB_IN1|SB_IN2|SB_MIC|SB_IND);
				CodecCommandSet(PMR2, GIM|SB_MC);

                CodecCommandSet(CR1,   Codec_mode|DAC_MUTE);
			}
			break;
			
		case Codec_FMin:
			{
				Codec_mode = SB_MICBIAS|BYPASS1;
				CodecCommandSet(CR1,   Codec_mode|DAC_MUTE);

				CodecCommandSet(PMR1, SB_DAC|SB_ADC|SB_IN2|SB_MIC|SB_IND);
				CodecCommandSet(PMR2, GIM|SB_MC);
			}
			break;
			
		case Codec_FMADC:
			{
				Codec_mode = SB_MICBIAS|BYPASS1;
				CodecCommandSet(CR1,   Codec_mode|DAC_MUTE);
				CodecCommandSet(CR2,   DAC_ADWL16|ADC_ADWL16|ADC_HPF|INSEL_LINE1);

				//CodecCommandSet(CGR10,  0x00 );        // set FM ADC input gain
				    
				CodecCommandSet(PMR1, SB_DAC|SB_IN2|SB_MIC|SB_IND);
				CodecCommandSet(PMR2, GIM|SB_MC);
			}
			break;
			
		case Codec_LineADC:
			{
				Codec_mode = SB_MICBIAS|BYPASS1|HP_DIS;
				CodecCommandSet(CR1,   Codec_mode|DAC_MUTE);
                USDELAY(10);
				CodecCommandSet(CR2,   DAC_ADWL16|ADC_ADWL16|ADC_HPF|INSEL_LINE1);

			//	CodecCommandSet(CGR10,  0x00 );        // set line in ADC input gain
				
				CodecCommandSet(PMR1, SB_DAC|SB_IN2|SB_MIC|SB_IND);     //SB_MIX|
				CodecCommandSet(PMR2, GIM|SB_MC);
                Codec_SetVolumet(0);
			}
			break;
			
		case Codec_MICAdc:
			{
				Codec_mode = SB_MICBIAS|HP_DIS;                             //SIDETONE|
				CodecCommandSet(CR1,   Codec_mode|DAC_MUTE);
                USDELAY(10);
				CodecCommandSet(CR2,   DAC_ADWL16|ADC_ADWL16|ADC_HPF|INSEL_MIC);

                        // remove the setting, because CGR10 will be set at RECWIN.c,  lzy 4.14
			//	CodecCommandSet(CGR10,  0x33);        // set MIC input gain GIL and GIR
				
				CodecCommandSet(PMR1, SB_DAC|SB_IN1|SB_IN2|SB_IND);     //SB_MIX|
				CodecCommandSet(PMR2, GIM|SB_MC);
                Codec_SetVolumet(0);
			}
			break;
			
		case Codec_Standby:
			{
			#if defined( CODEC_LOW_EN )
    			GPIO_SetPinLevel(CODEC_INITIAL_PIN, GPIO_HIGH);
			#else
    			GPIO_SetPinLevel(CODEC_INITIAL_PIN, GPIO_LOW);
			#endif
                USDELAY(10);
                
                Codec_SetVolumet(0);
				Codec_mode =  SB_MICBIAS|DAC_MUTE;
				CodecCommandSet(CR1,   Codec_mode);

				USDELAY(1000);
				CodecCommandSet(PMR1,   SB_OUT|SB_ADC|SB_IN1|SB_IN2|SB_MIC|SB_IND);	
			}
			break;

	}

}


/* --------------------------------------------------------------------------
*  FUNCTION:    	Codec_SetSampleRate:
*  DESCRIPTION:  setup codec sample rate both for ADC and DAC application
*  INPUT:        	CodecFS_en_t		8kHz ~  48KHz
*  RETURN:     	NONE
*  NOTES:      
*  -------------------------------------------------------------------------- */
void Codec_SetSampleRate(CodecFS_en_t CodecFS)
{
	if(CodecFS<FSSTOP)
	{
		switch (CodecFS) 
		{
		case FS_8000Hz:
			CodecCommandSet(CCR2,    (FREQ8kHz<<4)|FREQ8kHz);      		//8KHZ  
			break;
		case FS_11025Hz:
			CodecCommandSet(CCR2,    (FREQ11025kHz<<4)|FREQ11025kHz); 	 //11.025K
			break;
		case FS_12KHz:
			CodecCommandSet(CCR2,    (FREQ12kHz<<4)|FREQ12kHz);      		//12K
			break;
		case FS_16KHz:
			 CodecCommandSet(CCR2,    (FREQ16kHz<<4)|FREQ16kHz);     		 //16K 
			break;
		case FS_22050Hz:
			CodecCommandSet(CCR2,     (FREQ2205kHz<<4)|FREQ2205kHz);      //22.05K
			break;
		case FS_24KHz:
			CodecCommandSet(CCR2,    (FREQ24kHz<<4)|FREQ24kHz);      		//24K
			break;		    
		case FS_32KHz:
			CodecCommandSet(CCR2,     (FREQ32kHz<<4)|FREQ32kHz);      	//32K  
			break;
		case FS_44100Hz:
			CodecCommandSet(CCR2,     (FREQ441kHz<<4)|FREQ441kHz);      	//44.1KHZ    
			break;
		case FS_48KHz:
			CodecCommandSet(CCR2,     (FREQ48kHz<<4)|FREQ48kHz);      	//48K
			break;
		}
	}
}


/* --------------------------------------------------------------------------
*  FUNCTION:    	Codec_SetVolumet:
*  DESCRIPTION:  set  codec output volume 
*  INPUT:        	volume
*  RETURN:     	NONE
*  NOTES:      		volume = 0 mean mute,  
*  -------------------------------------------------------------------------- */
void Codec_SetVolumet(unsigned int Volume)
{
	UINT16 vol, vol_out, vol_in ;
	
 	if(Volume > MAX_VOLUME) Volume = MAX_VOLUME;

	if(Volume == 0)  
		{
		Codec_mode |= HP_DIS;
		CodecCommandSet(CR1, Codec_mode);
		}
	else 
		{
		Codec_mode &= ~HP_DIS;
		CodecCommandSet(CR1, Codec_mode);
		
		vol = MAX_VOLUME - Volume;
		vol +=  MAX_OUTLEVEL;

		if(vol >= 31)
			{
			vol_out = 31;           // 0x1f
			
 // 最大音量调节范围只有46-MAX_OUTLEVEL =  36,这里只好将最小几个相同			
			if(vol > 46) 
			    vol_in = 15;          
			else
    			vol_in = vol -31;
			}
		else
			{
			vol_in = 0x0;
			vol_out = vol;
			}

		CodecCommandSet(CGR8, vol_out |GAIN_BYLEFT);    	// set output  volume GOL and GOL,  CGR9= CGR8
		CodecCommandSet(CGR1, (vol_in<<4) |vol_in);    	    // set DAC input  volume  GODL and GODR
		CodecCommandSet(CGR2, (vol_in + 4) |GAIN_BYLEFT);    // set line1 input  volume GOBL1 and GOBR1, CGR3 = CGR2
		CodecCommandSet(CGR4, (vol_in + 4) |GAIN_BYLEFT);    // set line2 input  volume  GOBL2 and GOBR2  CGR5 = CGR4
		
//  mic output gain is no setup because we no using MIC monitor function
//		CodecCommandSet(CGR6, (vol_in + 4) |GAIN_BYLEFT);    // set mic input  volume  GOSL and GOSR  CGR7 = CGR6

		}

}

/* --------------------------------------------------------------------------
*  FUNCTION:    	Codec_DACMute
*  DESCRIPTION:   set codec DAC soft mute
*  INPUT:        	NONE
*  RETURN:     	NONE
*  NOTES:      		this function only used when DAC working
*  -------------------------------------------------------------------------- */
void Codec_DACMute(void)
{	
	Codec_mode |= DAC_MUTE;
	CodecCommandSet(CR1,   DAC_MUTE|Codec_mode);		// DAC soft mute
}

/* --------------------------------------------------------------------------
*  FUNCTION:    	Codec_SetVolumet
*  DESCRIPTION:  set codec exit soft MUTE
*  INPUT:        	NONE
*  RETURN:     	NONE
*  NOTES:      		this function only used when DAC working
*  -------------------------------------------------------------------------- */
void Codec_DACUnMute(void)
{
	Codec_mode &= ~DAC_MUTE;
	CodecCommandSet(CR1,   Codec_mode);		     // DAC soft un mute
}

#endif

⌨️ 快捷键说明

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