一、 调试大纲
调试正式开始之前,想办法获取以下信息:硬件设计原理图/Codec参考驱动代码/FAE联系方式。
1. 从硬件设计原理图,我们要获取到Codec芯片和CPU通过什么接口连接,包括数据传输接口、控制接口、reset和power引脚。
2. Codec参考驱动代码,一般正规的厂商都会提供的,至少也提供对应场景的寄存器配置。
接下来开始正式调试,大致分为以下流程:
a. 数据总线配置
b. codec驱动集成
c. 把codec挂载到声卡上
d. 音频空间封装以及调用
e. 音效优化
二、数据总线配置
第三方Codec芯片一般是I2S总线/PCM总线进行数据传输,配置方法基本相同。
这一步是脱离Codec芯片,至于CPU侧有关系。
当配置完成后,可以通过以下指令进行测试总线属性,以I2S为例:
a. 先向设备导入一首测试音频test.wav
b.执行以下指令进行测试
tinymix "QUAT_MI2S_RX Audio Mixer MultiMedia1" "1"
tinyplay /sdcard/test.wav -D 0 -d 0 &
c. 这个时候就可以使用示波器测量QUAT_MI2S对应GPIO,进而测得当前的位时钟、采样率和位深度配置。
三、Codec驱动集成
这一步主要比较基础但也至关重要,需要多和厂商FAE沟通。
四、Codec挂载到声卡
修改文件:kernel/msm-3.18/sound/soc/msm/msm8952.c
修改内容:
@@ -2357,8 +2388,8 @@ static struct snd_soc_dai_link msm8952_dai[] = {
.stream_name = "Quaternary MI2S Capture",
.cpu_dai_name = "msm-dai-q6-mi2s.3",
.platform_name = "msm-pcm-routing",
- .codec_dai_name = "snd-soc-dummy-dai",
- .codec_name = "snd-soc-dummy",
+ .codec_dai_name = "ES7243E HiFi 0",
+ .codec_name = "es7243e.5-0010",
.no_pcm = 1,
.dpcm_capture = 1,
.be_id = MSM_BACKEND_DAI_QUATERNARY_MI2S_TX,
--
五、音频空间封装以及调用
这里指提供下封装部分的代码diff,可以参考下。
+//kernel/msm-3.18/sound/soc/msm/msm8952.c
+extern void es7243e_amic_enable(void);
+extern void es7243e_amic_disable(void);
+static const char *const ext_codec_es7243e_function[] = { "Off", "On" };
+static int ext_codec_es7243e_control = 0;
+static int ext_codec_es7243e_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
+{
+ ucontrol->value.integer.value[0] = ext_codec_es7243e_control;
+ pr_err("%s: ext_codec_es7243e_control = %d\n", __func__, ext_codec_es7243e_control);
+ return 0;
+}
+
+static int ext_codec_es7243e_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
+{
+ if(ucontrol->value.integer.value[0] == ext_codec_es7243e_control)
+ return 1;//avoid repeat operation
+
+ ext_codec_es7243e_control = ucontrol->value.integer.value[0];
+
+ if(ucontrol->value.integer.value[0]) {
+ es7243e_amic_enable();
+ } else {
+ es7243e_amic_disable();
+ }
+ pr_err("%s: value.integer.value = %ld\n", __func__, ucontrol->value.integer.value[0]);
+ return 0;
+}
@@ -1032,6 +1063,8 @@ static const struct soc_enum msm_snd_enum[] = {
vi_feed_ch_text),
SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(mi2s_rx_sample_rate_text),
mi2s_rx_sample_rate_text),
+ SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(ext_codec_es7243e_function),
+ ext_codec_es7243e_function),
};
static const struct snd_kcontrol_new msm_snd_controls[] = {
@@ -1051,6 +1084,9 @@ static const struct snd_kcontrol_new msm_snd_controls[] = {
msm_vi_feed_tx_ch_get, msm_vi_feed_tx_ch_put),
SOC_ENUM_EXT("MI2S_RX SampleRate", msm_snd_enum[6],
mi2s_rx_sample_rate_get, mi2s_rx_sample_rate_put),
+ SOC_ENUM_EXT("Ext_Inpput_Control", msm_snd_enum[7],
+ ext_codec_es7243e_get, ext_codec_es7243e_put),
+
};
具体调用的修改文件是:hardware/qcom/audio/configs/msm8953/mixer_paths_qrd_sku3.xml
diff --git a/hardware/qcom/audio/configs/msm8953/mixer_paths_qrd_sku3.xml b/hardware/qcom/audio/configs/msm8953/mixer_paths_qrd_sku3.xml
index c6a3906..d05b9ee 100755
--- a/hardware/qcom/audio/configs/msm8953/mixer_paths_qrd_sku3.xml
+++ b/hardware/qcom/audio/configs/msm8953/mixer_paths_qrd_sku3.xml
@@ -49,6 +49,7 @@
<ctl name="Voip Evrc Min Max Rate Config" id="1" value="4" />
<ctl name="Voip Dtx Mode" value="0" />
<ctl name="TTY Mode" value="Off" />
+ <ctl name="Ext_Inpput_Control" value="Off" />
<ctl name="HPHL Volume" value="9" />
<ctl name="HPHR Volume" value="9" />
<ctl name="RX1 Digital Volume" value="84" />
@@ -113,6 +114,10 @@
<ctl name="INTERNAL_BT_SCO_RX Audio Mixer MultiMedia5" value="0" />
<ctl name="MultiMedia1 Mixer TERT_MI2S_TX" value="0" />
<ctl name="MultiMedia5 Mixer TERT_MI2S_TX" value="0" />
+ <ctl name="MultiMedia8 Mixer TERT_MI2S_TX" value="0" />
+ <ctl name="MultiMedia1 Mixer QUAT_MI2S_TX" value="0" />
+ <ctl name="MultiMedia5 Mixer QUAT_MI2S_TX" value="0" />
+ <ctl name="MultiMedia8 Mixer QUAT_MI2S_TX" value="0" />
<ctl name="MultiMedia1 Mixer INTERNAL_BT_SCO_TX" value="0" />
<ctl name="PRI_MI2S_RX_Voice Mixer CSVoice" value="0" />
<ctl name="Voice_Tx Mixer TERT_MI2S_TX_Voice" value="0" />
@@ -422,7 +427,7 @@
</path>
<path name="audio-record">
- <ctl name="MultiMedia1 Mixer TERT_MI2S_TX" value="1" />
+ <ctl name="MultiMedia1 Mixer QUAT_MI2S_TX" value="1" />
</path>
<path name="audio-record bt-sco">
@@ -442,7 +447,7 @@
<ctl name="MultiMedia1 Mixer INTERNAL_FM_TX" value="1" />
</path>
<path name="audio-record-compress">
- <ctl name="MultiMedia8 Mixer TERT_MI2S_TX" value="1" />
+ <ctl name="MultiMedia8 Mixer QUAT_MI2S_TX" value="1" />
</path>
<path name="audio-record-compress bt-sco">
@@ -459,7 +464,7 @@
</path>
<path name="low-latency-record">
- <ctl name="MultiMedia5 Mixer TERT_MI2S_TX" value="1" />
+ <ctl name="MultiMedia5 Mixer QUAT_MI2S_TX" value="1" />
</path>
<path name="low-latency-record bt-sco">
@@ -910,7 +915,7 @@
</path>
<path name="handset-mic">
- <ctl name="DEC1 MUX" value="ADC1" />
+ <path name="adc1" />
</path>
<path name="noise-mic">
@@ -1026,9 +1031,7 @@
<!-- Dual MIC devices -->
<path name="speaker-dmic-endfire">
<ctl name="MI2S_TX Channels" value="Two" />
- <ctl name="DEC1 MUX" value="ADC1" />
- <ctl name="DEC2 MUX" value="ADC2" />
- <ctl name="ADC2 MUX" value="INP3" />
+ <ctl name="Ext_Inpput_Control" value="On" />
</path>
<path name="dmic-endfire">
@@ -1056,7 +1059,7 @@
</path>
<path name="handset-stereo-dmic-ef">
- <path name="speaker-dmic-endfire" />
+ <path name="dmic-endfire" />
</path>
<path name="speaker-stereo-dmic-ef">
六、 音效优化
这一点要先测试,由于高通平台音效的DSP可以继续使用,因此使用外部Codec上的双麦克风时,同时选择加载双麦克风音效会更好。因此调整双麦克风属性配置如下:
diff --git a/hardware/qcom/audio/configs/msm8953/msm8953.mk b/hardware/qcom/audio/configs/msm8953/msm8953.mk
index ec5d0a1..5483e1e 100755
--- a/hardware/qcom/audio/configs/msm8953/msm8953.mk
+++ b/hardware/qcom/audio/configs/msm8953/msm8953.mk
@@ -112,10 +112,10 @@ audio_hal.period_size=192
##fluencetype can be "fluence" or "fluencepro" or "none"
##modified by kuangjincheng @20170225 for SLM758 bugzilla 6705
PRODUCT_PROPERTY_OVERRIDES += \
-ro.qc.sdk.audio.fluencetype=none\
+ro.qc.sdk.audio.fluencetype=fluence\
persist.audio.fluence.voicecall=false\
persist.audio.fluence.voicerec=false\
-persist.audio.fluence.audiorec=false\
+persist.audio.fluence.audiorec=true\
persist.audio.fluence.speaker=false