diff --git a/components/esp_hw_support/include/esp_sleep.h b/components/esp_hw_support/include/esp_sleep.h index 8fa0bc68b2d..825d1a6a725 100644 --- a/components/esp_hw_support/include/esp_sleep.h +++ b/components/esp_hw_support/include/esp_sleep.h @@ -121,6 +121,7 @@ typedef enum { ESP_SLEEP_WAKEUP_BT, //!< Wakeup caused by BT (light sleep only) ESP_SLEEP_WAKEUP_VAD, //!< Wakeup caused by VAD ESP_SLEEP_WAKEUP_VBAT_UNDER_VOLT, //!< Wakeup caused by VDD_BAT under voltage. + ESP_SLEEP_WAKEUP_USB, //!< Wakeup caused by USB HS (light sleep only) } esp_sleep_source_t; /** @@ -133,7 +134,6 @@ typedef enum { /* Leave this type define for compatibility */ typedef esp_sleep_source_t esp_sleep_wakeup_cause_t; - enum { ESP_ERR_SLEEP_REJECT = ESP_ERR_INVALID_STATE, ESP_ERR_SLEEP_TOO_SHORT_SLEEP_DURATION = ESP_ERR_INVALID_ARG, @@ -545,6 +545,22 @@ esp_err_t esp_sleep_enable_bt_wakeup(void); */ esp_err_t esp_sleep_disable_bt_wakeup(void); +/** + * @brief Enable wakeup by High-Speed USB-OTG + * @return + * - ESP_OK on success + * - ESP_ERR_NOT_SUPPORTED if wakeup from USB is not supported + */ +esp_err_t esp_sleep_enable_usb_wakeup(void); + +/** + * @brief Disable wakeup by High-Speed USB-OTG + * @return + * - ESP_OK on success + * - ESP_ERR_NOT_SUPPORTED if wakeup from USB is not supported + */ +esp_err_t esp_sleep_disable_usb_wakeup(void); + /** * @brief Enable wakeup by WiFi MAC * @return diff --git a/components/esp_hw_support/sleep_modes.c b/components/esp_hw_support/sleep_modes.c index 821107a5b77..d5f0a432249 100644 --- a/components/esp_hw_support/sleep_modes.c +++ b/components/esp_hw_support/sleep_modes.c @@ -1686,6 +1686,11 @@ esp_err_t esp_sleep_disable_wakeup_source(esp_sleep_source_t source) else if (CHECK_SOURCE(source, ESP_SLEEP_WAKEUP_VBAT_UNDER_VOLT, RTC_VBAT_UNDER_VOLT_TRIG_EN)) { s_config.wakeup_triggers &= ~RTC_VBAT_UNDER_VOLT_TRIG_EN; } +#endif +#if SOC_PM_SUPPORT_USB_WAKEUP + else if (CHECK_SOURCE(source, ESP_SLEEP_WAKEUP_USB, RTC_USB_TRIG_EN)) { + s_config.wakeup_triggers &= ~RTC_USB_TRIG_EN; + } #endif else { ESP_LOGE(TAG, "Incorrect wakeup source (%d) to disable.", (int) source); @@ -2287,6 +2292,26 @@ esp_err_t esp_sleep_disable_bt_wakeup(void) #endif } +esp_err_t esp_sleep_enable_usb_wakeup(void) +{ +#if SOC_PM_SUPPORT_USB_WAKEUP + s_config.wakeup_triggers |= RTC_USB_TRIG_EN; + return ESP_OK; +#else + return ESP_ERR_NOT_SUPPORTED; +#endif +} + +esp_err_t esp_sleep_disable_usb_wakeup(void) +{ +#if SOC_PM_SUPPORT_USB_WAKEUP + s_config.wakeup_triggers &= (~RTC_USB_TRIG_EN); + return ESP_OK; +#else + return ESP_ERR_NOT_SUPPORTED; +#endif +} + esp_sleep_wakeup_cause_t esp_sleep_get_wakeup_cause(void) { if (esp_rom_get_reset_reason(0) != RESET_REASON_CORE_DEEP_SLEEP && !s_light_sleep_wakeup) { @@ -2445,6 +2470,11 @@ uint32_t esp_sleep_get_wakeup_causes(void) if (wakeup_cause_raw & RTC_VBAT_UNDER_VOLT_TRIG_EN) { wakeup_cause |= BIT(ESP_SLEEP_WAKEUP_VBAT_UNDER_VOLT); } +#endif +#if SOC_PM_SUPPORT_USB_WAKEUP + if (wakeup_cause_raw & RTC_USB_TRIG_EN) { + wakeup_cause |= BIT(ESP_SLEEP_WAKEUP_USB); + } #endif if (wakeup_cause == 0) { wakeup_cause |= BIT(ESP_SLEEP_WAKEUP_UNDEFINED); diff --git a/components/soc/esp32p4/include/soc/Kconfig.soc_caps.in b/components/soc/esp32p4/include/soc/Kconfig.soc_caps.in index 5b79c33908a..ff98bda048f 100644 --- a/components/soc/esp32p4/include/soc/Kconfig.soc_caps.in +++ b/components/soc/esp32p4/include/soc/Kconfig.soc_caps.in @@ -1175,6 +1175,10 @@ config SOC_USB_UTMI_PHY_NO_POWER_OFF_ISO bool default y +config SOC_PM_SUPPORT_USB_WAKEUP + int + default 1 + config SOC_PARLIO_TX_UNIT_MAX_DATA_WIDTH int default 16 diff --git a/components/soc/esp32p4/include/soc/soc_caps.h b/components/soc/esp32p4/include/soc/soc_caps.h index 1695ac50a2a..691a6809372 100644 --- a/components/soc/esp32p4/include/soc/soc_caps.h +++ b/components/soc/esp32p4/include/soc/soc_caps.h @@ -435,6 +435,7 @@ // USB PHY Caps #define SOC_USB_UTMI_PHY_NUM (1U) #define SOC_USB_UTMI_PHY_NO_POWER_OFF_ISO 1 +#define SOC_PM_SUPPORT_USB_WAKEUP (1U) /*-------------------------- PARLIO CAPS --------------------------------------*/ #define SOC_PARLIO_TX_UNIT_MAX_DATA_WIDTH 16 /*!< Number of data lines of the TX unit */