?? codecs.c
字號:
if (Use_SPDIF) I2C_error += Set_WM8731(9, 0x00); /* Deactivate interface */
else I2C_error += Set_WM8731(9, 0x01); /* Activate interface */
#ifdef VOLUME_DARR
I2C_error += Set_WM8731(2, MAX_VOLUME >> 1);
I2C_error += Set_WM8731(3, MAX_VOLUME >> 1);
#else
I2C_error += Set_WM8731(2, START_UP_VOLUME >> 1);
I2C_error += Set_WM8731(3, START_UP_VOLUME >> 1);
#endif /* VOLUME_DARR */
return (I2C_error);
}
//==============================================================================================
/*******************/
/*** VOLUME_DARR ***/
/*******************/
void SetVolume_DARR80(unsigned char Left_Right, unsigned char Volume)
{
/* volume control on DARR is from 0 to 128 ,
that is why the volume is increased with one*/
if (Left_Right == 0) I2C_Write_Byte(AVOW_ADDR, (Volume >> 1)+1);
if (Left_Right == 1) I2C_Write_Byte(AVOX_ADDR, (Volume >> 1)+1);
#ifdef USE_DUAL_CODEC
if (Left_Right == 2) I2C_Write_Byte(AVOY_ADDR, (Volume >> 1)+1);
if (Left_Right == 3) I2C_Write_Byte(AVOZ_ADDR, (Volume >> 1)+1);
#endif /* END USE_DUAL_CODEC */
}
//==============================================================================================
/********************/
/*** CODEC_CS4251 ***/
/********************/
unsigned char Config_Codec_CS4251(void)
{
unsigned char I2C_error = 0;
#ifdef CODEC_CS4251
CODEC_RESET(0); /* Reset */
Wait_For_mSec(10); /* Ensure a steady-state reset */
CODEC_RESET(1); /* Remove reset */
Set_CS4251(0x02, 0x01); /* PDN = 1 Powerdown for Software Mode within 10 ms */
/* Software mode audio settings when PDN = 1 */
#ifdef PCB_PNP80_HEADSET
//no use allan
// Use DAC and ADC for headset
Set_CS4251(0x03, 0x21); /* No Auto | Single Speed | MICB | MICA | MICBIAS | (LSB) MCLK/DIV2 */
// Use DAC only for headphone
// Set_CS4251(0x03, 0x2F); /* No Auto | Single Speed | PDN_MICB | PDN_MICA | PDN_MICBIAS | (LSB) MCLK/DIV2 */
Set_CS4251(0x04, 0x4C); /* I2S Master | DAC = I2S format | ADC = I2S format | DIGMIX = Off | MICMIX = Off */
#else // Universal Transceiver
// Software Mode (default for Nack)
// Set_CS4251(0x03, 0x2F); /* No Auto | Single Speed | PDN_MICB | PDN_MICA | PDN_MICBIAS | (LSB) MCLK/DIV2 */
// Software Mode (default for Ack)
Set_CS4251(0x03, 0x21); /* No Auto | Single Speed | MICB | MICA | MICBIAS | (LSB) MCLK/DIV2 */
// Default Hardware Mode (Auto)
// Set_CS4251(0x03, 0xAE); /* Auto | Single Speed | PDN_MICB | PDN_MICA | PDN_MICBIAS | (LSB) No MCLK/DIV2 */
Set_CS4251(0x04, 0x0C); /* I2S Slave | DAC = I2S format | ADC = I2S format | DIGMIX = Off | MICMIX = Off */
#endif
Set_CS4251(0x02, 0x00); /* PDN = 0 */
// Set_CS4251(0x02, 0x1E); /* Powerdown PGA and ADC */
/* Required DAC settings */
Set_CS4251(0x08, 0x73); /* HP_GAIN = default G = 0.6047 (not in dB) | DAC_SNGVOL = On | DACMuteB | DACMuteA */
Set_CS4251(0x09, 0x41); /* DATA_SEL = 01 Signal Processing Engine to DAC | Zero Crossing */
Set_CS4251(0x10, 0x00); /* MUTE_PCM_MIXA = Off | 0dB */
Set_CS4251(0x11, 0x00); /* MUTE_PCM_MIXB = Off | 0dB */
Set_CS4251(0x16, Volume_Memory); /* AOUTA Volume = user setting*/
Set_CS4251(0x17, Volume_Memory); /* AOUTB Volume = user setting if not using DAC_SNGVOL */
/* For improved DAC audio performance */
Set_CS4251(0x14, 0x19); /* Treble Corner Freq = 15kHz | Bass Corner Freq = 50Hz | Tone Control = On */
Set_CS4251(0x21, 0x50); /* Charge Pump Freq = 438kHz */
/* For default DAC audio performance */
// Set_CS4251(0x14, 0x00); /* Tone Control = Off */
// Set_CS4251(0x21, 0xF0); /* Charge Pump Freq = 180kHz */
/* Already DAC default */
// Set_CS4251(0x12, 0x00); /* Beep 260.87Hz | On time 86ms */
// Set_CS4251(0x13, 0x00); /* Beep off time 1.23 seconds | Beep Volume 0dB */
// Set_CS4251(0x15, 0x88); /* 0dB Treble Gain | 0dB Bass Gain */
// Set_CS4251(0x18, 0x00); /* PCMA = L | PCMB = R | ADCA = L | ADCB = R */
// Set_CS4251(0x19, 0x00); /* 0dB Max Threshold | 0dB Max Cushion Threshold | Limiter Soft Ramp = Off | Limiter Zero Cross = Off */
// Set_CS4251(0x1A, 0x7F); /* Limit = Off */
/* Required ADC settings */
Set_CS4251(0x06, 0xA5); /* ADCB_HPF_EN | ADCA_HPF_EN | ZCROSSB | ZCROSSA */
Set_CS4251(0x1D, 0x00); /* Fastest Release */
Set_CS4251(0x1E, 0x1C); /* ALC Threshold Max = 0dB | Min = -30dB */
Set_CS4251(0x1F, 0xC0); /* NG_ALL = On | NG_EN = On | -64dB Threshold | 50ms delay */
/* Already ADC default */
// Set_CS4251(0x0A, 0x00); /* ALCA_SRDIS = Off | ALCA_ZCDIS = Off | 0dB PGAA_VOL */
// Set_CS4251(0x0B, 0x00); /* ALCB_SRDIS = Off | ALCB_ZCDIS = Off | 0dB PGAB_VOL */
// Set_CS4251(0x0C, 0x00); /* 0dB ADCA_ATT */
// Set_CS4251(0x0D, 0x00); /* 0dB ADCB_ATT */
// Set_CS4251(0x1C, 0x00); /* ALC_ENB = Off | ALC_ENA = Off | Fastest Attack */
Set_CS4251(0x08, 0x70); /* HP_GAIN = default G = 0.6047 (not in dB) | DAC_SNGVOL = On | DACMuteB = Off | DACMuteA = Off */
if (Use_ModuleMode==CU)
{
#ifndef LINE_IN
if (Use_Application<4)
{
/* For CU Nack */
Set_CS4251(0x03, 0x2F); /* No Auto | Single Speed | PDN_MICB | PDN_MICA | PDN_MICBIAS | (LSB) MCLK/DIV2 */
//Set_CS4251(0x05, 0xE0); /* ADC_SNGVOL | ADCB_DBOOST | ADCA_DBOOST | MICB_BOOST=Off | MICA_BOOST=Off */
Set_CS4251(0x05, 0x80); /* ADC_SNGVOL | MICB_BOOST=Off | MICA_BOOST=Off */
Set_CS4251(0x07, 0x00); /* AIN1B->PGAB | AIN1A->PGAA */
}
else
{
/* For CU Headset */
Set_CS4251(0x03, 0x21); /* No Auto | Single Speed | MICB | MICA | MICBIAS | (LSB) MCLK/DIV2 */
/* Note: ADC_DBOOST must be turned off to eliminate distortion in mic in */
Set_CS4251(0x02, 0x00); /* Poweron PGA and ADC */
//Set_CS4251(0x05, 0x83); /* ADC_SNGVOL | ADCB_DBOOST=Off | ADCA_DBOOST=Off | MICB_BOOST | MICA_BOOST */
Set_CS4251(0x05, 0x80); /* ADC_SNGVOL | MICB_BOOST=Off | MICA_BOOST=Off */
Set_CS4251(0x07, 0xF0); /* AIN3B->PGAB | AIN3A->PGAB +32/16dB */
Set_CS4251(0x18, 0xA0); /* L+R/2 | L+R/2 | L | R */
}
#else
Set_CS4251(0x03, 0x2F); /* No Auto | Single Speed | PDN_MICB | PDN_MICA | PDN_MICBIAS | (LSB) MCLK/DIV2 */
//Set_CS4251(0x05, 0xE0); /* ADC_SNGVOL | ADCB_DBOOST | ADCA_DBOOST | MICB_BOOST=Off | MICA_BOOST=Off */
Set_CS4251(0x05, 0x80); /* ADC_SNGVOL | MICB_BOOST=Off | MICA_BOOST=Off */
Set_CS4251(0x07, 0x00); /* AIN1B->PGAB | AIN1A->PGAA */
#endif
}
#endif /*CODEC_CS4251*/
return (I2C_error);
}
/********************/
/*** CODEC_CS4251 ***/
/********************/
unsigned char Set_CS4251(unsigned char address, int data)
{
unsigned char I2C_error = 0;
i2cSlaveAddress = 0x94; /* CS4251 I2C Address + Write */
I2C_error = I2C_Write_Byte(address, data);
i2cSlaveAddress = I2C_SLAVE_ADDRESS; /* Restore DARR80 I2C slave address */
return (I2C_error);
}
void SetVolume_CS4251(unsigned char Left_Right, unsigned char Volume)
{
if (Volume < 52) Volume = 52; /* Set 52 as Min -102dB */
/* 255 is Max -0.5dB. 24 is Headphone Gain Max +12dB but not used due to distortion */
Set_CS4251(0x16, Volume); /* Left on AOUTA */
// Set_CS4251(0x17, Volume); /* Right on AOUTB if DAC_SNGVOL not used */
#if 0
if (Volume < 25) Volume = 25; /* 25 is Min -51.5dB */
/* 255 is Max -0.5dB. 24 is Headphone Gain Max +12dB but not used due to distortion */
Volume &= 0x7F; /* PCM Mute Off */
Set_CS4251(0x10, Volume);
Set_CS4251(0x11, Volume);
#endif
}
void SetInVolume_CS4251(unsigned char Left_Right, unsigned char Volume)
{
SetVolume_CS4251(Left_Right, Volume);
}
/********************/
/*** CODEC_CS4341 ***/
/********************/
unsigned char Config_Codec_CS4341(void)
{
unsigned char I2C_error = 0;
#ifdef CODEC_CS4341
CODEC_RESET(0); /* Reset */
Wait_For_mSec(10); /* Ensure a steady-state reset */
CODEC_RESET(1); /* Remove reset */
//REG01 7 6 5 4 3 2 1 0
// AMUTE | DIF2 | DIF1 | DIF0 | DEM1 | DEM0 | POR | PDN
Set_CS4341(0x01, 0x01); /* PDN = 1 POR=0, Powerdown for Software Mode within 10 ms */
//REG00 7 6 5 4 3 2 1 0
// Reserved | Reserved | Reserved | Reserved | Reserved | Reserved | MCLKDIV | Reserved |
Set_CS4341(0x00, 0x02); /* MCLK/DIV2 */
//REG01 7 6 5 4 3 2 1 0
// AMUTE | DIF2 | DIF1 | DIF0 | DEM1 | DEM0 | POR | PDN
Set_CS4341(0x01, 0x93); /* AMUTE Disable | I2S up 24 bit,32xFS internal SCLK */
//REG02 7 6 5 4 3 2 1 0
// A=B | Soft | Zero Cross | ATAPI4 | ATAPI3 | ATAPI2 | ATAPI1 | ATAPI0 |
Set_CS4341(0x02, 0xA9); /* A=B, Zero Crossing , AOUTA=aL AOUTB=bR */
#ifdef CODEC_CS4341
if((PINB && 0x02)==0) //Mute DAC////mute key active //PB1=0; mute
{
Set_CS4341(0x03, 0x80 ); /* Allan Add Left on AOUTA */
Set_CS4341(0x04, 0x80 ); /* Allan Add Left on AOUTA */
}
else //Open DAC////no mute key active //PB1=1; no mute
{
Set_CS4341(0x03, 0x00 ); /* Allan Add Left on AOUTA */
Set_CS4341(0x04, 0x00 ); /* Allan Add Left on AOUTA */
}
#endif
Set_CS4341(0x01, 0x90); /* PDN = 0 I2S up 24 bit,32xFS internal SCLK*/
Wait_For_mSec(10); /* Ensure a steady-state reset */
#endif
return (I2C_error);
}
/********************/
/*** CODEC_CS4341 ***/
/********************/
unsigned char Set_CS4341(unsigned char address, int data)
{
unsigned char I2C_error = 0;
i2cSlaveAddress = 0x20; /* CS4341 I2C Address 001000 0 0 + Write */
I2C_error = I2C_Write_Byte(address, data);
i2cSlaveAddress = I2C_SLAVE_ADDRESS; /* Restore DARR80 I2C slave address */
return (I2C_error);
}
void SetVolume_CS4341(unsigned char Left_Right, unsigned char Volume)
{
if(key_state) //Mute DAC////mute key active //PB1=0; mute
{
Set_CS4341(0x03, 0x80 ); /* Allan Add Left on AOUTA */
Set_CS4341(0x04, 0x80 ); /* Allan Add Left on AOUTA */
}
else //Open DAC////no mute key active //PB1=1; no mute
{
Set_CS4341(0x03, 0x00 ); /* Allan Add Left on AOUTA */
Set_CS4341(0x04, 0x00 ); /* Allan Add Left on AOUTA */
}
return; //allan
}
void SetInVolume_CS4341(unsigned char Left_Right, unsigned char Volume)
{
SetVolume_CS4341(Left_Right, 0x00 );
return; //allan
}
//be cancelled allan
void Codec_PowerControl(unsigned char Sync_Stat)
{
unsigned char temp_vol = 100;
if (prev_Sync_Stat != Sync_Stat)
{
prev_Sync_Stat = Sync_Stat;
if (Sync_Stat)
{
Sync_Led_Status = LED_SYNC_STATUS;
//Set_CS4251(0x08, 0x70); /* HP_GAIN = default G = 0.6047 (not in dB) | DAC_SNGVOL = On | DACMuteB = Off | DACMuteA = Off */
Set_CS4341(0x08, 0x70); /* HP_GAIN = default G = 0.6047 (not in dB) | DAC_SNGVOL = On | DACMuteB = Off | DACMuteA = Off */
if (ApplicType == APPL_TYPE_NACK)
{
//Set_CS4251(0x02, 0x1E); /* Powerdown PGA and ADC */
Set_CS4341(0x02, 0x1E); /* Powerdown PGA and ADC */
}
else if ( ApplicType == APPL_TYPE_HEADSET)
{
//Set_CS4251(0x02, 0x00); /* Poweron PGA and ADC */
//Set_CS4251(0x05, 0x83); /* ADC_SNGVOL | ADCB_DBOOST=Off | ADCA_DBOOST=Off | MICB_BOOST | MICA_BOOST */
//Set_CS4251(0x07, 0xF0); /* AIN3B->PGAB | AIN3A->PGAB +32/16dB */
//Set_CS4251(0x18, 0xA0); /* L+R/2 | L+R/2 | L | R */
Set_CS4341(0x02, 0x00); /* Poweron PGA and ADC */
Set_CS4341(0x05, 0x83); /* ADC_SNGVOL | ADCB_DBOOST=Off | ADCA_DBOOST=Off | MICB_BOOST | MICA_BOOST */
Set_CS4341(0x07, 0xF0); /* AIN3B->PGAB | AIN3A->PGAB +32/16dB */
Set_CS4341(0x18, 0xA0); /* L+R/2 | L+R/2 | L | R */
}
//#if 0
/* Gradual Volume Control at AOUTA and AOUTB */
while (temp_vol > START_UP_VOLUME)
{
temp_vol -= 2;
//SetVolume_CS4251(0, temp_vol);
SetVolume_CS4341(0x00, 0x00);
Wait_For_mSec(10);
}
//#endif
}
else
{
//Set_CS4251(0x02, 0x01); /* Powerdown Codec */
Set_CS4341(0x02, 0x01); /* Powerdown Codec */
}
}
}
/*
unsigned char Config_Codec_CS4251(void)
{
Set_CS4251(0x02, 0x01);
Set_CS4251(0x03, 0x21);
Set_CS4251(0x04, 0x0C);
Set_CS4251(0x02, 0x00); // PDN = 0 //
Set_CS4251(0x08, 0x73); // HP_GAIN = default G = 0.6047 (not in dB) | DAC_SNGVOL = On | DACMuteB | DACMuteA//
Set_CS4251(0x09, 0x41); // DATA_SEL = 01 Signal Processing Engine to DAC | Zero Crossing //
Set_CS4251(0x10, 0x00); // MUTE_PCM_MIXA = Off | 0dB //
Set_CS4251(0x11, 0x00); // MUTE_PCM_MIXB = Off | 0dB//
Set_CS4251(0x16, Volume_Memory); // AOUTA Volume = user setting//
Set_CS4251(0x17, Volume_Memory); // AOUTB Volume = user setting if not using DAC_SNGVOL //
Set_CS4251(0x14, 0x19); // Treble Corner Freq = 15kHz | Bass Corner Freq = 50Hz | Tone Control = On //
Set_CS4251(0x21, 0x50); // Charge Pump Freq = 438kHz //
Set_CS4251(0x06, 0xA5); // ADCB_HPF_EN | ADCA_HPF_EN | ZCROSSB | ZCROSSA //
Set_CS4251(0x1D, 0x00); // Fastest Release ///
Set_CS4251(0x1E, 0x1C); // ALC Threshold Max = 0dB | Min = -30dB //
Set_CS4251(0x1F, 0xC0); // NG_ALL = On | NG_EN = On | -64dB Threshold | 50ms delay //
Set_CS4251(0x08, 0x70); // HP_GAIN = default G = 0.6047 (not in dB) | DAC_SNGVOL = On | DACMuteB = Off | DACMuteA = Off //
Set_CS4251(0x03, 0x2F); // No Auto | Single Speed | PDN_MICB | PDN_MICA | PDN_MICBIAS | (LSB) MCLK/DIV2 //
Set_CS4251(0x05, 0x80); // ADC_SNGVOL | MICB_BOOST=Off | MICA_BOOST=Off //
Set_CS4251(0x07, 0x00); // AIN1B->PGAB | AIN1A->PGAA //
}
*/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -