]> granicus.if.org Git - esp-idf/commitdiff
pm: handle the case of 2MHz frequency
authorIvan Grokhotkov <ivan@espressif.com>
Tue, 27 Mar 2018 02:52:38 +0000 (10:52 +0800)
committerIvan Grokhotkov <ivan@espressif.com>
Tue, 27 Mar 2018 03:20:55 +0000 (11:20 +0800)
It is not possible to generate 1 MHz REF_TICK from 2 MHz APB clock
(this is a limitation of REF_TICK divider circuit). Since switching
REF_TICK frequency is something we would like to avoid (to maintain
UART output even with DFS), 2 MHz frequency has been marked as
unsupported.

components/esp32/pm_esp32.c

index a59640115587093437f161de8c75d72e8cb09aaa..11a4d3c0db4dc5f1026b8f3815058d2a4d3cef1c 100644 (file)
@@ -180,6 +180,12 @@ esp_err_t esp_pm_configure(const void* vconfig)
     if (config->light_sleep_enable) {
         return ESP_ERR_NOT_SUPPORTED;
     }
+
+    if (config->min_cpu_freq == RTC_CPU_FREQ_2M) {
+        /* Minimal APB frequency to achieve 1MHz REF_TICK frequency is 5 MHz */
+        return ESP_ERR_NOT_SUPPORTED;
+    }
+
     rtc_cpu_freq_t min_freq = config->min_cpu_freq;
     rtc_cpu_freq_t max_freq = config->max_cpu_freq;
     int min_freq_mhz = rtc_clk_cpu_freq_value(min_freq);
@@ -188,14 +194,14 @@ esp_err_t esp_pm_configure(const void* vconfig)
         return ESP_ERR_INVALID_ARG;
     }
 
-    rtc_cpu_freq_t apb_max_freq; /* CPU frequency in APB_MAX mode */
+    rtc_cpu_freq_t apb_max_freq = max_freq; /* CPU frequency in APB_MAX mode */
     if (max_freq == RTC_CPU_FREQ_240M) {
         /* We can't switch between 240 and 80/160 without disabling PLL,
          * so use 240MHz CPU frequency when 80MHz APB frequency is requested.
          */
         apb_max_freq = RTC_CPU_FREQ_240M;
-    } else {
-        /* Otherwise (max CPU frequency is 80MHz or 160MHz), can use 80MHz
+    } else if (max_freq == RTC_CPU_FREQ_160M || max_freq == RTC_CPU_FREQ_80M) {
+        /* Otherwise, can use 80MHz
          * CPU frequency when 80MHz APB frequency is requested.
          */
         apb_max_freq = RTC_CPU_FREQ_80M;