sleep_gpio.c 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. /*
  2. * SPDX-FileCopyrightText: 2015-2022 Espressif Systems (Shanghai) CO LTD
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. #include <stddef.h>
  7. #include <string.h>
  8. #include <sys/lock.h>
  9. #include <sys/param.h>
  10. #include "esp_attr.h"
  11. #include "esp_sleep.h"
  12. #include "esp_log.h"
  13. #include "soc/soc_caps.h"
  14. #include "sdkconfig.h"
  15. #include "driver/gpio.h"
  16. #include "esp_private/gpio.h"
  17. #include "esp_private/sleep_gpio.h"
  18. #include "esp_private/spi_flash_os.h"
  19. static const char *TAG = "sleep";
  20. #if SOC_GPIO_SUPPORT_SLP_SWITCH
  21. #if CONFIG_GPIO_ESP32_SUPPORT_SWITCH_SLP_PULL
  22. void gpio_sleep_mode_config_apply(void)
  23. {
  24. for (gpio_num_t gpio_num = GPIO_NUM_0; gpio_num < GPIO_NUM_MAX; gpio_num++) {
  25. if (GPIO_IS_VALID_GPIO(gpio_num)) {
  26. gpio_sleep_pupd_config_apply(gpio_num);
  27. }
  28. }
  29. }
  30. IRAM_ATTR void gpio_sleep_mode_config_unapply(void)
  31. {
  32. for (gpio_num_t gpio_num = GPIO_NUM_0; gpio_num < GPIO_NUM_MAX; gpio_num++) {
  33. if (GPIO_IS_VALID_GPIO(gpio_num)) {
  34. gpio_sleep_pupd_config_unapply(gpio_num);
  35. }
  36. }
  37. }
  38. #endif
  39. void esp_sleep_config_gpio_isolate(void)
  40. {
  41. ESP_EARLY_LOGI(TAG, "Configure to isolate all GPIO pins in sleep state");
  42. for (gpio_num_t gpio_num = GPIO_NUM_0; gpio_num < GPIO_NUM_MAX; gpio_num++) {
  43. if (GPIO_IS_VALID_GPIO(gpio_num)) {
  44. gpio_sleep_set_direction(gpio_num, GPIO_MODE_DISABLE);
  45. gpio_sleep_set_pull_mode(gpio_num, GPIO_FLOATING);
  46. }
  47. }
  48. #if CONFIG_ESP_SLEEP_PSRAM_LEAKAGE_WORKAROUND && CONFIG_SPIRAM
  49. gpio_sleep_set_pull_mode(esp_mspi_get_io(ESP_MSPI_IO_CS1), GPIO_PULLUP_ONLY);
  50. #endif // CONFIG_ESP_SLEEP_PSRAM_LEAKAGE_WORKAROUND && CONFIG_SPIRAM
  51. #if CONFIG_ESP_SLEEP_FLASH_LEAKAGE_WORKAROUND
  52. gpio_sleep_set_pull_mode(esp_mspi_get_io(ESP_MSPI_IO_CS0), GPIO_PULLUP_ONLY);
  53. #endif // CONFIG_ESP_SLEEP_FLASH_LEAKAGE_WORKAROUND
  54. #if CONFIG_ESP_SLEEP_MSPI_NEED_ALL_IO_PU
  55. gpio_sleep_set_pull_mode(esp_mspi_get_io(ESP_MSPI_IO_CLK), GPIO_PULLUP_ONLY);
  56. gpio_sleep_set_pull_mode(esp_mspi_get_io(ESP_MSPI_IO_Q), GPIO_PULLUP_ONLY);
  57. gpio_sleep_set_pull_mode(esp_mspi_get_io(ESP_MSPI_IO_D), GPIO_PULLUP_ONLY);
  58. gpio_sleep_set_pull_mode(esp_mspi_get_io(ESP_MSPI_IO_HD), GPIO_PULLUP_ONLY);
  59. gpio_sleep_set_pull_mode(esp_mspi_get_io(ESP_MSPI_IO_WP), GPIO_PULLUP_ONLY);
  60. #if CONFIG_SPIRAM_MODE_OCT || CONFIG_ESPTOOLPY_FLASHMODE_OPI
  61. gpio_sleep_set_pull_mode(esp_mspi_get_io(ESP_MSPI_IO_DQS), GPIO_PULLUP_ONLY);
  62. gpio_sleep_set_pull_mode(esp_mspi_get_io(ESP_MSPI_IO_D4), GPIO_PULLUP_ONLY);
  63. gpio_sleep_set_pull_mode(esp_mspi_get_io(ESP_MSPI_IO_D5), GPIO_PULLUP_ONLY);
  64. gpio_sleep_set_pull_mode(esp_mspi_get_io(ESP_MSPI_IO_D6), GPIO_PULLUP_ONLY);
  65. gpio_sleep_set_pull_mode(esp_mspi_get_io(ESP_MSPI_IO_D7), GPIO_PULLUP_ONLY);
  66. #endif // CONFIG_SPIRAM_MODE_OCT || CONFIG_ESPTOOLPY_FLASHMODE_OPI
  67. #endif // CONFIG_ESP_SLEEP_MSPI_NEED_ALL_IO_PU
  68. }
  69. void esp_sleep_enable_gpio_switch(bool enable)
  70. {
  71. ESP_EARLY_LOGI(TAG, "%s automatic switching of GPIO sleep configuration", enable ? "Enable" : "Disable");
  72. for (gpio_num_t gpio_num = GPIO_NUM_0; gpio_num < GPIO_NUM_MAX; gpio_num++) {
  73. if (GPIO_IS_VALID_GPIO(gpio_num)) {
  74. if (enable) {
  75. gpio_sleep_sel_en(gpio_num);
  76. } else {
  77. gpio_sleep_sel_dis(gpio_num);
  78. }
  79. }
  80. }
  81. }
  82. #endif // SOC_GPIO_SUPPORT_SLP_SWITCH