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.

[参考译文] AM625:使用外部 AUDIO_EXT_REFCLK 作为主器件运行 MCASP

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

https://e2e.ti.com/support/audio-group/audio/f/audio-forum/1647482/am625-running-mcasp-as-master-with-external-audio_ext_refclk

器件型号: AM625

大约两个月前、我在 BeagleBone Black (AM335x) 上使用 McASP 成功播放了 4 通道音频。  但是、由于 BeagleBone 是一个较旧的平台、我现在正在尝试在 PocketBeagle2 (AM6254) 上实现相同的功能、以打造更现代且成本更低的系统。

我注意到的一点是、与 BeagleBone Black 不同、PocketBeagle2 似乎没有板载音频 X-TAL (24.576MHz)、因此音频时钟的生成方式似乎有所不同。

我能够使音频播放正常工作,但播放速度完全不正确 — 音频在大约 1 秒内完成、这使我怀疑 McASP 由不正确的 AUX 时钟源或意外的时钟配置运行。 (当我明确设置时钟内 simple-audio-card,cpu,所以我只保留) sound-dai=<&mcasp0>;

该主题非常有用:
https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1487650/am625-running-mcasp-as-master-with-external-audio_ext_refclk-of-24-576mhz

https://software-dl.ti.com/tisci/esd/latest/5_soc_doc/am62x/clocks.html#clocks-for-mcasp0-device

但是、即使检查时钟摘要并尝试几种调试方法后、似乎我的时钟配置仍未正确应用。

对于在作为主器件运行 McASP 时在 AM6254 上配置 McASP 音频时钟的正确方法有任何建议、我将不胜感激。

Results:
locofield@loco-adp:~$ aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: locofieldmcasp [locofield-mcasp], device 0: davinci-mcasp.0-a2b24xx-hifi a2b24xx.2-0068-0 [davinci-mcasp.0-a2b24xx-hifi a2b24xx.2-0068-0]
locofield@loco-adp:~$ speaker-test -c4 -r48000 -FS32_LE

speaker-test 1.2.14

Playback device is default
Stream parameters are 48000Hz, S32_LE, 4 channels
Using 16 octaves of pink noise
ALSA lib pcm_params.c:2235:(snd1_pcm_hw_refine_slave) Slave PCM not usable
Broken configuration for playback: no configurations available: Invalid argument
Setting of hwparams failed: Invalid argument
#include "k3-am6232-pocketbeagle2.dts"

/ {
	compatible = "beagle,am62-pocketbeagle2", "ti,am625";
	model = "BeagleBoard.org PocketBeagle2";

	sound {
		compatible = "simple-audio-card";
		simple-audio-card,name = "locofield-mcasp";
		simple-audio-card,format = "i2s";

		simple-audio-card,bitclock-master = <&dailink0_master>;
		simple-audio-card,frame-master = <&dailink0_master>;

		dailink0_master: simple-audio-card,cpu {
			sound-dai = <&mcasp0>;
		};

		simple-audio-card,codec {
			sound-dai = <&a2b24xx>;
		};
	};
};

...

&main_pmx0 {
	mcasp0_pins: mcasp0-default-pins {
		pinctrl-single,pins = <
			AM62X_IOPAD(0x1a0, PIN_INPUT, 2)  // P1.02 AUDIO EXT REFCLK0
			AM62X_IOPAD(0x1a4, PIN_OUTPUT, 0) // ACLKX
			AM62X_IOPAD(0x1a8, PIN_OUTPUT, 0) // AFSX
			AM62X_IOPAD(0x194, PIN_OUTPUT, 0) // AXR3
			AM62X_IOPAD(0x198, PIN_OUTPUT, 0) // AXR2
		>;
	};

...

&mcasp0 {
	status = "okay";
	#sound-dai-cells = <0>;

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

	op-mode = <0>;
	tdm-slots = <2>;
	slot-width = <32>;

	num-serializer = <4>;
	serial-dir = <0 0 1 1>;

	clocks = <&k3_clks 190 0>, <&k3_clks 190 15>;
	clock-names = "fck", "ahclkx";

	assigned-clocks = <&k3_clks 190 0>, <&k3_clks 190 15>;
	assigned-clock-parents = <&k3_clks 190 2>, <&k3_clks 190 18>;
	assigned-clock-rates = <0>, <6144000>;
};
locofield@loco-adp:~$ sudo k3conf dump clock2 190
|------------------------------------------------------------------------------------------------|
| VERSION INFO                                                                                   |
|------------------------------------------------------------------------------------------------|
| K3CONF           | (version 0.4-nogit built Thu Dec 04 20:24:55 UTC 2025)                      |
| SoC              | AM62X SR1.0                                                                 |
| SoC identifiers  | [0x3a247529] 0x1d123 Func-Safe Secure 'T' Grade -40 C to 125 C ALW Package  |
| SYSFW            | ABI: 4.0 (firmware version 0x000b '11.2.5--v11.02.05 (Fancy Rat))')         |
| DM ABI Info      | 3.0                                                                         |
| DM F/w rev       | 11.2.5                                                                      |
| DM Component rev | RM/PM HAL:'v11.02.05' SCI_SERV:'MSDK.11.02.00.11'                           |
| F/w Capabilities | 0x7b7: GEN DEEP_SLP MCU_ONLY PART_IO DM_MGD_LPM IO_ISO DM-SPLT              |
|------------------------------------------------------------------------------------------------|

|-----------------------------------------------------------------------------------------------------------------------------|
| Device ID | Clock ID | Clock Name                                                       | Status          | Clock Frequency |
|-----------------------------------------------------------------------------------------------------------------------------|
|   190     |     0    | DEV_MCASP0_AUX_CLK                                               | CLK_STATE_READY | 96000000        |
|   190     |     1    | DEV_MCASP0_AUX_CLK_PARENT_POSTDIV4_16FF_MAIN_2_HSDIVOUT8_CLK     | CLK_STATE_READY | 100000000       |
|   190     |     2    | DEV_MCASP0_AUX_CLK_PARENT_POSTDIV1_16FFT_MAIN_1_HSDIVOUT6_CLK    | CLK_STATE_READY | 96000000        |
|   190     |     3    | DEV_MCASP0_MCASP_ACLKR_PIN                                       | CLK_STATE_READY | 0               |
|   190     |     4    | DEV_MCASP0_MCASP_ACLKR_POUT                                      | CLK_STATE_READY | 0               |
|   190     |     5    | DEV_MCASP0_MCASP_ACLKX_PIN                                       | CLK_STATE_READY | 0               |
|   190     |     6    | DEV_MCASP0_MCASP_ACLKX_POUT                                      | CLK_STATE_READY | 0               |
|   190     |     7    | DEV_MCASP0_MCASP_AFSR_POUT                                       | CLK_STATE_READY | 0               |
|   190     |     8    | DEV_MCASP0_MCASP_AFSX_POUT                                       | CLK_STATE_READY | 0               |
|   190     |     9    | DEV_MCASP0_MCASP_AHCLKR_PIN                                      | CLK_STATE_READY | 0               |
|   190     |    10    | DEV_MCASP0_MCASP_AHCLKR_PIN_PARENT_BOARD_0_EXT_REFCLK1_OUT       | CLK_STATE_READY | 0               |
|   190     |    11    | DEV_MCASP0_MCASP_AHCLKR_PIN_PARENT_GLUELOGIC_HFOSC0_CLKOUT       | CLK_STATE_READY | 25000000        |
|   190     |    12    | DEV_MCASP0_MCASP_AHCLKR_PIN_PARENT_BOARD_0_AUDIO_EXT_REFCLK0_OUT | CLK_STATE_READY | 0               |
|   190     |    13    | DEV_MCASP0_MCASP_AHCLKR_PIN_PARENT_BOARD_0_AUDIO_EXT_REFCLK1_OUT | CLK_STATE_READY | 0               |
|   190     |    14    | DEV_MCASP0_MCASP_AHCLKR_POUT                                     | CLK_STATE_READY | 0               |
|   190     |    15    | DEV_MCASP0_MCASP_AHCLKX_PIN                                      | CLK_STATE_READY | 0               |
|   190     |    16    | DEV_MCASP0_MCASP_AHCLKX_PIN_PARENT_BOARD_0_EXT_REFCLK1_OUT       | CLK_STATE_READY | 0               |
|   190     |    17    | DEV_MCASP0_MCASP_AHCLKX_PIN_PARENT_GLUELOGIC_HFOSC0_CLKOUT       | CLK_STATE_READY | 25000000        |
|   190     |    18    | DEV_MCASP0_MCASP_AHCLKX_PIN_PARENT_BOARD_0_AUDIO_EXT_REFCLK0_OUT | CLK_STATE_READY | 0               |
|   190     |    19    | DEV_MCASP0_MCASP_AHCLKX_PIN_PARENT_BOARD_0_AUDIO_EXT_REFCLK1_OUT | CLK_STATE_READY | 0               |
|   190     |    20    | DEV_MCASP0_MCASP_AHCLKX_POUT                                     | CLK_STATE_READY | 0               |
|   190     |    21    | DEV_MCASP0_VBUSP_CLK                                             | CLK_STATE_READY | 250000000       |
|-----------------------------------------------------------------------------------------------------------------------------|

locofield@loco-adp:~$ cat /sys/kernel/debug/pinctrl/*/pinmux-pins | grep "mcasp"
pin 101 (PIN101): 2b00000.audio-controller (GPIO UNCLAIMED) function mcasp0-default-pins group mcasp0-default-pins
pin 102 (PIN102): 2b00000.audio-controller (GPIO UNCLAIMED) function mcasp0-default-pins group mcasp0-default-pins
pin 104 (PIN104): 2b00000.audio-controller (GPIO UNCLAIMED) function mcasp0-default-pins group mcasp0-default-pins
pin 105 (PIN105): 2b00000.audio-controller (GPIO UNCLAIMED) function mcasp0-default-pins group mcasp0-default-pins
pin 106 (PIN106): 2b00000.audio-controller (GPIO UNCLAIMED) function mcasp0-default-pins group mcasp0-default-pins
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Ko:
    不确定您是否查看过此应用手册: https://www.ti.com/lit/an/sdaa199/sdaa199.pdf 
    最后还有一些软件示例、如果他们提供帮助、请告诉我。

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

    如果有一个更完整的 DTS 示例、我认为会有所帮助。
    在本例中、我需要使用一个外部时钟作为 MCLK、然后对其进行分频以生成 BCLK。
    现在、根据这个示例、我认为将时钟配置与 McASP0 分开。

    下面是我更新后的示例:

    &main_pmx0 {
    	mcasp0_pins: mcasp0-default-pins {
    		pinctrl-single,pins = <
    			AM62X_IOPAD(0x1a4, PIN_OUTPUT, 0)
    			AM62X_IOPAD(0x1a8, PIN_OUTPUT, 0)
    			AM62X_IOPAD(0x194, PIN_OUTPUT, 0)
    			AM62X_IOPAD(0x198, PIN_OUTPUT, 0)
    		>;
    	};
    
    	ext_refclk0_pins: ext-refclk0-default-pins {
    		pinctrl-single,pins = <
    			AM62X_IOPAD(0x1a0, PIN_INPUT, 2)
    		>;
    	};
    	
    	...
    
    &mcasp0 {
    	status = "okay";
    	#sound-dai-cells = <0>;
    
    	pinctrl-names = "default";
    	pinctrl-0 = <&mcasp0_pins>;
    
    	op-mode = <0>;
    	tdm-slots = <2>;
    	slot-width = <32>;
    
    	num-serializer = <4>;
    	serial-dir = <0 0 1 1>;
    
    	assigned-clocks = <&k3_clks 190 9>, <&k3_clks 190 15>;
    	assigned-clock-parents = <&k3_clks 190 12>, <&k3_clks 190 18>;
    	assigned-clock-rates = <6144000>, <6144000>;
    };
    
    &audio_refclk0 {
        pinctrl-names = "default";
        pinctrl-0 = <&ext_refclk0_pins>;
    
        assigned-clocks = <&k3_clks 157 9>;
        assigned-clock-parents = <>;
    };

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

    您好、Ko:

    使用 AUXCLK 时、您是否在器件树中添加了 system-clock-direction-out;在此处将 MCASP 设置为 dailink 主站。

    此外、如果您计划在音频外部 REFCLK 上提供外部时钟、您是否可以共享这些更改、以便在 MCASP 上将该时钟 (6.144MHz) 路由为 AHCLKX?

    此致、

    Suren  

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

    你好 Suren!!

    speaker-test 添加 mclk-fs 属性后、错误已解决。

    然而,它仍然似乎不是从我提供的时钟运行 audio_ext_clk0.
    实际上、根据时钟摘要、McASP 仍从 100MHz 源获取时钟 (clk:157:8) 并将其分频。

    如果我的理解正确,当我断开提供给的外部时钟时 refclk0,应该不再生成 BCLK。
    但是、即使在断开外部时钟后、仍会生成 BCLK、因此我怀疑 McASP 实际上并未 refclk0 用作其时钟源。

    我的系统设计应低于:(期望)

    6.144MHz -->音频外部 Refclk0 (E18)
    AHCLKX(内部)= 6.144MHz
    ACLKX (B20)= 3.072MHz (32 位* 2 通道* 48000Hz)
    AFSX
    AXR2 和 AXR3 作为输出(两个占空比为 50%的串行器)

    您能告诉我以下器件树出了什么问题吗?

    / {
    	compatible = "beagle,am62-pocketbeagle2", "ti,am625";
    	model = "BeagleBoard.org PocketBeagle2";
    
    	sound {
    		compatible = "simple-audio-card";
    		simple-audio-card,name = "locofield-mcasp";
    		simple-audio-card,format = "i2s";
    
    		simple-audio-card,mclk-fs = <128>;
    
    		simple-audio-card,bitclock-master = <&dailink0_master>;
    		simple-audio-card,frame-master = <&dailink0_master>;
    
    		dailink0_master: simple-audio-card,cpu {
    			sound-dai = <&mcasp0>;
    		};
    
    		simple-audio-card,codec {
    			sound-dai = <&a2b24xx>;
    		};
    	};
    };
    
    &main_pmx0 {
    	mcasp0_pins: mcasp0-default-pins {
    		pinctrl-single,pins = <
    			AM62X_IOPAD(0x1a4, PIN_OUTPUT, 0)
    			AM62X_IOPAD(0x1a8, PIN_OUTPUT, 0)
    			AM62X_IOPAD(0x194, PIN_OUTPUT, 0)
    			AM62X_IOPAD(0x198, PIN_OUTPUT, 0)
    		>;
    	};
    
    	ext_refclk0_pins: ext-refclk0-default-pins {
    		pinctrl-single,pins = <
    			AM62X_IOPAD(0x1a0, PIN_INPUT, 2)
    		>;
    	};

    &mcasp0 {
    	status = "okay";
    	#sound-dai-cells = <0>;
    
    	pinctrl-names = "default";
    	pinctrl-0 = <&mcasp0_pins>;
    
    	op-mode = <0>;
    	tdm-slots = <2>;
    	slot-width = <32>;
    
    	num-serializer = <4>;
    	serial-dir = <0 0 1 1>;
    
    	clocks = <&k3_clks 190 9>;
    
    	assigned-clocks = <&k3_clks 190 9>, <&k3_clks 190 15>;
    	assigned-clock-parents = <&k3_clks 190 12>, <&k3_clks 190 18>;
    	assigned-clock-rates = <6144000>, <6144000>;
    };
    
    &audio_refclk0 {
    	pinctrl-names = "default";
    	pinctrl-0 = <&ext_refclk0_pins>;
    
    	clocks = <&k3_clks 157 0>;
    
    	assigned-clocks = <&k3_clks 157 0>;
    	/delete-property/ assigned-clock-parents; // << not worked!!
    	assigned-clock-rates = <6144000>;
    };

    现在、生成的 BCLK 频率是完全正确的 7874015 / 2

    locofield@loco-adp:~$ sudo cat /sys/kernel/debug/clk/clk_summary | grep clk:157
     clk:157:18                          0       0        0        100000000   0          0     50000      Y   deviceless                      no_connection_id 
        clk:157:10                       0       0        0        100000000   0          0     50000      Y      deviceless                      no_connection_id
           audio_refclk:clk:157:10       0       0        0        100000000   0          0     50000      N         deviceless                      no_connection_id
     clk:157:8                           0       0        0        100000000   0          0     50000      Y   deviceless                      no_connection_id 
        clk:157:0                        0       0        0        7874015     0          0     50000      Y      deviceless                      no_connection_id
           audio_refclk:clk:157:0        0       0        0        7874015     0          0     50000      N         deviceless                      no_connection_id

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

    您好、Ko:

    您能否查看以下主题、帮助客户使用 Audio_external_REFCLK 来实现播放功能。

     AM62P:AXR0 上仅 McASP 数据流 

    您是否修改了器件树中的 AUDIO_refclk0 节点?

    此致

    Suren

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

    谢谢、Suren。

    我仍然不明白为什么 McASP 时钟一直源自 clk:157:8

    locofield@loco-adp:~$ sudo cat /sys/kernel/debug/clk/clk_summary | grep clk:157
     clk:157:9                           0       0        0        0           0          0     50000      Y   deviceless                      no_connection_id 
     clk:157:8                           0       0        0        100000000   0          0     50000      Y   deviceless                      no_connection_id 
        clk:157:0                        0       0        0        7874015     0          0     50000      Y      deviceless                      no_connection_id
           audio_refclk:clk:157:0        0       0        0        7874015     0          0     50000      N         simple-audio-card,codec         no_connection_id

    &main_pmx0 {
    	mcasp0_pins: mcasp0-default-pins {
    		pinctrl-single,pins = <
    			AM62X_IOPAD(0x1a4, PIN_OUTPUT, 0)
    			AM62X_IOPAD(0x1a8, PIN_OUTPUT, 0)
    			AM62X_IOPAD(0x194, PIN_OUTPUT, 0)
    			AM62X_IOPAD(0x198, PIN_OUTPUT, 0)
    		>;
    	};
    
    	ext_refclk0_pins: ext-refclk0-default-pins {
    		pinctrl-single,pins = <
    			AM62X_IOPAD(0x1a0, PIN_INPUT, 2) // AUDIO EXT REFCLK0
    		>;
    	};
    	
    	...
    	
    &mcasp0 {
    	status = "okay";
    	#sound-dai-cells = <0>;
    
    	pinctrl-names = "default";
    	pinctrl-0 = <&mcasp0_pins>;
    
    	op-mode = <0>;
    	tdm-slots = <2>;
    	slot-width = <32>;
    
    	num-serializer = <4>;
    	serial-dir = <0 0 1 1>;
    
    	clocks = <&k3_clks 190 15>;
    
    	assigned-clocks = <&k3_clks 190 15>;
    	assigned-clock-parents = <&k3_clks 190 18>;
    	assigned-clock-rates = <6144000>;
    };
    
    &audio_refclk0 {
    	pinctrl-names = "default";
    	pinctrl-0 = <&ext_refclk0_pins>;
    
    	clocks = <&k3_clks 157 0>;
    
    	assigned-clocks = <&k3_clks 157 0>;
    	assigned-clock-parents = <&k3_clks 157 9>;
    	assigned-clock-rates = <6144000>;
    };
    
    &audio_refclk1 {
    	status = "disabled";
    };

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

    您好、Ko:
    Suren 目前到明天、请期待收到延迟的回复。

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

    尊敬的 Suren 和 Divyansh:

    我最终放弃使用 audio_ext_refclk 作为 MCLK (AHCLKX) 源。

    相反、我直接将时钟提供给 ACLKX、并将 McASP 配置为输出 AFSXAXR2AXR3
    该配置现在可以正常工作。

    非常感谢您的帮助!