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.

[参考译文] TLV320AIC3104:Linux 上用于 Xilinx Ultrascale+ MPSoC 的 ALSA 声卡无法正常工作

Guru**** 2553450 points
Other Parts Discussed in Thread: TLV320AIC3104

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

https://e2e.ti.com/support/audio-group/audio/f/audio-forum/989963/tlv320aic3104-alsa-soundcard-on-linux-for-xilinx-ultrascale-mpsoc-not-working

器件型号:TLV320AIC3104

大家好!
我有一个带有 TLV320AIC3104音频编解码器的定制 Xilinx Ultrascale+ MPSoC 板。 编解码器通过 I2C 连接到 ARM 处理器进行配置、并连接到 FPGA 进行 I2S 音频接口连接。 我已经为 I2S 接口创建了一个块设计(硬件设计)。 块设计非常基本。 我使用了 Xilinx 音频格式器 IP、I2S 接收器和发送器 IP。
我使用的是 petalinux、它会自动为硬件设计创建内核配置和器件树条目。 我认为自动生成的东西没有问题。

现在、我的工作是将外部硬件添加到我的 Linux 项目中。 我已将 TLV320AIC3104添加到内核配置中、并启用了 ALSA ASOC 简易声卡驱动程序。
我创建了两个器件树条目:一个用于编解码器、另一个用于简易声卡。 主线 Linux 上已有用于 TLV320AIC3104编解码器和 Simple sound 卡的器件树条目: am57xx-beagle-x15-common.dtsi - arch/arm/boot/dts/am57xx-be15-common.dtsi - Linux 源代码(v5.11.10)- Bootlin (使用 ctrl320AIC3104和 simple 器件树状网络搜索 TLV320AIC3104音频节点)。 我的设备树条目几乎相同、但 ALSA 无法识别声卡! 我还阅读了有关如何设置驱动程序的简短说明: TLV320AIC3XSW-Linux 驱动程序或库| TI.com 、但遗憾的是它仍然无法正常工作。

在电路板上测试设计之前、我想测试仿真器上的 Linux 映像、以查看是否已正确设置所有内容。 遗憾的是、它不是 Linux 正在引导并正常工作、但 uBoot 会显示一些错误消息:

[2.665735]已初始化高级 Linux 声音架构驱动程序。
(笑声)
[5.375628] xlnx_format_PCM 80010000.audio_formatter:声卡设备创建失败
[5.376359]注册的 xlnx_format_PCM 80010000.audio_formatter: PCM 平台器件
[5.377945] xlnx_I2S 8002000.I2S_receiver:xlnx_I2S_capture DAI registered
[5.378645] xlnx_I2S 80030000.I2S_transmitter:xlnx_I2S_playback DAI registered
(笑声)
[6.477359] ASOC-simple-card sound0:解析错误-22
[6.477870] ASOC-simple-card:Sound0探测器失败,错误-22
(笑声)
[6.359714] tlv320aic3x-codec 0-0018:0-0018未找到电源 IOVDD、使用虚拟稳压器
[6.361562] tlv320aic3x-codec 0-0018:0-0018未找到电源 DVDD、正在使用虚拟稳压器
[6.362193] tlv320aic3x-codec 0-0018:0-0018电源 AVDD 未找到、使用虚拟稳压器
[6.362751] tlv320aic3x-codec 0-0018:0-0018未找到电源 DRVDD、使用虚拟稳压器
(笑声)
[6.6646434] ALSA 设备列表:
[6.664918]未找到声卡。


请注意  ASOC-simple-card sound0:parse 错误-22问题。 -22是-EINVAL 的值、表示 "无效参数" (来源: 错误:Linux 系统错误(fnal.gov))
我认为这是因为简单音频卡的一个或一些设备树属性有误。 但我找不到问题。 我花了很多小时来寻找问题
您知道问题是什么吗? 附件中包含音频节点(编解码器、简单音频卡)的.dtsi 文件。 此开机自检也附带了引导日志。
 e2e.ti.com/.../system_2D00_user.dtsi.txte2e.ti.com/.../uboot_5F00_log.txt


我使用的是 petalinux 2020.2

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

    Daniel:

    您似乎在 DTS 中遇到了有关声卡定义方式的错误。 您似乎正在传递一个未定义的参数。

    在我们的 DTS 中、我们定义了以下行:

    简单音频卡、CPU{
      Sound-Dai =<&AUDIO_FORMATER_0>;
      时钟=<&MISC_clk_0>;
    };

    audio_format_0{(&A)
      #sound-di-cells =<0>;
    };

    具有 TDM 或 I2S 接口。 在我们的 BeagleBone 系统中、它使用 Sitara 的 McASP 外设:

    简单音频卡、CPU{
     Sound-Dai =<&mcasp3>;
    };

    mcasp3{.m&mcasp3}
     #sound-di-cells =<0>;
     分配的时钟=<&l4per2_clkctrl DRA7_L4PER2_MCASP3_CLKCTRL 24>;
     分配的时钟父级=<&sys_clkin2>;
     状态="正常";

     OP-MODE =<0>;/* MCASP_IIS_MODE */
     TDM-SLOTS =<2>;
     /* 4个串行器*/
     serial-dir =</* 0:非活动、1:TX、2:Rx */  1 2 0 0>;
     tx-num-evt =<32>;
     Rx-num-evt =<32>;
    };

    此外、请确保已定义 Mix_clk_0。 下面是简单卡的 Linux 内核文档:

    https://www.kernel.org/doc/Documentation/devicetree/bindings/sound/simple-card.txt

    和 Linux Sound Subsystem 文档

    https://www.kernel.org/doc/html/v4.11/sound/index.html?highlight=sound

    此致、
    佩德罗

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

    嗯... 我将我的器件树与您的器件树进行了比较、但我找不到问题。

    [引用 userid="8571" URL"~/support/audio/f/audio-forum/989963/tlv320aic3104-alsa-soundcard-on-linux-for-xilinx-ultrascale-mpsoc-not-working/3656983 #3656983"]您似乎正在传递未定义的参数。

    我在 simple-sound 卡中搜索了一个未定义的参数、但我找不到一个。 您是否有任何建议,未定义的节点属性可能是什么?

    这是定义 MISC_clk_0和 AUDIO_FORMATER_0的文件:
    e2e.ti.com/.../pl.dtsi.txt

    它由 Xilinx 的 petalinux 工具从我的 FPGA 块设计自动生成

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

    通常、Sound-dai 连接到 DTS 中的 I2S 外设。 我看到只有 MISC_CLK 被连接并 被设定为12MHz 频率。 我不关注这一切的连接方式。 这通常不是我们建议的连接方式。 应该以某种方式将其分配给使用位时钟、帧同步和数据驱动 I2S 总线的外设。 我想知道是否会产生错误、因为它不知道 BCLK、FSYNC 和数据是如何连接到 Sound-Dai 的。

    除此之外、其他一切似乎都是正确的。 因此,我不知道还有什么建议。

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

    非常感谢您再次回复!
    我将尝试根据您的建议解决问题、并在几天内回来告诉您问题是否有效。

    sound0和 tlv320aic3104节点受来自 Linux 主线内核的设备树的启发:
    am57xx-beagle-x15-common.dtsi - arch/arm/boot/dts/am57xx-beagle-x15-common.dtsi - Linux 源代码(v5.11.11)- Bootlin
    (此设备树中的节点也称为 sound0和 tlv320aic3104)

    [引用 userid="8571" URL"~/support/audio/f/audio-forum/989963/tlv320aic3104-alsa-soundcard-on-linux-for-xilinx-ultrascale-mpsoc-not-working/3659460 #3659460"]它应该被分配给使用位时钟、帧同步和数据驱动 I2S 总线的外设。

    我的 I2S"外设"由3个组件组成:I2S 接收器、I2S 发送器和音频格式器(用于访问存储器的 DMA)。 它们一起构成 I2S 外设。 I2S Rx 和 Tx 连接到音频格式器、音频格式器通过 AXI4总线连接到 CPU/内存。 所有这些都可以由 CPU 通过存储器映射寄存器进行编程。
    我实际上认为您是对的。 我仅将音频格式器连接到 Sound0设备树节点。 我实际上需要连接整个 I2S"外设"。
    目前、我不知道如何 将所有3个 I2S 器件树节点组合到一个 I2S DAI 节点 、但我将搜索解决方案。

    非常感谢您提供的 tipp、我没有看到这个问题。 我需要尝试一下!

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

    我认为它已经连接到驱动 I2S 总线的外设。

    简单音频卡、CPU{
    Sound-Dai =<&AUDIO_FORMATER_0>;
    时钟=<&MISC_clk_0>;
    };

    AUDIO_FORMATER_0是 DMA。 AUDIO_FORMATER_0知道 I2S Rx 和 TX 器件树节点。
    但我不知道这是否足够了。

    Xilinx 提供了一个用于此设置的声卡驱动程序、但这种方法不那么方便、因为必须对驱动程序进行修改才能正常工作。 这比简单卡的司机要不舒服……