rk3568 适配rk809音频
RK809是一款集成了多种功能的电源管理芯片,主要用于笔记本电脑、平板电脑、工控机等设备的电源管理。以下是RK809的详细功能介绍:
- 电源管理:控制电源的开关、电压、电流等参数,保证设备的稳定运行。
- 音频管理:支持PDM/I2S音频播放和录制,不仅支持耳机录音和播放用能,还可以直接驱动 2W喇叭。
- 电池管理:支持多种电池类型,包括锂离子电池、聚合物电池等,可以实现电池的充放电管理,延长电池寿命。
- 供电管理:支持多种供电方式,包括AC适配器、USB供电等,可以智能切换供电方式,保证设备的稳定运行。
- 温度管理:支持温度监测和控制,可以防止设备过热,保护设备安全。
- 时间管理:支持RTC时间记录、定时唤醒,以及输出RTC时钟信号。
相比之下,RK817在功能上比RK809更加强大,主要体现在以下方面:
(1)USB PD快充:支持USB PD 3.0协议,最高输出功率可达100W,可以快速充电支持PD协议的设备。
(2)Type-C接口:支持Type-C接口的设备,可以实现数据传输和充电功能。
(3)QC3.0快充:支持QC3.0协议,可以快速充电支持QC3.0协议的设备。
作者:炭烤毛蛋 ,查看博主了解更多。
提示:RK809的功耗比RK817低,比较适合功耗要求较低的设备,例如智能音箱等。RK817的功耗比RK809高,更适合功耗要求较高的设备,例如平板电脑、笔记本电脑等。
文章目录
- rk3568 适配rk809音频
- 1. 核查硬件,适配rk809音频
- 1.1 声卡适配
- 1.2 耳机适配
- 1.3 喇叭适配
- 2. 适配音频路由
- 2.1 适配 Android 音频路由
- 2.2 适配 Linux 音频路由
- Tips
- 总结
1. 核查硬件,适配rk809音频
rk809 音频需要外部提供 SPK_HP 供电和I2S(PDM)信号;输入立体声MIC可拆分为左声道和右声道; 喇叭则只有单声道输出,功率限定 2W; 耳机则为立体声。部分用户需要使用立体声喇叭,从耳机取音频经过功放放大推动喇叭。
VCC_SPK_HP 与 vcc_5v0直接相连,无需增加外部控制。
1.1 声卡适配
graph LR
A --> B
subgraph Subgraph1
C1 --> C2
C2 --> C3
C3 --> C4
note right of C4: This is a subgraph
label Subgraph1
subgraph Subgraph2
D1 --> D2
D2 --> D3
D3 --> D4
note right of D4: This is another subgraph
D4(( )) --> D5(( ))
D5 --> D6
D6 --> D7
note right of D7: This is a node with a label
end
end
注册rk809声卡前准备条件:
- rk809声卡驱动相关宏开启(RK内核已经匹配rk809声卡)
- 匹配设备树以及关联总线
- 注册声卡设备树
废话不多说,直接上设备树配置。
/ {
rk809_sound: rk809-sound {
status = "okay";
compatible = "simple-audio-card";
simple-audio-card,format = "i2s";
simple-audio-card,name = "rockchip,rk809-codec";
simple-audio-card,mclk-fs = <256>;
simple-audio-card,cpu {
sound-dai = <&i2s1_8ch>;
};
simple-audio-card,codec {
sound-dai = <&rk809_codec>;
};
};
};
&i2c0 {
status = "okay";
rk809: pmic@20 {
compatible = "rockchip,rk809";
reg = <0x20>;
......
rk809_codec: codec {
#sound-dai-cells = <0>;
compatible = "rockchip,rk809-codec", "rockchip,rk817-codec";
clocks = <&cru I2S1_MCLKOUT>;
clock-names = "mclk";
assigned-clocks = <&cru I2S1_MCLKOUT>, <&cru I2S1_MCLK_TX_IOE>;
assigned-clock-rates = <12288000>;
assigned-clock-parents = <&cru I2S1_MCLKOUT_TX>, <&cru I2S1_MCLKOUT_TX>;
pinctrl-names = "default";
pinctrl-0 = <&i2s1m0_mclk>;
hp-volume = <20>;
spk-volume = <3>;
mic-in-differential;
status = "okay";
};
};
};
&i2s1_8ch {
status = "okay";
rockchip,clk-trcm = <1>;
pinctrl-names = "default";
pinctrl-0 = <&i2s1m0_sclktx
&i2s1m0_lrcktx
&i2s1m0_sdi0
&i2s1m0_sdo0>;
};
刷新内核后,可以看到 rk809声卡
cat /proc/asound/cards
0 [rockchiprk809co]: rockchip_rk809- - rockchip,rk809-codec
rockchip,rk809-codec
1.2 耳机适配
耳机检测检测GPIO可以在rk809_sound中添加也可以单独注册耳机驱动。对比rk809声卡注册耳机检测,单独耳机检测增加hook,进而识别三段、四段耳机;也有耳机 uevent 上报,音频HAL层进而切换音频路由。
/ {
rk_headset: rk-headset {
compatible = "rockchip_headset";
headset_gpio = <&gpio3 RK_PA2 GPIO_ACTIVE_LOW>;
pinctrl-names = "default";
pinctrl-0 = <&hp_det>;
io-channels = <&saradc 2>;
};
};
&saradc {
status = "okay";
vref-supply = <&vcca_1v8>;
};
1.3 喇叭适配
双喇叭方案,音频取自耳机左右声道,经功放推动喇叭。功放由GPIO控制,高电平开启,低电平关闭。驱动中有此相关控制,只需增加到 rk809_codec声卡即可。
&rk809_codec {
spk-ctl-gpio = <&gpio3 RK_PC3 GPIO_ACTIVE_HIGH>;
};
2. 适配音频路由
耳机、喇叭控制都正确,但是发现喇叭无声音。HAL层默认喇叭由 rk809直接推动,并非本文中提及的耳机音源放大。将喇叭播放音频路由从"SPK"改为"SPK_HP"才有声音,也就是适配音频路由。
2.1 适配 Android 音频路由
适配过程可参考《rk3568 Android audio 调试》,废话不多说直接上修改内容。
--- a/tinyalsa_hal/codec_config/default_config.h
+++ b/tinyalsa_hal/codec_config/default_config.h
@@ -19,36 +19,36 @@
const struct config_control default_speaker_normal_controls[] = {
{
.ctl_name = "Playback Path",
- .str_val = "SPK",
+ .str_val = "SPK_HP",
},
};
const struct config_control default_speaker_incall_controls[] = {
{
.ctl_name = "Playback Path",
- .str_val = "SPK",
+ .str_val = "SPK_HP",
},
{
.ctl_name = "Voice Call Path",
- .str_val = "SPK",
+ .str_val = "SPK_HP",
},
};
const struct config_control default_speaker_ringtone_controls[] = {
{
.ctl_name = "Playback Path",
- .str_val = "RING_SPK",
+ .str_val = "RING_SPK_HP",
},
};
const struct config_control default_speaker_voip_controls[] = {
{
.ctl_name = "Playback Path",
- .str_val = "SPK",
+ .str_val = "SPK_HP",
},
{
.ctl_name = "Voip Path",
- .str_val = "SPK",
+ .str_val = "SPK_HP",
},
};
@@ -62,7 +62,7 @@ const struct config_control default_earpiece_normal_controls[] = {
const struct config_control default_earpiece_incall_controls[] = {
{
.ctl_name = "Playback Path",
- .str_val = "SPK",
+ .str_val = "SPK_HP",
},
{
.ctl_name = "Voice Call Path",
2.2 适配 Linux 音频路由
适配过程可参考《Linux 音频路由适配 (amixer)》,废话不多说直接上修改内容。
--- a/overlay/usr/share/alsa/ucm/rockchip,rk809-codec/HiFi.conf
+++ b/overlay/usr/share/alsa/ucm/rockchip,rk809-codec/HiFi.conf
@@ -40,7 +40,7 @@ SectionDevice."Speaker" {
EnableSequence [
cdev "hw:rockchiprk809co"
- cset "name='Playback Path' SPK"
+ cset "name='Playback Path' SPK_HP"
]
Tips
- HP_DET 和 SPK_CTL 被复用情况可能引起驱动注册失败,需要先查GPIO复用。
- 音频路由可以使用命令调整音频路由,再编译代码确认结果。
- 耳机或者主mic录音时只有单声道,属于正常现象;需要软件作音频搬移实现“立体声”。
- 耳机和主mic可以合并为立体声录音,此时无法再使用单独录音。
总结
不枉博主一片辛苦,欢迎订阅博主–炭烤毛蛋 。