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.

[参考译文] Linux/AM3352:虚拟编解码器的 McASP 配置

Guru**** 2964790 points

Other Parts Discussed in Thread: TLV320AIC33, AM3358, AM3352

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/672205/linux-am3352-mcasp-configuration-for-dummy-codec

器件型号:AM3352
主题中讨论的其他器件:TLV320AIC33、 AM3358、

工具/软件:Linux

您好!

我正在尝试使用 McASP 制作一个8槽 tdm Rx/TX。  我们将连接 FPGA、因此我们不需要编解码器。 下面显示了我的 DTS 文件。  我使用了虚拟编解码器、但无法获取 davine-mcasp.c 文件以打印任何日志。  虚拟编解码器似乎没有连接到 McASP 驱动程序。 有没有关于缺少连接的想法?

   CODE_TEST:CODE_TEST{
      兼容="linux、snd-so-dummy;
      #sound-di-cells =<0>;
      status="oke";
   };

   听起来{
      兼容="简单音频卡";
      simple-audio-card、name ="AM335x-TDM";
//     简单音频卡,格式="DSP_A";
      simple-audio-card、format ="DSP_b";
//      简单音频卡,格式="i2c";
      simple-audio-card、frame-master =<&sound_master>;
      simple-audio-card、bitclock-master =<&sound_master>;
//     简单音频卡,位时钟反转;
//     系统时钟频率=<24000000>;
//     系统时钟方向="out";
      status="oke";

      sound_master:simple-audio-card、CPU{
         Sound-Dai =<&McASP0>;
         系统时钟频率=<24000000>;
         系统时钟方向="OUT";

         di-tdm-slot-num =<2>;
         di-tdm-slot-width =<16>;
      };

      sound_master1:简单音频卡、编解码器{
//         sound-dai =<&tlv320aic3x>;
         sound-dai =<&codec_test>;
      };
   };

   McASP0_Pins:McASP0_Pins{
      pinctrl-single、pins =</**/
         0x120 (PIN_INPUT 下拉 | MUX_MODE6)/*(N18) gmii1_txd2.McASP0_ahclkx *
         0x12c (PIN_INPUT_PULLDOWN | MUX_MODE6)/*(N19) gmii1_txclk.McASP0_aclkx *
         0x130 (PIN_INPUT 下拉| MUX_MODE6)/*(M19) gmii1_rxclk.McASP0_FSX *
         0x134 (PIN_OUTPUT 下拉| MUX_MODE6)//(N17) gmii1_col.McASP0_axr0 */
         0x138 (PIN_INPUT 下拉 | MUX_MODE6)/*(N16) gmii1_rxd0.McASP0_axr1 */
      >;

i2c0{(&I)
   pinctrl-names ="default";
   pinctrl-0 =<&i2c0_PINs>;
   时钟频率=<100000 >;
   状态="正常";

   tlv320aic3x:tlv320aic3x@1b{
      兼容="ti、tlv320aic3x";
      reg =<0x1b>;
      #sound-di-cells =<0>;

      状态="正常";
   };

/*   tlv320aic33:tlv320aic33@1b{
      兼容="ti、tlv320aic33";
      reg =<0x1b>;
      #sound-di-cells =<0>;

      状态="正常";
   };*/

};

&McASP0{
   #sound-di-cells =<0>;
   pinctrl-names ="default";
   pinctrl-0 =<&McASP0_PINs>;

   状态="正常";

   OP-MODE =<0>;         /* 0:McASP_IIS_MODE、1:DIT */
   TDM-SLOTS =<8>;

   /* 4个串行器*/
   serial-dir =<      /* 0:非活动、1:TX、2:Rx *
      1 2 0 0      /* AXR0 AXR1 AXR2 AXR3 */
   >;
   tx-num-evt =<32>;
   Rx-num-evt =<32>;
};

Rob

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

    请参阅以下有关虚拟编解码器配置的 e2e 线程:

    e2e.ti.com/.../2461361
    e2e.ti.com/.../2464720

    此致、
    帕维尔
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在我请求帮助之前,我已经浏览过所有这些帖子。 它们只是作为一个概览提供了帮助。

    我们使用的是 am3352和 am3358控制器。 McASP 外设具有内置的 tdm 功能、因此选择了它。

    下面是我需要做的事情。 我的项目需要一个8槽 tdm、而没有编解码器。 我使用简单卡音频设备实现了 DTS。 首先、我使用以下命令配置了内核配置:

    CONFIG_SND
    CONFIG_SND_SIMPLE_CARD
    CONFIG_SND_HWDEP
    CONFIG_SND_TIMER
    CONFIG_SND_PCM
    CONFIG_SND_RAWMIDI
    CONFIG_SND_SOC
    CONFIG_SND_EDMA_SOC
    CONFIG_SND_Davinci_SOC
    CONFIG_SND_Davinci_SOC_MCASP

    为 McASP 选择了达芬奇 SoC 音频驱动程序。

    接下来、需要修改 DTS 文件。 自2.6.32版本以来、我没有使用过 Linux 内核。 DTS 和 CONFIG_of (打开固件)实现对我来说是新的。 DTS 是启动时内核的驱动程序配置文件。 CONFIG_of 分析 DTS (实际上是 DTB)中的参数。 此处是内核中 DTS 参数的链接(github.com/.../devicetree)。 我发现浏览 dtsi 文件、内核文档和有关 DTS 的文章非常有用。 DTS 文件会编译到 DTB (器件树 bloB/块)中。 DTB 是引导时使用的文件。 对 DTB 进行反编译非常有用;它可以准确显示您正在配置的内容。 dtsi 文件是包含处理器有用信息的文件。

    此外、TI 的引脚多路复用工具对于在 DTS 文件中配置引脚非常有用。

    以下是我的 McASP DTS:

    /{

    CODE_TEST:CODE_TEST{
    兼容="linux、snd-so-dummy;
    #sound-di-cells =<0>;
    status="oke";
    };


    // AM335x 是时钟主控器(MCLK、位和帧 CLKS)
    //声音{
    //兼容=“简单音频卡”;
    //简单音频卡,名称="AM335x-TDM";
    //简单音频卡,格式="DSP_B";
    //simple-audio-card、frame-master =<&sound_master>;
    //simple-audio-card、bitclock-master =<&sound_master>;
    //status="oke";
    //
    //sound_master:simple-audio-card、CPU{
    //sound-dai =<&McASP0>;
    //系统时钟频率=<24000000>;
    //系统时钟方向="out";
    //
    //di-tdm-slot-num =<8>;
    //di-tdm-slot-width =<16>;
    //};
    //
    //简单音频卡,编解码器{
    //sound-dai =<&codec_test>;
    //};
    //};
    //};

    // AM335x 是时钟从器件(位和帧 CLKS、不需要 MCLK)
    听起来{
    兼容="简单音频卡";
    simple-audio-card、name ="AM335x-TDM";
    simple-audio-card、format ="DSP_b";
    simple-audio-card、frame-master =<&sound_master>;
    simple-audio-card、bitclock-master =<&sound_master>;
    status="oke";

    简单音频卡、CPU{
    Sound-Dai =<&McASP0>;
    系统时钟方向="in";
    //位时钟反转;

    di-tdm-slot-num =<8>;
    di-tdm-slot-width =<16>;
    };

    sound_master:simple-audio-card、codec{
    sound-dai =<&codec_test>;
    };

    };
    };

    am33xx_pinmux{(am33xx_pinmux)}
    pinctrl-names ="default";
    pinctrl-0 =<&triac_PINs>、<&clkout1_PIN>、
    通用引脚>、<未使用引脚>;

    McASP0_Pins:McASP0_Pins{
    pinctrl-single、pins =</**/
    // clk 主控方
    /*0x120 (PIN_OUTPUT 下拉| MUX_MODE6)/*(N18) gmii1_txd2.McASP0_ahclkx *
    /*0x12c (PIN_OUTPUT 下拉| MUX_MODE6)/*(N19) gmii1_txclk.McASP0_aclkx *
    /*0x130 (PIN_OUTPUT 下拉| MUX_MODE6)/*(M19) gmii1_rxclk.McASP0_FSX *

    // clk 从器件
    0x120 (PIN_INPUT 下拉| MUX_MODE6)/*(N18) gmii1_txd2.McASP0_ahclkx *
    0x12c (PIN_INPUT_PULLDOWN | MUX_MODE6)/*(N19) gmii1_txclk.McASP0_aclkx *
    0x130 (PIN_INPUT 下拉| MUX_MODE6)/*(M19) gmii1_rxclk.McASP0_FSX *

    //数据线
    0x134 (PIN_OUTPUT 下拉| MUX_MODE6)//(N17) gmii1_col.McASP0_axr0 */
    0x138 (PIN_INPUT 下拉| MUX_MODE6)/*(N16) gmii1_rxd0.McASP0_axr1 */
    ;/**/

    };
    };

    &McASP0{
    #sound-di-cells =<0>;
    pinctrl-names ="default";
    pinctrl-0 =<&McASP0_PINs>;

    状态="正常";

    OP-MODE =<0>; /* 0:McASP_IIS_MODE、1:DIT */
    TDM-SLOTS =<8>;

    /* 4个串行器*/
    serial-dir =</* 0:非活动、1:TX、2:Rx *
    1 2 0 0/* AXR0 AXR1 AXR2 AXR3 */
    >;
    tx-num-evt =<32>;
    Rx-num-evt =<32>;
    };

    在每个驱动程序中、都有一个用于解析驱动程序的 DTB 的 CONFIG_of 段。 函数名称的末尾通常有_of。 查看此处以查看是否实现了内核文档中的参数。

    我需要为上述 DTS 的此配置应用2个补丁:

    这个补丁允许系统时钟方向="IN | OUT"。 默认情况下、它是"in"、但除非应用此补丁、否则 AM335x 时钟主模式将不起作用。
    www.spinics.net/.../msg46431.html

    此补丁扩展了 Linux-SoC-dummy、因此不需要编解码器。
    patchwork.kernel.org/.../

    如何在多个通道中使用 alsa:
    我使用了非交错实现。 我没有添加所有代码、因为互联网上有很多示例。 我无法像在 PC 上那样更改嵌入式 Linux 上的参数。 我认为这是嵌入式世界中的限制。 下面列出的参数是唯一可以更改的参数。

    DevName ="plughw:0、0";//我无法使用"HW:0、0"
    snd_pcm_open (&hndl、devnam.c_str ()、snd_pcm_stream_replayback、0);

    RET = snd_pcm_hw_params_set_rate _resample (hndl、pHwParms、1);//这必须为1或不起作用

    RET = SND_PCM_HW_params_set_access (mhndl、pHwParms、snd_PCM_access_rw_interleaved);

    RET = snd_pcm_hw_params_set_format (hndl、pHwParms、snd_pcm_format_s16_LE);

    RET = snd_pcm_hw_params_set_channels (hndl、pHwParms、8);

    SAMP = 24000;
    RET = snd_pcm_hw_params_set_rate _near (hndl、pHwParms、&SAMP、NULL);//必须使用 near 或无法设置采样率

    //它不允许我设置/获取缓冲区大小或周期,因此我选择了驱动程序中允许的值。 也许、与周期和缓冲区大小相关的最小/最大函数会起作用。 我没有尝试。

    bufSIZ = 64k;
    persid = 16;
    帧= bufSIZ /周期;
    uint8_t *pBuf[8];
    RET = snd_pcm_writen (m_Hnelf、pBuf、frame);