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.

[参考译文] AM6442:AM64x:了解定制板上的 EHRPWM_SOCA 与物理引脚输出和 40MHz 要求。

Guru**** 2908220 points

Other Parts Discussed in Thread: AM625, AM6442

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/1638936/am6442-am64x-understanding-ehrpwm_soca-vs-physical-pin-output-and-40-mhz-requirement-on-custom-board

器件型号: AM6442
主题中讨论的其他器件: AM625

尊敬的 TI 团队:

我正在 使用 RT- Linux SDK 来开发基于 AM64x 的定制电路板、但对 ePWM 配置、引脚可用性和 EHRPWM_SOCA 使用情况有疑问

在 SoC 级 DTSI (main dtsi) 中、我看到 定义并启用了 ePWM 实例 EPWM0 到 EPWM8。 在 TI EVM 板上测试相同的软件后、我能够成功配置和运行 ePWM 模块。

然而、在我的 定制电路板上、只有有限数量的引脚被路由出去、并且 没有 EPWM0 到 EPWM8 的引脚在物理上可用

我的要求如下:

  • 我需要使用 EHRPWM_SOCA。
  • 信号频率要求是 ~40MHz  
  • 与 ePWM 输出类似、我最初希望将其驱动为引脚信号

定制 电路板 引脚

image.png

TRM AM64x SitaraTm 处理器

image.png

 

我们可以使用 EHRPWM_SOCA 来驱动 40MHz 外部信号吗?

此致、
Ravilla Dinesh。

 

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

    尊敬的 Ravilla:

    [引述 userid=“649949“ url=“~/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/1638936/am6442-am64x-understanding-ehrpwm_soca-vs-physical-pin-output-and-40-mhz-requirement-on-custom-board
    • 我需要使用 EHRPWM_SOCA。
    [/报价]

    这是必须的吗?

    请检查您是否可以在同一引脚(多路复用器 3)上使用 SYSCLKOUT0、该引脚将输出一个干净的 PLL 衍生时钟。

    此致、
    Vinu

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

    您好的团队、

    请检查您是否可以在同一引脚(多路复用器 3)上使用 SYSCLKOUT0、该引脚将输出一个干净的 PLL 衍生时钟。

    根据您的输入、更改了引脚配置。


    引脚配置:
    main_ehrpwm_SOCA_pins_default:main-ehrpwm-SOCA-pins-default{
       pinctrl-single、pins =<
         AM64X_IOPAD (0x0058、PIN_OUTPUT、3)/* C17、模式 3:EHRPWM_SOCA */
        >;
      };

    外设配置:

    &epwm0{
      pinctrl-names =“default“;
      pinctrl-0 =<&MAIN_ehrpwm_SOCA_pins_default>; /* main_epwm0_pins_default */
      状态=“正常“;
    };

    内核端:
    root@am64xx-EVM:~# echo 0 >/sys/class/pwm/pwmchip1/export
    root@am64xx-EVM:~# echo 50 >/sys/class/pwm/pwmchip1/pwm0/period
    root@am64xx-EVM:~# echo 25 >/sys/class/pwm/pwmchip1/pwm0/duty_cycle
    root@am64xx-EVM:~# echo 1 >/sys/class/pwm/pwmchip1/pwm0/enable

    但引脚在 40MHz 下不会进行驱动。

    此致、
    Ravilla Dinesh。

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

    尊敬的 Ravilla:

    SYSCLKOUT0 不是 ePWM 引脚。

    如前所述、请使用 PLL 衍生时钟对其进行配置。

       有关类似问题、请参阅 AM625:CLKOUT0 的 50MHz 输出。

    此致、
    Vinu  

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

    尊敬的 Vinu:

    我正在使用 Processor SDK Linux RT 09.02 来设计 AM64x (AM642 EVM)。

    我正在尝试配置 SYSCLKOUT0(在 clk:119 clk_summary 中观察到)。


    Pinmux 配置:
    clkout0_pins_default:clkout0-default-pins{
          pinctrl-single、pins =<
            AM64X_IOPAD (0x0258、PIN_OUTPUT、3)/*(C17) SYSCLKOUT0 */
          >;
       };

    /{
      clkout0_ref:clkout0-ref-clk{
        Compatible =“simple-pm-bus“;   /*←TI E2E 的关键修复*/
        #address-cells =<1>;
        #size-cells =<1>;
        范围;

        分配的时钟     =<&K3_CLKS 119 0>;
        assigned-clock-parament=<&k3_CLKS 119 1>;
        分配的时钟速率  =<40000000>;

        pinctrl-names =“default“;
        pinctrl-0   =<&clkout0_pins_default>;
      };
    };

    时钟摘要输出:
    root@am64xx-EVM:~# cat /sys/kernel/debug/clk/clk_summary | grep “clk:119“
     CLK:119:1               0     0     0       0         0 0 50000      y
     CLK:119:0               0     0     0       0         0 0 50000      y

    此致、
    Ravilla Dinesh。

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

    尊敬的 Ravilla:

    我假设您仍然未获得所需的频率。

    您能告诉我您是如何到达设备 119 的吗?

    深入研究该问题后、很难使用 SYSCLKOUT0 生成 40MHz。 您可以使用该子系统生成 50MHz 或 25MHz。

    SYSCLKOUT0 不够灵活、如果您需要生成 40MHz 的频率、则必须 对 MAIN_0 PLL HSDIV4 分频器进行重新编程、这种情况不太可能发生、因为它会影响 正在使用它的其他外设。

    您必须使用以下任一父时钟。

    • 123 (DEV_BOARD0_CLKOUT0_IN):输入多路复用时钟。
    • 124 (_parent_HSDIV4_16FFT_MAIN_0_HSDIVOUT4_CLK5):父选项 1。
    • 125 (_parent_HSDIV4_16fft_main_0_HSDIVOUT4_CLK10):父选项 2。

    如果您可以访问 18 个可配置 EPWM 引脚中的任何一个、则生成 40MHz 频率的理想选择是使用 EPWM 本身。

    下一个最佳选择是在 C17 上使用 TIMER_IO4。 但是、由于内部功能时钟为 250MHz、没有整数除数、可以完全产生 80MHz 的频率(计时器需要在 80MHz 下切换:一个用于上升沿,一个用于下降沿)

    此外、与 CLKOUT0(在时钟框架启用后立即输出时钟)不同、DMTimer 必须由软件显式启动。 有关更多信息、请参阅 https://software-dl.ti.com/processor-sdk-linux/esd/AM64X/latest/exports/docs/linux/Foundational_Components /内核/ Kernel_Drivers / DM-Timer.html

    此致、
    Vinu

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

    尊敬的 Vinu:

    您必须使用以下任一父时钟。

    [123 (DEV_BOARD0_CLKOUT0_IN):输入多路复用时钟。]

    • 124 (_parent_HSDIV4_16FFT_MAIN_0_HSDIVOUT4_CLK5):父选项 1。
    • 125 (_parent_HSDIV4_16fft_main_0_HSDIVOUT4_CLK10):父选项 2。

    给出了 am6442 (k3-am642-evm.dts) 的一些参考配置示例。

    此致、

    Ravilla Dinesh。

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

    尊敬的 Ravilla:

    给出一些 am6442 的参考配置示例 (k3-am642-evm.dts)。
    [/报价]

    请参阅我之前分享的 AM625 线程、只需更改父时钟和引脚控制。 (AM625:CLKOUT0 的 50MHz 输出) 

    但请记住、您可以获得 50MHz 或 25MHz、而不是 40MHz。

    此致、
    Vinu

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

    尊敬的 Vinu:

    调整系统设置。

    引脚配置:

    clkout0_pins_default:clkout0-default-pins{
          pinctrl-single、pins =<
            AM64X_IOPAD (0x0258、PIN_OUTPUT、3)/*(C17) SYSCLKOUT0 */
          >;
       };


    /{
      clkout0_ref:clkout0-ref-clk{
        compatible  =“simple-pm-bus“;
        #clock-cells =<0>;

        有用          =<&K3_CLKS 123 0>;
        分配的时钟     =<&K3_CLKS 123 0>;
        assigned-clock-parter =<&k3_CLKS 125 2>;   
        分配的时钟速率  =<25000000>;

        pinctrl-names =“default“;
        pinctrl-0   =<&clkout0_pins_default>;
      };
    };

    root@am64xx-EVM:~# cat /sys/kernel/debug/clk/clk_summary | grep -E “clk:12[0-5]“
     CLK:125:4               0     0     0    32552         0 0 50000      y
     CLK:125:3               0     0     0  12500000         0 0 50000      y
     CLK:125:2               0     0     0    29761         0 0 50000      y
      CLK:125:0              0     0     0    29761         0 0 50000      y
     CLK:125:1               0     0     025000000           0 0 50000      y
     CLK:123:0               0     0     025000000           0 0 50000      y


    assigned-clock-rates 从 25MHz→50MHz 变化会正确反映在中 /sys/kernel/debug/clk/clk_summary.


    /{
      clkout0_ref:clkout0-ref-clk{
        compatible  =“simple-pm-bus“;
        #clock-cells =<0>;

        有用          =<&K3_CLKS 123 0>;
        分配的时钟     =<&K3_CLKS 123 0>;
        assigned-clock-parter =<&k3_CLKS 125 2>;   
        分配的时钟速率  =<50000000>;

        pinctrl-names =“default“;
        pinctrl-0   =<&clkout0_pins_default>;
      };
    };

    root@am64xx-EVM:~# cat /sys/kernel/debug/clk/clk_summary | grep -E “clk:12[0-5]“
     CLK:125:4               0     0     0    32552         0 0 50000      y
     CLK:125:3               0     0     0  12500000         0 0 50000      y
     CLK:125:2               0     0     0    29761         0 0 50000      y
      CLK:125:0              0     0     0    29761         0 0 50000      y
     CLK:125:1               0     0     025000000           0 0 50000      y
     CLK:123:0               0     0     050000000           0 0 50000      y

    其他意见:

    • 但物理输出保持固定在~125MHz
    • 使用的父时钟: clk:125:2

    问题:

    然而、在 使用示波器探测 SYSCLKOUT0 (C17) 引脚时、我始终观察到 125MHz 输出、而不是 50MHz。



    此致、
    Ravilla Dinesh


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

    尊敬的 Ravilla:

    您能否分享完整的解析 DTS 和时钟摘要?

    此致、
    Vinu

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

    尊敬的 Ravilla:

    您的 DT 节点格式错误。

    请参阅 AM64X 时钟标识符: https://software-dl.ti.com/tisci/esd/latest/5_soc_doc/am64x/clocks.html

    [引述 userid=“649949“ url=“~/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/1638936/am6442-am64x-understanding-ehrpwm_soca-vs-physical-pin-output-and-40-mhz-requirement-on-custom-board/6328065     有用          =<&K3_CLKS 123 0>;
    [/报价]

    这是对 k3_CLKS 绑定工作原理的误解。
    引用 TI SCI 时钟的正确格式为 <&K3_CLKS DEVICE_ID CLOCK_ID>。

    对于 AM64X、CLKOUT0 属于器件 157 (BOARD0)、而不是器件 123。

    请尝试以下 DT 节点

    clkout0_pins_default: clkout0-default-pins {
                pinctrl-single,pins = <
                    AM64X_IOPAD(0x0258, PIN_OUTPUT, 3) /* (C17) SYSCLKOUT0 */
                >;
          };
    
    
    / {
        clkout0_ref: clkout0-ref-clk {
            compatible    = "simple-pm-bus";
            #clock-cells  = <0>;
            
             /* 
             * Device 157 = BOARD_0
             * Clock 123  = CLKOUT0 Mux
             * Clock 125  = 25 MHz Parent from MAIN_0 PLL
             */
            
            assigned-clocks        = <&k3_clks 157 123>;
            assigned-clock-parents = <&k3_clks 157 125>;  
    
            pinctrl-names = "default";
            pinctrl-0     = <&clkout0_pins_default>;
        };
    };

    此致、
    Vinu

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

    尊敬的 Vinu:

    调整系统设置。

    124 (_parent_HSDIV4_16FFT_MAIN_0_HSDIVOUT4_CLK5)。

    clkout0_pins_default:clkout0-default-pins{
          pinctrl-single、pins =<
             AM64X_IOPAD (0x0258、PIN_OUTPUT、3)/*(C17) SYSCLKOUT0 */
          >;
       };

    /{
      clkout0_ref:clkout0-ref-clk{
        compatible  =“simple-bus“;   /* was simple-pm-bus—修复探针*/
        #address-cells =<1>;        /*简单总线需要*/
        #size-cells  =<1>;        /*简单总线需要*/
        范围;

        /*
         *设备 157= BOARD0
         *时钟 123 = DEV_BOARD0_CLKOUT0_IN(多路复用器)
         *时钟 124 = HSDIV4_16FFT_MAIN_0_HSDIVOUT4_CLK5 -> 50MHz
         *时钟 125 = HSDIV4_16FFT_MAIN_0_HSDIVOUT4_CLK10 -> 25MHz
         */
        分配的时钟     =<&K3_CLKS 157 123>;
        assigned-clock-paraments =<&K3_CLKS 157 124>;  /* 50MHz */

        pinctrl-names =“default“;
        pinctrl-0   =<&clkout0_pins_default>;
      };
    };

    root@am64xx-evm:~# cat /sys/kernel/debug/pinctrl */ pins 2>/dev/null | grep “0258“
    引脚 150 (PIN150) 0:? a40258 00000000 pinctrl-single  
    root@am64xx-EVM:~# cat /sys/kernel/debug/clk/clk_summary | grep “157“
     CLK:157:125              0     0     025000000           0 0 50000      y
     CLK:157:124              0     0     050000000           0 0 50000      y
      CLK:157:123             0     0     050000000           0 0 50000      y

    125 (_parent_HSDIV4_16FFT_MAIN_0_HSDIVOUT4_CLK10)

    &main_pmx0{
      clkout0_pins_default:clkout0-default-pins{
        pinctrl-single、pins =<
          AM64X_IOPAD (0x0258、PIN_OUTPUT、3)/*(C17) SYSCLKOUT0 */
        >;
      };
    };

    /{
      clkout0_ref:clkout0-ref-clk{
        compatible  =“simple-pm-bus“;
        #clock-cells =<0>;
         
         /*  
         *设备 157= Board_0
         *时钟 123 = CLKOUT0 多路复用器
         *时钟 125 =来自 MAIN_0 PLL 的 25MHz 父级
         */
         
        分配的时钟     =<&K3_CLKS 157 123>;
        assigned-clock-parter =<&K3_CLKS 157 125>;   

        pinctrl-names =“default“;
        pinctrl-0   =<&clkout0_pins_default>;
      };
    };

    root@am64xx-evm:~# cat /sys/kernel/debug/pinctrl */ pins 2>/dev/null | grep “0258“
    引脚 150 (PIN150) 0:? a40258 00000000 pinctrl-single  
    root@am64xx-EVM:~# cat /sys/kernel/debug/clk/clk_summary | grep “157“
     CLK:157:125              0     0     025000000           0 0 50000      y
      CLK:157:123             0     0     025000000           0 0 50000      y
     CLK:157:124              0     0     050000000           0 0 50000      y


    问题:

    然而、在 使用示波器探测 SYSCLKOUT0 (C17) 引脚时、我始终观察到 125MHz 输出、而不是 50MHz。


    此致、
    Ravilla Dinesh。


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

    尊敬的 Ravilla:

    该波形看起来不像正确的 125MHz 信号。 它看起来更像是一个噪声。

    看一下时钟摘要、时钟未启用。  

    root@am64xx-EVM:~# cat /sys/kernel/debug/clk/clk_summary | grep “157“
     CLK:157:125              0    0     025000000           0 0 50000      y
     CLK:157:124              0    0     050000000           0 0 50000      y
      CLK:157:123             0    0     050000000           0 0 50000      y

    为什么 兼容的 simple-pm-bus 被 simple-bus 取代?

    此外、使用 simple-pm-bus 时、需要 clocks 属性来启用它。

    我将共享一个已校正的 DT 节点和丢失的时钟参数以启用时钟

    clkout0_pins_default: clkout0-default-pins {
                pinctrl-single,pins = <
                    AM64X_IOPAD(0x0258, PIN_OUTPUT, 3) /* (C17) SYSCLKOUT0 */
                >;
          };
    
    
    / {
        clkout0_ref: clkout0-ref-clk {
            compatible    = "simple-pm-bus";
            #clock-cells  = <0>;
            
             /* 
             * Device 157 = BOARD_0
             * Clock 123  = CLKOUT0 Mux
             * Clock 125  = 25 MHz Parent from MAIN_0 PLL
             */
             
            /* To enable clock on probe */
            clocks = <&k3_clks 157 123>;
            
            /* To configures the mux parent */
            assigned-clocks        = <&k3_clks 157 123>;
            assigned-clock-parents = <&k3_clks 157 125>;  /* 25 Mhz */
    
            pinctrl-names = "default";
            pinctrl-0     = <&clkout0_pins_default>;
        };
    };

    如果仍然未启用、您可以尝试通过 debugfs 强制启用它进行验证。

    # Force-enable
    echo 1 > /sys/kernel/debug/clk/clk:157:123/clk_enable_count
    
    # Verify
    cat /sys/kernel/debug/clk/clk_summary | grep "157:123"

    此致、
    Vinu

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

    尊敬的 Vinu:

    调整系统设置。

    clkout0_pins_default:clkout0-default-pins{
          pinctrl-single、pins =<
            AM64X_IOPAD (0x0258、PIN_OUTPUT、3)/*(C17) SYSCLKOUT0 */
          >;
       };

    /{
      clkout0_ref:clkout0-ref-clk{
        compatible  =“simple-pm-bus“;
        #clock-cells =<0>;
         
         /*  
         *设备 157= Board_0
         *时钟 123 = CLKOUT0 多路复用器
         *时钟 125 =来自 MAIN_0 PLL 的 25MHz 父级
         */
         
        /*启用探针上的时钟*/
        Clocks =<&K3_CLKS 157 123>;
         
        /*以配置多路复用器父级*/
        分配的时钟     =<&K3_CLKS 157 123>;
        assigned-clock-paraments =<&K3_CLKS 157 125>; /* 25MHz */

        pinctrl-names =“default“;
        pinctrl-0   =<&clkout0_pins_default>;
      };
    };

    输出:
    root@am64xx-EVM:~# cat /sys/kernel/debug/clk/clk_summary | grep “157“
     CLK:157:125              0     0     025000000           0 0 50000      y
      CLK:157:123             0     0     025000000           0 0 50000      y
     CLK:157:124              0     0     050000000           0 0 50000      y
    root@am64xx-EVM:~# cat /sys/kernel/debug/clk/clk_summary | grep “157:123“
      CLK:157:123             0     0     025000000           0 0 50000      y
    root@am64xx-EVM:~# echo 1 >/sys/kernel/debug/clk/clk:157:123/clk_enable_count
    -sh:回显:写入错误:权限被拒绝

    然而、在 使用示波器探测 SYSCLKOUT0 (C17) 引脚时、我始终观察到 125MHz 输出、而不是 25MHz。

    此致、
    Ravilla Dinesh。

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

    嗨、Ravillla、

    与 AM62x 不同、时钟看起来再次被禁用。

    我会尝试从我的结束,并在本周结束时回到你身边。

    此致、
    Vinu

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

    尊敬的 Ravilla:

    我编写了一个简单的时钟驱动程序来阻止时钟被禁用。

    我必须对 DT 打补丁、因为 CLOCKOUT0 (C17) 引脚与 MCAN1 冲突。 兼容字符串也会更改。

    DT 补丁

    diff --git a/board-support/ti-linux-kernel-6.18.13+git-ti-rt/arch/arm64/boot/dts/ti/k3-am642-evm.dts b/board-support/ti-linux-kernel-6.18.13+git-ti-rt/arch/arm64/boot/dts/ti/k3-am642-evm.dts
    index 1267ab0f7..68b5bd3e5 100644
    --- a/board-support/ti-linux-kernel-6.18.13+git-ti-rt/arch/arm64/boot/dts/ti/k3-am642-evm.dts
    +++ b/board-support/ti-linux-kernel-6.18.13+git-ti-rt/arch/arm64/boot/dts/ti/k3-am642-evm.dts
    @@ -248,9 +248,38 @@ icssg1_emac1: port@1 {
     			};
     		};
     	};
    +
    +	 clkout0_ref: clkout0-ref-clk {
    +        compatible    = "custom,clkout0-enabler";
    +        
    +         /* 
    +         * Device 157 = BOARD_0
    +         * Clock 123  = CLKOUT0 Mux
    +         * Clock 125  = 25 MHz Parent from MAIN_0 PLL
    +         */
    +         
    +        /* To enable clock on probe */
    +        clocks = <&k3_clks 157 123>;
    +        
    +        /* To configures the mux parent */
    +        assigned-clocks        = <&k3_clks 157 123>;
    +        assigned-clock-parents = <&k3_clks 157 125>;  /* 25 Mhz */
    +
    +        pinctrl-names = "default";
    +        pinctrl-0     = <&clkout0_pins_default>;
    +    };
    +
    +
     };
     
     &main_pmx0 {
    +
    +	clkout0_pins_default: clkout0-default-pins {
    +        pinctrl-single,pins = <
    +            AM64X_IOPAD(0x0258, PIN_OUTPUT_PULLUP, 3) /* (C17) SYSCLKOUT0 */
    +        >;
    +    };
    +
     	main_mmc1_pins_default: main-mmc1-default-pins {
     		pinctrl-single,pins = <
     			AM64X_IOPAD(0x0294, PIN_INPUT_PULLUP, 0) /* (J19) MMC1_CMD */
    @@ -389,13 +418,6 @@ AM64X_IOPAD(0x0250, PIN_OUTPUT, 0) /* (A17) MCAN0_TX */
     		>;
     	};
     
    -	main_mcan1_pins_default: main-mcan1-default-pins {
    -		pinctrl-single,pins = <
    -			AM64X_IOPAD(0x025c, PIN_INPUT, 0) /* (D17) MCAN1_RX */
    -			AM64X_IOPAD(0x0258, PIN_OUTPUT, 0) /* (C17) MCAN1_TX */
    -		>;
    -	};
    -
     	ddr_vtt_pins_default: ddr-vtt-default-pins {
     		bootph-all;
     		pinctrl-single,pins = <
    @@ -723,10 +745,7 @@ &main_mcan0 {
     };
     
     &main_mcan1 {
    -	status = "okay";
    -	pinctrl-names = "default";
    -	pinctrl-0 = <&main_mcan1_pins_default>;
    -	phys = <&transceiver2>;
    +	status = "disabled";
     };
     
     &icssg1_mdio {

    simple_clock_enable.c

    #include <linux/module.h>
    #include <linux/platform_device.h>
    #include <linux/clk.h>
    #include <linux/of.h>
    #include <linux/of_device.h>
    
    struct clkout0_priv {
        struct clk *clk;
    };
    
    static int clkout0_probe(struct platform_device *pdev)
    {
        struct clkout0_priv *priv;
        int ret;
    
        priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
        if (!priv)
            return -ENOMEM;
    
        priv->clk = devm_clk_get(&pdev->dev, NULL);
        if (IS_ERR(priv->clk)) {
            dev_err(&pdev->dev, "Failed to get clock\n");
            return PTR_ERR(priv->clk);
        }
    
        ret = clk_prepare_enable(priv->clk);
        if (ret) {
            dev_err(&pdev->dev, "Failed to enable clock\n");
            return ret;
        }
    
        platform_set_drvdata(pdev, priv);
        dev_info(&pdev->dev, "CLKOUT0 successfully enabled!\n");
    
        return 0;
    }
    
    static void clkout0_remove(struct platform_device *pdev)
    {
        struct clkout0_priv *priv = platform_get_drvdata(pdev);
        clk_disable_unprepare(priv->clk);
    }
    
    static const struct of_device_id clkout0_of_match[] = {
        { .compatible = "custom,clkout0-enabler", },
        { }
    };
    MODULE_DEVICE_TABLE(of, clkout0_of_match);
    
    static struct platform_driver clkout0_driver = {
        .probe = clkout0_probe,
        .remove = clkout0_remove,
        .driver = {
            .name = "clkout0-enabler",
            .of_match_table = clkout0_of_match,
        },
    };
    
    module_platform_driver(clkout0_driver);
    
    MODULE_AUTHOR("TI");
    MODULE_DESCRIPTION("Simple clock enable driver for AM64x CLKOUT0");
    MODULE_LICENSE("GPL");
    MODULE_VERSION("0.01");

    Makefile

    e2e.ti.com/.../8473.Makefile.txt

     在构建内核模块之前、必须导出 SDK_INSTALL_DIR。

    插入模块后将启用时钟。

    包含时钟摘要之前和之后的日志

    root@am64xx-evm:~# cat /sys/kernel/debug/clk/clk_summary | grep 157
     clk:157:125                         0       0        0        25000000    0          0     50000      Y   deviceless                      no_connection_id         
     clk:157:124                         0       0        0        50000000    0          0     50000      Y   deviceless                      no_connection_id         
        clk:157:123                      0       0        0        50000000    0          0     50000      Y      deviceless                      no_connection_id         
    root@am64xx-evm:~# insmod ../home/simple_clock_enabler.ko 
    [   68.213229] simple_clock_enabler: loading out-of-tree module taints kernel.
    [   68.215600] clkout0-enabler clkout0-ref-clk: CLKOUT0 successfully enabled!
    root@am64xx-evm:~# cat /sys/kernel/debug/clk/clk_summary | grep 157
     clk:157:125                         1       1        0        25000000    0          0     50000      Y   deviceless                      no_connection_id         
        clk:157:123                      1       1        0        25000000    0          0     50000      Y      clkout0-ref-clk                 no_connection_id         
     clk:157:124                         0       0        0        50000000    0          0     50000      Y   deviceless                      no_connection_id         
    root@am64xx-evm:~# 

    我无法探测引脚。 请从您的端开始尝试

    此致、
    Vinu

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

    尊敬的 Vinu:

    根据您的输入、我启用了时钟。 在探测期间、引脚在 125MHz 处驱动。

    root@am64xx-EVM:~# cat /sys/kernel/debug/clk/clk_summary | grep 157.
    CLK:157:125 0 0 0 25000000 0 50000 Y
    CLK:157:124 0 0 0 50000000 0 50000 Y
    CLK:157:123 0 0 0 50000000 0 50000 Y
    root@am64xx-EVM:~# insmod /home/root/simple_clock_enabler.ko
    [56.374130] clkout0-enable clkout0-ref-clk:已成功启用 CLKOUT0!
    root@am64xx-EVM:~# cat /sys/kernel/debug/clk/clk_summary | grep 157.
    CLK:157:125 1 0 25000000 0 50000 Y
    CLK:157:123 1 0 25000000 0 50000 Y
    CLK:157:124 0 0 0 50000000 0 50000 Y

    将 SS 连接到底部以供参考。


    此致、

    Ravilla Dinesh

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

    尊敬的 Ravilla:

    您能否尝试将引脚 C17 设为 GPIO 并查看是否能够切换引脚?  

    这将有助于验证硬件连接。

    在 SW 侧、所有需要的工作都已完成。 时钟摘要显示了正确的频率、此时钟已启用。

    检查 SW 侧是否需要其他任何元件。 但请确保硬件连接正确。

    此外、请确保设备树中没有任何冲突。 如果可能、共享解析的 DT。

    此致、
    Vinu

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

    尊敬的 Vinu:

    您能否尝试将引脚 C17 设为 GPIO 并查看是否能够切换引脚?  

    通过将引脚配置为 GPIO 来验证引脚功能。
    GPIO 切换正常工作、引脚按预期驱动高电平和低电平。
    这样可确认焊盘配置和硬件连接正常。

    root@am64xx-EVM:~# gpioset gpiochip1 62=0
    root@am64xx-EVM:~# gpioset gpiochip1 62=1
    root@am64xx-EVM:~# gpioset gpiochip1 62=0

    此致、
    Ravilla Dinesh。

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

    尊敬的 Ravilla:

    感谢您的确认。

    如果可能、共享解压缩的 DT。

    此外、请共享用于将引脚配置为 GPIO 的 DT。

    此致、
    Vinu

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

    尊敬的 Vinu:

    请在下面找到用于 GPIO 模式和 SYSCLKOUT0 模式的 DT 配置。

    此外、请共享用于将引脚配置为 GPIO 的 DT。

    已在同一引脚上成功验证 GPIO 切换、从而确认焊盘配置和硬件连接正常工作。
    GPIO 配置:

    e2e.ti.com/.../k3_2D00_am642_2D00_evm.txt

    如果可能、共享解析的 DT。
    SYSCLKOUT0 配置:

    e2e.ti.com/.../k3_2D00_am642_2D00_evm_2D00_SYSCLKOUT0.txt


    此致、
    Ravilla Dinesh。

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

    尊敬的 Ravilla:

    我分享了一些语法上的细微更改。 请尝试一下、并告诉我。

    /* In &main_pmx0 */
    clkout0_pins_default: clkout0-default-pins {
        pinctrl-single,pins = <
            AM64X_IOPAD(0x0258, PIN_OUTPUT, 3) /* (C17) SYSCLKOUT0 */
        >;
    };
    
    /* Inside the main / { } block, not a separate fragment */
    clkout0_ref: clkout0-ref-clk {
        compatible    = "custom,clkout0-enabler";
        clocks        = <&k3_clks 157 123>;
        assigned-clocks        = <&k3_clks 157 123>;
        assigned-clock-parents = <&k3_clks 157 125>; /* 25 MHz */
        pinctrl-names = "default";
        pinctrl-0     = <&clkout0_pins_default>;
    };

    在 DTS 中使用块注释/**/。 //可能会破坏 DTC 解析器。

    在解析的 DTS 中、clkout0_ref 节点按如下方式放置:

    / {	clkout0_ref: clkout0-ref-clk {

    在解析的 DTC 中、这被视为一个单独的根节点片段、它被放置在独立块中。

    尝试将其放入主块中、以便正确解析 pinctrl。

    进行这些更改后、请检查焊盘寄存器。

    devmem 0xF40258 32

    它应该为:0x00040003(输出,多路复用器= 3)

    此致、
    Vinu

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

    尊敬的 Vinu:

    我分享了一些语法上的细微更改。 请尝试一下、并告诉我。

    根据您建议的语法更新、我按如下方式修改了 DTS:

    /* In &main_pmx0 */
    clkout0_pins_default: clkout0-default-pins {
        pinctrl-single,pins = <
            AM64X_IOPAD(0x0258, PIN_OUTPUT, 3) /* (C17) SYSCLKOUT0 */
        >;
    };
    
    /* Inside the main / { } block */
    clkout0_ref: clkout0-ref-clk {
        compatible    = "custom,clkout0-enabler";
        clocks        = <&k3_clks 157 123>;
        assigned-clocks        = <&k3_clks 157 123>;
        assigned-clock-parents = <&k3_clks 157 125>; /* 25 MHz */
        pinctrl-names = "default";
        pinctrl-0     = <&clkout0_pins_default>;
    };
    

    但是、DT 编译仍失败、并出现以下错误:

    DTC     arch/arm64/boot/dts/ti/k3-am642-evm.dtb
    Error: arch/arm64/boot/dts/ti/k3-am642-evm.dts:651.14-29 syntax error
    FATAL ERROR: Unable to parse input tree
    make[3]: *** [scripts/Makefile.lib:424: arch/arm64/boot/dts/ti/k3-am642-evm.dtb] Error 1


    我遵循了上一个主题中引用的相同方法。

    SYSCLKOUT0 不是 ePWM 引脚。

    如前所述、请使用 PLL 衍生时钟对其进行配置。

       有关类似问题、请参阅 AM625:CLKOUT0 的 50MHz 输出。



    请共享您的 DTS 配置以与我的 DTS 文件进行交叉验证。


    此致、

    Ravilla Dinesh。

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

    尊敬的 Ravilla:

    我被误认为是 SYSCLKOUT0。 它不能像 CLKOUT0 一样进行配置。

    查看时钟树、它只能生成 31.25MHz 信号。

    但我可以看到、eCAP1 可以通过 C17 (ECAP1_IN_APWM_OUT) 进行路由、该 C17 可用于生成 40MHz 信号。

    共享下面的 DT 补丁。 确保没有重复节点。

    &main_pmx0 {
        main_ecap1_pins_default: main-ecap1-pins-default {
            pinctrl-single,pins = <
                AM64X_IOPAD(0x0258, PIN_OUTPUT, 2) /* (C17) MCAN1_TX.ECAP1_IN_APWM_OUT */
            >;
        };
    };
    
    &ecap1 {
        status = "okay";
        pinctrl-names = "default";
        pinctrl-0 = <&main_ecap1_pins_default>;
    };

    请 恢复 SYSCLKOUT0 之前的更改。

    从 Linux 引导后、尝试以下操作。

    对于 40MHz、理论上应该具有以下特性

    echo 0 > /sys/class/pwm/pwmchipX/export
    echo 25 > /sys/class/pwm/pwmchipX/pwm0/period       # 25 ns = 40 MHz
    echo 12 > /sys/class/pwm/pwmchipX/pwm0/duty_cycle   # ~50% duty
    echo 1 > /sys/class/pwm/pwmchipX/pwm0/enable

    我们已经在 AM62x 上尝试了该方法、根据以下值我们可以得到 41MHz。

    Echo 0 >/sys/class/pwm/pwmchipX/export
    Echo 20 >/sys/class/pwm/pwmchipX/pwm0/period
    Echo 10 >/sys/class/pwm/pwmchipX/pwm0/duty_cycle
    Echo 1 >/sys/class/pwm/pwmchipX/pwm0/enable

    因此、可能需要对其进行调整。

    请尝试一下。

    此致、
    Vinu

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

    尊敬的 Vinu:

    根据您的意见、问题现已解决。 ~    给定的配置、我们能够在 AM6442 中的 ECAP1_IN_APWM_OUT 引脚 C17 上生成 Ω 41MHz。
    &main_pmx0 {
        main_ecap1_pins_default: main-ecap1-pins-default {
            pinctrl-single,pins = <
                AM64X_IOPAD(0x0258, PIN_OUTPUT, 2) /* (C17) MCAN1_TX.ECAP1_IN_APWM_OUT */
            >;
        };
    };
    
    &ecap1 {
        status = "okay";
        pinctrl-names = "default";
        pinctrl-0 = <&main_ecap1_pins_default>;
    };


    此致、
    Ravilla Dinesh。