pm_trace.c 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. /*
  2. * SPDX-FileCopyrightText: 2016-2021 Espressif Systems (Shanghai) CO LTD
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. #include "esp_private/pm_trace.h"
  7. #include "driver/gpio.h"
  8. /* GPIOs to use for tracing of esp_pm events.
  9. * Two entries in the array for each type, one for each CPU.
  10. * Feel free to change when debugging.
  11. */
  12. static const int DRAM_ATTR s_trace_io[] = {
  13. #if !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32H2) && !defined(CONFIG_IDF_TARGET_ESP8684)
  14. BIT(4), BIT(5), // ESP_PM_TRACE_IDLE
  15. BIT(16), BIT(17), // ESP_PM_TRACE_TICK
  16. BIT(18), BIT(18), // ESP_PM_TRACE_FREQ_SWITCH
  17. BIT(19), BIT(19), // ESP_PM_TRACE_CCOMPARE_UPDATE
  18. BIT(25), BIT(26), // ESP_PM_TRACE_ISR_HOOK
  19. BIT(27), BIT(27), // ESP_PM_TRACE_SLEEP
  20. #else
  21. BIT(2), BIT(3), // ESP_PM_TRACE_IDLE
  22. BIT(4), BIT(5), // ESP_PM_TRACE_TICK
  23. BIT(6), BIT(6), // ESP_PM_TRACE_FREQ_SWITCH
  24. BIT(7), BIT(7), // ESP_PM_TRACE_CCOMPARE_UPDATE
  25. BIT(8), BIT(9), // ESP_PM_TRACE_ISR_HOOK
  26. BIT(18), BIT(18), // ESP_PM_TRACE_SLEEP
  27. #endif
  28. };
  29. void esp_pm_trace_init(void)
  30. {
  31. for (size_t i = 0; i < sizeof(s_trace_io)/sizeof(s_trace_io[0]); ++i) {
  32. int io = __builtin_ffs(s_trace_io[i]);
  33. if (io == 0) {
  34. continue;
  35. }
  36. gpio_set_direction(io - 1, GPIO_MODE_OUTPUT);
  37. }
  38. }
  39. void IRAM_ATTR esp_pm_trace_enter(esp_pm_trace_event_t event, int core_id)
  40. {
  41. REG_WRITE(GPIO_OUT_W1TS_REG, s_trace_io[2 * event + core_id]);
  42. }
  43. void IRAM_ATTR esp_pm_trace_exit(esp_pm_trace_event_t event, int core_id)
  44. {
  45. REG_WRITE(GPIO_OUT_W1TC_REG, s_trace_io[2 * event + core_id]);
  46. }