[RK3566-Android11] 关于双TAS5805M-攻放IC-立体声+低音组2.1通路调试

2023-11-02 21:30

本文主要是介绍[RK3566-Android11] 关于双TAS5805M-攻放IC-立体声+低音组2.1通路调试,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

问题描述

由于RK3566/3568/3588的新平台没有适配tas5805m的驱动,驱动库里只有老版本的571x的低芯片版本的驱动,这里我们可以使用Ti提供TAS5805M驱动《Linux Driver for TAS5805M》中的tas5805m.c和tas5805m.h文件修改适用于新平台,需要注意由于kernel版本升级,tas5805m.c中snd_soc_codec方法被弃用,需要修改为snd_soc_component方法,还有一些类似的codec方法都需要替换为对应的component函数,然后根据库里老的tas571x.c驱动,将其中的gpio控制部分移植过来。这边由于代码问题,无法附上修改好的tas5805m.c文件。可根据我的叙述,尝试自行修改。

我这里由于使用了两个TAS5805M的驱动,所以使用了2份tas5805m.c驱动来控制,dts配置如下:

    tas5805m_sound: tas5805m-sound {compatible = "simple-audio-card";simple-audio-card,format = "i2s";simple-audio-card,name = "rockchip,tas5805m";simple-audio-card,mclk-fs = <256>;simple-audio-card,dai-link@0 {format = "i2s";cpu {sound-dai = <&i2s1_8ch>;};codec {sound-dai = <&tas5805m>;};};simple-audio-card,dai-link@1 {format = "i2s";cpu {sound-dai = <&i2s1_8ch>;};codec {sound-dai = <&tas5805ms>;};};};&i2c2 {
...//0x2f 立体声tas5805m: tas5805m@2f {#sound-dai-cells = <0>;compatible = "ti,tas5805m";reg = <0x2f>;pinctrl-names = "default";pinctrl-0 = <&i2s1m0_mclk>;//CPU_AM_EN GPIO1_B0_Dpdn-gpios = <&gpio1 RK_PB0 GPIO_ACTIVE_LOW>;//I2S1_MCLK_M0 GPIO1 A2reset-gpios = <&gpio1 RK_PA2 GPIO_ACTIVE_LOW>;status = "okay";};//0x2e 低音tas5805ms: tas5805ms@2e {#sound-dai-cells = <0>;compatible = "ti,tas5805ms";reg = <0x2e>;status = "okay";};
...
}

遇到的问题:

1.播放音乐喇叭无声音
最开始调试的时候,我先单独调试了一个芯片,根据上面的驱动部分修改cat /proc/asound/cards查看声卡注册成功,但是没有声音出来,这是需要使用 tinyplay /data/test1k-44100.wav -D 1 命令,强制I2S通过喇叭出声音。我这里强制I2S是可以出声音的,如果没声音,需要检查对应的i2s软/硬件配置是否正确。

2.hdmi sound声音优先级高于功放
这是RK的声音通路设计,我调试的时候发现一直没声音,结果拔了HDMI后声音出来了。如果要修改优先级,可以在frameworks\av\services\audiopolicy\enginedefault\src\Engine.cpp中,将AUDIO_DEVICE_OUT_SPEAKER的优先级高于AUDIO_DEVICE_OUT_AUX_DIGITAL,如下:

        if (devices2.isEmpty()) {devices2 = availableOutputDevices.getDevicesFromType(AUDIO_DEVICE_OUT_SPEAKER);}if ((devices2.isEmpty()) && (strategy != STRATEGY_SONIFICATION)) {// no sonification on aux digital (e.g. HDMI)devices2 = availableOutputDevices.getDevicesFromType(AUDIO_DEVICE_OUT_AUX_DIGITAL);}if ((devices2.isEmpty()) &&(getForceUse(AUDIO_POLICY_FORCE_FOR_DOCK) == AUDIO_POLICY_FORCE_ANALOG_DOCK)) {devices2 = availableOutputDevices.getDevicesFromType(AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET);}// if (devices2.isEmpty()) {//     devices2 = availableOutputDevices.getDevicesFromType(AUDIO_DEVICE_OUT_SPEAKER);// }

3.双芯片注册regmap_register_patch时有时失败
tas5805m.c驱动中需要使用regmap_register_patch方法去注册tas5805m.h的tas5805m_init_sequence函数,去修改寄存器,达到立体声和低音的效果,如下:

	ret = regmap_register_patch(regmap, tas5805m_init_sequence, ARRAY_SIZE(tas5805m_init_sequence));printk("tas5805m:>>>>>>>>>>>> regmap_register_patch: ret = %d<<<<<<<<<<<<<<<<",ret);if (ret != 0){dev_err(dev, "Failed to initialize TAS5805M: %d\n",ret);goto err;}

这里双驱动的时候,发现驱动加载时,ret经常注册失败返回-6,导致声音注册失败无声,虽然可以屏蔽此处,不注册效果也可以出声,但是无法使用立体声效果。经过反复研究,发现I2C的clock-frequency高一点的时候就会出现概率注册失败的情况,clock-frequency在10的低速时,则不会失败,跟Ti沟通,Ti那边说初始化时候要保持I2S稳定信号,需要在初始化之前保证I2S1提前输出稳定信号就可以。

4.tas5805m.h的使用问题
由于需要立体声+低音组成2.1的效果,所以根据我的硬件,0x2f立体声这路,需要使用2.1的.h配置。
而0x2e低音这路,需要使用1.0的.h配置,这部分。配置文件如下:

https://pan.baidu.com/s/1cZDh03eCm0vZhQAfJu2Lcg      ou0v
https://pan.baidu.com/s/1i35fkz8iTd9Kt6R7iV9BBw      y58a

tas5805m.h是2.1
tas5805ms.h是1.0

遇到类似问题,可以私聊我。

后续问题:

按照RK驱动注册流程,即使打上I2S常开补丁,I2S-CLK也是在声卡注册之后也就是I2C之后才能出来波形,如下图:
在这里插入图片描述
(图中:黄色为 i2c2 的 I2C2_SDA_M1 蓝色为 i2s1 的 I2S1_SCLK_TX_M0_PMIC)
按照以上波形,开机后,I2S在I2C之后,这样TAS5805M驱动在注册时会导致写入的寄存器配置失效。
会导致最高音量时会出现失真的情况,如下图。在这里插入图片描述
按照TI的的要求,我们需要iis信号出来以后再写iic,如下图:
在这里插入图片描述
这里我们只需要在打上I2S常开补丁之后,更换驱动的编译顺序,就可以让I2S的信号比I2C的信号先出来。如下图:
在这里插入图片描述
这里我们把rockchip/的编译优先级提高,把codecs/的注册放到最后。在用示波器测量如下图:
在这里插入图片描述
可以看到,I2S的信号提前出来了。这时我们再使用1K-0db的音源测试看看:
在这里插入图片描述
最高音量不削顶了,不在有失真的情况,说明通过TAS5805M写入I2C寄存器成功了。

这篇关于[RK3566-Android11] 关于双TAS5805M-攻放IC-立体声+低音组2.1通路调试的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/333432

相关文章

ASIO网络调试助手之一:简介

多年前,写过几篇《Boost.Asio C++网络编程》的学习文章,一直没机会实践。最近项目中用到了Asio,于是抽空写了个网络调试助手。 开发环境: Win10 Qt5.12.6 + Asio(standalone) + spdlog 支持协议: UDP + TCP Client + TCP Server 独立的Asio(http://www.think-async.com)只包含了头文件,不依

如何在Visual Studio中调试.NET源码

今天偶然在看别人代码时,发现在他的代码里使用了Any判断List<T>是否为空。 我一般的做法是先判断是否为null,再判断Count。 看了一下Count的源码如下: 1 [__DynamicallyInvokable]2 public int Count3 {4 [__DynamicallyInvokable]5 get

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能

vscode中文乱码问题,注释,终端,调试乱码一劳永逸版

忘记咋回事突然出现了乱码问题,很多方法都试了,注释乱码解决了,终端又乱码,调试窗口也乱码,最后经过本人不懈努力,终于全部解决了,现在分享给大家我的方法。 乱码的原因是各个地方用的编码格式不统一,所以把他们设成统一的utf8. 1.电脑的编码格式 开始-设置-时间和语言-语言和区域 管理语言设置-更改系统区域设置-勾选Bata版:使用utf8-确定-然后按指示重启 2.vscode

【2.1 深度学习中的感知机是什么】

2.1 深度学习中的感知机是什么 深度学习是机器学习的一个分支,它模拟人脑的工作方式来处理数据,尤其是通过神经网络的结构来自动提取数据的特征并进行分类、回归或其他复杂的任务。在深度学习的早期发展中,许多基础概念和模型为后续的复杂网络奠定了基础。其中,**感知机(Perceptron)**是一个非常重要的基础模型,它实际上是神经网络和深度学习的前身之一。 感知机的基本概念 感知机是一种二分

起点中文网防止网页调试的代码展示

起点中文网对爬虫非常敏感。如图,想在页面启用调试后会显示“已在调试程序中暂停”。 选择停用断点并继续运行后会造成cpu占用率升高电脑卡顿。 经简单分析网站使用了js代码用于防止调试并在强制继续运行后造成电脑卡顿,代码如下: function A(A, B) {if (null != B && "undefined" != typeof Symbol && B[Symbol.hasInstan

php 7之PhpStorm + Nginx + Xdebug运行调试

操作环境: windows PHP 7.1.10 PhpStorm-2017.2.4 Xdebug 2.5.4 Xdebug helper 1.6.1 nginx-1.12.2 注意查看端口占用情况 netstat -ano //查看所以端口netstat -aon|findstr "80" //查看指定端口占用情况 比如80端口查询情况 TCP 0.0.0.0:8

【2025】基于Python的空气质量综合分析系统的设计与实现(源码+文档+调试+答疑)

博主介绍:     ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W+粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台的优质作者。通过长期分享和实战指导,我致力于帮助更多学生完成毕业项目和技术提升。 技术范围:     我熟悉的技术领域涵盖SpringBoot、Vue、SSM、HLMT

VS Code 调试go程序的相关配置说明

用 VS code 调试Go程序需要在.vscode/launch.json文件中增加如下配置:  // launch.json{// Use IntelliSense to learn about possible attributes.// Hover to view descriptions of existing attributes.// For more information,