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.

[FAQ] [参考译文] 【常见问题解答】TDA4VH:TDA4 板上的 ECAP Linux 功能

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1528975/faq-tda4vh-ecap-linux-feature-on-tda4-boards

器件型号:TDA4VH

工具/软件:

如何在 TDA4 电路板上的 Linux 中启用 ECAP?

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

    尊敬的 Gokul:

    以下步骤将在 TDA4VH 板上启用 eCAP。 类似的更改也可应用于其他 TDA4 板:

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

    • 器件树更改:

    From 156367f0a2ad26d5d56f38ceefeb7c3f9d4fdeed Mon Sep 17 00:00:00 2001
    From: Gokul Praveen <g-praveen@ti.com>
    Date: Tue, 22 Apr 2025 15:30:48 +0530
    Subject: [PATCH] ECAP ENABLE
    
    Enables ECAP in capture mode on J784S4
    
    Similar changes can be made to other boards as well
    ---
     arch/arm64/boot/dts/ti/k3-j784s4-evm.dts   | 41 ++++++++++++++++++++++
     arch/arm64/boot/dts/ti/k3-j784s4-main.dtsi | 30 ++++++++++++++++
     arch/arm64/boot/dts/ti/k3-j784s4.dtsi      |  3 ++
     3 files changed, 74 insertions(+)
    
    diff --git a/arch/arm64/boot/dts/ti/k3-j784s4-evm.dts b/arch/arm64/boot/dts/ti/k3-j784s4-evm.dts
    index de256005f..61ea53554 100644
    --- a/arch/arm64/boot/dts/ti/k3-j784s4-evm.dts
    +++ b/arch/arm64/boot/dts/ti/k3-j784s4-evm.dts
    @@ -500,8 +500,49 @@ audio_ext_refclk1_pins_default: audio-ext-refclk1-default-pins {
     			J784S4_IOPAD(0x078, PIN_OUTPUT, 1) /* (AH37) MCAN2_RX.AUDIO_EXT_REFCLK1 */
     		>;
     	};
    +
    +    myecap0_pins_default: myecap0-default-pins {
    +        pinctrl-single,pins = <
    +            J784S4_IOPAD(0x0c4, PIN_INPUT, 0) /* (AD36) ECAP0_IN_APWM_OUT */
    +        >;
    +    };
    +
    +    myecap1_pins_default: myecap1-default-pins {
    +        pinctrl-single,pins = <
    +            J784S4_IOPAD(0x0e8, PIN_INPUT, 1) /* (AR38) TIMER_IO0.ECAP1_IN_APWM_OUT */
    +        >;
    +    };
    +
    +    myecap2_pins_default: myecap2-default-pins {
    +        pinctrl-single,pins = <
    +            J784S4_IOPAD(0x0ec, PIN_INPUT, 1) /* (AN37) TIMER_IO1.ECAP2_IN_APWM_OUT */
    +        >;
    +    };
    +
     };
     
    +&ecap0 {
    +       /* ECAP in Capture mode */
    +       pinctrl-names = "default";
    +       pinctrl-0 = <&myecap0_pins_default>;
    +       status = "okay";
    +	};
    +
    +&ecap1 {
    +       /* ECAP in Capture mode */
    +       pinctrl-names = "default";
    +       pinctrl-0 = <&myecap1_pins_default>;
    +       status = "okay";
    +};
    +
    +&ecap2 {
    +       /* ECAP in Capture mode */
    +       pinctrl-names = "default";
    +       pinctrl-0 = <&myecap2_pins_default>;
    +       status = "okay";
    +};
    +
    +
     &wkup_pmx2 {
     	bootph-all;
     	wkup_uart0_pins_default: wkup-uart0-default-pins {
    diff --git a/arch/arm64/boot/dts/ti/k3-j784s4-main.dtsi b/arch/arm64/boot/dts/ti/k3-j784s4-main.dtsi
    index a7cecbdbc..a6ad9b4b9 100644
    --- a/arch/arm64/boot/dts/ti/k3-j784s4-main.dtsi
    +++ b/arch/arm64/boot/dts/ti/k3-j784s4-main.dtsi
    @@ -1425,6 +1425,36 @@ serdes4: serdes@5050000 {
     		};
     	};
     
    +	ecap0: capture@3100000 {
    +			compatible = "ti,am62-ecap-capture";
    +			reg = <0x00 0x3100000 0x00 0x100>;
    +			power-domains = <&k3_pds 126 TI_SCI_PD_EXCLUSIVE>;
    +			clocks = <&k3_clks 126 0>;
    +			clock-names = "fck";
    +			interrupt-parent = <&gic500>;
    +			interrupts = <GIC_SPI 293 IRQ_TYPE_EDGE_RISING>;
    +		};
    +
    +	ecap1: capture@3110000 {
    +			compatible = "ti,am62-ecap-capture";
    +			reg = <0x00 0x3110000 0x00 0x100>;
    +			power-domains = <&k3_pds 127 TI_SCI_PD_EXCLUSIVE>;
    +			clocks = <&k3_clks 127 0>;
    +			clock-names = "fck";
    +			interrupt-parent = <&gic500>;
    +	        interrupts = <GIC_SPI 294 IRQ_TYPE_EDGE_RISING>;
    +		};
    +
    +	ecap2: capture@3120000 {
    +			compatible = "ti,am62-ecap-capture";
    +			reg = <0x00 0x3120000 0x00 0x100>;
    +			power-domains = <&k3_pds 128 TI_SCI_PD_EXCLUSIVE>;
    +			clocks = <&k3_clks 128 0>;
    +			clock-names = "fck";
    +			interrupt-parent = <&gic500>;
    +	        interrupts = <GIC_SPI 295 IRQ_TYPE_EDGE_RISING>;
    +		};
    +
     	main_navss: bus@30000000 {
     		bootph-all;
     		compatible = "simple-bus";
    diff --git a/arch/arm64/boot/dts/ti/k3-j784s4.dtsi b/arch/arm64/boot/dts/ti/k3-j784s4.dtsi
    index 5b09c97cf..8c2a07436 100644
    --- a/arch/arm64/boot/dts/ti/k3-j784s4.dtsi
    +++ b/arch/arm64/boot/dts/ti/k3-j784s4.dtsi
    @@ -259,6 +259,9 @@ cbass_main: bus@100000 {
     			 <0x44 0x00000000 0x44 0x00000000 0x00 0x08000000>, /* PCIe2 DAT0 */
     			 <0x44 0x10000000 0x44 0x10000000 0x00 0x08000000>, /* PCIe3 DAT0 */
     			 <0x4e 0x20000000 0x4e 0x20000000 0x00 0x00080000>, /* GPU */
    +			 <0x00 0x03100000 0x00 0x03100000 0x00 0x00000100>,  /* Ecap0 */
    +			 <0x00 0x03110000 0x00 0x03110000 0x00 0x00000100>, /* Ecap1*/
    +			 <0x00 0x03120000 0x00 0x03120000 0x00 0x00000100>, /* Ecap2*/
     
     			 /* MCUSS_WKUP Range */
     			 <0x00 0x28380000 0x00 0x28380000 0x00 0x03880000>,
    -- 
    2.34.1

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

    • 生成 PWM 信号
    • 运行以下脚本以捕获信号并获取其计时器周期和占空比:

    用户空间脚本:

    #!/bin/bash
    
    cd /sys/bus/counter/devices/counter0/signal1
    echo positive > polarity0
    echo negative > polarity1
    echo positive > polarity2
    echo negative > polarity3
    
    
    cd /sys/bus/counter/devices/counter0/count0/
    freq=$(cat /sys/bus/counter/devices/counter0/signal0/frequency)
    ceiling=$(cat /sys/bus/counter/devices/counter0/count0/ceiling)
    
    echo 0 > num_overflows
    echo 0 > count
    echo 1 > enable
    
    devmem2 0x3100028 w 0x003600EE #ECCTL
    devmem2 0x310002C w 0x003E0000 #ECINT_EN
    
    echo 0 > enable
    echo 1 > enable
    
    while true; do
    
    sleep 5
    cap0_val=$(cat capture0)
    cap1_val=$(cat capture1)
    cap2_val=$(cat capture2)
    cap3_val=$(cat capture3)
    
    if  [ "$cap1_val" -lt "$cap2_val" ]; then
    
    period_cnt=$(( cap1_val + cap2_val ))
    period=$(echo "scale=2; $period_cnt / $freq" | bc)
    high_cnt=$(( cap2_val ))
    duty=$(bc <<< "scale=2; $high_cnt / $period_cnt * 100")
    
    echo "Valid capture detected."
    echo "Period Count: $period_cnt"
    echo "High Count:   $high_cnt"
    echo "Period (s):   $period"
    echo "Duty Cycle:   $duty%"
    
    break
    
    else
    echo "Invalid capture: cap0_val=$cap0_val, cap1_val=$cap1_val, cap2_val=$cap2_val, cap3_val=$cap3_val"
    echo "Retrying..."
    sleep 1
    fi
    done
    
    echo "Final captured values:"
    echo "cap0_val: $cap0_val"
    echo "cap1_val: $cap1_val"
    echo "cap2_val: $cap2_val"
    echo "cap3_val: $cap3_val"
    
    echo 0 > enable

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

    此致

    Gokul