rk3568 适配rk809音频

news2025/1/16 20:10:15

rk3568 适配rk809音频

RK809是一款集成了多种功能的电源管理芯片,主要用于笔记本电脑、平板电脑、工控机等设备的电源管理。以下是RK809的详细功能介绍:

  1. 电源管理:控制电源的开关、电压、电流等参数,保证设备的稳定运行。
  2. 音频管理:支持PDM/I2S音频播放和录制,不仅支持耳机录音和播放用能,还可以直接驱动 2W喇叭。
  3. 电池管理:支持多种电池类型,包括锂离子电池、聚合物电池等,可以实现电池的充放电管理,延长电池寿命。
  4. 供电管理:支持多种供电方式,包括AC适配器、USB供电等,可以智能切换供电方式,保证设备的稳定运行。
  5. 温度管理:支持温度监测和控制,可以防止设备过热,保护设备安全。
  6. 时间管理:支持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-codec
rk809 音频需要外部提供 SPK_HP 供电和I2S(PDM)信号;输入立体声MIC可拆分为左声道和右声道; 喇叭则只有单声道输出,功率限定 2W; 耳机则为立体声。部分用户需要使用立体声喇叭,从耳机取音频经过功放放大推动喇叭。
VCC_SPK_HP 与 vcc_5v0直接相连,无需增加外部控制。

1.1 声卡适配

Audio
I2S
i2c
rk809_sound
HP
SPK
rk809
rk3568
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

  1. HP_DET 和 SPK_CTL 被复用情况可能引起驱动注册失败,需要先查GPIO复用。
  2. 音频路由可以使用命令调整音频路由,再编译代码确认结果。
  3. 耳机或者主mic录音时只有单声道,属于正常现象;需要软件作音频搬移实现“立体声”。
  4. 耳机和主mic可以合并为立体声录音,此时无法再使用单独录音。

总结

不枉博主一片辛苦,欢迎订阅博主–炭烤毛蛋 。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/557229.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

开放原子训练营(第三季)inBuilder低代码开发实验室之人人都是开发者

目录 前言: 一、知己知彼 1.1全场景 全角色 多终端 快速开发 1.2直觉化 响应式 1.3所见即所得 1.4全栈开发 二、百战百胜 2.1inBuilder开发入门 2.2点火启动&#xff0c;新的征程 三、实战表现 3.1实战总结 3.2实战效果 四、总结 前言: 2023年&#xff0c;是我们摘…

chatgpt赋能Python-python_embedded_null_character

Python中嵌入空字符的介绍 在Python编程语言中&#xff0c;空字符是一种特殊的字符&#xff0c;它在字符串中表示为空格或空行。不过&#xff0c;在某些情况下添加一个空字符是非常必要的&#xff0c;例如在编码时需要将字符串以空字符分隔&#xff0c;或者在数据库存储中需要…

CC++——深入探究动态内存管理

文章目录 总述C&C程序内存区域划分C内存管理方式运用new/delete操作内置类型new和delete操作自定义类型 operator new与operator delete函数new和delete操作符的实现原理自定义类型 malloc/free 和 new/delete 的区别 总述 俗话说&#xff0c;没有理解过底层的c&c程序员…

性能测试——服务端监控工具nmon

这里写自定义目录标题 一、性能监控工具nmon介绍二、nmon可监控的数据类型三、nmon特点四、Linux下安装1、检查安装环境2、下载nmon3、解压 五、运行nmon1、启动nmon2、常用nmon快捷命令3、nmon命令行参数4、命令行例子5、重点 六、查看 nmon 监控结果1、nmon_analyser 介绍2、…

AI:Vue2和Vue3的对比

1. 什么是Vue.js以及Vue.js在前端开发中的重要性。 Vue.js是一个遵循MVVM&#xff08;Model-View-ViewModel&#xff09;模式的前端JavaScript框架&#xff0c;它采用了双向数据绑定和组件化的思想&#xff0c;使得前端开发变得更加简洁、高效、可维护。Vue.js由中国工程师尤雨…

chatgpt赋能Python-python_dlib

Python Dlib&#xff1a;从入门到实践 Python Dlib 是一个用于人脸检测、跟踪和姿态估计的高性能C库&#xff0c;提供 Python 接口方便调用。它是一个开源项目&#xff0c;被广泛应用于计算机视觉、图像处理和机器学习等领域。本文将从介绍Dlib的原理、特点以及应用场景等方面…

Rshiny基本函数(交互式web应用)

Rshiny基础函数 引言shiny包的下载shinyApp的构成ui的设计函数HTML类比img函数无法加载图片控件函数ui设计的输出对象 server总结 引言 R语言shiny包可以帮助我们轻松的制作交互式的web应用&#xff0c;并且可以搭建为独立的桌面可执行程序&#xff0c;非常方便制作和分享&…

人工智能(柴玉梅)第四章课后部分习题答案(仅供参考)

注释部分只是复习用&#xff0c;不是答案 第五题 注释&#xff1a;便于复习 本来想搜个类似的&#xff0c;结果发现r1这种人家都带括号&#xff01;&#xff01;&#xff01;额&#xff0c;没括号那我就从前往后算了&#xff0c;按顺序算准没错~ CF&#xff08;H&#xff09;的…

Python logging使用

目录 logging模块 logging核心组件 logger handler StreamHandler&#xff1a;把日志内容在控制台中输出 FileHandler&#xff1a;把日志内容写入到文件中 filter formatter 注意日志级别的继承问题 logger.exception 上述样例的整体代码 日志的配置文件及其模板 lo…

用Python爬取了三大相亲软件评论区,结果…

小三&#xff1a;怎么了小二&#xff1f;一副愁眉苦脸的样子。 小二&#xff1a;唉&#xff01;这不是快过年了吗&#xff0c;家里又催相亲了 ... 小三&#xff1a;现在不是流行网恋吗&#xff0c;你可以试试相亲软件呀。 小二&#xff1a;这玩意靠谱吗&#xff1f; 小三&#…

使用Gradle7.6.1 + SpringBoot3.0.2 + java17创建微服务项目(学习)

这是一个大胆的决定 这里是导航 技术栈开发工具一、创建gradle父子项目&#xff08;deity&#xff09;1.0 简单流程示意1.1、IDEA中主要图示1.1.1 项目结构图1.1.2 IDEA中 Gradle配置 1.2、deity父项目build.gradle文件1.3、deity父项目settings.gradle文件1.4、子项目build.g…

计算机底层知识

汇编语言&#xff08;机器语言&#xff09;的执行过程 汇编语言的本质&#xff1a;机器语言的助记符 其实他就是机器语言 计算机通电->CPU读取内存中程序&#xff08;电信号输入&#xff09; ->时钟发生器不断震荡通电 ->推动CPU内部一步一步执行&#xff08;执行多…

elementUI,自定义表头,多层级表头,表头合并,行内容一致的合并行

先上效果&#xff1a; 1.自定义表头&#xff1a; 通过设置 slot"header" 来自定义表头。 slot-scope"scope" 这一行千万不要因为没有再template中使用到scope&#xff0c;vscode报红而删除&#xff0c;这会导致input框不能输入任何内容&#xff01; &l…

软考网工计算题总结(一):总共27类题型,进来复习啦!

题型一&#xff1a; 1.地址编号从80000H到BFFFFH且按字节编址的内存容量为&#xff08;5&#xff09;KB,若用16KX4bit的存储芯片够成该内存&#xff0c;共需&#xff08;6&#xff09;片。 (5)A.128 B.256 C.512 D.1024 (6)A.8 B.16 C.32 D.64 【答案】B C 【解析】本题…

写一个自己的MyGPT app

chatGPT大火之后&#xff0c;国内外一众玩家撸起袖子热火朝天干了起来。 借助开源的GPT可以轻松的拥有自己的专属GPT&#xff0c;装装逼还是很好用的&#xff0c;也算赶一下chatGPT的风口。 这里使用ANYGPT&#xff0c;打造自已的GPT&#xff0c;AnyGPT API 开发者文档 语雀…

【STM32】基础知识 第十六课 窗口看门狗 WWDG 深入浅出

【STM32】基础知识 第十六课 窗口看门狗 WWDG 深入浅出 概述窗口看门狗 (WWDG)WWDG_SR 状态寄存器WWDG 配置与使用使用 WWDG 进行故障检测案例 概述 在嵌入式开发中, 可靠性和稳定性是至关重要的. 这就是为什么许多单片机, 比如 STM32, 提供了窗口看门狗 (Window Watchdog, WW…

redis 源码记录

正好最近时间富裕&#xff0c;看一看redis源码&#xff0c;简单的记录一下。也有可能说的是不全面的&#xff0c;自行斟酌&#xff0c;只能通过debug来简单的梳理本次测试流程&#xff0c;而不是全量的覆盖的所有测试用例&#xff0c;时不时更新&#xff0c;争取一天学一点点。…

基于Web的水果蔬菜销售系统的设计与实现(论文+源码)_kaic

摘 要 随着互联网经济与技术进程的不断推进&#xff0c;网上购物方式受到公众的普遍关注和欢迎。传统的樱桃线下销售模式缺陷不断暴露&#xff0c;难以满足公众不断加快的生活节奏和生活方式的需求。本文根据目前大众的实际需要&#xff0c;根据网上商城的特点、现状以及主要功…

Java 与排序算法(3):插入排序

一、插入排序 插入排序&#xff08;Insertion Sort&#xff09;是一种简单直观的排序算法&#xff0c;它的基本思想是将待排序序列分为已排序区间和未排序区间&#xff0c;然后每次从未排序区间取出一个元素&#xff0c;将其插入到已排序区间的合适位置中&#xff0c;使得插入…

【SpringBoot】八:Web服务---WebMvcConfigurer

文章目录 1.WebMvcConfigurer简介2. 页面跳转控制器3. 数据格式化4. 拦截器4.1 一个拦截器4.2 多个拦截器 1.WebMvcConfigurer简介 WebMvcConfigurer是SpringMVC xml配置文件的JavaConfig实现方式。 2. 页面跳转控制器 创建 SpringMVC 配置类: 3. 数据格式化 Formatter&…