/* * SPDX-FileCopyrightText: 2021-2024 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Unlicense OR CC0-1.0 */ #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "esp_check.h" #include "esp_sleep.h" #include "driver/gpio.h" /* Most development boards have "boot" button attached to GPIO0. * You can also change this to another pin. */ #if CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32C2 || CONFIG_IDF_TARGET_ESP32H2 \ || CONFIG_IDF_TARGET_ESP32C6 #define BOOT_BUTTON_NUM 9 #elif CONFIG_IDF_TARGET_ESP32C5 #define BOOT_BUTTON_NUM 28 #elif CONFIG_IDF_TARGET_ESP32P4 #define BOOT_BUTTON_NUM 35 #else #define BOOT_BUTTON_NUM 0 #endif /* Use boot button as gpio input */ #define GPIO_WAKEUP_NUM BOOT_BUTTON_NUM /* "Boot" button is active low */ #define GPIO_WAKEUP_LEVEL 0 static const char *TAG = "gpio_wakeup"; void example_wait_gpio_inactive(void) { printf("Waiting for GPIO%d to go high...\n", GPIO_WAKEUP_NUM); while (gpio_get_level(GPIO_WAKEUP_NUM) == GPIO_WAKEUP_LEVEL) { vTaskDelay(pdMS_TO_TICKS(10)); } } esp_err_t example_register_gpio_wakeup(void) { /* Initialize GPIO */ gpio_config_t config = { .pin_bit_mask = BIT64(GPIO_WAKEUP_NUM), .mode = GPIO_MODE_INPUT, .pull_down_en = false, .pull_up_en = false, .intr_type = GPIO_INTR_DISABLE }; ESP_RETURN_ON_ERROR(gpio_config(&config), TAG, "Initialize GPIO%d failed", GPIO_WAKEUP_NUM); /* Enable wake up from GPIO */ ESP_RETURN_ON_ERROR(gpio_wakeup_enable(GPIO_WAKEUP_NUM, GPIO_WAKEUP_LEVEL == 0 ? GPIO_INTR_LOW_LEVEL : GPIO_INTR_HIGH_LEVEL), TAG, "Enable gpio wakeup failed"); ESP_RETURN_ON_ERROR(esp_sleep_enable_gpio_wakeup(), TAG, "Configure gpio as wakeup source failed"); /* Make sure the GPIO is inactive and it won't trigger wakeup immediately */ example_wait_gpio_inactive(); ESP_LOGI(TAG, "gpio wakeup source is ready"); return ESP_OK; }