#include "es8388.h"
#include "I2C.h"
#define ES8388_ADDR1 0x20
#define ES8388_ADDR2 0x22
#define WriteReg(_index, _reg, _val) i2cWriteByte((I2CPort_TypeDef)I2C_G, ES8388_ADDR[_index % ES8388_CNT], _reg, _val)
#define ReadReg(_index, _reg) i2cReadByte((I2CPort_TypeDef)I2C_G, ES8388_ADDR[_index % ES8388_CNT], _reg)
static u8 ES8388_ADDR[ES8388_CNT] = {
ES8388_ADDR1, ES8388_ADDR2
};
/*----------------------------------------------
//Initialize CODEC after power up
// MIC TO LIN1&RIN1, DIFFERENTIAL MODE
// LOUT1&ROUT1 TO HEADPHONE
----------------------------------------------*/
void es8388_init(u8 index)
{
unsigned char i;
WriteReg(index, 0x01, 0x58);
WriteReg(index, 0x01, 0x50);
WriteReg(index, 0x02, 0xF3);
WriteReg(index, 0x02, 0xF0);
WriteReg(index, 0x2B, 0x80);
WriteReg(index, 0x00, 0x36);
WriteReg(index, 0x08, 0x80); // codec in i2s master
WriteReg(index, 0x04, 0x00);
WriteReg(index, 0x19, 0x02);
WriteReg(index, 0x09, 0x88); // left pga =+24db, right pga = +24db
WriteReg(index, 0x0A, 0x00); //lin1 rin1 for adc, stereo mode
WriteReg(index, 0x0B, 0x02);
WriteReg(index, 0x0C, 0x10); //adc i2s-32bit
WriteReg(index, 0x0D, 0x02);
WriteReg(index, 0x10, 0x00); //ladc volume = 0db
WriteReg(index, 0x11, 0x00); //radc volume = 0db
WriteReg(index, 0x17, 0x10); //dac i2s-32bit
WriteReg(index, 0x18, 0x02);
WriteReg(index, 0x1A, 0x00); //ldac volume =0db
WriteReg(index, 0x1B, 0x00); //rdac volume = 0db
WriteReg(index, 0x26, 0x00); //lin1 rin1 for bypass in
WriteReg(index, 0x27, 0xd0); //ldac+lin2 to lmixer, if only use lin2 to lmixer, reg0x27 = 0x50
WriteReg(index, 0x2A, 0xd0); //rdac+lin2 to rmixer, if only use rin2 to rmixer, reg0x2a = 0x50
WriteReg(index, 0x03, 0x09); // power up adc
WriteReg(index, 0x02, 0x00); // start stae machine
delay_ms(500);
WriteReg(index, 0x04, 0x3c); // power up dac and line out
for (i = 0; i < 0x1B; i++) // set line output volume
{
WriteReg(index, 0x2E, i);
WriteReg(index, 0x2F, i);
WriteReg(index, 0x30, i);
WriteReg(index, 0x31, i);
}
}
/*----------------------------------------------
//SET CODEC INTO STANDBY MODE for min. power consumption
----------------------------------------------*/
void es8388_standby(u8 index)
{
unsigned char i;
WriteReg(index, 0x19, 0x06); //mute dac
for (i = 0; i < 0x1B; i++) {
WriteReg(index, 0x2E, 0x1A - i);
WriteReg(index, 0x2F, 0x1A - i);
WriteReg(index, 0x30, 0x1A - i);
WriteReg(index, 0x31, 0x1A - i);
}
WriteReg(index, 0x04, 0x00);
WriteReg(index, 0x04, 0xC0); //power down dac and line out
WriteReg(index, 0x03, 0xFF); //power down adc and line in
WriteReg(index, 0x02, 0xF3); //stop state machine
WriteReg(index, 0x2B, 0x9C); //disable mclk
WriteReg(index, 0x00, 0x00);
WriteReg(index, 0x01, 0x58);
}
/*----------------------------------------------
//Resume Codec from standby mode
----------------------------------------------*/
void es8388_resume(u8 index)
{
unsigned char i;
WriteReg(index, 0x2B, 0x80); //enable mclk
WriteReg(index, 0x01, 0x50);
WriteReg(index, 0x00, 0x36);
WriteReg(index, 0x02, 0x00); //start state machine
WriteReg(index, 0x03, 0x09); //power up adc and line in
delay_ms(100);
WriteReg(index, 0x04, 0x00);
WriteReg(index, 0x04, 0x3c); //power up dac and line out
for (i = 0; i < 0x1B; i++) //set lineout volume
{
WriteReg(index, 0x2E, i);
WriteReg(index, 0x2F, i);
WriteReg(index, 0x30, i);
WriteReg(index, 0x31, i);
}
WriteReg(index, 0x19, 0x02); //ummute DAC
}
u8 es8388_reg_read(u8 index, u8 reg)
{
if (index >= ES8388_CNT)
return 0xff;
return ReadReg(index, reg);
}
void es8388_reg_write(u8 index, u8 reg, u8 val)
{
if (index >= ES8388_CNT)
return;
WriteReg(index, reg, val);
}
- 1
- 2
- 3
前往页