[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_D
		pdn-gpios = <&gpio1 RK_PB0 GPIO_ACTIVE_LOW>;
		//I2S1_MCLK_M0 GPIO1 A2
		reset-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);
        }
        // 把这里屏蔽移到上AUDIO_DEVICE_OUT_AUX_DIGITAL上面去
        // 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寄存器成功了。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: TAS5805M是一种数字音频功率放大器芯片,它采用了I2C控制接口来实现对器件的各种配置和控制。 要编写TAS5805M的I2C程序,首先需要了解芯片的寄存器配置和寄存器位的功能。TAS5805M的寄存器可以分为设备配置寄存器和音频处理寄存器两类。设备配置寄存器包括芯片ID、时钟、使能等配置,而音频处理寄存器包括音量、EQ、声场等音频处理参数的配置。 编写I2C程序的过程大致如下:首先通过I2C总线向TAS5805M写入设备配置寄存器,将芯片ID、时钟、使能等参数设置好。接下来根据需要对音频处理寄存器进行配置,包括音量、EQ、声场等参数的设置。需要注意的是,在对音频处理寄存器进行配置时,要保证寄存器位的设置正确,否则可能会导致音质变差或者无声输出。 编写I2C程序需要注意的几个细节:首先要确保I2C总线的时钟和数据线的电平稳定,以免出现通信错误。其次,在进行I2C读写操作时,要根据TAS5805M的地址和寄存器地址来正确操作寄存器位。最后,在每一次配置完成后,最好进行一次音频输出测试,以确保输出效果符合预期。 总的来说,编写TAS5805M的I2C程序需要有一定的音频处理和I2C通信基础,同时还需要仔细研究芯片的寄存器配置和寄存器位功能,才能实现对芯片的各种稳定可靠的配置。 ### 回答2: TAS5805M是一种数字功放芯片,其IIC程序是编程该芯片的其中一种方法。为了使用TAS5805M实现数字放大器功能,需要通过IIC接口来设置芯片的不同寄存器中的参数。IIC程序的实现是通过控制IIC总线来读写寄存器来完成。 TAS5805M的IIC程序主要包括以下步骤: 1. 初始化IIC总线,设置好地址和速率等参数; 2. 将寄存器地址和设置好的参数通过IIC总线写入TAS5805M芯片的寄存器中; 3. 如果需要取回之前设置的某些参数,可以通过IIC总线进行读取。 在实际编写IIC程序时,需要对不同的寄存器及其参数进行详细的了解和分析,了解其相关的数据格式、数据位及控制位,在代码中进行相应的设置和配置。 总之,IIC程序是实现数字功放TAS5805M芯片功能的重要步骤之一,有着非常重要的作用。通过IIC程序的编写,可以对TAS5805M芯片进行自定义的设置和配置,以满足不同应用场景下所需的功率、信噪比等要求。 ### 回答3: TAS5805M是一款数字音频功放芯片,提供完整的I2C编程接口。针对TAS5805M的I2C编程接口程序,主要包括以下几点: 首先,需要通过I2C接口进行器件初始化,包括时钟控制、音频参数设置、保护机制等。使用I2C编程时需要注意时序和协议,以确保数据传输正确。 其次,TAS5805M支持多种音频输入格式,包括I2S、PCM、TDM等,需要根据具体应用进行音频输入格式的设置,同时设置音量、增益、等化器等参数。 此外,TAS5805M具备多通道并行桥接功放特性,支持2x20W、3x13W、4x10W的输出功率,需要根据实际需求设置输出通道。 最后,对于保护机制的设置,TAS5805M提供了过压、过温、短路等多种保护功能,需要根据具体应用进行设置。 总之,TAS5805M的I2C编程接口程序需要根据具体应用实现相关的程序设计和调试工作,以达到最佳的音频输出效果和保护机制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值