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.

[参考译文] SK-AM62A-LP:从深度睡眠设置 MCU GPIO 唤醒源

Guru**** 2445440 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1540658/sk-am62a-lp-setting-mcu-gpio-wakeup-source-from-deep-sleep

器件型号:SK-AM62A-LP


工具/软件:

您好:
我按照 本教程 和 其他教程 尝试将  MCU_GPIO0_16 设置为电路板的唤醒源。
我已经按照第二个教程的建议修改了第 35 行的“k3-am62x-sk-lpm-wkup-sources.dtso"。“。 我注意到、还需要修改“wak_mcugpio1_pins_default",“,这、这是我在第 63 行做的。 请参阅此处的文件:

// SPDX-License-Identifier: GPL-2.0
/**
 * AM62 family of devices can wakeup from Low Power Modes via
 * multiple wakeup sources. This overlay enables MAIN GPIO, MCU GPIO,
 * and MCU MCAN pins.
 *
 * Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/
 */

/dts-v1/;
/plugin/;

#include <dt-bindings/input/input.h>
#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/interrupt-controller/irq.h>
#include <dt-bindings/interrupt-controller/arm-gic.h>

#include "k3-pinctrl.h"

&{/} {
	gpio_key {
		compatible = "gpio-keys";
		autorepeat;
		pinctrl-names = "default";
		pinctrl-0 = <&main_gpio1_pins_default>;
		switch {
			label = "WKGPIO";
			linux,code = <KEY_WAKEUP>;
			interrupts-extended = <&main_gpio1 10 IRQ_TYPE_EDGE_RISING>,
				<&main_pmx0 0x1a0>;
			interrupt-names = "irq", "wakeup";
		};
	};

	mcu_gpio_key {
		compatible = "gpio-keys";
			autorepeat;
		pinctrl-names = "default";
		pinctrl-0 = <&wake_mcugpio1_pins_default>;
		interrupt-parent = <&mcu_gpio0>;
		interrupts = <16 IRQ_TYPE_EDGE_RISING>;
		switch {
			label = "MCUGPIO";
			linux,code = <143>;
			gpios = <&mcu_gpio0 16 GPIO_ACTIVE_LOW>;
			wakeup-source;
		};
	};
};

&main_pmx0 {
	main_gpio1_pins_default: main-gpio1-pins-default {
		pinctrl-single,pins = <
			AM62X_IOPAD(0x1a0, PIN_INPUT_PULLUP, 7) /* (E18) MCASP0_AXR0.EHRPWM1_B */
		>;
	};
};

&mcu_pmx0 {
	wake_mcugpio1_pins_default: wake-mcugpio1-pins-default {
		pinctrl-single,pins = <
			/* AM62X_MCU_IOPAD(0x0010, PIN_INPUT, 7) (D8) MCU_SPI0_D1.MCU_GPIO0_4 */
			AM62AX_MCU_IOPAD(0x0040, PIN_INPUT, 7) /* (B9) MCU_GPIO0_16 */
		>;
	};

	mcu_mcan0_tx_pins_default: mcu-mcan0-tx-pins-default {
		pinctrl-single,pins = <
			AM62X_IOPAD(0x034, PIN_OUTPUT, 0) /* (D6) MCU_MCAN0_TX */
		>;
	};

	mcu_mcan0_rx_pins_default: mcu-mcan0-rx-pins-default {
		pinctrl-single,pins = <
			AM62X_IOPAD(0x038, PIN_INPUT, 0) /* (B3) MCU_MCAN0_RX */
		>;
	};

	mcu_mcan0_rx_pins_wakeup: mcu-mcan0-rx-pins-wakeup {
		pinctrl-single,pins = <
			AM62X_IOPAD(0x038, PIN_INPUT | WKUP_EN, 0) /* (B3) MCU_MCAN0_RX */
		>;
	};

	mcu_mcan1_tx_pins_default: mcu-mcan1-tx-pins-default {
		pinctrl-single,pins = <
			AM62X_IOPAD(0x03c, PIN_OUTPUT, 0) /* (E5) MCU_MCAN1_TX */
		>;
	};

	mcu_mcan1_rx_pins_default: mcu-mcan1-rx-pins-default {
		pinctrl-single,pins = <
			AM62X_IOPAD(0x040, PIN_INPUT, 0) /* (D4) MCU_MCAN1_RX */
		>;
	};

	mcu_mcan1_rx_pins_wakeup: mcu-mcan1-rx-pins-wakeup {
		pinctrl-single,pins = <
			AM62X_IOPAD(0x040, PIN_INPUT | WKUP_EN, 0) /* (D4) MCU_MCAN1_RX */
		>;
	};

	mcu_uart0_pins_default: mcu-uart0-pins-default {
		pinctrl-single,pins = <
			AM62X_MCU_IOPAD(0x001c, PIN_INPUT, 0) /* MCU_UART0_CTSn */
			AM62X_MCU_IOPAD(0x0020, PIN_OUTPUT, 0) /* MCU_UART0_RTSn */
			AM62X_MCU_IOPAD(0x0018, PIN_OUTPUT, 0) /* MCU_UART0_TXD */
		>;
	};

	mcu_uart0_rxd_pins_default: mcu-uart0-rxd-pins-default {
		pinctrl-single,pins = <
			AM62X_MCU_IOPAD(0x0014, PIN_INPUT, 0) /* MCU_UART0_RXD */
		>;
	};

	mcu_uart0_rxd_pins_wakeup: mcu-uart0-rxd-pins-wakeup {
		pinctrl-single,pins = <
			AM62X_MCU_IOPAD(0x0014, PIN_INPUT | WKUP_EN, 0) /* MCU_UART0_RXD */
		>;
	};
};

&mcu_gpio0 {
	status = "okay";
};

&mcu_gpio_intr {
	status = "okay";
};

&mcu_mcan0 {
	pinctrl-names = "default", "wakeup";
	pinctrl-0 = <&mcu_mcan0_tx_pins_default>, <&mcu_mcan0_rx_pins_default>;
	pinctrl-1 = <&mcu_mcan0_tx_pins_default>, <&mcu_mcan0_rx_pins_wakeup>;
	status = "okay";
};

&mcu_mcan1 {
	pinctrl-names = "default", "wakeup";
	pinctrl-0 = <&mcu_mcan1_tx_pins_default>, <&mcu_mcan1_rx_pins_default>;
	pinctrl-1 = <&mcu_mcan1_tx_pins_default>, <&mcu_mcan1_rx_pins_wakeup>;
	status = "okay";
};

&mcu_uart0 {
	pinctrl-names = "default", "wakeup";
	pinctrl-0 = <&mcu_uart0_pins_default>, <&mcu_uart0_rxd_pins_default>;
	pinctrl-1 = <&mcu_uart0_pins_default>, <&mcu_uart0_rxd_pins_wakeup>;
	status = "ok";
};


我完全按照说明将此文件编译到.dtbo、并将其包含在设备树中、还按照规定修改了 uEnv.txt。

当我进入深度睡眠或仅 MCU 模式时、将引脚 (J8 MCU 接头上的引脚 11) 接地并不能唤醒器件(根据教程的建议)。 将引脚连接到 3.3V 也无法唤醒器件。
我知道、RTC 以及 WKUP_UART 都能够从深度睡眠中唤醒器件。

我还应该怎么做才能使用可在 J8 MCU 接头上访问的 MCU GPIO 唤醒器件?

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

    我修改了 k3-am62x-sk-lpm-wkup-sources.dtso 一些 、以注释该引脚的双重功能、请注意第 139-146 行:

    // SPDX-License-Identifier: GPL-2.0
    /**
     * AM62 family of devices can wakeup from Low Power Modes via
     * multiple wakeup sources. This overlay enables MAIN GPIO, MCU GPIO,
     * and MCU MCAN pins.
     *
     * Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/
     */
    
    /dts-v1/;
    /plugin/;
    
    #include <dt-bindings/input/input.h>
    #include <dt-bindings/gpio/gpio.h>
    #include <dt-bindings/interrupt-controller/irq.h>
    #include <dt-bindings/interrupt-controller/arm-gic.h>
    
    #include "k3-pinctrl.h"
    
    &{/} {
    	gpio_key {
    		compatible = "gpio-keys";
    		autorepeat;
    		pinctrl-names = "default";
    		pinctrl-0 = <&main_gpio1_pins_default>;
    		switch {
    			label = "WKGPIO";
    			linux,code = <KEY_WAKEUP>;
    			interrupts-extended = <&main_gpio1 10 IRQ_TYPE_EDGE_RISING>,
    				<&main_pmx0 0x1a0>;
    			interrupt-names = "irq", "wakeup";
    		};
    	};
    
    	mcu_gpio_key {
    		compatible = "gpio-keys";
    			autorepeat;
    		pinctrl-names = "default";
    		pinctrl-0 = <&wake_mcugpio1_pins_default>;
    		interrupt-parent = <&mcu_gpio0>;
    		interrupts = <16 IRQ_TYPE_EDGE_RISING>;
    		switch {
    			label = "MCUGPIO";
    			linux,code = <143>;
    			gpios = <&mcu_gpio0 16 GPIO_ACTIVE_LOW>;
    			wakeup-source;
    		};
    	};
    };
    
    &main_pmx0 {
    	main_gpio1_pins_default: main-gpio1-pins-default {
    		pinctrl-single,pins = <
    			AM62X_IOPAD(0x1a0, PIN_INPUT_PULLUP, 7) /* (E18) MCASP0_AXR0.EHRPWM1_B */
    		>;
    	};
    };
    
    &mcu_pmx0 {
    	wake_mcugpio1_pins_default: wake-mcugpio1-pins-default {
    		pinctrl-single,pins = <
    			/* AM62X_MCU_IOPAD(0x0010, PIN_INPUT, 7) (D8) MCU_SPI0_D1.MCU_GPIO0_4 */
    			AM62AX_MCU_IOPAD(0x0040, PIN_INPUT | WKUP_EN, 7) /* (B9) MCU_GPIO0_16 */
    		>;
    	};
    
    	mcu_mcan0_tx_pins_default: mcu-mcan0-tx-pins-default {
    		pinctrl-single,pins = <
    			AM62X_IOPAD(0x034, PIN_OUTPUT, 0) /* (D6) MCU_MCAN0_TX */
    		>;
    	};
    
    	mcu_mcan0_rx_pins_default: mcu-mcan0-rx-pins-default {
    		pinctrl-single,pins = <
    			AM62X_IOPAD(0x038, PIN_INPUT, 0) /* (B3) MCU_MCAN0_RX */
    		>;
    	};
    
    	mcu_mcan0_rx_pins_wakeup: mcu-mcan0-rx-pins-wakeup {
    		pinctrl-single,pins = <
    			AM62X_IOPAD(0x038, PIN_INPUT | WKUP_EN, 0) /* (B3) MCU_MCAN0_RX */
    		>;
    	};
    
    	mcu_mcan1_tx_pins_default: mcu-mcan1-tx-pins-default {
    		pinctrl-single,pins = <
    			AM62X_IOPAD(0x03c, PIN_OUTPUT, 0) /* (E5) MCU_MCAN1_TX */
    		>;
    	};
    	
    	mcu_mcan1_rx_pins_default: mcu-mcan1-rx-pins-default {
    		pinctrl-single,pins = <
    			AM62X_IOPAD(0x040, PIN_INPUT, 0) /* (D4) MCU_MCAN1_RX */
    		>;
    	};
    
    	mcu_mcan1_rx_pins_wakeup: mcu-mcan1-rx-pins-wakeup {
    		pinctrl-single,pins = <
    			AM62X_IOPAD(0x040, PIN_INPUT | WKUP_EN, 0) /* (D4) MCU_MCAN1_RX */
    		>;
    	};
    
    	mcu_uart0_pins_default: mcu-uart0-pins-default {
    		pinctrl-single,pins = <
    			AM62X_MCU_IOPAD(0x001c, PIN_INPUT, 0) /* MCU_UART0_CTSn */
    			AM62X_MCU_IOPAD(0x0020, PIN_OUTPUT, 0) /* MCU_UART0_RTSn */
    			AM62X_MCU_IOPAD(0x0018, PIN_OUTPUT, 0) /* MCU_UART0_TXD */
    		>;
    	};
    
    	mcu_uart0_rxd_pins_default: mcu-uart0-rxd-pins-default {
    		pinctrl-single,pins = <
    			AM62X_MCU_IOPAD(0x0014, PIN_INPUT, 0) /* MCU_UART0_RXD */
    		>;
    	};
    
    	mcu_uart0_rxd_pins_wakeup: mcu-uart0-rxd-pins-wakeup {
    		pinctrl-single,pins = <
    			AM62X_MCU_IOPAD(0x0014, PIN_INPUT | WKUP_EN, 0) /* MCU_UART0_RXD */
    		>;
    	};
    };
    
    &mcu_gpio0 {
    	status = "okay";
    };
    
    &mcu_gpio_intr {
    	status = "okay";
    };
    
    &mcu_mcan0 {
    	pinctrl-names = "default", "wakeup";
    	pinctrl-0 = <&mcu_mcan0_tx_pins_default>, <&mcu_mcan0_rx_pins_default>;
    	pinctrl-1 = <&mcu_mcan0_tx_pins_default>, <&mcu_mcan0_rx_pins_wakeup>;
    	status = "okay";
    };
    
    /*
    &mcu_mcan1 {
    	pinctrl-names = "default", "wakeup";
    	pinctrl-0 = <&mcu_mcan1_tx_pins_default>, <&mcu_mcan1_rx_pins_default>;
    	pinctrl-1 = <&mcu_mcan1_tx_pins_default>, <&mcu_mcan1_rx_pins_wakeup>;
    	status = "okay";
    };
    */
    
    &mcu_uart0 {
    	pinctrl-names = "default", "wakeup";
    	pinctrl-0 = <&mcu_uart0_pins_default>, <&mcu_uart0_rxd_pins_default>;
    	pinctrl-1 = <&mcu_uart0_pins_default>, <&mcu_uart0_rxd_pins_wakeup>;
    	status = "ok";
    };
    


    这是因为我假设“mcan1_rx_pin"覆盖“覆盖了同一个具有不同功能的 I/O 焊盘(请参阅第 93 行和第 99 行)。
    仍然无法获得该引脚来唤醒器件。

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

    您好 Nathan、

    您能否共享用于唤醒器件的引脚的 PADCONFIG 寄存器值?

    谢谢、

    Anshu

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

    尊敬的 Anshu:


    上面是我用于唤醒器件的引脚的寄存器。

    下面是上面第 62 行(来自 AM62X 数据表)中用于参考的引脚的寄存器:

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

    MCU_PADCONFIG16 的地址为 0x04084040

    MCU_PADCONFIG4(来自 AM62x 数据表)的地址为 0x04084010

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

    您好 Nathan、

    我当时正在寻找存储在这些寄存器中的值。 您可以在 Linux 用户空间上使用 devmem2 之类的内容。

    谢谢、

    Anshu

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

    您好 Nathan、

    另外、请共享“cat /proc/interrupts “的输出  

    谢谢、

    Anshu