phy_common.c 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. /*
  2. * SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. #include "esp_timer.h"
  7. #include <stdint.h>
  8. extern void bt_track_pll_cap(void);
  9. static esp_timer_handle_t phy_track_pll_timer;
  10. static volatile int64_t s_previous_timestamp;
  11. #define PHY_TRACK_PLL_PERIOD_IN_US 1000000
  12. static void phy_track_pll_timer_callback(void* arg)
  13. {
  14. #if IEEE802154_ENABLED || BT_ENABLED
  15. bt_track_pll_cap();
  16. #endif
  17. s_previous_timestamp = esp_timer_get_time();
  18. }
  19. void phy_track_pll_init(void)
  20. {
  21. // Light sleep scenario: enabling and disabling PHY frequently, the timer will not get triggered.
  22. // Using a variable to record the previously tracked time when PLL was last called.
  23. // If the duration is larger than PHY_TRACK_PLL_PERIOD_IN_US, then track PLL.
  24. int64_t now = esp_timer_get_time();
  25. if (now - s_previous_timestamp > PHY_TRACK_PLL_PERIOD_IN_US) {
  26. phy_track_pll_timer_callback((void* )0);
  27. }
  28. const esp_timer_create_args_t phy_track_pll_timer_args = {
  29. .callback = &phy_track_pll_timer_callback,
  30. .name = "phy-track-pll-timer"
  31. };
  32. ESP_ERROR_CHECK(esp_timer_create(&phy_track_pll_timer_args, &phy_track_pll_timer));
  33. ESP_ERROR_CHECK(esp_timer_start_periodic(phy_track_pll_timer, PHY_TRACK_PLL_PERIOD_IN_US));
  34. }
  35. void phy_track_pll_deinit(void)
  36. {
  37. ESP_ERROR_CHECK(esp_timer_stop(phy_track_pll_timer));
  38. ESP_ERROR_CHECK(esp_timer_delete(phy_track_pll_timer));
  39. }