RK3568系列12——ES8316音频芯片配置

  RK3568平台官方推荐搭配RK809PMIC使用,而RK809集成了一个音频芯片,但是其音质效果并没有独立的音频芯片那么好,因此项目中采用一块ES8316芯片作为系统的音频输出。

预备知识

  • DAI(Digital Audio Interface):CPU端声音输出通路,有I2S、PDM、SPDIF等格式
  • codec:物理音频芯片
  • sound-card:软件驱动,用于连接DAI和codec

原理图分析

  • 地址脚(芯片第31脚):被拉低,因此I2C地址为0x10
  • I2C4总线接入的是M1通道

CODEC配置

  由于ES8316只有一对双声道的音频输出接口,因此项目中将功放和耳机输出接在一起,由一个GPIO(GPIO3_C6)控制功放的开关,插入耳机时关闭功放,实现音频通路的切换。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
&pinctrl {
audio {
speaker_enable: speaker-enable {
rockchip,pins = <3 RK_PC6 RK_FUNC_GPIO &pcfg_pull_down>;
};
};
};

&i2c4 {
status = "okay";
clock-frequency = <400000>;

es8316: es8316@10 {
status = "okay";
#sound-dai-cells = <0>;
compatible = "everest,es8316";
reg = <0x10>;
clocks = <&cru I2S1_MCLKOUT>;
clock-names = "mclk";
assigned-clocks = <&cru I2S1_MCLKOUT>, <&cru I2S1_MCLK_TX_IOE>;
assigned-clock-rates = <11289600>;
assigned-clock-parents = <&cru I2S1_MCLKOUT_TX>, <&cru I2S1_MCLKOUT_TX>;
pinctrl-names = "default";
pinctrl-0 = <&i2s1m0_mclk &speaker_enable>;
spk-con-gpio = <&gpio3 RK_PC6 GPIO_ACTIVE_HIGH>;
};
};

DAI配置

  RK3568I2S1音频总线支持8个声道,但是项目中只用到两个声道,因此要重新定义一下I2S1使用的PIN脚,另外RK809音频相关的配置无法被彻底关闭,因此需要彻底删除。

1
2
3
4
5
6
7
8
9
10
11
12
&i2s1_8ch {
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&i2s1m0_sclktx
&i2s1m0_lrcktx
&i2s1m0_lrckrx
&i2s1m0_sdi0
&i2s1m0_sdo0>;
};

/delete-node/ &rk809_sound;
/delete-node/ &rk809_codec;

声卡配置

  声卡(Audio Card/Sound Card/MACHINE)的作用是将CODEC(物理声卡)和DAI(CPU音频输出)连接在一起,形成一个供上层(Android)使用的抽象音频设备。这里需要注意的是,声卡的工作频率必须设置在11289600hz(采样率44.1Khz * 比特率256),暂未找到如何突破这个上限。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/ {
es8316-sound {
compatible = "simple-audio-card";
simple-audio-card,name = "rockchip,es8316-codec";
simple-audio-card,format = "i2s";
simple-audio-card,mclk-fs = <256>;

simple-audio-card,cpu {
sound-dai = <&i2s1_8ch>;
system-clock-frequency = <11289600>;
};
simple-audio-card,codec {
sound-dai = <&es8316>;
system-clock-frequency = <11289600>;
};
};
};

耳机检测配置

  RK平台使用了一种新的耳机检测的方式,耳机状态由CPU来检测,然后通过extcon的方式通知CODEC来做出相关动作,这里需要通知ES8316来开关功放。其中检测方式有两种:A.耳机插入检测电路连接CODEC,CODEC检测到插入后,产生一个中断给CPU;B.耳机插入检测电路通过GPIO的方式连接CPU。当CPU检测到耳机插入后,可以通过ADC的方式检测耳机是否带麦克风。项目中使用方式B,但是ADC脚并没有接线,因此不进行相关配置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/ {
rk_headset: rk-headset {
compatible = "rockchip_headset";

// A.中断方式
// hook_gpio = <&gpio1 RK_PB0 GPIO_ACTIVE_HIGH>;
// io-channels = <&saradc 2>;
// io-channel-names = "headset";

// B.GPIO方式
headset_gpio = <&gpio1 RK_PB0 GPIO_ACTIVE_HIGH>;
pinctrl-names = "default";
pinctrl-0 = <&hp_det>;
};
};

&pinctrl {
audio {
hp_det: hp-det {
rockchip,pins = <1 RK_PB0 RK_FUNC_GPIO &pcfg_pull_down>;
};
};
};

&es8316 {
extcon = <&rk_headset>
};

调试命令

1
2
3
4
5
6
7
8
# 探测I2C设备
i2cdetect -y 4

# 导出I2C设备寄存器
i2cdump -f -y 4 0x10

# 设置I2C设备寄存器(0x12位地址,0x23为内容)
i2cset -f -y 4 0x10 0x12 0x23

参考文档