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/DRA750:使用特定串行器的音频接口回放/录制

Guru**** 2579345 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/622571/linux-dra750-audio-interface-playback-record-with-specific-serializer

器件型号:DRA750

工具/软件:Linux

高出口、

(1)我使用具有 I2S 模式的 MCASP2执行音频回放/录制测试。

(2) My DTS 配置(AXR0 TX、AXR1 Rx;AXR2 TX、AXR3 Rx、带环回测试):

----------------------------------------

mcasp2{(&M)
#sound-di-cells =<0>;
fclk_parent ="atl_clkin2_ck);

pinctrl-names ="default";
pinctrl-0 =<&mcasp2_pines>;

状态="正常";

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

----------------------------------------

(3) 我可以检测声卡、并显示设备节点

root@WNC-J6:~# ls -la /dev/snd
drwxr-xr-x 3 root root 140 jan 1 1970。
drwxr-xr-x 12根根13840 Sep 3 18:41。
drwxr-xr-x 2 root 60 Jan 1 1970 by path
crw-rw-- 1根音频116,1970年1月0日 controlC0
crw-rw-- 1根音频116,1970年1月24日 pcmC0D0c
crw-rw-- 1根音频116,1970年1月16日 pcmC0D0p
crw-rw-- 1根音频116,1970年1月33日计时器
root@WNC-J6:~#

(4) 以下命令只能选择卡和器件、不能选择串行器。

aplay -R8000 -D plushw:0、0 /usr/local/bin/2_mins.wav &

arecord -R8000 -f S16_LE -D plushw:0、0 100_sec.wav -d 100 -t wav -vv

(5) 如何使用 aplay 或 aRecord 选择特定串行器来执行回放/录制回送测试?

非常感谢。

BRS

路易

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

    我已将您的问题转发给音频专家。

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

    路易

    McASP AIFO 中所有串行器在给定方向的音频采样以交错方式存储(即 AXR0的采样0、AXR2的采样0、AXR0的采样1、AXR2的采样1等)。 McASP 驱动程序针对每个流方向公开一个 PCM 器件、因此内核驱动程序播放的数据被认为已经交错。 换言之、交错样本的任务必须在用户空间内完成。 同样、对于音频捕获、不同之处在于数据将被去交错。

    因此、使用 aplay/arecord 实用程序是不可能的、您必须编写自己的应用程序来处理交错/去交错部分。

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

    尊敬的 Misael:

    下面 是我们的原理图:

    2. DTS 配置如下所示

    ***** MCASP2 (使用4个串行器、2个 TX、2个 RX)*****

    mcasp2{(&M)

           #sound-di-cells =<0>;

           fclk_parent ="atl_clkin2_ck);

     

           pinctrl-names ="default";

           pinctrl-0 =<&mcasp2_pines>;

     

           状态="正常";

     

           OP-MODE =<0>;         /* MCASP_IIS_MODE */

           TDM-SLOTS =<2>;

           /* 16串行器*/

           serial-dir =< /* 0:非活动、1:TX、2:Rx *

                   1 2 1 2

                   0 0 0 0 0

                   0 0 0 0 0

                   0 0 0 0 0

           >;   

           tx-num-evt =<8>;

           Rx-num-evt =<8>;

    };

    ***** 机器驱动程序(使用“sound/soc/cgeneral/simple-card.c”)****

        snd2:声音@2{

                   兼容="简单音频卡 mcasp2";

                   simple-audio-card、name ="DRA7xx-EVM-MCASP2";

    #if 0

                   /*我们没有编解码器*/

                   simple-audio-card、MCLK-FS =<256>;

    #endif

                   simple-audio-card、小工具=

                           "耳机"、"耳机插孔"、

                           "线路"、"线路输出"、

                           "麦克风"、"麦克风插孔"、

                           "线路"、"线路输入";

                   简单音频卡,路由=

                           "耳机插孔"、      "HPLOUT"、

                           "耳机插孔"、      "HPROUT"、

                           "线路输出"、            "LLOUT"、

                           "线路输出"、            "RLOUT"、

                           "MIC3L"、               "Mic Jack"、

                           "MIC3R"、               "Mic Jack"、

                           "MIC Jack"、            "Mic Bias"、

                           "LINE1L"、              "线路输入"、

                           "LINE1R"、              "线路输入";

                   状态="正常";

     

                   simple-audio-card、di-link@0{

                           格式="I2S";

                           bitclock-master =<&sound2_master>;

                           frame-master =<&sound2_master>;

                           位时钟反转;

     

                           sound2_master:CPU{

                                   Sound-Dai =<&mcasp2>;

                                   系统时钟频率=<8192000>;

                           };

     

                           编解码器{

                                   sound-dai =<&btsco_mcasp2>;

                           };

                   };

           };

    ***** 编解码器驱动程序,虚拟编解码器,没有编解码器芯片,只有驱动程序支持(使用“sound/soc/codec/bt-sco.c”)****

        btsco_mcasp2:btsco_mcasp2@0{

                   #sound-di-cells =<0>;

                   compatible ="delta、dfbmcs320-mcasp2";

                   状态="正常";

           };

    3.如需上述配置,/dev/snd 将会显示

    root@WNC-J6:~# ls -al /dev/snd
    drwxr-xr-x 3 root root 140 jan 1 1970。
    drwxr-xr-x 11 root 13860 Sep 3 18:41。
    drwxr-xr-x 2 root 60 Jan 1 1970 by path
    crw-rw-- 1根音频116,1970年1月0日 controlC0
    crw-rw-- 1根音频116,1970年1月24日 pcmC0D0c
    crw-rw-- 1根音频116,1970年1月16日 pcmC0D0p
    crw-rw-- 1根音频116,1970年1月33日计时器
    root@WNC-J6:~#

    我无法指示 AXR0、AXR1、AXR2、AXR3进行音频播放/录制

    4.我的问题是:  

    由于 aplay/arecord ALSA 实用程序需要访问用户空间设备节点,因此如何生成4个设备节点,例如:

    “适用于 AXR0的/dev/snd/pcmC0D0c”

    “/dev/snd/pcmC0D0p for AXR1”

    “/dev/sndpcmC0D1c for AXR2”

    “/dev/snd/pcmC0D1p for AXR3”

    谢谢你。

    BRS

    路易

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    路易
    由于我在上一篇文章中给出的原因、您在第4点中描述的内容是不可能的:如果您有多个串行器在给定的流方向上处于活动状态(即回放)、则数据将交错并通过单个 PCM 设备从用户空间传递。

    换言之、对于给定的 McASP、无论活动串行器的数量如何、都可以有一个捕获和一个回放 PCM 器件。

    您尝试执行的操作可能有一种是使用插件(即路由或其他)或它们的组合(即 dmix +路由)。 请看以下网址: www.alsa-project.org/.../pcm_plugins.html
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Misael:

     

    我想再次确认以下信息:

      我的请求是运行时选择不同的串行器(PIN)以在"One McASP"中播放/录制音频(即 McASP1、McASP1具有 AXR0、AXR3用于 Tx、AXR1、AXR2用于 Rx)。

      "PCM 插件"实现完成后、我可以运行时间更改不同的 McASP1串行器以播放/录制音频?

     

    BRS

    路易

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

    路易

    当您说"选择不同的串行器(运行时)"时、您是否意味着一次只能激活一个串行器?

    换句话说、是否有 McASP1、AXR0和 AXR1用于传输 TX 数据的用例?

    我的期望是、使用插件时、可以有两个虚拟器件(每个对应一个串行器)。  插件可以根据 McASP 的需要管理通道的交错。

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

    我的用例如下:

    1.是的、McASP1有5个串行器、但一个串行器将同时激活、用例请参阅项目2

    McASP1具有5个串行器、3个 TX (适配器板播放和载板记录)、2个 RX (适配器板录制和载板播放)、所有这些都是数字到数字连接。
    2.1 McASP1的用例
    1. AXR0的适配器板播放 AXR0提供的载板记录
    2.关闭适配器板播放、载板记录

    3. AXR1的适配器主板播放 AXR1的载板记录
    4.关闭适配器板播放、载板记录

    5. AXR2的适配器主板播放 AXR2的载板记录
    6.关闭适配器板播放、载板记录

    7. AXR3的适配器板记录 AXR3的载板间隙
    8.关闭适配器板记录、载板播放

    9. AXR4的适配器板记录 AXR4的载板间隙
    10.关闭适配器板记录、载板播放

    2.2以上是我们的测试计划中的用例、无法重新启动更改 DTS 文件以实现这些目标。

    BRS
    路易
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    路易
    我认为 ALSA 插件方法是首选尝试方法。 备份选项是在 McASP 驱动程序中添加 kcontrol、可以在其中指定要使用的串行器、但这是一个黑客攻击。 我认为这是最后的办法,只有在排除了插件方法的情况下。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    路易

    请查看随附的 asounddrc 文件。 我认为它可以帮助适配器板端。 载板侧会发生类似的变化、但流方向不同。

    新的 PCM 设备称为 axr0p、axr1p、...,您可以直接将它们与 aplay/arecord 中的-D 参数一起使用。 虚拟 PCM 设备会将信道重新路由到硬件 PCM 设备(您需要在 asounddrc 文件中将其更改为系统中的索引)。 我假设适配器板支持6个回放和4个捕捉通道;并且载板支持4个回放和6个捕捉通道。

    e2e.ti.com/.../asoundrc.zip

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

    我将部分内容记录到"asoundrc"中、并有一些问题:

    =========================== asoundrc ===================
    pcm.jamr{
    类型 HW;
    卡3;


    pcm.axr0p{
    键入 route;
    Slave.pcm jamr;
    slave.channels;
    tTable.0.0 1;
    tTable.1.3.1;


    (笑声)
    (笑声)
    (笑声)
    ================================================================================

    请回答以下3个问题:

    问题1:
    "通道"代表什么? 引脚(串行器)?

    问题2:
    "table.1.3 1"代表什么? 如何使用它?
    --> table.x.y Z,X 表示输入通道,什么是输入通道? Y 表示输出通道、什么是输出通道? 串行器?

    问题3:
    在我的条件下、mcasp2仅在适配器板(AXR0、AXR1、AXR2、AXR3)中使用4个串行器、并将所有方向配置为 Rx。
    我是否只需要添加 PCM.axr0c、PCM.axr1c、PCM.axr2c、PCM.axr3c?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    "信道"是指将在硬件 PCM 设备中使用的信道数。

    tTable.x.y Z -> X=输入通道索引、Y=输出通道索引、Z=卷(0.0-1.0)、其中输入指的是虚拟设备、输出到硬件设备。

    目标是创建可用于通过特定 McASP 串行器传输数据的 PCM 器件。 让我们考虑一个具有3个有源 TX 串行器和2个 TDM 插槽的设置。 对于 McASP 收到的每6个样本、它将按以下顺序将其移出:sample0->AXR0、sample1->AXR1、sample2->AXR2、sample3->AXR0、sample4->AXR1、 sample5->AXR2。

    因此、如果我们希望一次只通过一个串行器传输有效的立体声数据:

    • AXR0串行器:L 0 0 R 0 0 (L =左通道、R =右通道)
    • AXR1串行器:0 L 0 R 0
    • AXR2串行器:0 0 L 0 R

    换言之、我们希望虚拟 立体声器件将两个通道路由到6通道流中的相应插槽索引。 因此、对于上述示例:

    • AXR0串行器可调整:0.0 1和1.3 1
    • AXR1串行器的可调整值:0.1 1和1.4 1
    • AXR2串行器的可调整性:0.2 1和1.5 1

    对于适配器板中的4个 RX 串行器、是的、您需要为每个串行器创建4个虚拟器件。 在这种情况下、"channels"参数将为8 (假设 tdm-slots = 2)。 同样、如果 一次只使用一个串行器、这些特定的虚拟器件将起作用。

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

    尊敬的 Misael:

    最后、我可以通过黑客攻击 Davinci-McASP 驱动程序来运行时间更改串行器。

    您提供的所有信息都非常有用。

    非常感谢。

    BRS
    路易