This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TAS2552:TAS2552没有声音

Guru**** 1810550 points
Other Parts Discussed in Thread: TAS2552
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/audio-group/audio/f/audio-forum/1080620/tas2552-tas2552-has-no-sound

部件号:TAS2552
“线程: 测试”中讨论的其它部件

现在我在 imx6Q 中使用 TAS2552,  

现在出现了一种非常奇怪的现象,在每台设备接通电源,播放音频,没有声音, 然后,经过一段时间(小时未固定),喇叭将响起,示波器音频信号未听到扬声器声音相位,同时也有时钟信号,这可能是错误的

谢谢你

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,张

    您能否分享有关您所面临问题的更多详细信息?
    也许您所遵循的步骤列表和结构图会有所帮助。

    此致,
    伊万·萨拉扎尔
    应用工程师

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    萨拉萨尔,您好,感谢您的回复。

    第一种现象:

    重新启动或重置设备后,您需要等待一段时间才能正常播放音频。 (在等待期间也有声音输出,但白色噪音微弱,数字输入 I2S 时钟和信号正常)

    第二种现象:

    VBOOST 输出异常。 播放音频时,它仅输出8V,并停止输出约200毫秒。 当我们修改 APT 寄存器值时,第一个现象不会改变。

    此致。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,张

    在第一种情况下,是否有任何 I2C 命令发送到设备? 基本上,我想知道设备在发出白噪音时是否已正确初始化。 我想知道该设备如何能够从白噪声变成正常。

    关于第二个案例,可能是增压过载。 您能否分享一个示意图,显示以下引脚的连接方式? VBAT,VREG,PVDD,VBOOST,OUT +, 输出-

    此致,
    伊万·萨拉扎尔
    应用工程师

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    萨拉萨尔,您好,感谢您的回复。

    n 从第一种现象看,已确认芯片的初始 IIC 通信没有问题。 配置已成功。 我已经阅读了 I2C 工具寄存器的价值,没有问题。

    对于第二种现象,示意图如下所示,请为我检查:

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好,Salazar,谢谢你

    让我补充一个关于第一种现象的说明:

    设备再次通电后,音频数据将播放一段时间(未固定),并且扬声器只有微弱的白色噪音。 该数据由 I2S BITCLock 和数据线上的示波器测量,当扬声器发出正常声音时,波形与扬声器保持一致。

    使用 i2CTools 检查寄存器0x1 0x2 0x3 0x14。 这些寄存器的配置和播放音频数据期间的更改在扬声器正常和异常时在寄存器的值和状态方面是一致的。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    还请共享用于初始化的 I2C 命令。 请注意,I2C 配置过程中必须遵循一个序列,数据表对此提供了一些注释。 您还可以参考 EVM GUI 中使用的顺序。

    从示意图中:

    • MCLK 似乎不是来自与其余 I2S 信号相同的信号源
      • MCLK 频率是多少?
      • 什么是 I2S_TXC 频率?
      • 什么是 I2S_FS 频率?
      • 根据以上情况,在设备上使用 BCLK 进行内部时钟设置可能更好
    • 当您说 VBOOST 停止时,您的意思是电压是否与 VBAT 达到相同水平? 还是转到 GND?
    • 请尝试从输出中删除 C73/C74并测试回放效果吗?
    • 如果您未连接任何负载(扬声器打开)进行测试,增压是否仍在停止?

    此致,
    伊万·萨拉扎尔
    应用工程师

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    设备寄存器的 IIC 初始化过程如下所示。 请帮助查看是否有问题。 该代码是 TI TAS2552驱动程序附带的内核

    /*
     * tas2552.c - ALSA SoC Texas Instruments TAS2552 Mono Audio Amplifier
     *
     * Copyright (C) 2014 Texas Instruments Incorporated -  http://www.ti.com
     *
     * Author: Dan Murphy <dmurphy@ti.com>
     *
     * This program is free software; you can redistribute it and/or
     * modify it under the terms of the GNU General Public License
     * version 2 as published by the Free Software Foundation.
     *
     * This program is distributed in the hope that it will be useful, but
     * WITHOUT ANY WARRANTY; without even the implied warranty of
     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     * General Public License for more details.
     */
    
    #include <linux/module.h>
    #include <linux/errno.h>
    #include <linux/device.h>
    #include <linux/i2c.h>
    #include <linux/gpio.h>
    #include <linux/of_gpio.h>
    #include <linux/pm_runtime.h>
    #include <linux/regmap.h>
    #include <linux/slab.h>
    
    #include <linux/gpio/consumer.h>
    #include <linux/regulator/consumer.h>
    
    #include <sound/pcm.h>
    #include <sound/pcm_params.h>
    #include <sound/soc.h>
    #include <sound/soc-dapm.h>
    #include <sound/tlv.h>
    #include <sound/tas2552-plat.h>
    #include <dt-bindings/sound/tas2552.h>
    
    #include "tas2552.h"
    
    static const struct reg_default tas2552_reg_defs[] = {
    	{TAS2552_CFG_1, 0x22},
    	{TAS2552_CFG_3, 0x80},
    	{TAS2552_DOUT, 0x00},
    	{TAS2552_OUTPUT_DATA, 0xc0},
    	{TAS2552_PDM_CFG, 0x01},
    	{TAS2552_PGA_GAIN, 0x00},
    	{TAS2552_BOOST_APT_CTRL, 0x0f},
    	{TAS2552_RESERVED_0D, 0xbe},
    	{TAS2552_LIMIT_RATE_HYS, 0x08},
    	{TAS2552_CFG_2, 0xef},
    	{TAS2552_SER_CTRL_1, 0x00},
    	{TAS2552_SER_CTRL_2, 0x00},
    	{TAS2552_PLL_CTRL_1, 0x10},
    	{TAS2552_PLL_CTRL_2, 0x00},
    	{TAS2552_PLL_CTRL_3, 0x00}, 
    	{TAS2552_BTIP, 0x8f},
    	{TAS2552_BTS_CTRL, 0x80},
    	{TAS2552_LIMIT_RELEASE, 0x04},
    	{TAS2552_LIMIT_INT_COUNT, 0x00},
    	{TAS2552_EDGE_RATE_CTRL, 0x40},
    	{TAS2552_VBAT_DATA, 0x00},
    };
    
    #define TAS2552_NUM_SUPPLIES	3
    static const char *tas2552_supply_names[TAS2552_NUM_SUPPLIES] = {
    	"vbat",		/* vbat voltage */
    	"iovdd",	/* I/O Voltage */
    	"avdd",		/* Analog DAC Voltage */
    };
    
    struct tas2552_data {
    	struct snd_soc_codec *codec;
    	struct regmap *regmap;
    	struct i2c_client *tas2552_client;
    	struct regulator_bulk_data supplies[TAS2552_NUM_SUPPLIES];
    	struct gpio_desc *enable_gpio;
    	unsigned char regs[TAS2552_VBAT_DATA];
    	unsigned int pll_clkin;
    	int pll_clk_id;
    	unsigned int pdm_clk;
    	int pdm_clk_id;
    
    	unsigned int dai_fmt;
    	unsigned int tdm_delay;
    };
    
    static int tas2552_post_event(struct snd_soc_dapm_widget *w,
    			      struct snd_kcontrol *kcontrol, int event)
    {
    	struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
    
    	switch (event) {
    	case SND_SOC_DAPM_POST_PMU:
    		snd_soc_write(codec, TAS2552_RESERVED_0D, 0xc0);
    		snd_soc_update_bits(codec, TAS2552_LIMIT_RATE_HYS, (1 << 5),
    				    (1 << 5));
    		snd_soc_update_bits(codec, TAS2552_CFG_2, 1, 0);
    		snd_soc_update_bits(codec, TAS2552_CFG_1, TAS2552_SWS, 0);
    		break;
    	case SND_SOC_DAPM_POST_PMD:
    		snd_soc_update_bits(codec, TAS2552_CFG_1, TAS2552_SWS,
    				    TAS2552_SWS);
    		snd_soc_update_bits(codec, TAS2552_CFG_2, 1, 1);
    		snd_soc_update_bits(codec, TAS2552_LIMIT_RATE_HYS, (1 << 5), 0);
    		snd_soc_write(codec, TAS2552_RESERVED_0D, 0xbe);
    		break;
    	}
    	return 0;
    }
    
    /* Input mux controls */
    static const char * const tas2552_input_texts[] = {
    	"Digital", "Analog" };
    static SOC_ENUM_SINGLE_DECL(tas2552_input_mux_enum, TAS2552_CFG_3, 7,
    			    tas2552_input_texts);
    
    static const struct snd_kcontrol_new tas2552_input_mux_control =
    	SOC_DAPM_ENUM("Route", tas2552_input_mux_enum);
    
    static const struct snd_soc_dapm_widget tas2552_dapm_widgets[] =
    {
    	SND_SOC_DAPM_INPUT("IN"),
    
    	/* MUX Controls */
    	SND_SOC_DAPM_MUX("Input selection", SND_SOC_NOPM, 0, 0,
    			 &tas2552_input_mux_control),
    
    	SND_SOC_DAPM_AIF_IN("DAC IN", "DAC Playback", 0, SND_SOC_NOPM, 0, 0),
    	SND_SOC_DAPM_DAC("DAC", NULL, SND_SOC_NOPM, 0, 0),
    	SND_SOC_DAPM_OUT_DRV("ClassD", TAS2552_CFG_2, 7, 0, NULL, 0),
    	SND_SOC_DAPM_SUPPLY("PLL", TAS2552_CFG_2, 3, 0, NULL, 0),
    	SND_SOC_DAPM_POST("Post Event", tas2552_post_event),
    
    	SND_SOC_DAPM_OUTPUT("OUT")
    };
    
    static const struct snd_soc_dapm_route tas2552_audio_map[] = {
    	{"DAC", NULL, "DAC IN"},
    	{"Input selection", "Digital", "DAC"},
    	{"Input selection", "Analog", "IN"},
    	{"ClassD", NULL, "Input selection"},
    	{"OUT", NULL, "ClassD"},
    	{"ClassD", NULL, "PLL"},
    };
    
    #ifdef CONFIG_PM
    static void tas2552_sw_shutdown(struct tas2552_data *tas2552, int sw_shutdown)
    {
    	u8 cfg1_reg = 0;
    
    	if (!tas2552->codec)
    		return;
    
    	if (sw_shutdown)
    		cfg1_reg = TAS2552_SWS;
    
    	snd_soc_update_bits(tas2552->codec, TAS2552_CFG_1, TAS2552_SWS,
    			    cfg1_reg);
    }
    #endif
    
    static int tas2552_setup_pll(struct snd_soc_codec *codec,
    			     struct snd_pcm_hw_params *params)
    {
    	struct tas2552_data *tas2552 = dev_get_drvdata(codec->dev);
    	bool bypass_pll = false;
    	unsigned int pll_clk = params_rate(params) * 512;
    	unsigned int pll_clkin = tas2552->pll_clkin;
    	u8 pll_enable;
    
    	if (!pll_clkin) {
    		if (tas2552->pll_clk_id != TAS2552_PLL_CLKIN_BCLK)
    			return -EINVAL;
    
    		pll_clkin = snd_soc_params_to_bclk(params);
    		pll_clkin += tas2552->tdm_delay;
    	}
    
    	pll_enable = snd_soc_read(codec, TAS2552_CFG_2) & TAS2552_PLL_ENABLE;
    	snd_soc_update_bits(codec, TAS2552_CFG_2, TAS2552_PLL_ENABLE, 0);
    
    	if (pll_clkin == pll_clk)
    		bypass_pll = true;
    
    	if (bypass_pll) {
    		/* By pass the PLL configuration */
    		snd_soc_update_bits(codec, TAS2552_PLL_CTRL_2,
    				    TAS2552_PLL_BYPASS, TAS2552_PLL_BYPASS);
    	} else {
    		/* Fill in the PLL control registers for J & D
    		 * pll_clk = (.5 * pll_clkin * J.D) / 2^p
    		 * Need to fill in J and D here based on incoming freq
    		 */
    		unsigned int d, q, t;
    		u8 j;
    		u8 pll_sel = (tas2552->pll_clk_id << 3) & TAS2552_PLL_SRC_MASK;
    		u8 p = snd_soc_read(codec, TAS2552_PLL_CTRL_1);
    
    		p = (p >> 7);
    
    recalc:
    		t = (pll_clk * 2) << p;
    		j = t / pll_clkin;
    		d = t % pll_clkin;
    		t = pll_clkin / 10000;
    		q = d / (t + 1);
    		d = q + ((9999 - pll_clkin % 10000) * (d / t - q)) / 10000;
    
    		if (d && (pll_clkin < 512000 || pll_clkin > 9200000)) {
    			if (tas2552->pll_clk_id == TAS2552_PLL_CLKIN_BCLK) {
    				pll_clkin = 1800000;
    				pll_sel = (TAS2552_PLL_CLKIN_1_8_FIXED << 3) &
    							TAS2552_PLL_SRC_MASK;
    			} else {
    				pll_clkin = snd_soc_params_to_bclk(params);
    				pll_clkin += tas2552->tdm_delay;
    				pll_sel = (TAS2552_PLL_CLKIN_BCLK << 3) &
    							TAS2552_PLL_SRC_MASK;
    			}
    			goto recalc;
    		}
    
    		snd_soc_update_bits(codec, TAS2552_CFG_1, TAS2552_PLL_SRC_MASK,
    				    pll_sel);
    		
    		//zhn
    		// snd_soc_update_bits(codec, TAS2552_CFG_1, TAS2552_PLL_SRC_BCLK,
    		// 		    pll_sel);
    
    		snd_soc_update_bits(codec, TAS2552_PLL_CTRL_1,
    				    TAS2552_PLL_J_MASK, j);
    		/* Will clear the PLL_BYPASS bit */
    		snd_soc_write(codec, TAS2552_PLL_CTRL_2,
    			      TAS2552_PLL_D_UPPER(d));
    		snd_soc_write(codec, TAS2552_PLL_CTRL_3,
    			      TAS2552_PLL_D_LOWER(d));
    	}
    
    	/* Restore PLL status */
    	snd_soc_update_bits(codec, TAS2552_CFG_2, TAS2552_PLL_ENABLE,
    			    pll_enable);
    
    	return 0;
    }
    
    static int tas2552_hw_params(struct snd_pcm_substream *substream,
    			     struct snd_pcm_hw_params *params,
    			     struct snd_soc_dai *dai)
    {
    	struct snd_soc_codec *codec = dai->codec;
    	struct tas2552_data *tas2552 = dev_get_drvdata(codec->dev);
    	int cpf;
    	u8 ser_ctrl1_reg, wclk_rate;
    
    	switch (params_width(params)) {
    	case 16:
    		ser_ctrl1_reg = TAS2552_WORDLENGTH_16BIT;
    		cpf = 32 + tas2552->tdm_delay;
    		break;
    	case 20:
    		ser_ctrl1_reg = TAS2552_WORDLENGTH_20BIT;
    		cpf = 64 + tas2552->tdm_delay;
    		break;
    	case 24:
    		ser_ctrl1_reg = TAS2552_WORDLENGTH_24BIT;
    		cpf = 64 + tas2552->tdm_delay;
    		break;
    	case 32:
    		ser_ctrl1_reg = TAS2552_WORDLENGTH_32BIT;
    		cpf = 64 + tas2552->tdm_delay;
    		break;
    	default:
    		dev_err(codec->dev, "Not supported sample size: %d\n",
    			params_width(params));
    		return -EINVAL;
    	}
    
    	if (cpf <= 32)
    		ser_ctrl1_reg |= TAS2552_CLKSPERFRAME_32;
    	else if (cpf <= 64)
    		ser_ctrl1_reg |= TAS2552_CLKSPERFRAME_64;
    	else if (cpf <= 128)
    		ser_ctrl1_reg |= TAS2552_CLKSPERFRAME_128;
    	else
    		ser_ctrl1_reg |= TAS2552_CLKSPERFRAME_256;
    
    	snd_soc_update_bits(codec, TAS2552_SER_CTRL_1,
    			    TAS2552_WORDLENGTH_MASK | TAS2552_CLKSPERFRAME_MASK,
    			    ser_ctrl1_reg);
    
    	switch (params_rate(params)) {
    	case 8000:
    		wclk_rate = TAS2552_WCLK_FREQ_8KHZ;
    		break;
    	case 11025:
    	case 12000:
    		wclk_rate = TAS2552_WCLK_FREQ_11_12KHZ;
    		break;
    	case 16000:
    		wclk_rate = TAS2552_WCLK_FREQ_16KHZ;
    		break;
    	case 22050:
    	case 24000:
    		wclk_rate = TAS2552_WCLK_FREQ_22_24KHZ;
    		break;
    	case 32000:
    		wclk_rate = TAS2552_WCLK_FREQ_32KHZ;
    		break;
    	case 44100:
    	case 48000:
    		wclk_rate = TAS2552_WCLK_FREQ_44_48KHZ;
    		break;
    	case 88200:
    	case 96000:
    		wclk_rate = TAS2552_WCLK_FREQ_88_96KHZ;
    		break;
    	case 176400:
    	case 192000:
    		wclk_rate = TAS2552_WCLK_FREQ_176_192KHZ;
    		break;
    	default:
    		dev_err(codec->dev, "Not supported sample rate: %d\n",
    			params_rate(params));
    		return -EINVAL;
    	}
    
    	snd_soc_update_bits(codec, TAS2552_CFG_3, TAS2552_WCLK_FREQ_MASK,
    			    wclk_rate);
    
    	return tas2552_setup_pll(codec, params);
    }
    
    #define TAS2552_DAI_FMT_MASK	(TAS2552_BCLKDIR | \
    				 TAS2552_WCLKDIR | \
    				 TAS2552_DATAFORMAT_MASK)
    static int tas2552_prepare(struct snd_pcm_substream *substream,
    			   struct snd_soc_dai *dai)
    {
    	struct snd_soc_codec *codec = dai->codec;
    	struct tas2552_data *tas2552 = snd_soc_codec_get_drvdata(codec);
    	int delay = 0;
    
    	/* TDM slot selection only valid in DSP_A/_B mode */
    	if (tas2552->dai_fmt == SND_SOC_DAIFMT_DSP_A)
    		delay += (tas2552->tdm_delay + 1);
    	else if (tas2552->dai_fmt == SND_SOC_DAIFMT_DSP_B)
    		delay += tas2552->tdm_delay;
    
    	/* Configure data delay */
    	snd_soc_write(codec, TAS2552_SER_CTRL_2, delay);
    
    	return 0;
    }
    
    static int tas2552_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt)
    {
    	struct snd_soc_codec *codec = dai->codec;
    	struct tas2552_data *tas2552 = dev_get_drvdata(codec->dev);
    	u8 serial_format;
    
    	switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
    	case SND_SOC_DAIFMT_CBS_CFS:
    		serial_format = 0x00;
    		break;
    	case SND_SOC_DAIFMT_CBS_CFM:
    		serial_format = TAS2552_WCLKDIR;
    		break;
    	case SND_SOC_DAIFMT_CBM_CFS:
    		serial_format = TAS2552_BCLKDIR;
    		break;
    	case SND_SOC_DAIFMT_CBM_CFM:
    		serial_format = (TAS2552_BCLKDIR | TAS2552_WCLKDIR);
    		break;
    	default:
    		dev_vdbg(codec->dev, "DAI Format master is not found\n");
    		return -EINVAL;
    	}
    
    	switch (fmt & (SND_SOC_DAIFMT_FORMAT_MASK |
    		       SND_SOC_DAIFMT_INV_MASK)) {
    	case (SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF):
    		break;
    	case (SND_SOC_DAIFMT_DSP_A | SND_SOC_DAIFMT_IB_NF):
    	case (SND_SOC_DAIFMT_DSP_B | SND_SOC_DAIFMT_IB_NF):
    		serial_format |= TAS2552_DATAFORMAT_DSP;
    		break;
    	case (SND_SOC_DAIFMT_RIGHT_J | SND_SOC_DAIFMT_NB_NF):
    		serial_format |= TAS2552_DATAFORMAT_RIGHT_J;
    		break;
    	case (SND_SOC_DAIFMT_LEFT_J | SND_SOC_DAIFMT_NB_NF):
    		serial_format |= TAS2552_DATAFORMAT_LEFT_J;
    		break;
    	default:
    		dev_vdbg(codec->dev, "DAI Format is not found\n");
    		return -EINVAL;
    	}
    	tas2552->dai_fmt = fmt & SND_SOC_DAIFMT_FORMAT_MASK;
    
    	snd_soc_update_bits(codec, TAS2552_SER_CTRL_1, TAS2552_DAI_FMT_MASK,
    			    serial_format);
    	return 0;
    }
    
    static int tas2552_set_dai_sysclk(struct snd_soc_dai *dai, int clk_id,
    				  unsigned int freq, int dir)
    {
    	struct snd_soc_codec *codec = dai->codec;
    	struct tas2552_data *tas2552 = dev_get_drvdata(codec->dev);
    	u8 reg, mask, val;
    
    	switch (clk_id) {
    	case TAS2552_PLL_CLKIN_MCLK:
    	case TAS2552_PLL_CLKIN_IVCLKIN:
    		if (freq < 512000 || freq > 24576000) {
    			/* out of range PLL_CLKIN, fall back to use BCLK */
    			dev_warn(codec->dev, "Out of range PLL_CLKIN: %u\n",
    				 freq);
    			clk_id = TAS2552_PLL_CLKIN_BCLK;
    			freq = 0;
    		}
    		/* fall through */
    	case TAS2552_PLL_CLKIN_BCLK:
    	case TAS2552_PLL_CLKIN_1_8_FIXED:
    		mask = TAS2552_PLL_SRC_MASK;
    		val = (clk_id << 3) & mask; /* bit 4:5 in the register */
    		reg = TAS2552_CFG_1;
    		tas2552->pll_clk_id = clk_id;
    		tas2552->pll_clkin = freq;
    		break;
    	case TAS2552_PDM_CLK_PLL:
    	case TAS2552_PDM_CLK_IVCLKIN:
    	case TAS2552_PDM_CLK_BCLK:
    	case TAS2552_PDM_CLK_MCLK:
    		mask = TAS2552_PDM_CLK_SEL_MASK;
    		val = (clk_id >> 1) & mask; /* bit 0:1 in the register */
    		reg = TAS2552_PDM_CFG;
    		tas2552->pdm_clk_id = clk_id;
    		tas2552->pdm_clk = freq;
    		break;
    	default:
    		dev_err(codec->dev, "Invalid clk id: %d\n", clk_id);
    		return -EINVAL;
    	}
    
    	snd_soc_update_bits(codec, reg, mask, val);
    
    	return 0;
    }
    
    static int tas2552_set_dai_tdm_slot(struct snd_soc_dai *dai,
    				    unsigned int tx_mask, unsigned int rx_mask,
    				    int slots, int slot_width)
    {
    	struct snd_soc_codec *codec = dai->codec;
    	struct tas2552_data *tas2552 = snd_soc_codec_get_drvdata(codec);
    	unsigned int lsb;
    
    	if (unlikely(!tx_mask)) {
    		dev_err(codec->dev, "tx masks need to be non 0\n");
    		return -EINVAL;
    	}
    
    	/* TDM based on DSP mode requires slots to be adjacent */
    	lsb = __ffs(tx_mask);
    	if ((lsb + 1) != __fls(tx_mask)) {
    		dev_err(codec->dev, "Invalid mask, slots must be adjacent\n");
    		return -EINVAL;
    	}
    
    	tas2552->tdm_delay = lsb * slot_width;
    
    	/* DOUT in high-impedance on inactive bit clocks */
    	snd_soc_update_bits(codec, TAS2552_DOUT,
    			    TAS2552_SDOUT_TRISTATE, TAS2552_SDOUT_TRISTATE);
    
    	return 0;
    }
    
    static int tas2552_mute(struct snd_soc_dai *dai, int mute)
    {
    	u8 cfg1_reg = 0;
    	struct snd_soc_codec *codec = dai->codec;
    
    	if (mute)
    		cfg1_reg |= TAS2552_MUTE;
    
    	snd_soc_update_bits(codec, TAS2552_CFG_1, TAS2552_MUTE, cfg1_reg);
    
    	return 0;
    }
    
    #ifdef CONFIG_PM
    static int tas2552_runtime_suspend(struct device *dev)
    {
    	struct tas2552_data *tas2552 = dev_get_drvdata(dev);
    
    	tas2552_sw_shutdown(tas2552, 1);
    
    	regcache_cache_only(tas2552->regmap, true);
    	regcache_mark_dirty(tas2552->regmap);
    
    	gpiod_set_value(tas2552->enable_gpio, 0);
    
    	return 0;
    }
    
    static int tas2552_runtime_resume(struct device *dev)
    {
    	struct tas2552_data *tas2552 = dev_get_drvdata(dev);
    
    	gpiod_set_value(tas2552->enable_gpio, 1);
    
    	tas2552_sw_shutdown(tas2552, 0);
    
    	regcache_cache_only(tas2552->regmap, false);
    	regcache_sync(tas2552->regmap);
    
    	return 0;
    }
    #endif
    
    static const struct dev_pm_ops tas2552_pm = {
    	SET_RUNTIME_PM_OPS(tas2552_runtime_suspend, tas2552_runtime_resume,
    			   NULL)
    };
    
    static const struct snd_soc_dai_ops tas2552_speaker_dai_ops = {
    	.hw_params	= tas2552_hw_params,
    	.prepare	= tas2552_prepare,
    	.set_sysclk	= tas2552_set_dai_sysclk,
    	.set_fmt	= tas2552_set_dai_fmt,
    	.set_tdm_slot	= tas2552_set_dai_tdm_slot,
    	.digital_mute = tas2552_mute,
    };
    
    /* Formats supported by TAS2552 driver. */
    #define TAS2552_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE |\
    			 SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE)
    
    /* TAS2552 dai structure. */
    static struct snd_soc_dai_driver tas2552_dai[] = {
    	{
    		.name = "tas2552-amplifier",
    		.playback = {
    			.stream_name = "Playback",
    			.channels_min = 2,
    			.channels_max = 2,
    			.rates = SNDRV_PCM_RATE_8000_192000,
    			.formats = TAS2552_FORMATS,
    		},
    		.ops = &tas2552_speaker_dai_ops,
    	},
    };
    
    /*
     * DAC digital volumes. From -7 to 24 dB in 1 dB steps
     */
    static DECLARE_TLV_DB_SCALE(dac_tlv, -700, 100, 0);
    
    static const char * const tas2552_din_source_select[] = {
    	"Muted",
    	"Left",
    	"Right",
    	"Left + Right average",
    };
    static SOC_ENUM_SINGLE_DECL(tas2552_din_source_enum,
    			    TAS2552_CFG_3, 3,
    			    tas2552_din_source_select);
    
    static const struct snd_kcontrol_new tas2552_snd_controls[] = {
    	SOC_SINGLE_TLV("Speaker Driver Playback Volume",
    			 TAS2552_PGA_GAIN, 0, 0x1f, 0, dac_tlv),
    	SOC_ENUM("DIN source", tas2552_din_source_enum),
    };
    
    static int tas2552_codec_probe(struct snd_soc_codec *codec)
    {
    	struct tas2552_data *tas2552 = snd_soc_codec_get_drvdata(codec);
    	int ret;
    
    	tas2552->codec = codec;
    
    	ret = regulator_bulk_enable(ARRAY_SIZE(tas2552->supplies),
    				    tas2552->supplies);
    
    	if (ret != 0) {
    		dev_err(codec->dev, "Failed to enable supplies: %d\n",
    			ret);
    		return ret;
    	}
    
    	gpiod_set_value(tas2552->enable_gpio, 1);
    
    	ret = pm_runtime_get_sync(codec->dev);
    	if (ret < 0) {
    		dev_err(codec->dev, "Enabling device failed: %d\n",
    			ret);
    		printk("zhn tas2552_codec_probe fail!\r\n");
    		goto probe_fail;
    	}
    
    	snd_soc_update_bits(codec, TAS2552_CFG_1, TAS2552_MUTE, TAS2552_MUTE);
    	snd_soc_write(codec, TAS2552_CFG_3, TAS2552_I2S_OUT_SEL |
    					    TAS2552_DIN_SRC_SEL_AVG_L_R);
    	snd_soc_write(codec, TAS2552_OUTPUT_DATA,
    		      TAS2552_PDM_DATA_SEL_V_I |
    		      TAS2552_R_DATA_OUT(TAS2552_DATA_OUT_V_DATA));
    	snd_soc_write(codec, TAS2552_BOOST_APT_CTRL, TAS2552_APT_DELAY_200 |
    						     TAS2552_APT_THRESH_20_17);
    
    	snd_soc_write(codec, TAS2552_CFG_2, TAS2552_BOOST_EN | TAS2552_APT_EN |
    					    TAS2552_LIM_EN);
    
    	return 0;
    
    probe_fail:
    	gpiod_set_value(tas2552->enable_gpio, 0);
    	
    	regulator_bulk_disable(ARRAY_SIZE(tas2552->supplies),
    					tas2552->supplies);
    	return ret;
    }
    
    static int tas2552_codec_remove(struct snd_soc_codec *codec)
    {
    	struct tas2552_data *tas2552 = snd_soc_codec_get_drvdata(codec);
    
    	pm_runtime_put(codec->dev);
    
    	gpiod_set_value(tas2552->enable_gpio, 0);
    
    	return 0;
    };
    
    #ifdef CONFIG_PM
    static int tas2552_suspend(struct snd_soc_codec *codec)
    {
    	struct tas2552_data *tas2552 = snd_soc_codec_get_drvdata(codec);
    	int ret;
    
    	ret = regulator_bulk_disable(ARRAY_SIZE(tas2552->supplies),
    					tas2552->supplies);
    
    	if (ret != 0)
    		dev_err(codec->dev, "Failed to disable supplies: %d\n",
    			ret);
    	return ret;
    }
    
    static int tas2552_resume(struct snd_soc_codec *codec)
    {
    	struct tas2552_data *tas2552 = snd_soc_codec_get_drvdata(codec);
    	int ret;
    
    	ret = regulator_bulk_enable(ARRAY_SIZE(tas2552->supplies),
    				    tas2552->supplies);
    
    	if (ret != 0) {
    		dev_err(codec->dev, "Failed to enable supplies: %d\n",
    			ret);
    	}
    
    	return ret;
    }
    #else
    #define tas2552_suspend NULL
    #define tas2552_resume NULL
    #endif
    
    static const struct snd_soc_codec_driver soc_codec_dev_tas2552 = {
    	.probe = tas2552_codec_probe,
    	.remove = tas2552_codec_remove,
    	.suspend =	tas2552_suspend,
    	.resume = tas2552_resume,
    	.ignore_pmdown_time = true,
    
    	.component_driver = {
    		.controls		= tas2552_snd_controls,
    		.num_controls		= ARRAY_SIZE(tas2552_snd_controls),
    		.dapm_widgets		= tas2552_dapm_widgets,
    		.num_dapm_widgets	= ARRAY_SIZE(tas2552_dapm_widgets),
    		.dapm_routes		= tas2552_audio_map,
    		.num_dapm_routes	= ARRAY_SIZE(tas2552_audio_map),
    	},
    };
    
    static const struct regmap_config tas2552_regmap_config = {
    	.reg_bits = 8,
    	.val_bits = 8,
    
    	.max_register = TAS2552_MAX_REG,
    	.reg_defaults = tas2552_reg_defs,
    	.num_reg_defaults = ARRAY_SIZE(tas2552_reg_defs),
    	.cache_type = REGCACHE_RBTREE,
    };
    
    static int tas2552_probe(struct i2c_client *client,
    			   const struct i2c_device_id *id)
    {
    	struct device *dev;
    	struct tas2552_data *data;
    	int ret;
    	int i;
     
    	dev = &client->dev;
    	data = devm_kzalloc(&client->dev, sizeof(*data), GFP_KERNEL);
    	if (data == NULL)
    		return -ENOMEM;
    
    	data->enable_gpio = devm_gpiod_get_optional(dev, "enable",
    						    GPIOD_OUT_LOW);
    	if (IS_ERR(data->enable_gpio))
    		return PTR_ERR(data->enable_gpio);
    
    	data->tas2552_client = client;
    	data->regmap = devm_regmap_init_i2c(client, &tas2552_regmap_config);
    	if (IS_ERR(data->regmap)) {
    		ret = PTR_ERR(data->regmap);
    		dev_err(&client->dev, "Failed to allocate register map: %d\n",
    			ret);
    		return ret;
    	}
    
    	for (i = 0; i < ARRAY_SIZE(data->supplies); i++)
    		data->supplies[i].supply = tas2552_supply_names[i];
    
    	ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(data->supplies),
    				      data->supplies);
    	if (ret != 0) {
    		dev_err(dev, "Failed to request supplies: %d\n", ret);
    		return ret;
    	}
    
    	pm_runtime_set_active(&client->dev);
    	pm_runtime_set_autosuspend_delay(&client->dev, 1000);
    	pm_runtime_use_autosuspend(&client->dev);
    	pm_runtime_enable(&client->dev);
    	pm_runtime_mark_last_busy(&client->dev);
    	pm_runtime_put_sync_autosuspend(&client->dev);
    
    	dev_set_drvdata(&client->dev, data);
    
    	ret = snd_soc_register_codec(&client->dev,
    				      &soc_codec_dev_tas2552,
    				      tas2552_dai, ARRAY_SIZE(tas2552_dai));
    	if (ret < 0)
    		dev_err(&client->dev, "Failed to register codec: %d\n", ret);
    
    	return ret;
    }
    
    static int tas2552_i2c_remove(struct i2c_client *client)
    {
    	snd_soc_unregister_codec(&client->dev);
    	pm_runtime_disable(&client->dev);
    	return 0;
    }
    
    static const struct i2c_device_id tas2552_id[] = {
    	{ "tas2552", 0 },
    	{ }
    };
    MODULE_DEVICE_TABLE(i2c, tas2552_id);
    
    #if IS_ENABLED(CONFIG_OF)
    static const struct of_device_id tas2552_of_match[] = {
    	{ .compatible = "ti,tas2552", },
    	{},
    };
    MODULE_DEVICE_TABLE(of, tas2552_of_match);
    #endif
    
    static struct i2c_driver tas2552_i2c_driver = {
    	.driver = {
    		.name = "tas2552",
    		.of_match_table = of_match_ptr(tas2552_of_match),
    		.pm = &tas2552_pm,
    	},
    	.probe = tas2552_probe,
    	.remove = tas2552_i2c_remove,
    	.id_table = tas2552_id,
    };
    
    module_i2c_driver(tas2552_i2c_driver);
    
    MODULE_AUTHOR("Dan Muprhy <dmurphy@ti.com>");
    MODULE_DESCRIPTION("TAS2552 Audio amplifier driver");
    MODULE_LICENSE("GPL");
    

    计算机驱动程序代码如下所示:(设备树声音节点驱动程序)

    /*
     * Copyright 2012 Freescale Semiconductor, Inc.
     * Copyright 2012 Linaro Ltd.
     *
     * The code contained herein is licensed under the GNU General Public
     * License. You may obtain a copy of the GNU General Public License
     * Version 2 or later at the following locations:
     *
     * www.opensource.org/.../gpl-license.html
     * www.gnu.org/.../gpl.html
     */
    
    #include <linux/module.h>
    #include <linux/of.h>
    #include <linux/of_platform.h>
    #include <linux/i2c.h>
    #include <linux/clk.h>
    #include <sound/soc.h>
    #include <linux/delay.h>
    //#include "../codecs/tas2552.h"
    #include "/home/zhn/zhnwork/WorkBsp/V2X-OBU-6Q-LTE/V2X-OBU-6Q-LTE-Kernel-IMULED-ALSA/sound/soc/codecs/tas2552.h"
    #include "/home/zhn/zhnwork/WorkBsp/V2X-OBU-6Q-LTE/V2X-OBU-6Q-LTE-Kernel-IMULED-ALSA/sound/soc/fsl/imx-audmux.h"
    #include <dt-bindings/sound/tas2552.h>
    
    #define DAI_NAME_SIZE	32
    
    struct imx_tas2552_data {
    	struct snd_soc_dai_link dai;
    	struct snd_soc_card card;
    	char codec_dai_name[DAI_NAME_SIZE];
    	char platform_name[DAI_NAME_SIZE];
    	struct clk *codec_clk;
    	unsigned int clk_frequency;
    };
    
    
    static int imx_audmux_config(int slave, int master)
    {
    	unsigned int ptcr, pdcr;
    	slave = slave - 1;
    	master = master - 1;
    
    	ptcr = IMX_AUDMUX_V2_PTCR_SYN |
    		IMX_AUDMUX_V2_PTCR_TFSDIR |
    		IMX_AUDMUX_V2_PTCR_TFSEL(slave) |
    		IMX_AUDMUX_V2_PTCR_TCLKDIR |
    		IMX_AUDMUX_V2_PTCR_TCSEL(slave);
    	pdcr = IMX_AUDMUX_V2_PDCR_RXDSEL(slave);
    	imx_audmux_v2_configure_port(master, ptcr, pdcr);
    
    	/*
    	 * According to RM, RCLKDIR and SYN should not be changed at same time.
    	 * So separate to two step for configuring this port.
    	 */
    	ptcr |= IMX_AUDMUX_V2_PTCR_RFSDIR |
    		IMX_AUDMUX_V2_PTCR_RFSEL(slave) |
    		IMX_AUDMUX_V2_PTCR_RCLKDIR |
    		IMX_AUDMUX_V2_PTCR_RCSEL(slave);
    	imx_audmux_v2_configure_port(master, ptcr, pdcr);
    
    	ptcr = IMX_AUDMUX_V2_PTCR_SYN;
    	pdcr = IMX_AUDMUX_V2_PDCR_RXDSEL(master);
    	imx_audmux_v2_configure_port(slave, ptcr, pdcr);
    
    	return 0;
    }
    
    
    static int imx_tas2552_dai_init(struct snd_soc_pcm_runtime *rtd)
    {
    	struct imx_tas2552_data *data = snd_soc_card_get_drvdata(rtd->card);
    	struct snd_soc_dai *codec_dai = rtd->codec_dai;
    	struct snd_soc_codec *codec = codec_dai->codec;
    
    	struct device *dev = rtd->card->dev;
    	int ret;
    
    
    
    	ret = snd_soc_dai_set_sysclk(rtd->codec_dai, TAS2552_PLL_CLKIN_MCLK,
    		data->clk_frequency, SND_SOC_CLOCK_OUT);
    	if (ret) {
    		dev_err(dev, "could not set codec driver clock params\n");
    		return ret;
    	}
    
    	return 0;
    }
    
    static const struct snd_soc_dapm_widget imx_tas2552_dapm_widgets[] = {
    	SND_SOC_DAPM_SPK("Ext Spk", NULL),
    };
    
    static int imx_tas2552_probe(struct platform_device *pdev)
    {
    	struct device_node *np = pdev->dev.of_node;
    	struct device_node *ssi_np, *codec_np;
    	struct platform_device *ssi_pdev;
    	struct i2c_client *codec_dev;
    	struct imx_tas2552_data *data = NULL;
    	int int_port, ext_port;
    	int ret;
    
    	ret = of_property_read_u32(np, "mux-int-port", &int_port);
    	if (ret) {
    		dev_err(&pdev->dev, "mux-int-port missing or invalid\n");
    		return ret;
    	}
    	ret = of_property_read_u32(np, "mux-ext-port", &ext_port);
    	if (ret) {
    		dev_err(&pdev->dev, "mux-ext-port missing or invalid\n");
    		return ret;
    	}
    
    	imx_audmux_config(int_port, ext_port);
    
    	ssi_np = of_parse_phandle(pdev->dev.of_node, "ssi-controller", 0);
    	codec_np = of_parse_phandle(pdev->dev.of_node, "audio-codec", 0);
    	if (!ssi_np || !codec_np) {
    		dev_err(&pdev->dev, "phandle missing or invalid\n");
    		ret = -EINVAL;
    		goto fail;
    	}
    
    	ssi_pdev = of_find_device_by_node(ssi_np);
    	if (!ssi_pdev) {
    		dev_err(&pdev->dev, "failed to find SSI platform device\n");
    		ret = -EPROBE_DEFER;
    		goto fail;
    	}
    	codec_dev = of_find_i2c_device_by_node(codec_np);
    	if (!codec_dev) {
    		dev_err(&pdev->dev, "failed to find codec platform device\n");
    		return -EPROBE_DEFER;
    	}
    
    	data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL);
    	if (!data) {
    		ret = -ENOMEM;
    		goto fail;
    	}
    
    	data->codec_clk = clk_get(&codec_dev->dev, NULL);
    	if (IS_ERR(data->codec_clk)) {
    		printk("Unable to get clock!\n");
    		ret = PTR_ERR(data->codec_clk);
    		goto fail;
    	}
    
    	data->clk_frequency = clk_get_rate(data->codec_clk);
    	data->dai.name = "HiFi";
    	data->dai.stream_name = "HiFi";
    	data->dai.codec_dai_name = "tas2552-amplifier";
    	data->dai.codec_of_node = codec_np;
    	data->dai.cpu_of_node = ssi_np;
    	data->dai.platform_of_node = ssi_np;
    	data->dai.init = &imx_tas2552_dai_init;
    	data->dai.dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF |  SND_SOC_DAIFMT_CBS_CFS;
    
    	data->card.dev = &pdev->dev;
    	ret = snd_soc_of_parse_card_name(&data->card, "model");
    	if (ret)
    		goto fail;
    	ret = snd_soc_of_parse_audio_routing(&data->card, "audio-routing");
    	if (ret)
    		goto fail;
    	data->card.num_links = 1;
    	data->card.owner = THIS_MODULE;
    	data->card.dai_link = &data->dai;
    	data->card.dapm_widgets = imx_tas2552_dapm_widgets;
    	data->card.num_dapm_widgets = ARRAY_SIZE(imx_tas2552_dapm_widgets);
    
    	platform_set_drvdata(pdev, &data->card);
    	snd_soc_card_set_drvdata(&data->card, data);
    	ret = devm_snd_soc_register_card(&pdev->dev, &data->card);
    	if (ret) {
    		dev_err(&pdev->dev, "snd_soc_register_card failed (%d)\n", ret);
    		goto fail;
    	}
    
    	of_node_put(ssi_np);
    	of_node_put(codec_np);
    
    	return 0;
    
    fail:
    	if (data && !IS_ERR(data->codec_clk))
    		clk_put(data->codec_clk);
    	of_node_put(ssi_np);
    	of_node_put(codec_np);
    
    	return ret;
    }
    
    static int imx_tas2552_remove(struct platform_device *pdev)
    {
    	struct snd_soc_card *card = platform_get_drvdata(pdev);
    	struct imx_tas2552_data *data = snd_soc_card_get_drvdata(card);
    
    	clk_put(data->codec_clk);
    
    	return 0;
    }
    
    static const struct of_device_id imx_tas2552_dt_ids[] = {
    	{ .compatible = "fsl,imx-audio-tas2552", },
    	{ /* sentinel */ }
    };
    MODULE_DEVICE_TABLE(of, imx_tas2552_dt_ids);
    
    static struct platform_driver imx_tas2552_driver = {
    	.driver = {
    		.name = "imx-tas2552",
    		.pm = &snd_soc_pm_ops,
    		.of_match_table = imx_tas2552_dt_ids,
    	},
    	.probe = imx_tas2552_probe,
    	.remove = imx_tas2552_remove,
    };
    module_platform_driver(imx_tas2552_driver);
    
    MODULE_AUTHOR("Shawn Guo <shawn.guo@linaro.org>");
    MODULE_DESCRIPTION("Freescale i.MX tas2552 ASoC machine driver");
    MODULE_LICENSE("GPL v2");
    MODULE_ALIAS("platform:imx-tas2552");

    加载驱动程序时,首先加载第一个驱动程序,然后依次加载第二个驱动程序以完成设备驱动程序的安装。请检查驱动程序加载是否有问题。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我们的硬件上安装了 MCLK,但 MCLK 没有输出,然后我们在播放音频时实际使用了 BCLK,我们尝试删除 C73/C74,但这也不起作用,下面有几个硬件图形,请帮助检查

    连接喇叭-语音回放异常的 VBOOST 波形

    消除负载语音回放异常的 VBOOST 波形

    语音播放异常-SPK 波形

    语音播放异常-SPK 波形频率

    语音回放正常-SPK 波形

    语音回放正常的 VBOOST 波形

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,张

    感谢您共享配置。 我将在下周初查看此内容并获得更多评论。
    我知道您正在使用 BCLK 而不是 MCLK 进行内部时钟设置,但是否仍可以共享时钟频率? 这有助于了解设备中的时钟设置是否正确。

    关于示波器捕获,似乎音频仍在播放,但升压正在降至 VBAT 级别,因此输出可能正在剪辑。 我是否理解正确?

    此致,
    伊万·萨拉扎尔
    应用工程师

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好,Salazar,谢谢你

    是的,正如您所理解的,

    下面是我们的 BCLK 和 WCLK 时钟,您可以查看

    BCLK:

    WCLK:

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,张

    感谢大家分享这些时钟,我将了解一下这一点,并向大家提出进一步的意见。

    同时,我还想仔细检查升压配置。 您提到更改 APT 寄存器没有更改行为,您是否更改了寄存器2上的 APT_EN 位? 还是其他一些注册?

    此致,
    伊万·萨拉扎尔
    应用工程师

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    以下是当设备扬声器可以播放音频且无法播放音频时(两个值是音频播放状态的变化),我为 TAS2552的所有寄存器读取的值。

    从寄存器读取的值中,可启用带和不带音频回放的复位器上的 APT_EN 位值。 APT 寄存器通过示波器修改值后,我们可以看到更改,但修改此寄存器的更改似乎与解决当前问题无关

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,张

    从您共享的寄存器列表中,我将重点介绍以下内容:

    • 寄存器1显示在第一种情况下启用静音和软件关机,在第二种情况下禁用。 应禁用这些功能以进行播放
    • 寄存器2显示 D 类和 PLL 已禁用

    初始化前的设备似乎是第一种情况,初始化后的设备似乎是第二种情况。 你可以确认吗? 我的理解是否正确第一个问题是音频播放效果良好的问题?

    此致,
    伊万·萨拉扎尔
    应用工程师

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好,Salazar,谢谢你

    与您可能想象的不一样,我上面共享的寄存器,具有两个值的寄存器是播放音频时的第一个值,是播放音频时的第二个值(aplay ***.wav)。 在音频播放结束时,无论扬声器是否发出声音,以及在音频播放期间寄存器的变化,它都将返回到以前的值。

    另一个:

    我们已经彼此沟通了一周,但问题尚未解决。 我们有急事。 我们能否有更有效的沟通方式?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    还有另一个问题,请帮助检查我在上面粘贴的“机器”和编解码器的驱动程序代码是否有任何问题

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Salazar,

    为了解决这个问题,我们不知道为什么我播放音频测试有问题,当使用 alsa 车库波段的音频测试音频时,我更改了另一个 wav 格式的音频播放是正常的,所以问题得到了解决, 您能帮我分析音频问题吗,该剧有一个 probleme2e.ti.com/.../Front_5F00_Left.wav

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我向您发送了一份私下分享联系信息的请求,我们可能会安排电话来讨论这一问题。

    我不清楚它是否仅适用于某些音频文件或某些格式。 我可以帮助解决您可能遇到的任何硬件问题,但驱动程序在一段时间内没有得到维护,因为 TAS2552不是最近发布的设备。

    此致,
    伊万·萨拉扎尔
    应用工程师