@@ -66,20 +66,53 @@ esp_err_t knob_gpio_wake_up_control(uint32_t gpio_num, uint8_t wake_up_level, bo
6666{
6767 esp_err_t ret ;
6868 if (enable ) {
69+ #if CONFIG_PM_POWER_DOWN_PERIPHERAL_IN_LIGHT_SLEEP
70+ #if SOC_PM_SUPPORT_EXT1_WAKEUP
71+ ret = esp_sleep_enable_ext1_wakeup_io ((1ULL << gpio_num ), wake_up_level == 0 ? ESP_EXT1_WAKEUP_ANY_LOW : ESP_EXT1_WAKEUP_ANY_HIGH );
72+ #else
73+ /*!< Not support etc: esp32c2, esp32c3. Target must support ext1 wakeup */
74+ ret = ESP_FAIL ;
75+ ESP_RETURN_ON_FALSE (ret == ESP_OK , ESP_FAIL , TAG , "Target must support ext1 wakeup" );
76+ #endif
77+ #endif
78+ /* Enable wake up from GPIO */
6979 ret = gpio_wakeup_enable (gpio_num , wake_up_level == 0 ? GPIO_INTR_LOW_LEVEL : GPIO_INTR_HIGH_LEVEL );
7080 } else {
81+ #if CONFIG_PM_POWER_DOWN_PERIPHERAL_IN_LIGHT_SLEEP
82+ #if SOC_PM_SUPPORT_EXT1_WAKEUP
83+ ret = esp_sleep_disable_ext1_wakeup_io (1ULL << gpio_num );
84+ #endif
85+ #endif
7186 ret = gpio_wakeup_disable (gpio_num );
7287 }
7388 return ret ;
7489}
7590
7691esp_err_t knob_gpio_wake_up_init (uint32_t gpio_num , uint8_t wake_up_level )
7792{
93+ #if CONFIG_PM_POWER_DOWN_PERIPHERAL_IN_LIGHT_SLEEP
94+ if (!esp_sleep_is_valid_wakeup_gpio (gpio_num )) {
95+ ESP_LOGE (TAG , "GPIO %ld is not a valid wakeup source under CONFIG_PM_POWER_DOWN_PERIPHERAL_IN_LIGHT_SLEEP" ,
96+ gpio_num );
97+ return ESP_FAIL ;
98+ }
99+ gpio_hold_en (gpio_num );
100+ #endif
78101 /* Enable wake up from GPIO */
79102 esp_err_t ret = gpio_wakeup_enable (gpio_num , wake_up_level == 0 ? GPIO_INTR_LOW_LEVEL : GPIO_INTR_HIGH_LEVEL );
80103 ESP_RETURN_ON_FALSE (ret == ESP_OK , ESP_FAIL , TAG , "Enable gpio wakeup failed" );
104+
105+ #if CONFIG_PM_POWER_DOWN_PERIPHERAL_IN_LIGHT_SLEEP
106+ #if SOC_PM_SUPPORT_EXT1_WAKEUP
107+ ret = esp_sleep_enable_ext1_wakeup_io ((1ULL << gpio_num ), wake_up_level == 0 ? ESP_EXT1_WAKEUP_ANY_LOW : ESP_EXT1_WAKEUP_ANY_HIGH );
108+ #else
109+ /*!< Not support etc: esp32c2, esp32c3. Target must support ext1 wakeup */
110+ ret = ESP_FAIL ;
111+ ESP_RETURN_ON_FALSE (ret == ESP_OK , ESP_FAIL , TAG , "Target must support ext1 wakeup" );
112+ #endif
113+ #else
81114 ret = esp_sleep_enable_gpio_wakeup ();
82115 ESP_RETURN_ON_FALSE (ret == ESP_OK , ESP_FAIL , TAG , "esp sleep enable gpio wakeup failed" );
83-
116+ #endif
84117 return ESP_OK ;
85118}
0 commit comments