调试正式开始之前,想办法获取以下信息:硬件设计原理图/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,进而测得当前的位时钟、采样率和位深度配置。
这一步主要比较基础但也至关重要,需要多和厂商FAE沟通。
修改文件: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 @@
+
@@ -113,6 +114,10 @@
+
+
+
+
@@ -422,7 +427,7 @@
-
+
@@ -442,7 +447,7 @@
-
+
@@ -459,7 +464,7 @@
-
+
@@ -910,7 +915,7 @@
-
+
@@ -1026,9 +1031,7 @@
-
-
-
+
@@ -1056,7 +1059,7 @@
-
+
六、 音效优化
这一点要先测试,由于高通平台音效的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