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.

[参考译文] TLV320AIC3254:从Linux驱动程序加载miniDSP

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

https://e2e.ti.com/support/audio-group/audio/f/audio-forum/618369/tlv320aic3254-loading-minidsp-from-linux-driver

部件号:TLV320AIC3254

团队,

我们的客户正在修改AIC3254 Linux驱动程序以支持加载DSP。 他们查看了生成的代码并将DSP加载到内存中。 未加载DSP时,音频工作正常,但加载DSP时,它们获得0dB级别的噪声。 在他们的设计中,他们在 驱动程序中使用24.576 时钟,并使用驱动程序设置音频速率和接口设置。 他们查看了寄存器,并按预期加载了所有内容,并且测试了开发套件上的简单Treble shelf应用程序。 他们想知道实际MCLK速率是否发生了变化,因为它与开发套件上的时钟不同。 所有设备都以48kHz运行。

对可能出现的问题有什么想法? 它们正在写入与DSP相关的所有寄存器,但路由和其他设置由驱动程序处理。

谢谢!

Antonio

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

    包括下面的一些其他客户详细信息。 如果您需要任何其他信息或注册捕获,请告诉我:

    我认为这是PurePath Studio产生的更大问题。  在输出中,我只得到了一个直射输出,而我得到了一个非常差的正弦波输出。  这是一个2k正弦波,通常非常干净。 不通过DSP运行时。  这绝对是DSP的最简单应用程序,但我看不到工作室中的任何区域可以编辑设备时钟频率,位宽等。  

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

    你好,Antonio,

    如果使用EVM时miniDSP代码按预期工作,我认为正如您所建议的那样,EVM和终端系统之间的时钟差异可能会导致此问题。

    能否验证PurePath Studio上的流程流是否配置为48kHz操作? 另一个要考虑的问题是,如果在终端系统中主时钟为24.576MHz,则EVM中的主时钟为11.2896MHz,因此应在终端系统时钟生成中进行适当调整。 要尝试的一件事是将终端系统中使用的时钟频率连接到EVM,并检查噪音是否可以重复出现。 此外,将设置从Linux驱动程序加载到EVM可能是一个很好的测试。

    PurePath Studio中未配置时钟,唯一可更改的参数聊天是使用的采样频率。 拥有客户使用的时钟频率 并为时钟配置注册设置将有助于检查问题的根本原因。

    此致,

     -Diego Mel é ndez López ñ a
      音频应用工程师

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

    迭戈,

    我是客户有问题。  我刚刚测试了数据接口,它是48kHz签名的16位小端数据,我可以使用ALSA配置强制使用此格式。  我真的不认为我可以在没有很好的工作的情况下获得Linux驱动程序来设置开发套件,因为我们使用的是小USB而不是完整套件,而且它的处理器有6MHz时钟,所以我不知道MCLK是什么。   我将包括寄存器转储和PurePath生成的代码。  从我所看到的,代码正被完美地放置在DSP内存中。

    e2e.ti.com/.../0753.regdump.txte2e.ti.com/.../dsp.h

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

    您好,Ed,

    感谢您的反馈。 我在查看Antonio发送的Process Flow图像时注意到选择了不正确的内插器块。 在您的流程中,使用Int2xOut,此块与四速率采样频率兼容,如192KHz。 对于48kHz采样率,应选择Int8xOut。 您可以尝试更改使用的内插器块吗?  

    话虽如此,我使用TLV320AIC3254EVM-K执行了一些测试,并且能够重现该问题,我使用了Int2xOut内插器并提供了外部48kHz采样速率时钟。 PPS流程也设置为在48kHz下运行。 在初始设备配置后,通过更改提供给EVM的时钟来重现此问题,因此我认为时钟设置是您系统中的问题。 您能否共享您的终端系统中使用的整个时钟设置?

    谢谢, 此致,

     -Diego Mel é ndez López ñ a
      音频应用工程师

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

    迭戈,

    我更新为使用8x输出,但它只添加了几个步骤,输出看起来仍然像一个金字塔。  时钟的配置是通过ALSA结构完成的,但我可以尽力为您提供参数。  在我的配置中,我有TLV320作为FCLK和BCLK的时钟主控器,它们在48kHz和1.536MHz下是正确的,这是16位数据。  我检查了代码输出,但复位后它不调整数据字段,因此必须假设16位数据。  以下是驱动程序中硬件设置的代码,包括48kHz的参数。  如果需要其他信息,请告诉我。  需要注意的是,在没有DSP的情况下,这些参数是很好的,因为我们已经使用此产品一年多了,现在刚刚进入测试阶段,并希望添加一些DSP以获得适当的频率响应。

    MCLK = 2457.6万
    比率=4.8万
    p_val = 2
    PLL_j = 8
    PLL_d = 0000
    剂量= 128
    ndac =8
    MDAC =2.
    aosr =64
    nadc = 8
    mAdc = 4.
    BCLK_N = 4

    /*将PLL用作CODE_CLKIN和DAC_MOD_CLK作为BDIV_CLKIN */
    	snd_so_write (CODEC,AIC32X4_CLKUX,AIC32X4_PLLCLKIN);
    	snd_so_write (CODEC,AIC32X4_IFACE3, AIC32X4_DACMOD2BCLK);
    
    	/*我们将R值固定为1,并使P和J=K.D成为变量*/
    	数据= snd_so_read (编解码器,AIC32X4_PLLPR);
    	数据&=~(7 <4);
    	snd_so_write (编解码器,AIC32X4_PLLPR,
    		(数据|(aic32x4_divs[I].p_val << 4)| 0x01);
    
    	snd_so_write (codec,AIC32X4_PLLJ,aic32x4_divs[I].plL_j);
    
    	snd_so_write (codec, AIC32X4_PLLDMSB,(aic32x4_divs[I].PLL_d >> 8);
    	snd_so_write (编解码器,AIC32X4_PLLDLSB,
    		(aic32x4_divs[i].PLL_d & 0xff));
    
    	/* NDAC除法器值*/
    	数据= snd_so_read (编解码器,AIC32X4_NDAC);
    	数据&=~(0x7f);
    	snd_so_write (编解码器,AIC32X4_NDAC, 数据| aic32x4_divs[i].ndac);
    
    	/* MDAC除法器值*/
    	数据= snd_so_read (codec,AIC32X4_MDAC);
    	数据&=~(0x7f);
    	snd_so_write (codec,AIC32X4_MDAC, 数据| aic32x4_divs[i].mdc);
    
    	/* DOSR MSB和LSB值*/
    	snd_so_write (CODEC,AIC32X4_DOSRMSB,aic32x4_divs[i].dosr >> 8);
    	snd_so_write (CODEC,AIC32X4_DOSRLSB,
    		(aic32x4_divs[i].dosr & 0xff));
    
    	/* NADC除法器值*/
    	数据= snd_so_read (编解码器,AIC32X4_NADC);
    	数据&=~(0x7f);
    	snd_so_write (编解码器,AIC32X4_NADC, 数据| aic32x4_divs[i].nadc);
    
    	/* mAdc除法器值*/
    	数据= snd_so_read (codec,AIC32X4_mAdc);
    	数据&=~(0x7f);
    	snd_so_write (codec,AIC32X4_mAdc, 数据| aic32x4_divs[i].mAdc);
    
    	/* AOSR值*/
    	snd_so_write (CODEC,AIC32X4_AOSR,aic32x4_divs[i].aosr);
    
    	/* BCLK N分配器*/
    	数据= snd_x4_read (CODEC,AIC32X4_BCLKN);
    	
    	soc ~,so_cl32f=数据;soc 数据| aic32x4_divs[I].blck_N);