如何通过I2S添加外部DAC

以下是MT6592 JB9.MPporting external codec的方法,其它chip添加方法类似。

1,请先在\mediatek\config\common\ProjectConfig.mk中将mtk_AUDIO_EXTCODEC_SUPPORT = no置为yes CUSTOM_KERNEL_SOUND = 改为贵司需要添加的IC 型号。

2,如果单独添加EXT DAC,且挂在I2S DAC上面,即audio通路是和MTK方式一致,见下图。那么这种连接方式会比较简单,软件上不需要做什么修改,只需要配置正确的GPIO,具体配置GPIO 问题,请参考eCourse:。

【转自一牛网】如何通过I2S添加外部DAC?

3,如果是改接其他I2S,比如连接到2ndI2S也是可以的,不过需要在代码中相应位置去修改code。

如下列出来的是UL/DL都走EXTIC的情况,用的是2ndI2SIN/OUT这一组,采用48k输出,如果是其他接法,请在相应的位置做改动即可。

AudioPlayback的部分
platform/common/hardware/audio/aud_drv/AudioMTKStreamManager.cpp
AudioMTKStreamManager::openOutputStream()
*sampleRate=44100;
改为
*sampleRate=48000;
uint32AudioDigitalControl::DlPolicyByDevice(uint32_tDevice)
{
ALOGV("+%s(),Device=%d\n",FUNCTION,Device);
if(Device&AUDIO_DEVICE_OUT_BLUETOOTH_SCO||
Device&AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET||
Device&AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT){
returnAudioDigitalType::DAI_BT;
}
elseif(Device&AUDIO_DEVICE_OUT_AUX_DIGITAL||
Device&AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET||
Device&AUDIO_DEVICE_OUT_FM_TX){
returnAudioDigitalType::I2S_OUT_2;
}
else{
returnAudioDigitalType::I2S_OUT_DAC;//这里修改为I2S_OUT_2
} }
在这里修改,根据需求把AudioDigitalType设定为I2S_OUT_2.
这样应该就可以直接从I2S_OUT_2量到Audio输出的讯号.

Record的部分

请修改如下code,因为I00,I01不能直接连到O09,O10,所以需要修改连到AWB_Data的O05,O06:
status_tAudioMTKStreamIn::SetClientSourceandMemType(AudioMTKStreamInClient*mStreamInClient)
{ …
如下这里去决定使用哪一组I2SIN,这里需要把所有的case改变
caseAUDIO_SOURCE_VOICE_DOWNLINK:
caseAUDIO_SOURCE_VOICE_CALL:
caseAUDIO_SOURCE_CAMCORDER:
caseAUDIO_SOURCE_VOICE_RECOGNITION:
caseAUDIO_SOURCE_VOICE_COMMUNICATION:
caseAUDIO_SOURCE_VOICE_UNLOCK:
mStreamInClient->mSourceType=AudioDigitalType::I2S_IN_ADC;
改为
mStreamInClient->mSourceType=AudioDigitalType::I2S_IN_2;
switch(mStreamInClient->mAttributeClient->mdevices)
{
。。。
caseAUDIO_DEVICE_IN_AMBIENT:
caseAUDIO_DEVICE_IN_BUILTIN_MIC:
caseAUDIO_DEVICE_IN_WIRED_HEADSET:
caseAUDIO_DEVICE_IN_BACK_MIC:
caseAUDIO_DEVICE_IN_COMMUNICATION:
caseAUDIO_DEVICE_IN_VOICE_CALL:
//mStreamInClient->mMemDataType=AudioDigitalType::MEM_VUL;将这里的VUL改为AWB这一组输入
mStreamInClient->mMemDataType=AudioDigitalType::MEM_AWB;
break
… }

Speech的部分

有两个地方需要改:
status_tSpeechPhoneCallController::SetModemSpeechInterConnection(AudioDigitalType::Digital_Blockblock,modem_index_tmodem_index,AudioDigitalType::InterConnectionStateConnection)
{
AudioDigitalType::InterConnectionOutputmodem_pcm_tx_lch=(modem_indexMODEM_1)?AudioDigitalType::O17:AudioDigitalType::O07;
AudioDigitalType::InterConnectionOutputmodem_pcm_tx_rch=(modem_index
MODEM_1)?AudioDigitalType::O18:AudioDigitalType::O08;
AudioDigitalType::InterConnectionInputmodem_pcm_rx=(modem_indexMODEM_1)?AudioDigitalType::I14:AudioDigitalType::I09;
#ifdefDAIBT_NO_INTERCONNECTION_TO_MODEM_PCM
AudioDigitalType::InterConnectionOutputhw_gain_2_in_lch=AudioDigitalType::O15;
AudioDigitalType::InterConnectionOutputhw_gain_2_in_rch=AudioDigitalType::O16;
AudioDigitalType::InterConnectionInputhw_gain_2_out_lch=AudioDigitalType::I12;
AudioDigitalType::InterConnectionInputhw_gain_2_out_rch=AudioDigitalType::I13;
#endif
switch(block)
{
caseAudioDigitalType::DAI_BT:
#ifndefDAIBT_NO_INTERCONNECTION_TO_MODEM_PCM
mAudioDigitalInstance->SetinputConnection(Connection,AudioDigitalType::I02,modem_pcm_tx_lch);//DAIBT_IN->MODEM_PCM_TX_L
#else
mAudioDigitalInstance->SetinputConnection(Connection,AudioDigitalType::I02,hw_gain_2_in_lch);//DAIBT_IN->HW_GAIN2_IN_L
mAudioDigitalInstance->SetinputConnection(Connection,AudioDigitalType::I02,hw_gain_2_in_rch);//DAIBT_IN->HW_GAIN2_IN_R
mAudioDigitalInstance->SetinputConnection(Connection,hw_gain_2_out_lch,modem_pcm_tx_lch);//HW_GAIN2_OUT_L->MODEM_PCM_TX_L
mAudioDigitalInstance->SetinputConnection(Connection,hw_gain_2_out_rch,modem_pcm_tx_rch);//HW_GAIN2_OUT_R->MODEM_PCM_TX_R
#endif
mAudioDigitalInstance->SetinputConnection(Connection,modem_pcm_rx,AudioDigitalType::O02);//MODEM_PCM_RX->DAIBT_OUT
break;
caseAudioDigitalType::I2S_IN_ADC:
mAudioDigitalInstance->SetinputConnection(Connection,AudioDigitalType::I03,modem_pcm_tx_lch);//ADC_I2S_IN_L->MODEM_PCM_TX_L
mAudioDigitalInstance->SetinputConnection(Connection,AudioDigitalType::I04,modem_pcm_tx_rch);//ADC_I2S_IN_R->MODEM_PCM_TX_R
break;
caseAudioDigitalType::I2S_OUT_DAC:
mAudioDigitalInstance->SetinputConnection(Connection,modem_pcm_rx,AudioDigitalType::O03);//MODEM_PCM_RX->DAC_I2S_OUT_L
mAudioDigitalInstance->SetinputConnection(Connection,modem_pcm_rx,AudioDigitalType::O04);//MODEM_PCM_RX->DAC_I2S_OUT_R
break;
//这里需要添加对I2S_2_IN/OUT的处理case,其中IN的部分要经过HWGain2才可以连
caseAudioDigitalType::I2S_IN_2:
mAudioDigitalInstance->SetinputConnection(Connection,AudioDigitalType::I00,AudioDigitalType::O15);//I2S_2_IN_L->MODEM_PCM_TX_L
mAudioDigitalInstance->SetinputConnection(Connection,AudioDigitalType::I01,AudioDigitalType::O16);//I2S_2_IN_R->MODEM_PCM_TX_R
mAudioDigitalInstance->SetinputConnection(Connection,AudioDigitalType::I12,modem_pcm_tx_lch);//I2S_2_IN_L->MODEM_PCM_TX_L
mAudioDigitalInstance->SetinputConnection(Connection,AudioDigitalType::I13,modem_pcm_tx_rch);//I2S_2_IN_R->MODEM_PCM_TX_R
break;
caseAudioDigitalType::I2S_OUT_2:
mAudioDigitalInstance->SetinputConnection(Connection,modem_pcm_rx,AudioDigitalType::O00);//MODEM_PCM_RX->I2S_2_OUT_L
mAudioDigitalInstance->SetinputConnection(Connection,modem_pcm_rx,AudioDigitalType::O01);//MODEM_PCM_RX->I2S_2_OUT_R
break;
default:
ALOGW(“SetModemSpeechInterConnectionblock=%d”,block);
}
returnNO_ERROR;
}
这个函数是连interconnection的…
status_tSpeechPhoneCallController::OpenModemSpeechDigitalPart(constmodem_index_tmodem_index,constaudio_devices_toutput_device)
{
。。。
else//ADC/DACI2S
{
//这里需要enableHWGain2,设定Gain值
AudioMEMIFAttribute::SAMPLINGRATEmem_sample_rate=
(sample_rate
8000)?AudioMEMIFAttribute::AFE_8000HZ:AudioMEMIFAttribute::AFE_16000HZ;
mAudioDigitalInstance->SetHwDigitalGainMode(AudioDigitalType::HW_DIGITAL_GAIN2,mem_sample_rate,0xC8);
mAudioDigitalInstance->SetHwDigitalGain(0x80000,AudioDigitalType::HW_DIGITAL_GAIN2);
mAudioDigitalInstance->SetHwDigitalGainEnable(AudioDigitalType::HW_DIGITAL_GAIN2,true);
SetModemSpeechInterConnection(AudioDigitalType::I2S_IN_2,modem_index,AudioDigitalType::Connection);
SetModemSpeechInterConnection(AudioDigitalType::I2S_OUT_2,modem_index,AudioDigitalType::Connection);
SetModemSpeech2ndI2sInAttribute(sample_rate);
SetModemSpeech2ndI2sOutAttribute(sample_rate);
mAudioDigitalInstance->Set2ndI2SInEnable(true);
mAudioDigitalInstance->Set2ndI2SOutEnable(true);
}
。。。
}

本人主要从事的芯片,嵌入式行业的资深驱动工程师。以下是本人长时间从事外包工作的一个平台,大家可以看一看:
https://www.teckbond.com/portal/html/#/home/loginDL?ex=1277173946688536578

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值