这个是我修改的驱动源码:
最主要的2个函数,我修改了一下tlv320的源码生成的,然后调整了一下结构,毕竟2中片子功能部分有差异,我没有用原来的配置方法,所以直接把整个结构导入,这样在驱动内部一次性按照配置,一下都执行了
void soft_reset(unsigned int chip_num)
{
//soft reset
printk("soft_reset in chip_num:%d addr:0x%x\n",chip_num,IIC_device_addr[chip_num]);
ES8374_write(IIC_device_addr[chip_num],0x00,0x3F); //IC Rst start
msleep(1);
ES8374_write(IIC_device_addr[chip_num],0x00,0x03); //IC Rst stop
ES8374_write(IIC_device_addr[chip_num],0x01,0x7F); //IC clk on
ES8374_write(IIC_device_addr[chip_num],0x02,0x08); //select PLL
ES8374_write(IIC_device_addr[chip_num],0x03,0x20); //osr =32
ES8374_write(IIC_device_addr[chip_num],0x6F,0xA0); //pll set:mode enable
ES8374_write(IIC_device_addr[chip_num],0x72,0x41); //pll set:mode set
ES8374_write(IIC_device_addr[chip_num],0x09,0x01); //pll set:reset on ,set start //vcoout devided by 8
ES8374_write(IIC_device_addr[chip_num],0x0C,0x08); //pll set:k
ES8374_write(IIC_device_addr[chip_num],0x0D,0x13); //pll set:k
ES8374_write(IIC_device_addr[chip_num],0x0E,0xe0); //pll set:k
ES8374_write(IIC_device_addr[chip_num],0x0A,0x4A); //clock manager default:0100 1010=0x4A
ES8374_write(IIC_device_addr[chip_num],0x0B,0x08);//pll set:n
ES8374_write(IIC_device_addr[chip_num],0x09,0x41); //pll set:reset off ,set stop
ES8374_write(IIC_device_addr[chip_num],0x05,0x11); //clk div =1
ES8374_write(IIC_device_addr[chip_num],0x06,0x01); //LRCK div =0100H = 256D
ES8374_write(IIC_device_addr[chip_num],0x07,0x00);
ES8374_write(IIC_device_addr[chip_num],0x0F,0x04); //MASTER MODE, BCLK = MCLK/4
ES8374_write(IIC_device_addr[chip_num],0x10,0x0C); //I2S-16BIT, ADC
ES8374_write(IIC_device_addr[chip_num],0x11,0x0c); //I2S-16BIT, DAC
ES8374_write(IIC_device_addr[chip_num],0x24,0x08); //adc set
ES8374_write(IIC_device_addr[chip_num],0x36,0x00); //dac set
ES8374_write(IIC_device_addr[chip_num],0x12,0x30); //timming set
ES8374_write(IIC_device_addr[chip_num],0x13,0x20); //timming set
ES8374_write(IIC_device_addr[chip_num],0x21,0x50); //adc set: SEL LIN1 CH+PGAGAIN=0DB
ES8374_write(IIC_device_addr[chip_num],0x22,0xFF); //adc set: PGA GAIN=0DB
ES8374_write(IIC_device_addr[chip_num],0x21,0x14); //adc set: SEL LIN1 CH+PGAGAIN=18DB
ES8374_write(IIC_device_addr[chip_num],0x22,0x55); //pga = +15db
ES8374_write(IIC_device_addr[chip_num],0x00,0x80); // IC START
ES8374_write(IIC_device_addr[chip_num],0x14,0x8A); // IC START
ES8374_write(IIC_device_addr[chip_num],0x15,0x40); // IC START
ES8374_write(IIC_device_addr[chip_num],0x1A,0x01); // monoout set
ES8374_write(IIC_device_addr[chip_num],0x1B,0x09); // monoout set
ES8374_write(IIC_device_addr[chip_num],0x1C,0x90); // spk set
ES8374_write(IIC_device_addr[chip_num],0x1D,0x02); // spk set
ES8374_write(IIC_device_addr[chip_num],0x1F,0x00); // spk set
ES8374_write(IIC_device_addr[chip_num],0x1E,0xA0); // spk on
ES8374_write(IIC_device_addr[chip_num],0x28,0x00); // alc set
ES8374_write(IIC_device_addr[chip_num],0x25,0x00); // ADCVOLUME on
ES8374_write(IIC_device_addr[chip_num],0x38,0xc0); // DACVOLUMEL on 0db无衰减
ES8374_write(IIC_device_addr[chip_num],0x6D,0x60); //SEL:GPIO1=DMIC CLK OUT+SEL:GPIO2=PLL CLK OUT
ES8374_write(IIC_device_addr[chip_num],0x71,0x05);
ES8374_write(IIC_device_addr[chip_num],0x73,0x70);
#define CanAutoStartFirst 1
#ifdef CanAutoStartFirst
//BIAS 11111 100=0xfc -10u
//BIAS 11111 001=0xf9 -2.5u
//BIAS 11111 101=0xfd -12.5
ES8374_write(IIC_device_addr[chip_num],0x18,0xfc);
//ES8374_write(IIC_device_addr[chip_num],0x18,0xfd);
//开启转换
ES8374_write(IIC_device_addr[chip_num],0x36,0x00); //dac set
ES8374_write(IIC_device_addr[chip_num],0x37,0x00); // dac set
//ADC DMIC
//1000 1010=0x8a
//0000 0000=0x0
ES8374_write(IIC_device_addr[chip_num],0x24,0x0);
//ALC 10000100=0x84 关闭ALC 00011100=0x1c 不能开启,否则DAC杂音
//ES8374_write(IIC_device_addr[chip_num],0x26,0x1c);
//010 10111=0x57 max 34db
//010 11111=0x5F max 35.5db
//010 01011=0x4b max 10db
//010 11001=0x59 max 31db
//011 11001=0x79 max 31db limit mode
//000 11001=0x19
ES8374_write(IIC_device_addr[chip_num],0x26,0x19);
//PGA Min gain 5bit large=高增益 11011:28.5db=0x1B 01000:0db=0x8
//ES8374_write(IIC_device_addr[chip_num],0x27,0x8);
//000 11011=0x1b 28.5db
//000 11111=0x1f 30db
ES8374_write(IIC_device_addr[chip_num],0x27,0x1f);
//默认1011 0000=0xb0
ES8374_write(IIC_device_addr[chip_num],0x28,0xb0);
//0x29 alc decay time and attack time default:110010=0x32
ES8374_write(IIC_device_addr[chip_num],0x29,0x32);
//0x2b noise gate default:0
ES8374_write(IIC_device_addr[chip_num],0x2B,0x0);
//////////////////////MONO声音输出控制
//11100 001=0xe1
//ES8374_write(IIC_device_addr[chip_num],0x1A,0xe1);
//01100 001=0xe1//必须选择mixer才能确保LINEOUT和SPEAK Out同源
ES8374_write(IIC_device_addr[chip_num],0x1A,0x62);
//1001 1011
ES8374_write(IIC_device_addr[chip_num],0x1B,0x9b);
//////mix
//mix 11000000
ES8374_write(IIC_device_addr[chip_num],0x1C,0xC0);
//mixer gain
//1000 1011
ES8374_write(IIC_device_addr[chip_num],0x1B,0x9b);
/////////////////////PGA
//地址0x21
//mic in :0001 1100=0x1c
//ES8374_write(IIC_device_addr[chip_num],0x21,0x1c);
//line in:0010 1100=0x2c
//ES8374_write(IIC_device_addr[chip_num],0x21,0x2c);
//mic and line in
//line in:0011 1100=0x3c
ES8374_write(IIC_device_addr[chip_num],0x21,0x3c);
//增益
ES8374_write(IIC_device_addr[chip_num],0x22,0x7);
//////////////////////ADC
//jack detect 0x2c default:1101=0xd 通过GPIO或者RLIN1控制是否声音输出,会导致speakers静音
//7-1:RLin1 1010 1101=0xad
//ES8374_write(IIC_device_addr[chip_num],0x2c,0xad);
////0x2d ADC_SDP_SC-7 11100110=0xe6 会有背景噪声
//ES8374_write(IIC_device_addr[chip_num],0x2d,0xE6);
/////////////////////DAC
//0x36 00000100=0x4 默认 SDP左输出
//ES8374_write(IIC_device_addr[chip_num], 0x36, 0x4);
//010 000 00=0x40 SDK右输出 dac soft ramp关闭
//000 111 00=0x1c 0.5db每512周期
//000 100 00=0x10 0.5db每64周期
//000 011 00=0xc 0.5db每32周期
//000 001 00=0xc 0.5db每4周期
//000 000 00=0x0 SDK左输出 dac soft ramp关闭
ES8374_write(IIC_device_addr[chip_num], 0x36, 0x0);
//0x37 00000000 DAC DSM not mute=0x0
//double speed 10000000 0x80;
ES8374_write(IIC_device_addr[chip_num], 0x37, 0x0);
//0x38 00000000 衰减 0=0db 最大11000000=-96db
ES8374_write(IIC_device_addr[chip_num], 0x38, 0x0);
//关闭loop
ES8374_write(IIC_device_addr[chip_num],0x1C,0x80);
///////////////
//00101100=0x2c
//11001100=0xcc
//00000000=0x0
//00010000=0x10
//00001100=0xc
ES8374_write(IIC_device_addr[chip_num],0x10,0xC); //I2S-16BIT, ADC
//ADC DMIC
//1000 1010=0x8a
//0000 0000=0x0
//1000 0000=0x80 高通滤波关
//1000 1000=0x88 高通滤波开
//0000 1011=0xb
//0000 1100=0xc
ES8374_write(IIC_device_addr[chip_num],0x24,0x8);
ES8374_write(IIC_device_addr[chip_num],0x25,0x0);
//adc
////0x2d ADC_SDP_SC-7 11100110=0xe6 会有背景噪声
//000 00100=0x4;
ES8374_write(IIC_device_addr[chip_num],0x2D,0x4);
////////////////////
#endif
}
void SetCodecPara(ES8374_Audio_Ctrl* audio_ctrl)
{
if(!audio_ctrl)
return;
printk("SetCodecPara:\nbStartMic:%d\n bStartLineIn:%d\n bMicLoopOut:%d\n bLineInLoopOut:%d\n nMicVolume:%d\n nLineInVolume:%d\n nLineOutVolume:%d\n bStartLineOut:%d\n nSpeakOutVolume:%d\n bStartLineOut:%d\n",audio_ctrl->bStartMic,audio_ctrl->bStartLineIn,audio_ctrl->bMicLoopOut,audio_ctrl->bLineInLoopOut,audio_ctrl->nMicVolume,audio_ctrl->nLineInVolume,audio_ctrl->nLineOutVolume,audio_ctrl->bStartLineOut,audio_ctrl->nSpeakOutVolume,audio_ctrl->bStartLineOut);
////////////////////////////
audio_ctrl->bStartMic;//MIC输入
audio_ctrl->bStartLineIn;//线性输入
audio_ctrl->bStartLineOut;//线性lineout输出
audio_ctrl->bStartSpeakOut;//带功放输出
audio_ctrl->bMicLoopOut;//MIC环通输出
audio_ctrl->bLineInLoopOut;//LINEIN 环通输出
audio_ctrl->nMicVolume;//MIC音量
audio_ctrl->nLineInVolume;//LineIn音量
audio_ctrl->nLineOutVolume;//线性输出音量
audio_ctrl->nSpeakOutVolume;//功放喇叭输出音量
////////////////////////////////
int chip_num=0;
////////////////////////////
if((!(audio_ctrl->bStartSpeakOut))&&(!(audio_ctrl->bStartLineOut))){
//关闭转换
//001 00000=0x20
ES8374_write(IIC_device_addr[chip_num],0x36,0x20); //dac set
//0011 00 0 1=0x31
ES8374_write(IIC_device_addr[chip_num],0x37,0x31); // dac set
//-96dB 1100 0000=0xc0
ES8374_write(IIC_device_addr[chip_num],0x38,0xc0); // DACVOLUMEL 0x0:0db 0xc0:-96db
}else{
//开启转换
ES8374_write(IIC_device_addr[chip_num],0x36,0x00); //dac set
ES8374_write(IIC_device_addr[chip_num],0x37,0x00); // dac set
ES8374_write(IIC_device_addr[chip_num],0x38,0x0); // DACVOLUMEL 0x0:0db 0xc0:-96db
}
//线性输入 以及MIC输入
int nHightGain=1;//高增益
if((audio_ctrl->bStartMic)&&(audio_ctrl->bStartLineIn)){//00111000-0db=0x38 00111100-15db=0x3c MIC and lineIn
if(nHightGain)
ES8374_write(IIC_device_addr[chip_num],0x21,0x3c);
else
ES8374_write(IIC_device_addr[chip_num],0x21,0x38);
}
else if(audio_ctrl->bStartMic&&(!(audio_ctrl->bStartLineIn))){//00011100=0x1c
if(nHightGain)
ES8374_write(IIC_device_addr[chip_num],0x21,0x1c);
else
ES8374_write(IIC_device_addr[chip_num],0x21,0x18);
}
else if(audio_ctrl->bStartLineIn&&(!(audio_ctrl->bStartMic))){//00101100=0x2c
if(nHightGain)
ES8374_write(IIC_device_addr[chip_num],0x21,0x2c);
else
ES8374_write(IIC_device_addr[chip_num],0x21,0x28);
}
else //mic and line in //line in:1100 1100=0xcc
ES8374_write(IIC_device_addr[chip_num],0x21,0xc8);
//pga增益调节
if(nHightGain)
ES8374_write(IIC_device_addr[chip_num],0x22,0x7);
else
ES8374_write(IIC_device_addr[chip_num],0x22,0xf);
//线性输出
#if 0
if(audio_ctrl->bStartLineOut){//01100 001(LineIn)=0x61
ES8374_write(IIC_device_addr[chip_num],0x1A,0x61);
}
else{//01000 001(LineIn)=0x41
ES8374_write(IIC_device_addr[chip_num],0x1A,0x41);
}
#else
if(audio_ctrl->bStartLineOut){//01100 010(diff out1)=0x64
ES8374_write(IIC_device_addr[chip_num],0x1A,0x62);
}
else{//01000 010(diff out1)=0x44
ES8374_write(IIC_device_addr[chip_num],0x1A,0x42);
}
#endif
//line out音量
if(audio_ctrl->nLineOutVolume<1){
//01100000=0x60
ES8374_write(IIC_device_addr[chip_num],0x1B,0x70);
}else if(audio_ctrl->nLineOutVolume>9){
//0100 0001=0x9b
ES8374_write(IIC_device_addr[chip_num],0x1B,0x9b);
}else{
switch(audio_ctrl->nLineOutVolume){
case 1:
//01100001=0x63
ES8374_write(IIC_device_addr[chip_num],0x1B,0x73);
break;
case 2:
//01100010=0x71
ES8374_write(IIC_device_addr[chip_num],0x1B,0x71);
break;
case 3:
//01100011=0x50
ES8374_write(IIC_device_addr[chip_num],0x1B,0x50);
break;
case 4:
//01100100=0x31
ES8374_write(IIC_device_addr[chip_num],0x1B,0x31);
break;
case 5:
//01101000=0x33
ES8374_write(IIC_device_addr[chip_num],0x1B,0x33);
break;
case 6:
//01101001=0x38
ES8374_write(IIC_device_addr[chip_num],0x1B,0x38);
break;
case 7:
//01101010=0x39
ES8374_write(IIC_device_addr[chip_num],0x1B,0x39);
break;
case 8:
//01101011=0x3B
ES8374_write(IIC_device_addr[chip_num],0x1B,0x3B);
break;
case 9:
//01000000=0x10
ES8374_write(IIC_device_addr[chip_num],0x1B,0x10);
break;
}
}
//////mix
//mix 10000000(DAC to mix)=0x80 01000000(aux to mix)=0x40
//mix dac and aux 11000000=0xc0
//ES8374_write(IIC_device_addr[chip_num],0x1C,0xC8);
if((audio_ctrl->bMicLoopOut)||(audio_ctrl->bLineInLoopOut)){
ES8374_write(IIC_device_addr[chip_num],0x1C,0xC0);
}else{
//no to mix 00000000=0x0
if((!(audio_ctrl->bStartSpeakOut))&&(!(audio_ctrl->bStartLineOut))){
ES8374_write(IIC_device_addr[chip_num],0x1C,0x0);
//关闭mix mute 00010000=0x10
ES8374_write(IIC_device_addr[chip_num],0x1D,0x10);
}
else{////10000000=0x80 dac to mixer
ES8374_write(IIC_device_addr[chip_num],0x1C,0x80);
//0x1d mixer gain: 0010 0000=0x20 -21db 0x0=-8db
ES8374_write(IIC_device_addr[chip_num],0x1D,0x0);
}
}
//mixer gain
//1000 1011
ES8374_write(IIC_device_addr[chip_num],0x1B,0x9b);
///////Speak ClassD Speaker output
//10100 111(7.5db)
if(audio_ctrl->bStartSpeakOut){
unsigned char nVolume=0;
if(audio_ctrl->nSpeakOutVolume<1)
nVolume=0;
if(audio_ctrl->nSpeakOutVolume>=8)
nVolume=7;
else
nVolume=audio_ctrl->nSpeakOutVolume;
//10100000+nVolume=0xA0+nVolume
ES8374_write(IIC_device_addr[chip_num],0x1E,0xA0+nVolume);
}else{//00000+0
ES8374_write(IIC_device_addr[chip_num],0x1E,0x0);
}
}
海思MPI应用层主要就是配置Es8374AudioPara结构体,然后调用如下函数即可:
void SetAudioCodecPara()
{
int s_fdES8374= -1;
system("chmod -R 777 /dev/IV_ES8374");
s_fdES8374 = open(ES8374_FILE,O_RDWR);
if (s_fdES8374 < 0)
{
printf("SetAudioCodecPara can't open ES8374:%s\n",ES8374_FILE);
return;
}
printf("SetAudioCodecPara open ES8374,%s fd:%d\n", ES8374_FILE,s_fdES8374);
printf(PRINTF_WARNING"SetAudioCodecPara:\nbStartMic:%d\n bStartLineIn:%d\n bMicLoopOut:%d\n bLineInLoopOut:%d\n nMicVolume:%d\n nLineInVolume:%d\n nLineOutVolume:%d\n bStartLineOut:%d\n nSpeakOutVolume:%d\n bStartSpeakOut:%d\n"PRINTF_NONE,Es8374AudioPara.bStartMic,Es8374AudioPara.bStartLineIn,Es8374AudioPara.bMicLoopOut,Es8374AudioPara.bLineInLoopOut,Es8374AudioPara.nMicVolume,Es8374AudioPara.nLineInVolume,Es8374AudioPara.nLineOutVolume,Es8374AudioPara.bStartLineOut,Es8374AudioPara.nSpeakOutVolume,Es8374AudioPara.bStartSpeakOut);
Es8374AudioPara.chip_num = 0;
if (ioctl(s_fdES8374,SET_CODEC_PARA,&Es8374AudioPara))
printf("[Func]:%s [Line]:%d [Info]:%s\n", __FUNCTION__, __LINE__, " ES8374 SET_CODEC_PARA failed");
close(s_fdES8374);
s_fdES8374=0;
///////////////////
}
初始化芯片时:
int s_fdTlv = -1;
s_fdTlv = open(ES8374_FILE,O_RDWR);
if (s_fdTlv < 0)
{
printf("can't open ES8374,%s\n", ES8374_FILE);
return -1;
}
printf("open ES8374,%s fd:%d\n", ES8374_FILE,s_fdTlv);
audio_ctrl.chip_num = 0;
if (ioctl(s_fdTlv,SOFT_RESET,&audio_ctrl))
{
printf("[Func]:%s [Line]:%d [Info]:%s\n", __FUNCTION__, __LINE__, " ES8374 reset failed");
}
//////////////////////////
memset(&Es8374AudioPara,0,sizeof(ES8374_Audio_Ctrl));
#ifdef LOOP_MIC_LINE_IN_WHEN_START
Es8374AudioPara.bLineInLoopOut=1;
Es8374AudioPara.bMicLoopOut=1;
#else
Es8374AudioPara.bLineInLoopOut=0;
Es8374AudioPara.bMicLoopOut=0;
#endif
Es8374AudioPara.bStartLineIn=1;
Es8374AudioPara.bStartMic=1;
Es8374AudioPara.bStartSpeakOut=1;
Es8374AudioPara.bStartLineOut=1;
Es8374AudioPara.nLineInVolume=5;
Es8374AudioPara.nMicVolume=5;
Es8374AudioPara.nLineOutVolume=s32Volume;
Es8374AudioPara.nSpeakOutVolume=s32Volume;
ioctl(s_fdTlv,SET_CODEC_PARA,&Es8374AudioPara);
////////////////////////////
close(s_fdTlv);
////////////////////////////////////目前控制lineOut SpeakOut都还是对的,还通输出MIC和LineIn也是对的,声音也比较大,目前唯一的问题,就是MIC和LINEIn输入的声音,经过i2s,进入海思音频输入,编码整个体系后,声音很小,目前我还在找原因。