text: /*
   * SPDX-FileCopyrightText: 2021-2022 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
  #define BOOT_BUTTON_NUM         9
  #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;
  }
  