| 
									
										
										
										
											2016-10-06 14:21:30 +03:00
										 |  |  | // 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.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "sdkconfig.h"
 | 
					
						
							|  |  |  | #include "freertos/FreeRTOS.h"
 | 
					
						
							|  |  |  | #include "freertos/task.h"
 | 
					
						
							|  |  |  | #include "esp_attr.h"
 | 
					
						
							| 
									
										
										
										
											2017-02-13 00:56:47 +01:00
										 |  |  | #include "nvs_flash.h"
 | 
					
						
							| 
									
										
										
										
											2017-04-04 01:27:26 +03:00
										 |  |  | #include "nvs.h"
 | 
					
						
							|  |  |  | #include "esp_partition.h"
 | 
					
						
							| 
									
										
										
										
											2017-04-13 09:13:45 +03:00
										 |  |  | #include "esp_log.h"
 | 
					
						
							| 
									
										
										
										
											2018-05-22 16:12:30 +02:00
										 |  |  | #include "esp_timer.h"
 | 
					
						
							| 
									
										
										
										
											2019-02-14 16:49:30 +01:00
										 |  |  | #ifdef CONFIG_APP_ROLLBACK_ENABLE
 | 
					
						
							|  |  |  | #include "esp_ota_ops.h"
 | 
					
						
							|  |  |  | #endif //CONFIG_APP_ROLLBACK_ENABLE
 | 
					
						
							| 
									
										
										
										
											2018-12-10 02:11:37 -07:00
										 |  |  | #ifdef CONFIG_BT_ENABLED
 | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  | #include "esp_bt.h"
 | 
					
						
							| 
									
										
										
										
											2018-12-10 02:11:37 -07:00
										 |  |  | #endif //CONFIG_BT_ENABLED
 | 
					
						
							| 
									
										
										
										
											2017-03-20 11:21:56 +02:00
										 |  |  | #include <sys/time.h>
 | 
					
						
							| 
									
										
										
										
											2018-12-18 20:04:16 +01:00
										 |  |  | #include "soc/rtc.h"
 | 
					
						
							| 
									
										
										
										
											2018-12-20 01:57:32 +01:00
										 |  |  | #include "soc/rtc_cntl_reg.h"
 | 
					
						
							| 
									
										
										
										
											2019-01-09 10:07:54 +01:00
										 |  |  | #include "soc/apb_ctrl_reg.h"
 | 
					
						
							| 
									
										
										
										
											2018-12-20 01:57:32 +01:00
										 |  |  | #include "rom/rtc.h"
 | 
					
						
							| 
									
										
										
										
											2018-12-28 20:37:33 +02:00
										 |  |  | #include "esp_task_wdt.h"
 | 
					
						
							| 
									
										
										
										
											2018-07-03 23:03:50 +02:00
										 |  |  | #include "esp32-hal.h"
 | 
					
						
							| 
									
										
										
										
											2016-10-06 14:21:30 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-18 17:47:06 +08:00
										 |  |  | //Undocumented!!! Get chip temperature in Farenheit
 | 
					
						
							|  |  |  | //Source: https://github.com/pcbreflux/espressif/blob/master/esp32/arduino/sketchbook/ESP32_int_temp_sensor/ESP32_int_temp_sensor.ino
 | 
					
						
							|  |  |  | uint8_t temprature_sens_read(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | float temperatureRead() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return (temprature_sens_read() - 32) / 1.8; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-04 11:49:39 +02:00
										 |  |  | void __yield() | 
					
						
							| 
									
										
										
										
											2017-02-11 00:25:15 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     vPortYield(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-04 11:49:39 +02:00
										 |  |  | void yield() __attribute__ ((weak, alias("__yield"))); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-28 20:37:33 +02:00
										 |  |  | #if CONFIG_AUTOSTART_ARDUINO
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | extern TaskHandle_t loopTaskHandle; | 
					
						
							|  |  |  | extern bool loopTaskWDTEnabled; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void enableLoopWDT(){ | 
					
						
							|  |  |  |     if(loopTaskHandle != NULL){ | 
					
						
							|  |  |  |         if(esp_task_wdt_add(loopTaskHandle) != ESP_OK){ | 
					
						
							|  |  |  |             log_e("Failed to add loop task to WDT"); | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             loopTaskWDTEnabled = true; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void disableLoopWDT(){ | 
					
						
							|  |  |  |     if(loopTaskHandle != NULL && loopTaskWDTEnabled){ | 
					
						
							|  |  |  |         loopTaskWDTEnabled = false; | 
					
						
							|  |  |  |         if(esp_task_wdt_delete(loopTaskHandle) != ESP_OK){ | 
					
						
							|  |  |  |             log_e("Failed to remove loop task from WDT"); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2019-01-12 13:02:38 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void feedLoopWDT(){ | 
					
						
							|  |  |  |     esp_err_t err = esp_task_wdt_reset(); | 
					
						
							|  |  |  |     if(err != ESP_OK){ | 
					
						
							|  |  |  |         log_e("Failed to feed WDT! Error: %d", err); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2018-12-28 20:37:33 +02:00
										 |  |  | } | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-28 21:14:46 +02:00
										 |  |  | void enableCore0WDT(){ | 
					
						
							|  |  |  |     TaskHandle_t idle_0 = xTaskGetIdleTaskHandleForCPU(0); | 
					
						
							|  |  |  |     if(idle_0 == NULL || esp_task_wdt_add(idle_0) != ESP_OK){ | 
					
						
							|  |  |  |         log_e("Failed to add Core 0 IDLE task to WDT"); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void disableCore0WDT(){ | 
					
						
							|  |  |  |     TaskHandle_t idle_0 = xTaskGetIdleTaskHandleForCPU(0); | 
					
						
							|  |  |  |     if(idle_0 == NULL || esp_task_wdt_delete(idle_0) != ESP_OK){ | 
					
						
							|  |  |  |         log_e("Failed to remove Core 0 IDLE task from WDT"); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifndef CONFIG_FREERTOS_UNICORE
 | 
					
						
							| 
									
										
										
										
											2018-12-28 20:37:33 +02:00
										 |  |  | void enableCore1WDT(){ | 
					
						
							|  |  |  |     TaskHandle_t idle_1 = xTaskGetIdleTaskHandleForCPU(1); | 
					
						
							|  |  |  |     if(idle_1 == NULL || esp_task_wdt_add(idle_1) != ESP_OK){ | 
					
						
							|  |  |  |         log_e("Failed to add Core 1 IDLE task to WDT"); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void disableCore1WDT(){ | 
					
						
							|  |  |  |     TaskHandle_t idle_1 = xTaskGetIdleTaskHandleForCPU(1); | 
					
						
							|  |  |  |     if(idle_1 == NULL || esp_task_wdt_delete(idle_1) != ESP_OK){ | 
					
						
							|  |  |  |         log_e("Failed to remove Core 1 IDLE task from WDT"); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-13 17:13:13 +02:00
										 |  |  | BaseType_t xTaskCreateUniversal( TaskFunction_t pxTaskCode, | 
					
						
							|  |  |  |                         const char * const pcName, | 
					
						
							|  |  |  |                         const uint32_t usStackDepth, | 
					
						
							|  |  |  |                         void * const pvParameters, | 
					
						
							|  |  |  |                         UBaseType_t uxPriority, | 
					
						
							|  |  |  |                         TaskHandle_t * const pxCreatedTask, | 
					
						
							|  |  |  |                         const BaseType_t xCoreID ){ | 
					
						
							|  |  |  | #ifndef CONFIG_FREERTOS_UNICORE
 | 
					
						
							|  |  |  |     if(xCoreID >= 0 && xCoreID < 2) { | 
					
						
							|  |  |  |         return xTaskCreatePinnedToCore(pxTaskCode, pcName, usStackDepth, pvParameters, uxPriority, pxCreatedTask, xCoreID); | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  |     return xTaskCreate(pxTaskCode, pcName, usStackDepth, pvParameters, uxPriority, pxCreatedTask); | 
					
						
							|  |  |  | #ifndef CONFIG_FREERTOS_UNICORE
 | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-22 15:47:12 +03:00
										 |  |  | unsigned long IRAM_ATTR micros() | 
					
						
							| 
									
										
										
										
											2016-10-06 14:21:30 +03:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2019-01-09 10:07:54 +01:00
										 |  |  |     return (unsigned long) (esp_timer_get_time()); | 
					
						
							| 
									
										
										
										
											2016-10-06 14:21:30 +03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-22 15:47:12 +03:00
										 |  |  | unsigned long IRAM_ATTR millis() | 
					
						
							| 
									
										
										
										
											2016-10-06 14:21:30 +03:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2019-02-14 13:09:51 +01:00
										 |  |  |     return (unsigned long) (esp_timer_get_time() / 1000ULL); | 
					
						
							| 
									
										
										
										
											2016-10-06 14:21:30 +03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void delay(uint32_t ms) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2019-01-09 10:07:54 +01:00
										 |  |  |     vTaskDelay(ms / portTICK_PERIOD_MS); | 
					
						
							| 
									
										
										
										
											2016-10-06 14:21:30 +03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-02 13:03:48 +02:00
										 |  |  | void IRAM_ATTR delayMicroseconds(uint32_t us) | 
					
						
							| 
									
										
										
										
											2016-10-06 14:21:30 +03:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2016-12-02 13:03:48 +02:00
										 |  |  |     uint32_t m = micros(); | 
					
						
							|  |  |  |     if(us){ | 
					
						
							| 
									
										
										
										
											2017-03-20 11:21:56 +02:00
										 |  |  |         uint32_t e = (m + us); | 
					
						
							| 
									
										
										
										
											2016-12-02 13:03:48 +02:00
										 |  |  |         if(m > e){ //overflow
 | 
					
						
							|  |  |  |             while(micros() > e){ | 
					
						
							|  |  |  |                 NOP(); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         while(micros() < e){ | 
					
						
							| 
									
										
										
										
											2016-10-06 14:21:30 +03:00
										 |  |  |             NOP(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-18 15:07:25 +02:00
										 |  |  | void initVariant() __attribute__((weak)); | 
					
						
							|  |  |  | void initVariant() {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void init() __attribute__((weak)); | 
					
						
							|  |  |  | void init() {} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-14 16:49:30 +01:00
										 |  |  | bool verifyOta() __attribute__((weak)); | 
					
						
							|  |  |  | bool verifyOta() { return true; } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  | #ifdef CONFIG_BT_ENABLED
 | 
					
						
							|  |  |  | //overwritten in esp32-hal-bt.c
 | 
					
						
							|  |  |  | bool btInUse() __attribute__((weak)); | 
					
						
							|  |  |  | bool btInUse(){ return false; } | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-20 11:21:56 +02:00
										 |  |  | void initArduino() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2019-02-14 16:49:30 +01:00
										 |  |  | #ifdef CONFIG_APP_ROLLBACK_ENABLE
 | 
					
						
							|  |  |  |     const esp_partition_t *running = esp_ota_get_running_partition(); | 
					
						
							|  |  |  |     esp_ota_img_states_t ota_state; | 
					
						
							|  |  |  |     if (esp_ota_get_state_partition(running, &ota_state) == ESP_OK) { | 
					
						
							|  |  |  |         if (ota_state == ESP_OTA_IMG_PENDING_VERIFY) { | 
					
						
							|  |  |  |             if (verifyOta()) { | 
					
						
							|  |  |  |                 esp_ota_mark_app_valid_cancel_rollback(); | 
					
						
							|  |  |  |             } else { | 
					
						
							|  |  |  |                 log_e("OTA verification failed! Start rollback to the previous version ..."); | 
					
						
							|  |  |  |                 esp_ota_mark_app_invalid_rollback_and_reboot(); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2019-01-09 10:07:54 +01:00
										 |  |  |     //init proper ref tick value for PLL (uncomment if REF_TICK is different than 1MHz)
 | 
					
						
							|  |  |  |     //ESP_REG(APB_CTRL_PLL_TICK_CONF_REG) = APB_CLK_FREQ / REF_CLK_FREQ - 1;
 | 
					
						
							| 
									
										
										
										
											2018-12-20 01:57:32 +01:00
										 |  |  | #ifdef F_CPU
 | 
					
						
							| 
									
										
										
										
											2019-01-09 10:07:54 +01:00
										 |  |  |     setCpuFrequencyMhz(F_CPU/1000000); | 
					
						
							| 
									
										
										
										
											2018-12-20 01:57:32 +01:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2018-06-30 23:06:50 +02:00
										 |  |  | #if CONFIG_SPIRAM_SUPPORT
 | 
					
						
							|  |  |  |     psramInit(); | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2017-04-13 09:13:45 +03:00
										 |  |  |     esp_log_level_set("*", CONFIG_LOG_DEFAULT_LEVEL); | 
					
						
							| 
									
										
										
										
											2017-04-04 01:27:26 +03:00
										 |  |  |     esp_err_t err = nvs_flash_init(); | 
					
						
							|  |  |  |     if(err == ESP_ERR_NVS_NO_FREE_PAGES){ | 
					
						
							|  |  |  |         const esp_partition_t* partition = esp_partition_find_first(ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_DATA_NVS, NULL); | 
					
						
							|  |  |  |         if (partition != NULL) { | 
					
						
							|  |  |  |             err = esp_partition_erase_range(partition, 0, partition->size); | 
					
						
							|  |  |  |             if(!err){ | 
					
						
							|  |  |  |                 err = nvs_flash_init(); | 
					
						
							|  |  |  |             } else { | 
					
						
							|  |  |  |                 log_e("Failed to format the broken NVS partition!"); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     if(err) { | 
					
						
							|  |  |  |         log_e("Failed to initialize NVS! Error: %u", err); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  | #ifdef CONFIG_BT_ENABLED
 | 
					
						
							|  |  |  |     if(!btInUse()){ | 
					
						
							|  |  |  |         esp_bt_controller_mem_release(ESP_BT_MODE_BTDM); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2016-11-18 15:07:25 +02:00
										 |  |  |     init(); | 
					
						
							|  |  |  |     initVariant(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-13 13:40:31 +02:00
										 |  |  | //used by hal log
 | 
					
						
							| 
									
										
										
										
											2017-03-20 11:21:56 +02:00
										 |  |  | const char * IRAM_ATTR pathToFileName(const char * path) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2016-11-13 13:40:31 +02:00
										 |  |  |     size_t i = 0; | 
					
						
							|  |  |  |     size_t pos = 0; | 
					
						
							|  |  |  |     char * p = (char *)path; | 
					
						
							|  |  |  |     while(*p){ | 
					
						
							|  |  |  |         i++; | 
					
						
							|  |  |  |         if(*p == '/' || *p == '\\'){ | 
					
						
							|  |  |  |             pos = i; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         p++; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return path+pos; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2016-10-06 14:21:30 +03:00
										 |  |  | 
 |