]> granicus.if.org Git - esp-idf/commitdiff
implement esp_deep_sleep, fix build issues
authorIvan Grokhotkov <ivan@espressif.com>
Mon, 21 Nov 2016 15:05:23 +0000 (23:05 +0800)
committerIvan Grokhotkov <ivan@espressif.com>
Tue, 22 Nov 2016 13:54:49 +0000 (21:54 +0800)
17 files changed:
.gitlab-ci.yml
components/bt/bt.c
components/esp32/cpu_freq.c
components/esp32/deepsleep.c
components/esp32/include/esp_deepsleep.h
components/esp32/include/esp_system.h
components/esp32/include/rom/ets_sys.h
components/esp32/include/rom/uart.h
components/esp32/include/xtensa/core-macros.h
components/esp32/lib
components/esp32/phy_init.c
components/esp32/rtc.h [new file with mode: 0644]
components/esp32/system_api.c
examples/01_hello_world/main/hello_world_main.c
examples/06_sntp/main/sntp_main.c
examples/07_nvs_rw_value/main/nvs_rw_value.c
examples/08_nvs_rw_blob/main/nvs_rw_blob.c

index 814279ce159ac46a984875a9a3f4b683f0a25894..94e9b6dc7bf4cea52659430ee1f3dd5079dced0c 100644 (file)
@@ -46,6 +46,10 @@ build_template_app:
     - sed -i.bak -e's/CONFIG_OPTIMIZATION_LEVEL_DEBUG\=y/CONFIG_OPTIMIZATION_LEVEL_RELEASE=y/' sdkconfig
     - make defconfig
     - make all V=1
+    # Check if there are any stray printf/ets_printf references in WiFi libs
+    - cd ../components/esp32/lib
+    - test $(xtensa-esp32-elf-nm *.a | grep -w printf | wc -l) -eq 0
+    - test $(xtensa-esp32-elf-nm *.a | grep -w ets_printf | wc -l) -eq 0
 
 
 .build_gitlab: &build_template
index 23f8aea92ea825bda34338d926e8f90decba8a1d..633ff9823baf66db3bafa7c39a57b1f888ef2743 100644 (file)
@@ -115,7 +115,7 @@ static struct osi_funcs_t osi_funcs = {
     ._mutex_create = mutex_create_wrapper,
     ._mutex_lock = mutex_lock_wrapper,
     ._mutex_unlock = mutex_unlock_wrapper,
-    ._read_efuse_mac = system_efuse_read_mac,
+    ._read_efuse_mac = esp_efuse_read_mac,
 };
 
 static void bt_controller_task(void *pvParam)
index 327ea63867dd9544b297d9d524323614892257fb..c68dd4f078f6fd6be536203a2bbaefefb3ce7c6b 100644 (file)
 #include "rom/ets_sys.h"
 #include "rom/uart.h"
 #include "sdkconfig.h"
-
-typedef enum{
-    XTAL_40M = 40,
-    XTAL_26M = 26,
-    XTAL_24M = 24,
-    XTAL_AUTO = 0
-} xtal_freq_t;
-
-typedef enum{
-    CPU_80M = 1,
-    CPU_160M = 2,
-    CPU_240M = 3,
-} cpu_freq_t;
-
-extern void phy_get_romfunc_addr();
-
-// TODO: these functions need to be moved from librtc to ESP-IDF
-extern void rtc_init_lite();
-extern void rtc_set_cpu_freq(xtal_freq_t xtal_freq, cpu_freq_t cpu_freq);
+#include "phy.h"
+#include "rtc.h"
 
 /*
  * This function is not exposed as an API at this point,
@@ -52,7 +35,7 @@ void esp_set_cpu_freq(void)
     // wait uart tx finish, otherwise some uart output will be lost
     uart_tx_wait_idle(0);
 
-    rtc_init_lite();
+    rtc_init_lite(XTAL_AUTO);
     cpu_freq_t freq = CPU_80M;
     switch(freq_mhz) {
         case 240:
@@ -73,7 +56,7 @@ void esp_set_cpu_freq(void)
     // wait uart tx finish, otherwise some uart output will be lost
     uart_tx_wait_idle(0);
 
-    rtc_set_cpu_freq(XTAL_AUTO, freq);
+    rtc_set_cpu_freq(freq);
     ets_update_cpu_frequency(freq_mhz);
 }
 
index 742ff8cf4086050f4ea55211b6220b2241f0875d..b8b73a3b1ffd0456832c19b81406dad397387660 100644 (file)
@@ -10,6 +10,7 @@
 #include "soc/dport_reg.h"
 #include "esp_attr.h"
 #include "esp_deepsleep.h"
+#include "rtc.h"
 
 /* Updating RTC_MEMORY_CRC_REG register via set_rtc_memory_crc()
    is not thread-safe. */
@@ -46,3 +47,21 @@ void RTC_IRAM_ATTR esp_default_wake_deep_sleep(void) {
 }
 
 void __attribute__((weak, alias("esp_default_wake_deep_sleep"))) esp_wake_deep_sleep(void);
+
+void esp_deep_sleep(uint64_t time_in_us)
+{
+    rtc_set_cpu_freq(CPU_XTAL);
+    if (esp_get_deep_sleep_wake_stub() == NULL) {
+        esp_set_deep_sleep_wake_stub(esp_wake_deep_sleep);
+    }
+    uint32_t period = rtc_slowck_cali(CALI_RTC_MUX, 128);
+    uint32_t cycle_l, cycle_h;
+    rtc_usec2rtc(time_in_us >> 32, time_in_us, period, &cycle_h, &cycle_l);
+    rtc_slp_prep_lite(1, 0);
+    rtc_sleep(cycle_h, cycle_l, TIMER_EXPIRE_EN, 0);
+    while (1) {
+        ;
+    }
+}
+
+void system_deep_sleep(uint64_t) __attribute__((alias("esp_deep_sleep")));
index 59b3129185cc584cd757ef61c65c1122809657b6..051ad14c3c8b42550af0438545b431bb96e93d87 100644 (file)
@@ -30,25 +30,34 @@ extern "C" {
   */
 
 /**
-  * @brief     Set the chip to deep-sleep mode.
-  *
-  *            The device will automatically wake up after the deep-sleep time set
-  *            by the users. Upon waking up, the device boots up from user_init.
-  *
-  * @attention  The parameter time_in_us to be "uint64" is for further development.
-  *                  Only the low 32 bits of parameter time_in_us are avalable now.
-  *
-  * @param     uint64 time_in_us : deep-sleep time, only the low 32bits are avalable now. unit: microsecond
-  *
-  * @return    null
-  */
-void system_deep_sleep(uint64_t time_in_us);
+ * @brief Enter deep-sleep mode
+ *
+ * The device will automatically wake up after the deep-sleep time
+ * Upon waking up, the device calls deep sleep wake stub, and then proceeds
+ * to load application.
+ *
+ * This function does not return.
+ *
+ * @param time_in_us  deep-sleep time, unit: microsecond
+ */
+void esp_deep_sleep(uint64_t time_in_us) __attribute__((noreturn));
+
+
+/**
+ * @brief Enter deep-sleep mode
+ *
+ * Function has been renamed to esp_deep_sleep.
+ * This name is deprecated and will be removed in a future version.
+ *
+ * @param time_in_us  deep-sleep time, unit: microsecond
+ */
+void system_deep_sleep(uint64_t time_in_us) __attribute__((noreturn, deprecated));
 
 /**
  * @brief Default stub to run on wake from deep sleep.
  *
  * Allows for executing code immediately on wake from sleep, before
- * the software bootloader or esp-idf app has started up.
+ * the software bootloader or ESP-IDF app has started up.
  *
  * This function is weak-linked, so you can implement your own version
  * to run code immediately when the chip wakes from
index e4fcbbf4034fc1dfd5910d0c156a4f7f982c0476..40ebd8403cd325dc91b2b8348bedb3aa256744db 100644 (file)
@@ -54,7 +54,7 @@ void esp_restart(void) __attribute__ ((noreturn));
   * Function has been renamed to esp_restart.
   * This name will be removed in a future release.
   */
-void system_restart(void) __attribute((deprecated, noreturn));
+void system_restart(void) __attribute__ ((deprecated, noreturn));
 
 /**
   * @brief  Get system time, unit: microsecond.
@@ -74,7 +74,6 @@ uint32_t system_get_time(void)  __attribute__ ((deprecated));
   */
 uint32_t esp_get_free_heap_size(void);
 
-
 /**
   * @brief  Get the size of available heap.
   *
@@ -103,7 +102,7 @@ uint32_t esp_random(void);
   *
   * @return ESP_OK on success
   */
-esp_err_t esp_efuse_read_mac(uint8_t mac[6]);
+esp_err_t esp_efuse_read_mac(uint8_t* mac);
 
 /**
   * @brief  Read hardware MAC address.
@@ -116,6 +115,16 @@ esp_err_t esp_efuse_read_mac(uint8_t mac[6]);
   */
 esp_err_t system_efuse_read_mac(uint8_t mac[6]) __attribute__ ((deprecated));
 
+/**
+ * Get SDK version
+ *
+ * This function is deprecated and will be removed in a future release.
+ *
+ * @return constant string "master"
+ */
+const char* system_get_sdk_version(void)  __attribute__ ((deprecated));
+
+
 
 #ifdef __cplusplus
 }
index c412c9b41f798789baec9122170d7f113ab065c3..690691675af8c6afd23abd15f679f25d2ac869ba 100644 (file)
@@ -605,6 +605,14 @@ void intr_matrix_set(int cpu_no, uint32_t model_num, uint32_t intr_num);
 
 #define ETS_MEM_BAR() asm volatile ( "" : : : "memory" )
 
+typedef enum {
+    OK = 0,
+    FAIL,
+    PENDING,
+    BUSY,
+    CANCEL,
+} STATUS;
+
 /**
   * @}
   */
index 0c08590f57c7e7a350a584f2d573681cfcc34f15..aa3cf5921793284db816b89dffe479c787458929 100644 (file)
@@ -17,6 +17,7 @@
 
 #include "esp_types.h"
 #include "esp_attr.h"
+#include "ets_sys.h"
 
 #ifdef __cplusplus
 extern "C" {
@@ -161,14 +162,6 @@ typedef struct {
     int              received;
 } UartDevice;
 
-typedef enum {
-    OK = 0,
-    FAIL,
-    PENDING,
-    BUSY,
-    CANCEL,
-} STATUS;
-
 /**
   * @brief Init uart device struct value and reset uart0/uart1 rx.
   *        Please do not call this function in SDK.
index 663d29478ac17a34be31f72a42dffb832a25cbb4..c8f7e347627c47c7a8e3cdc7298838ec8a212ea7 100755 (executable)
@@ -42,7 +42,7 @@
  * share the name with the existing functions from hal.h.
  * Including this header file will define XTHAL_USE_CACHE_MACROS 
  * which directs hal.h not to use the functions.
- *
+ */
 
 /*
  *  Single-cache-line operations in C-callable inline assembly.
index e2e5781dc27e638c5e63f85bc23590dd21af1619..5182dd9dab9ec37e69711de33bb0c200502c4c03 160000 (submodule)
@@ -1 +1 @@
-Subproject commit e2e5781dc27e638c5e63f85bc23590dd21af1619
+Subproject commit 5182dd9dab9ec37e69711de33bb0c200502c4c03
index 32d8f64edf404e7e8d31a095623ee7f76544b13f..6154beae908574b9544eb07926cdc59d77b89240 100644 (file)
@@ -179,7 +179,7 @@ static esp_err_t load_cal_data_from_nvs_handle(nvs_handle handle,
         return ESP_ERR_INVALID_SIZE;
     }
     uint8_t sta_mac[6];
-    system_efuse_read_mac(sta_mac);
+    esp_efuse_read_mac(sta_mac);
     if (memcmp(sta_mac, cal_data_mac, sizeof(sta_mac)) != 0) {
         ESP_LOGE(TAG, "%s: calibration data MAC check failed: expected " \
                 MACSTR ", found " MACSTR,
@@ -210,7 +210,7 @@ static esp_err_t store_cal_data_to_nvs_handle(nvs_handle handle,
         return err;
     }
     uint8_t sta_mac[6];
-    system_efuse_read_mac(sta_mac);
+    esp_efuse_read_mac(sta_mac);
     err = nvs_set_blob(handle, PHY_CAL_MAC_KEY, sta_mac, sizeof(sta_mac));
     if (err != ESP_OK) {
         return err;
diff --git a/components/esp32/rtc.h b/components/esp32/rtc.h
new file mode 100644 (file)
index 0000000..2ac3139
--- /dev/null
@@ -0,0 +1,130 @@
+// Copyright 2015-2016 Espressif Systems (Shanghai) PTE LTD
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#pragma once
+#include <stdint.h>
+#include <stddef.h>
+#include "soc/soc.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+typedef enum{
+    XTAL_40M = 40,
+    XTAL_26M = 26,
+    XTAL_24M = 24,
+    XTAL_AUTO = 0
+} xtal_freq_t;
+
+typedef enum{
+    CPU_XTAL = 0,
+    CPU_80M = 1,
+    CPU_160M = 2,
+    CPU_240M = 3,
+    CPU_2M = 4
+} cpu_freq_t;
+
+typedef enum {
+    CALI_RTC_MUX = 0,
+    CALI_8MD256 = 1,
+    CALI_32K_XTAL = 2
+} cali_clk_t;
+
+/**
+ * This function must be called to initialize RTC library
+ * @param xtal_freq  Frequency of main crystal
+ */
+void rtc_init_lite(xtal_freq_t xtal_freq);
+
+/**
+ * Switch CPU frequency
+ * @param cpu_freq  new CPU frequency
+ */
+void rtc_set_cpu_freq(cpu_freq_t cpu_freq);
+
+/**
+ * @brief Return RTC slow clock's period
+ * @param cali_clk  clock to calibrate
+ * @param slow_clk_cycles  number of slow clock cycles to average
+ * @param xtal_freq  chip's main XTAL freq
+ * @return average slow clock period in microseconds, Q13.19 fixed point format
+ */
+uint32_t rtc_slowck_cali(cali_clk_t cali_clk, uint32_t slow_clk_cycles);
+
+/**
+ * @brief Convert from microseconds to slow clock cycles
+ * @param time_in_us_h Time in microseconds, higher 32 bit part
+ * @param time_in_us_l Time in microseconds, lower 32 bit part
+ * @param slow_clk_period  Period of slow clock in microseconds, Q13.19 fixed point format (as returned by rtc_slowck_cali).
+ * @param[out] cylces_h  output, higher 32 bit part of number of slow clock cycles
+ * @param[out] cycles_l  output, lower 32 bit part of number of slow clock cycles
+ */
+void rtc_usec2rtc(uint32_t time_in_us_h, uint32_t time_in_us_l, uint32_t slow_clk_period, uint32_t *cylces_h, uint32_t *cycles_l);
+
+
+#define DEEP_SLEEP_PD_NORMAL         BIT(0)   /*!< Base deep sleep mode */
+#define DEEP_SLEEP_PD_RTC_PERIPH     BIT(1)   /*!< Power down RTC peripherals */
+#define DEEP_SLEEP_PD_RTC_SLOW_MEM   BIT(2)   /*!< Power down RTC SLOW memory */
+#define DEEP_SLEEP_PD_RTC_FAST_MEM   BIT(3)   /*!< Power down RTC FAST memory */
+
+/**
+ * @brief Prepare for entering sleep mode
+ * @param deep_slp   DEEP_SLEEP_PD_ flags combined with OR (DEEP_SLEEP_PD_NORMAL must be included)
+ * @param cpu_lp_mode  for deep sleep, should be 0
+ */
+void rtc_slp_prep_lite(uint32_t deep_slp, uint32_t cpu_lp_mode);
+
+
+#define RTC_EXT_EVENT0_TRIG     BIT(0)
+#define RTC_EXT_EVENT1_TRIG     BIT(1)
+#define RTC_GPIO_TRIG           BIT(2)
+#define RTC_TIMER_EXPIRE        BIT(3)
+#define RTC_SDIO_TRIG           BIT(4)
+#define RTC_MAC_TRIG            BIT(5)
+#define RTC_UART0_TRIG          BIT(6)
+#define RTC_UART1_TRIG          BIT(7)
+#define RTC_TOUCH_TRIG          BIT(8)
+#define RTC_SAR_TRIG            BIT(9)
+#define RTC_BT_TRIG             BIT(10)
+
+
+#define RTC_EXT_EVENT0_TRIG_EN  RTC_EXT_EVENT0_TRIG
+#define RTC_EXT_EVENT1_TRIG_EN  RTC_EXT_EVENT1_TRIG
+#define RTC_GPIO_TRIG_EN        RTC_GPIO_TRIG
+#define RTC_TIMER_EXPIRE_EN     RTC_TIMER_EXPIRE
+#define RTC_SDIO_TRIG_EN        RTC_SDIO_TRIG
+#define RTC_MAC_TRIG_EN         RTC_MAC_TRIG
+#define RTC_UART0_TRIG_EN       RTC_UART0_TRIG
+#define RTC_UART1_TRIG_EN       RTC_UART1_TRIG
+#define RTC_TOUCH_TRIG_EN       RTC_TOUCH_TRIG
+#define RTC_SAR_TRIG_EN         RTC_SAR_TRIG
+#define RTC_BT_TRIG_EN          RTC_BT_TRIG
+
+/**
+ * @brief Enter sleep mode for given number of cycles
+ * @param cycles_h  higher 32 bit part of number of slow clock cycles
+ * @param cycles_l  lower 32 bit part of number of slow clock cycles
+ * @param wakeup_opt  wake up reason to enable (RTC_xxx_EN flags combined with OR)
+ * @param reject_opt  reserved, should be 0
+ * @return TBD
+ */
+uint32_t rtc_sleep(uint32_t cycles_h, uint32_t cycles_l, uint32_t wakeup_opt, uint32_t reject_opt);
+
+
+#ifdef __cplusplus
+}
+#endif
+
index 0d46e1e7aaa0be68508abac7abbb5b1fc4b6ebb1..36a5f806da87aaea802bcc2518bdebed4c945d66 100644 (file)
 
 static const char* TAG = "system_api";
 
-esp_err_t system_efuse_read_mac(uint8_t mac[6])
+void system_init()
+{
+}
+
+esp_err_t esp_efuse_read_mac(uint8_t* mac)
 {
     uint8_t efuse_crc;
     uint8_t calc_crc;
@@ -64,8 +68,10 @@ esp_err_t system_efuse_read_mac(uint8_t mac[6])
     return ESP_OK;
 }
 
+esp_err_t system_efuse_read_mac(uint8_t mac[6]) __attribute__((alias("esp_efuse_read_mac")));
+
 
-void IRAM_ATTR system_restart(void)
+void IRAM_ATTR esp_restart(void)
 {
     esp_wifi_stop();
 
@@ -130,66 +136,19 @@ void IRAM_ATTR system_restart(void)
     }
 }
 
+void system_restart(void) __attribute__((alias("esp_restart")));
+
 void system_restore(void)
 {
     esp_wifi_restore();
 }
 
-#if 0
-void system_deep_sleep_instant(uint64_t time_in_us)
-{
-    u32 period, cycle_h, cycle_l;
-
-    {
-        struct rst_info debug_data;
-        memset(&debug_data, 0, sizeof(struct rst_info));
-
-        WRITE_PERI_REG(RTC_STORE0, DEEP_SLEEP_AWAKE_FLAG);
-        debug_data.flag = DEEP_SLEEP_AWAKE_FLAG;
-
-        system_write_rtc_mem(0, &debug_data, sizeof(struct rst_info));
-    }
-    
-    rtc_set_cpu_freq(XTAL_AUTO, CPU_XTAL);
-    esp_set_deep_sleep_wake_stub(esp_wake_deep_sleep);
-
-    period = rtc_slowck_cali(CALI_RTC_MUX, 128, XTAL_AUTO);
-    rtc_usec2rtc(time_in_us >> 32, time_in_us, period, &cycle_h, &cycle_l);
-
-    rtc_slp_prep_lite(1, 0);
-    rtc_sleep(cycle_h, cycle_l, TIMER_EXPIRE_EN, 0);
-}
-
-static uint64_t deep_sleep_time;
-
-static void system_deep_sleep_step2(void)
-{
-    system_deep_sleep_instant(deep_sleep_time);
-}
-
-void system_deep_sleep(uint64 time_in_us)
-{
-    wifi_set_sleep_flag(1);
-
-    deep_sleep_time = time_in_us;
-
-    os_timer_disarm(&sta_con_timer);
-    os_timer_setfn(&sta_con_timer, (os_timer_func_t *)system_deep_sleep_step2, NULL);
-    os_timer_arm(&sta_con_timer, 100, 0);
-}
-
-#endif
-
-uint32_t system_get_free_heap_size(void)
+uint32_t esp_get_free_heap_size(void)
 {
     return xPortGetFreeHeapSize();
 }
 
-
-struct rst_info *system_get_rst_info(void)
-{
-    return NULL;
-}
+uint32_t system_get_free_heap_size(void) __attribute__((alias("esp_get_free_heap_size")));
 
 const char* system_get_sdk_version(void)
 {
index 1ff190acefa528a0cd8e84888d958d51310e3667..0e872522fa2b2376d4e6007e671df8d9c0ae5c1a 100644 (file)
@@ -21,7 +21,7 @@ void hello_task(void *pvParameter)
     }
     printf("Restarting now.\n");
     fflush(stdout);
-    system_restart();
+    esp_restart();
 }
 
 void app_main()
index 83f33b965625dcc2df65cc4805345879cdb50af1..6827fa9378b2ffe229c36d708ede8bafea8e1a52 100644 (file)
@@ -88,7 +88,7 @@ void app_main()
 
     const int deep_sleep_sec = 10;
     ESP_LOGI(TAG, "Entering deep sleep for %d seconds", deep_sleep_sec);
-    system_deep_sleep(1000000LL * deep_sleep_sec);
+    esp_deep_sleep(1000000LL * deep_sleep_sec);
 }
 
 static void obtain_time(void)
index 978c48edb8473641bbf4ae1f804baa30829acd83..dac2d4077e59ace15470b7034b817c66a48a1082 100644 (file)
@@ -76,5 +76,5 @@ void app_main()
     }
     printf("Restarting now.\n");
     fflush(stdout);
-    system_restart();
+    esp_restart();
 }
index 3fbdfcacd65c4dd227b31a6e3d7b3a69b7f70fd5..7c13c15ba7b548e14de8b7c262c8998d313918a7 100644 (file)
@@ -170,7 +170,7 @@ void app_main()
                 if (err != ESP_OK) printf("Error (%d) saving run time blob to NVS!\n", err);
                 printf("Restarting...\n");
                 fflush(stdout);
-                system_restart();
+                esp_restart();
             }
         }
         vTaskDelay(200 / portTICK_RATE_MS);