文章目录
1、环境介绍
硬件:RK3576 板卡
软件:RK3576 原厂 SDK(buildroot 系统),6.1 kernel
2、ES8388/8389/8390 Codec 介绍

es8388 预计 26 年年底停产。于是更换为 es8390。
es8388 和 es8390 硬件 p2p。es8390 和 es8389 软件驱动兼容。
3、原理图查看
3.1、es8390 codec
0X11 10PF/50V TOPF /50V NC_25 CO:102 C0402 -->0X10 )三L ADDR(CE) DGND VMID ES8388 AGND VMID ADCVREF ES8388 HPGND ADCVREF VREF ES8388 C121 120 C122 QFN28-4XDX0.8-0.45 4.7UFNOV .7UFNOV C0402 C0402 -->
DVDD/PVDD:1.8V
AVDD/HPVDD:3.3V
数字音频接口:SAI1(电平需与 DVDD/PVDD 一致)
控制接口:I2C3(电平需与 DVDD/PVDD 一致)
HPOUT_L/R:扬声器立体声左右声道输出
AUD_LINEOUT_L/R:耳机立体声左右声道输出
L/RIN1_ES8388:咪头1差分输入
L/RIN2_ES8388:咪头2差分输入
3.2、耳机接口

HP_CTL_H:耳机输出控制脚:GPIO2_PA6,高电平有效
HP_DET_L:耳机插入检测引脚:GPIO2_PB7,低电平有效
3.3、扬声器接口

SPK_CTL_L:扬声器控制接口:GPIO2_PA7,高电平有效
3.4、MIC 接口


4、驱动移植
这里基于主线 Linux 下的 es8389 驱动进行调试:
https://elixir.bootlin.com/linux/v7.0.3/source/sound/soc/codecs/es8389.c
https://elixir.bootlin.com/linux/v7.0.3/source/sound/soc/codecs/es8389.h
调试后的驱动已上传至 github:https://github.com/Cohen0415/es8389-driver
5、内核配置
CONFIG_SND_SOC_ES8389=y
6、设备树
/ {
...
es8389_sound: es8389-sound {
status = "okay";
compatible = "rockchip,multicodecs-card";
rockchip,card-name = "rockchip-es8389";
hp-det-gpio = <&gpio2 RK_PB7 GPIO_ACTIVE_LOW>;
io-channels = <&saradc 3>;
io-channel-names = "adc-detect";
keyup-threshold-microvolt = <1800000>;
poll-interval = <100>;
spk-con-gpio = <&gpio2 RK_PA7 GPIO_ACTIVE_HIGH>;
hp-con-gpio = <&gpio2 RK_PA6 GPIO_ACTIVE_HIGH>;
rockchip,pre-power-on-delay-ms = <30>;
rockchip,post-power-down-delay-ms = <40>;
rockchip,format = "i2s";
rockchip,mclk-fs = <256>;
rockchip,cpu = <&sai1>;
rockchip,codec = <&es8389>;
rockchip,audio-routing =
"Headphone", "HPOL",
"Headphone", "HPOR",
"Speaker", "HPOL",
"Speaker", "HPOR",
"Headphone", "Headphone Power",
"Headphone", "Headphone Power",
"Speaker", "Speaker Power",
"Speaker", "Speaker Power",
"INPUT2", "Main Mic",
"INPUT2", "Main Mic",
"INPUT1", "Headset Mic",
"INPUT1", "Headset Mic";
pinctrl-names = "default";
pinctrl-0 = <&hp_det>;
play-pause-key {
label = "playpause";
linux,code = <KEY_PLAYPAUSE>;
press-threshold-microvolt = <2000>;
};
};
...
};
&i2c3 {
status = "okay";
es8389: es8389@10 {
status = "okay";
#sound-dai-cells = <0>;
compatible = "everest,es8389";
reg = <0x10>;
clocks = <&mclkout_sai1>;
clock-names = "mclk";
assigned-clocks = <&mclkout_sai1>;
assigned-clock-rates = <12288000>;
pinctrl-names = "default";
pinctrl-0 = <&sai1m0_mclk>;
};
};
&sai1 {
status = "okay";
rockchip,sai-tx-route = <2 1 0 3>;
pinctrl-names = "default";
pinctrl-0 = <&sai1m0_lrck
&sai1m0_sclk
&sai1m0_sdi0
&sai1m0_sdo2>;
};
&pinctrl {
...
headphone {
hp_det: hp-det {
rockchip,pins = <2 RK_PB7 RK_FUNC_GPIO &pcfg_pull_up>;
};
};
...
}
7、测试
7.1、查看声卡
cat /proc/asound/cards
root@rk3576-buildroot:/# cat /proc/asound/cards
0 [rockchipes8389 ]: rockchip-es8389 - rockchip-es8389
rockchip-es8389
1 [rockchipdp0 ]: rockchip-dp0 - rockchip-dp0
rockchip-dp0
2 [rockchiphdmi ]: rockchip-hdmi - rockchip-hdmi
rockchip-hdmi
7.2、查看声卡配置
amixer controls -c 0
numid=55,iface=CARD,name='Headphone Jack'
numid=56,iface=CARD,name='Headset Mic Jack'
numid=59,iface=MIXER,name='Headphone Switch'
numid=69,iface=MIXER,name='ADC MUX'
numid=67,iface=MIXER,name='ADC Mixer DACL ADCL Mixer'
numid=68,iface=MIXER,name='ADC Mixer DACR ADCR Mixer'
numid=49,iface=MIXER,name='ADC OSR Volume'
numid=48,iface=MIXER,name='ADC OSR Volume ON Switch'
numid=50,iface=MIXER,name='ADC OUTPUT Invert Switch'
numid=46,iface=MIXER,name='ADC Ramp Rate'
numid=54,iface=MIXER,name='ADC2DAC Mixer Volume'
numid=37,iface=MIXER,name='ADCL Capture Volume'
numid=39,iface=MIXER,name='ADCL PGA Volume'
numid=38,iface=MIXER,name='ADCR Capture Volume'
numid=40,iface=MIXER,name='ADCR PGA Volume'
numid=45,iface=MIXER,name='ALC Capture Max Gain'
numid=43,iface=MIXER,name='ALC Capture Switch'
numid=44,iface=MIXER,name='ALC Capture Target Level'
numid=47,iface=MIXER,name='ALC Capture Winsize'
numid=53,iface=MIXER,name='DAC OUTPUT Invert Switch'
numid=51,iface=MIXER,name='DACL Playback Volume'
numid=52,iface=MIXER,name='DACR Playback Volume'
numid=62,iface=MIXER,name='Headset Mic Switch'
numid=65,iface=MIXER,name='IF ADCDACL Mixer ADCL DACL Mixer'
numid=66,iface=MIXER,name='IF ADCDACR Mixer ADCR DACR Mixer'
numid=63,iface=MIXER,name='IF DACL Mixer DACR DACL Mixer'
numid=64,iface=MIXER,name='IF DACR Mixer DACL DACR Mixer'
numid=61,iface=MIXER,name='Main Mic Switch'
numid=70,iface=MIXER,name='OUTL MUX'
numid=71,iface=MIXER,name='OUTR MUX'
numid=41,iface=MIXER,name='PGAL Select'
numid=42,iface=MIXER,name='PGAR Select'
numid=34,iface=MIXER,name='SAI1 Clk Auto Switch'
numid=5,iface=MIXER,name='SAI1 Receive Mono Slot Select'
numid=6,iface=MIXER,name='SAI1 Receive Mono Switch'
numid=29,iface=MIXER,name='SAI1 Receive PATH0 Source Select'
numid=28,iface=MIXER,name='SAI1 Receive PATH1 Source Select'
numid=27,iface=MIXER,name='SAI1 Receive PATH2 Source Select'
numid=26,iface=MIXER,name='SAI1 Receive PATH3 Source Select'
numid=4,iface=MIXER,name='SAI1 Receive SDIx Select'
numid=2,iface=MIXER,name='SAI1 Receive Start Mode Sel'
numid=11,iface=MIXER,name='SAI1 SDI0 Loopback I2S LR Channel Sel'
numid=15,iface=MIXER,name='SAI1 SDI0 Loopback I2S LR Switch'
numid=19,iface=MIXER,name='SAI1 SDI0 Loopback Src Select'
numid=23,iface=MIXER,name='SAI1 SDI0 Loopback Switch'
numid=10,iface=MIXER,name='SAI1 SDI1 Loopback I2S LR Channel Sel'
numid=14,iface=MIXER,name='SAI1 SDI1 Loopback I2S LR Switch'
numid=18,iface=MIXER,name='SAI1 SDI1 Loopback Src Select'
numid=22,iface=MIXER,name='SAI1 SDI1 Loopback Switch'
numid=9,iface=MIXER,name='SAI1 SDI2 Loopback I2S LR Channel Sel'
numid=13,iface=MIXER,name='SAI1 SDI2 Loopback I2S LR Switch'
numid=17,iface=MIXER,name='SAI1 SDI2 Loopback Src Select'
numid=21,iface=MIXER,name='SAI1 SDI2 Loopback Switch'
numid=8,iface=MIXER,name='SAI1 SDI3 Loopback I2S LR Channel Sel'
numid=12,iface=MIXER,name='SAI1 SDI3 Loopback I2S LR Switch'
numid=16,iface=MIXER,name='SAI1 SDI3 Loopback Src Select'
numid=20,iface=MIXER,name='SAI1 SDI3 Loopback Switch'
numid=25,iface=MIXER,name='SAI1 Sync In Switch'
numid=24,iface=MIXER,name='SAI1 Sync Out Switch'
numid=7,iface=MIXER,name='SAI1 Transmit Mono Switch'
numid=33,iface=MIXER,name='SAI1 Transmit SDO0 Source Select'
numid=32,iface=MIXER,name='SAI1 Transmit SDO1 Source Select'
numid=31,iface=MIXER,name='SAI1 Transmit SDO2 Source Select'
numid=30,iface=MIXER,name='SAI1 Transmit SDO3 Source Select'
numid=3,iface=MIXER,name='SAI1 Transmit SDOx Select'
numid=1,iface=MIXER,name='SAI1 Transmit Start Mode Sel'
numid=60,iface=MIXER,name='Speaker Switch'
numid=58,iface=MIXER,name='hp switch'
numid=57,iface=MIXER,name='spk switch'
numid=35,iface=PCM,name='SAI1 PCM Read Wait Time MS'
numid=36,iface=PCM,name='SAI1 PCM Write Wait Time MS'
7.3、查看引脚状态
可以在播放过程中,查看相关控制引脚的状态:
cat /sys/kernel/debug/gpio | grep -E "hp|spk"
root@rk3576-buildroot:/# cat /sys/kernel/debug/gpio | grep -E "hp|spk"
gpio-70 ( |hp-con ) out lo
gpio-71 ( |spk-con ) out lo
gpio-79 ( |hp-det ) in hi IRQ ACTIVE LOW
7.4、耳机放音
# 关喇叭,只开耳机
amixer -c 0 cset numid=57 off
amixer -c 0 cset numid=60 off
amixer -c 0 cset numid=58 on
amixer -c 0 cset numid=59 on
# 关掉 ADC/旁路/回环混音,先只走纯 DAC 播放
amixer -c 0 cset numid=63 off
amixer -c 0 cset numid=64 off
amixer -c 0 cset numid=65 off
amixer -c 0 cset numid=66 off
amixer -c 0 cset numid=67 off
amixer -c 0 cset numid=68 off
# DAC 输出不反相,音量先用温和值,别直接 255
amixer -c 0 cset numid=53 off
amixer -c 0 cset numid=51 150
amixer -c 0 cset numid=52 150
# OUT MUX 走 normal
amixer -c 0 cset numid=70 0
amixer -c 0 cset numid=71 0
# SAI1 使用 SDO2 输出 PATH0
amixer -c 0 cset numid=31 0
# 播放音频
aplay -D hw:0,0 sound_test.wav
7.5、扬声器放音
# 关耳机,只开喇叭
amixer -c 0 cset numid=58 off
amixer -c 0 cset numid=59 off
amixer -c 0 cset numid=57 on
amixer -c 0 cset numid=60 on
# 关 ADC/旁路/回环混音
amixer -c 0 cset numid=63 off
amixer -c 0 cset numid=64 off
amixer -c 0 cset numid=65 off
amixer -c 0 cset numid=66 off
amixer -c 0 cset numid=67 off
amixer -c 0 cset numid=68 off
# DAC 音量先别太高
amixer -c 0 cset numid=53 off
amixer -c 0 cset numid=51 210
amixer -c 0 cset numid=52 210
# 输出走 normal,SAI1 SDO2 -> PATH0
amixer -c 0 cset numid=70 0
amixer -c 0 cset numid=71 0
amixer -c 0 cset numid=31 0
# 播放音频
aplay -D hw:0,0 sound_test.wav
7.6、咪头录音/放音
# 关播放输出,避免啸叫
amixer -c 0 cset numid=57 off
amixer -c 0 cset numid=58 off
amixer -c 0 cset numid=59 off
amixer -c 0 cset numid=60 off
# 开主麦,关耳麦
amixer -c 0 cset numid=61 on
amixer -c 0 cset numid=62 off
# 输入选择,先用 PGAL/PGAR 默认项
amixer -c 0 cset numid=41 0
amixer -c 0 cset numid=42 0
# ADC 音量和 PGA 增益,先别太大
amixer -c 0 cset numid=37 191
amixer -c 0 cset numid=38 191
amixer -c 0 cset numid=39 8
amixer -c 0 cset numid=40 8
# 关 ALC,先用固定增益测
amixer -c 0 cset numid=43 off
# ADC MUX 选模拟麦 AMIC,通常是 0
amixer -c 0 cset numid=69 0
# 录音
arecord -D hw:0,0 -f S16_LE -r 48000 -c 2 -d 10 mic.wav
# 放音。放音的设置可以参考上面的耳机或喇叭
aplay -D hw:0,0 mic.wav
8、遇到的问题
8.1、i2cdetect timeout

经排查,是 ES8390 供电问题。VCC_1V8_S0 没有电压输出,原因是 ETA6280S2F 功率开关的输入电压范围在 2.1v ~ 6v。原理图上是 1.8v 输入。



8.2、es8390 i2c 地址漂移
该问题表现为 i2cdetect 时,有时会出现两个地址:
10: UU -- 12 -- ...
其中:
- 0x10 是驱动绑定的 ES8390 地址
- 0x12 是异常多出来的地址
同时导致驱动报错:
ASoC: error at soc_component_read_no_lock on es8389.3-0010 for register: [0x00000073] -6
ASoC: error at soc_component_read_no_lock on es8389.3-0010 for register: [0x00000044] -6
原因是,es8390 相比于 es8388 而言多了一根 i2c 地址线,分别是 pin8 和 pin26。

而原理图的 pin8 没有下拉,导致 i2c 地址不稳定。
0X10 ADDR(CE) DGND 18 AGND 13 HPGND 29 EPAD ES8388 QFN28-4X4X0_8-0_45 -->
解决方案有两种:
- 硬件加下拉电阻。
- 软件将 SAI1_SDI0_M0 配置成内部下拉:
&sai1 {
status = "okay";
rockchip,sai-tx-route = <2 1 0 3>;
pinctrl-names = "default";
pinctrl-0 = <&sai1m0_lrck
&sai1m0_sclk
&sai1m0_sdi0_pull_down
&sai1m0_sdo2>;
};
&pinctrl {
...
audio {
sai1m0_sdi0_pull_down: sai1m0-sdi0-pull-down {
rockchip,pins =
<4 RK_PB3 1 &pcfg_pull_down>;
};
};
...
};
8.3、喇叭放音时底噪大
喇叭放音测试时,人声很小,感觉被闷在里面了一样。所以听起来感觉是噪音很大。
原因是 es8390 左右声道的输出接到了单声道的喇叭功放。
在应用层修改配置,将一路 DAC 反相后,就正常了:
amixer -c 0 cset numid=53 on,off # DAC2 反相,适配喇叭功放差分输入
也可以直接设置寄存器:
i2cset -f -y 3 0x10 0x45 0x20

所以总的喇叭配置命令如下:
i2cset -f -y 3 0x10 0x45 0x20
# 关耳机,只开喇叭
amixer -c 0 cset numid=58 off
amixer -c 0 cset numid=59 off
amixer -c 0 cset numid=57 on
amixer -c 0 cset numid=60 on
# 关 ADC/旁路/回环混音
amixer -c 0 cset numid=63 off
amixer -c 0 cset numid=64 off
amixer -c 0 cset numid=65 off
amixer -c 0 cset numid=66 off
amixer -c 0 cset numid=67 off
amixer -c 0 cset numid=68 off
# DAC 音量先别太高
amixer -c 0 cset numid=53 on,off # DAC2 反相,适配喇叭功放差分输入
amixer -c 0 cset numid=51 210
amixer -c 0 cset numid=52 210
# 输出走 normal,SAI1 SDO2 -> PATH0
amixer -c 0 cset numid=70 0
amixer -c 0 cset numid=71 0
amixer -c 0 cset numid=31 0
# 播放音频
aplay -D hw:0,0 sound_test.wav
9、参考文章
《ES8390 DS.pdf》
10、总结
无。
1177

被折叠的 条评论
为什么被折叠?



