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/DRA745:DRA7xx 上的 McASP 和虚拟声卡

Guru**** 2554320 points
Other Parts Discussed in Thread: TLV320AIC3106

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/629979/linux-dra745-mcasp-and-dummy-sound-card-on-dra7xx

器件型号:DRA745
主题中讨论的其他器件:TLV320AIC3106

工具/软件:Linux

各位专家:

我是 Jacinto 和音频接口的新手。
我们有一位客户将 DRA7xx 用于他们的汽车产品。
根据客户要求、我们需要为其产品启用 McASP1、McASP5、McASP6、McASP7和 McASP8。
我和我的同事在 dra7-evm.dts 中设置了器件树、我们可以看到系统在/sys/bus/platform/devices/.下具有 init McASP 接口
现在、我们需要验证这些设置是否正常。
我们认为我们可以创建一些虚拟声卡来链接到这些 McASP 端口以进行验证。
但是、我们已经尝试了几天、运气不好、系统无法创建声卡。

有人能为 McASP 端口和虚拟声卡提供一些文档或示例吗?
或其他简单方法来验证 McASP 端口是否正常工作。

谢谢、此致、
韦恩

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

    我已将您的问题转交给 McASP 专家。

    您能告诉我们您使用的是哪款 SDK 吗?

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

    感谢你的答复。
    1。
    我按照此发行说明设置我的主机环境:
    omapedia.org/.../6AM.1.3_Release_Notes
    我不确定 SDK 版本、是否为"6.1.3"?
    内核版本为4.4.45。

    2.
    我们今天取得了一些进展。
    我们通过此链接向添加补丁 /sound/soc/soc-utils.c、以使 dra7-evm.dts 链接到此驱动程序。
    patchwork.kernel.org/.../
    现在、我们可以看到系统上的虚拟声卡。

    3.
    我们遇到另一个问题。
    在内核初始化过程中、我们看到了以下日志。
    声卡的路由似乎有问题。
    [13.537410] ASOC-simple-card sound@0:Snd-SoC-dumme-dai <->48460000.McASP 映射正常
    [13.545304] ASOC-simple-card sound@0:ASOC:找不到 HPLOUT 的源小工具
    [13.552471] ASOC-simple-card sound@0:ASOC:Failed to add route HPLOUT -> Direct -> Headphone Jack
    [13.561519] ASOC-simple-card sound@0:ASOC:找不到 HPROUT 的源小工具
    [13.568705] ASOC-simple-card sound@0:ASOC:无法添加路由 HPROUT -> Direct ->耳机插孔
    [13.577719] ASOC-simple-card sound@0:ASOC:找不到 LLOut 的源小工具
    [13.584814] ASOC-simple-card sound@0:ASOC:Failed to add route LLOut -> Direct -> Line Out
    [13.593201] ASOC-simple-card sound@0:ASOC:找不到 RLOUT 的源小工具
    [13.600294] ASOC-simple-card sound@0:ASOC:无法添加路由 RLOUT ->直接->线路输出
    [13.608691] ASOC-simple-card sound@0:ASOC:找不到适用于 MIC3L 的接收器小部件
    [13.615612] ASOC-simple-card sound@0:ASOC:Failed to add route Mic Jack -> Direct -> MIC3L
    [13.624013] ASOC-simple-card sound@0:ASOC:找不到用于 MIC3R 的接收器小部件
    [13.630918] ASOC-simple-card sound@0:ASOC:无法添加路由麦克风插孔->直接-> MIC3R
    [13.639344] ASOC-simple-card sound@0:ASOC:找不到用于麦克风偏置的源小工具
    [13.646703] ASOC-simple-card sound@0:ASOC:Failed to add route Mic Bias -> Direct -> Mic Jack
    [13.655367] ASOC-simple-card sound@0:ASOC:找不到适用于 LINE1L 的接收器小工具
    [13.662359] ASOC-simple-card sound@0:ASOC:Failed to add route Line in -> Direct -> LINE1L
    [13.670760] ASOC-simple-card sound@0:ASOC:找不到适用于 LINE1R 的接收器小工具
    [13.677767] ASOC-simple-card sound@0:ASOC:Failed to add route Line in -> Direct -> LINE1R

    4.
    这是我们的 DTS 设置、如果出现错误、请纠正我的问题。

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

    snd0:声音@0{
    兼容="简单音频卡";
    simple-audio-card、name ="DRA7xx-evm";
    simple-audio-card、小工具=
    "耳机"、"耳机插孔"、
    "线路"、"线路输出"、
    "麦克风"、"麦克风插孔"、
    "线路"、"线路输入";
    简单音频卡,路由=
    "耳机插孔"、 "HPLOUT"、
    "耳机插孔"、 "HPROUT"、
    "线路输出"、 "LLOUT"、
    "线路输出"、 "RLOUT"、
    "MIC3L"、 "MIC 插孔"、
    "MIC3R"、 "MIC 插孔"、
    "MIC 插孔"、 "MIC Bias"、
    "LINE1L"、 "线路输入"、
    "LINE1R"、 "线路输入";
    simple-audio-card、format ="DSP_b";
    simple-audio-card、bitclock-master =<&sound0_master>;
    simple-audio-card、frame-master =<&sound0_master>;
    //simple-audio-card、bitclock-master =<&codec_test>;
    //simple-audio-card、frame-master =<&codec_test>;
    简单音频卡、位时钟反转;

    sound0_master:简单音频卡、CPU{
    Sound-Dai =<&McASP1>;
    系统时钟频率=<11289600>;
    };

    简单音频卡、编解码器{
    //sound-dai ="linux、snd-soc 虚拟";
    //#sound-di-cells =<0>;
    //sound-dai =<&tlv320aic3106>;
    //时钟=<&ATL_clkin2_ck>;
    sound-dai =<&codec_test>;
    #sound-di-cells =<0>;
    };
    };

    McASP1{
    #sound-di-cells =<0>;

    分配的时钟=<&McASP1_ahclkx_mux>;
    分配的时钟父级=<&ATL_clkin2_ck>;

    状态="正常";

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


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

    韦恩、

    您可以从您的声音节点中删除"多声卡、小部件"和"多声卡、路由"属性、因为虚拟编解码器很可能没有定义任何需要在声卡中连接的小部件。

    此外,您还可以删除卡编解码器中的“sound-di-cells”属性:  

    简单音频卡、编解码器{
    sound-dai =<&codec_test>;
    #sound-di-cells =<0>;   <-删除此项
    };

    您是否仍然看到任何问题? 并不是很清楚。 请确保在 u-boot 中完成适当的 McASP1 Pinmux 设置。

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

    感谢您的宝贵建议。

    我们发现所有 McASP1引脚都配置为输入引脚、因此我们修改了虚拟编解码器以链接到 McASP8。
    虚拟编解码器在 McASP8上似乎正常工作、但当我们在 McASP8端口上探测 ACLKX / FSX /AXR0/AXR1时、仍然没有信号。
    下面是我们用于播放*。wav 的日志:

    root@jacinto6evm:/# tinyplay /vendor/wav/SampleAudio_0_4mb_44.1K.wav &
    [1] 1203
    root@jacinto6evm:/#播放样本:2通道、44100 Hz、24位
    root@jacinto6evm:/# cat /proc/asound/card0/pcm0p/sub0/status
    状态:正在运行
    owner_pid:1203
    TRIGGER_TIME:117.217354754
    tstamp :119.570235849
    延迟 :3552
    可用 :544
    AVAIL_max:1024
    ----
    HW_PTR :183840
    appl_ptr:187392
    root@jacinto6evm:/# cat /proc/asound/card0/pcm0p/sub0/status
    状态:正在运行
    owner_pid:1203
    TRIGGER_TIME:117.217354754
    tstamp :126.100228898
    延迟 :3344
    可用 :752
    AVAIL_max:1024
    ----
    HW_PTR :694000
    appl_ptr:697344

    我们有3个问题:
    1。
    日志似乎是虚拟编解码器的工作方式是查找并能够播放*。wav 文件、但为什么我们不能探测任何信号? 我们错过了什么?

    2.
    在内核初始化过程中、我们找到了如下日志、它是否会对输出信号产生任何影响?
    未使用虚拟稳压器找到电源 DVDD

    3.
    我们发现 U-Boot 中有两个文件:mux_data.h 和 dra7-evm.dts、这两个文件似乎设置了引脚 MUX 配置。
    根据我在 Sitara 系列(SDK7.0至 PSDK1.0)上的经验、*。dts 文件用于在内核级别定义器件树(链接 PIN MUX 至内核驱动程序)。
    但是、在我制作 U-Boot 映像时、会编译 U-Boot 中的这些*。dts。
    我不确定这些*。dts 是否影响 U-Boot 的 PIN MUX 配置。
    那么、我们使用该文件为 U-Boot 配置引脚 MUX 吗?


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

    1.由于 HW_PTR 在日志中发生更改,这意味着 McASP 正在接收数据并将其移出。 因此、很可能只有引脚多路复用器是错误的。

    2.不,这不应该影响。

    3.对于 u-boot pinmux、请在 mux_data.h 文件中进行更改。 确保在 DRA7xx 器件的相应阵列中添加 McASP8条目。

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

    感谢您的回复。

    我们仔细检查 U-Boot 上的引脚多路复用器、发现我们的引脚多路复用器被覆盖。
    我们可以探测放置在 McASP8 ACLKX 和 FSX 上的信号。

    现在我们面临另一个问题、客户需要以48kHz 采样率立体声24位格式运行 I2S、即 BCLK 应为3.072MHz。
    但是、我们的 McASP8_FSX 约为78.12KHz、McASP8_ACLKX 为2.5MHz。

    我们如何设置 McASP 时钟?
    内核器件树中有一个 dra7xx-clocks.dtsi 文件、我认为该文件可用于设置所有外设的时钟源。
    如果是、在哪里可以设置 McASP 端口时钟?
    如果没有、是否有设置 McASP 端口时钟以供参考的示例?


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

    您的声音节点中是否设置了 system-clock-frequency 属性? 必须设置系统时钟频率、以便能够从该频率生成精确的位时钟。 如果您仍然具有11.2896MHz、则无法生成精确的3.072MHz BCLK 频率。

    因此、您可能需要尝试如下所示的操作:

    @@-146、7 +146、7 @@
    
    sound0_master:简单音频卡、CPU{
    Sound-Dai =<&mcasp3>;
    - 系统时钟频率=<11289600>;
    + 系统时钟频率=<24576000>;
    };
    
    simple-audio-card、codec{
    @@-1313、8 +13、8 @@ i2c_p3_exp:&i2c2{
    &ATL_clkin1_ck>、
    <&ATL_clkin2_ck>;
    分配的时钟父级=<&sys_clkin2>、<&DPLL_AE_M2_ck>;
    - 分配的时钟速率=<0>、<0>、<180633600>、<361267200>、
    - <11289600>、<11289600>;
    + 分配的时钟速率=<0>、<0>、<122880000>、<245760000>、
    + <24576000>、<24576000>;
    
    状态="正常";
    
    

    您可能需要在 sound0_master 节点中设置一个附加属性、以使 slot_width = 32 (32位插槽中的24位数据):

    di-tdm-slot-width = 32; 

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

    尊敬的 Misael:

    非常感谢您的支持。

    我们按照您的建议修改 dra7-evm.dts 文件、如下所示:

    snd0:声音@0{
    兼容="简单音频卡";
    //compatible ="snd_duming";
    simple-audio-card、name ="DRA7xx-evm";
    //simple-audio-card、小工具=
    // "耳机"、"耳机插孔"、
    // "线路"、"线路输出"、
    // "麦克风"、"麦克风插孔"、
    // "线路"、"线路输入";
    //simple-audio-card,路由=
    // "耳机插孔"、 "HPLOUT"、
    // "耳机插孔"、 "HPROUT"、
    // "线路输出"、 "LLOUT"、
    // "线路输出"、 "RLOUT"、
    // "MIC3L"、 "MIC 插孔"、
    // "MIC3R"、 "MIC 插孔"、
    // "MIC 插孔"、 "MIC Bias"、
    // "LINE1L"、 "线路输入"、
    // "LINE1R"、 "线路输入";
    //simple-audio-card、format ="DSP_B";
    simple-audio-card、format ="I2S";
    simple-audio-card、bitclock-master =<&sound0_master>;
    simple-audio-card、frame-master =<&sound0_master>;
    //simple-audio-card、bitclock-master =<&codec_test>;
    //simple-audio-card、frame-master =<&codec_test>;
    简单音频卡、位时钟反转;
    sound0_master:简单音频卡、CPU{
    Sound-Dai =<&mcasp8>;
    //system-clock-frequency =<11289600>;
    系统时钟频率=<24576000>;
    di-tdm-slot-width =<32>;
    };
    
    简单音频卡、编解码器{
    //sound-dai ="linux、snd-soc 虚拟";
    //#sound-di-cells =<0>;
    //sound-dai =<&tlv320aic3106>;
    时钟=<&ATL_clkin2_ck>;
    sound-dai =<&codec_test>;
    //#sound-di-cells =<0>;
    };
    }; 
    &ATL{
    分配的时钟=<&ABE_DPLL_SYS_clk_mux>、
    <&ATL_gfclk_mux>、
    <DPLL_AE_ck >、
    <DPLL_AEM2x2_ck >、
    &ATL_clkin1_ck>、
    <&ATL_clkin2_ck>;
    分配的时钟父级=<&sys_clkin2>、<&DPLL_AE_M2_ck>;
    //assigned clock 比率=<0>、<0>、<180633600>、<361267200>、
    // <11289600>、<11289600>;
    分配的时钟速率=<0>、<0>、<122880000>、<245760000>、
    <24576000>、<24576000>;
    
    状态="正常";
    
    atl2{
    BWS = ;
    AWS = ;
    };
    }; 

    现在我们探测 ACLKX 和 AFSX、但频率仍然不是我们想要的。
    ACLKX 的频率为1.25Mhz、AFSX 的频率为39.1KHz、如下图所示:

    我很好奇、为什么我们将系统时钟频率从<11289600>提高到<2457600>、但我们探测的频率却降低了?
    "系统时钟频率"与 ACLKX/AFSX 频率之间有何关系?


    此致、
    郭恩

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

    当 McASP 处于主控模式时、McASP CLKXDIV 由所需的 BCLK 速率(通道*时隙_width *速率)和 AHCLKX 速率计算得出。 sound0_master 节点中的 system-clock-frequency 属性对应于 AHCLKX 速率。 BCLK 速率由回放期间使用的参数决定。

    实际 BCLK (ACLKX)和 FSYNC (AFSX)速率由驱动器计算其内部 CLKXDIV 确定。 因此、即使在增加系统时钟频率属性后、如果驱动器使用更大的分频器、BCLK 也可能会降低。

    McASP8节点的"分配时钟"和"分配时钟父节点"属性是否分别设置为 McASP8 AHCLKX 和 ATL2。

    >I2S 以48kHz 采样率立体声24位格式运行、即 BCLK 应为3.072MHz。

    高于 BCLK 对应于:2 (立体声)* 48000 (速率)* 32位(时隙宽度)= 3.072MHz。 因此、请确保您的回放命令与这些参数相对应(即立体声、24位或32位、48kHz 的示例文件)。

    我认为接下来的步骤是:

    1. 检查 McASP8 AHCLKX 是否从 ATL2路由(请参阅"分配的时钟"和"分配的时钟父级"属性)
    2. 检查 ATL2、AHCLKX 的速率是否符合我们的预期(即 cat /d/clk/atl_clkin2_ck/clk_rate、cat /d/clk/mcasp3_ahclkx_mux/clk_rate)
    3. 在后台播放时获取'omapconf show mcasp8'的输出。 我们可以检查 McASP 时钟分频器的配置方式
    4. 仔细看一下 DaVinci_McASP_calc_clk_div()中时钟分频器的计算结果、了解具体参数。 您可能需要添加列印、以查看这些公式中的值是否为预期值
    5. 简单音频卡编解码器节点中的"时钟"属性可能有害、但也可能会将 ATL 时钟频率设置为其他内容(我不确定您使用的虚拟编解码器)。 请尝试将其删除。