现象
使用录音软件录音,发现收音特别小
录音链路在 HAL 的 codec_config/es8389_config.h
原因
1、tinymix查看,发现PGA=2,增益太小了
2、HAL里in_set_gain是空实现(audio_hw.c:3802 直接 return 0),(hardware/rockchip/audio/tinyalsa_hal/audio_hw.c),App 侧录音音量控制完全无效,所以后面只能在 codec 配置里改。
static int in_set_gain(struct audio_stream_in *stream, float gain)
{
return 0;
}
驱动 probe 里 REG72/73 = 0x10 增益位是 0dB,随后被 HAL 应用 route 覆盖成 6dB。
修改
修改位置:hardware/rockchip/audio/tinyalsa_hal/codec_config/es8389_config.h
diff --git a/tinyalsa_hal/codec_config/es8389_config.h b/tinyalsa_hal/codec_config/es8389_config.h
--- a/tinyalsa_hal/codec_config/es8389_config.h
+++ b/tinyalsa_hal/codec_config/es8389_config.h
@@ -17,9 +17,9 @@
#include "config.h"
#define ES8389_DAC_VOL_0DB 0xBF /* -95.5dB + 0xBF * 0.5dB = 0dB */
#define ES8389_ADC_VOL_0DB 0xBF
-#define ES8389_MIC_PGA_GAIN 0x02 /* 2 * 3dB = 6dB */
+#define ES8389_MIC_PGA_GAIN 0x08 /* 8 * 3dB = 24dB (was 0x02 = 6dB): mic capture too quiet */
const struct config_control es8389_speaker_normal_controls[] = {
{
补充
为什么是改的.h
这其实是这套 HAL 的架构约定,不是随意选择
这套 HAL 是"数据 / 逻辑"分离的
hardware/rockchip/audio/tinyalsa_hal/codec_config/*_config.h
hardware/rockchip/audio/tinyalsa_hal/alsa_route.c
hardware/rockchip/audio/tinyalsa_hal/audio.c
数值放这里 ↓ 流程放这里 ↓
codec_config/*_config.h ←── alsa_route.c ──→ audio_hw.c
(数据表) (翻译器) (流程逻辑)
什么时候 apply、传什么参数
改"值" 把表翻译成 mixer 写操作
① codec_config/*_config.h = 一张数据表,只有三列:控件名、字符串值、整数值
② alsa_route.c = 把表翻译成寄存器写操作(不需要你动)
③ audio_hw.c = 流程逻辑(何时开流、何时切路由、参数怎么解析、要不要做软件处理)
| 你想改的本质 | 改哪 | 原因 |
|---|---|---|
| 一个值:增益数字、开关 on/off、某场景用哪些控件 | *_config.h |
它就是表格里的一格数据 |
| 时机 / 条件 / 流程:什么时候设、满足什么条件才设、运行期传进来的值怎么算 | .c |
表是 const 静态常量,没有 if/else,装不下 "随时变的值" |
用已经遇到的两个例子对照
例 1:mic 太小 → 改 .h(因为改的是"值")
#define ES8389_MIC_PGA_GAIN 0x08 /* 8 * 3dB = 24dB (was 0x02 = 6dB): mic capture too quiet */
它就是表格里的一格,被多处 route 引用(181/204 行),改一处全部场景生效 ------ 这是"数据"。
例 2:想让上层能调 mic 音量 → 必须改 .c(因为这不是"值",而是"没有通道")
表里只有"预设值"的概念,没有"变量"的概念。要支持运行期调,就得在 audio_hw.c 里加代码(比如让 in_set_parameters() 认识 mic_gain=x)------ 这是"逻辑"。
还有一个可能会踩的坑:改 .h 不生效
codec_config/ 下有 20 张表,靠声卡名匹配,不是靠 codec 编译选项:
if (strncmp(sound_card_config_list[i].sound_card_name, soundCardID,
...
route_table = sound_card_config_list[i].route_table;
匹配不到就 fallback 到 default_config_table(alsa_route.c:104)。es8388 / es8389 / es8316 / es8396 四张 Everest 表长得极像,改错文件完全不生效。所以动手前先确认:
cat /proc/asound/cards # 看声卡名,如 rockchipes8389 → 对应 es8389_config_table