工具/软件:
尊敬的专家:
客户使用此链接测试 MCU GPIO 从“深度睡眠“或“仅 MCU“模式唤醒。
-> 3.3.5.4。 深度睡眠
-> 3.3.5.5. 仅 MCU
它们使用相同的 Linux 器件树代码。 (k3-am62x-sk-lpm-wkup-sources.dtso)
唤醒 GPIO 为 MCU_GPIO0_19/MCU_GPIO0_20/MCU_GPIO0_3/MCU_GPIO0_14
所有这些 GPIO 都存在 上升沿和下降沿唤醒触发问题、即使软件仅设置了“失效触发边沿“也是如此。
这是设备树、
// 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 = "CAN1_INH_WKGPIO"; // linux,code = <KEY_WAKEUP>; // interrupts-extended = <&main_gpio0 4 IRQ_TYPE_LEVEL_LOW>, // <&main_pmx0 0x010>; // interrupt-names = "irq", "wakeup"; //}; // //switch1 { // label = "CAN0_INH_WKGPIO"; // linux,code = <144>; // interrupts-extended = <&main_gpio0 5 IRQ_TYPE_LEVEL_LOW>, // <&main_pmx0 0x014>; // 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 = <19 IRQ_TYPE_EDGE_FALLING>, <20 IRQ_TYPE_EDGE_FALLING>, <3 IRQ_TYPE_EDGE_FALLING>, <14 IRQ_TYPE_EDGE_FALLING>; switch { label = "WNC_SOC_MCUGPIO"; linux,code = <143>; gpios = <&mcu_gpio0 19 GPIO_ACTIVE_LOW>; wakeup-source; }; //mark test this switch1 { label = "IG_ON_MCUGPIO"; linux,code = <144>; gpios = <&mcu_gpio0 20 GPIO_ACTIVE_LOW>; wakeup-source; }; switch2 { label = "ECALL_MCUGPIO"; linux,code = <145>; gpios = <&mcu_gpio0 3 GPIO_ACTIVE_LOW>; wakeup-source; }; switch3 { label = "INH_MCUGPIO"; linux,code = <146>; gpios = <&mcu_gpio0 14 GPIO_ACTIVE_LOW>; wakeup-source; }; }; }; &main_pmx0 { main_gpio1_pins_default: main-gpio1-pins-default { pinctrl-single,pins = < //AM62X_IOPAD(0x010, 0x28054187, 7) /* (G17) OSPI0_D1.GPIO0_4 */ //AM62X_IOPAD(0x014, 0x28054187, 7) /* (F21) OSPI0_D2.GPIO0_5 */ >; }; }; &mcu_pmx0 { wake_mcugpio1_pins_default: wake-mcugpio1-pins-default { pinctrl-single,pins = < AM62X_MCU_IOPAD(0x0050, PIN_INPUT , 7) /* (A9) WKUP_I2C0_SDA.MCU_GPIO0_20 */ AM62X_MCU_IOPAD(0x004C, PIN_INPUT , 7) /* (E9) WKUP_I2C0_SCL.MCU_GPIO0_19 */ AM62X_MCU_IOPAD(0X000C, PIN_INPUT , 7) /* (E8) MCU_SPI0_D0.MCU_GPIO0_3 */ AM62X_MCU_IOPAD(0x0038, PIN_INPUT , 7) /* (E8) MCU_SPI0_D0.MCU_GPIO0_14 */ >; }; 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 = "disabled"; }; &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 = "disabled"; }; &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 = "disabled"; };
我们以 MCU_GPIO0_20 为例。
我认为 pinmux 可以。


我们让 GPIO 在 INIT 状态下保持低电平、然后触发高电平(上升沿)、即使是软件设置 故障边沿、也会触发唤醒事件。
我们可以看到没有反弹问题。

然后、让 GPIO 在初始化状态下保持高电平、然后触发低电平(下降沿)、从而触发唤醒事件。
我们还可以看到、没有反弹问题。

SW:10.0、我们仅在 Linux 端设置 wakup 源代码。
我有什么遗漏吗?
非常感谢
Gibbs