| 
									
										
										
										
											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 "esp32-hal.h"
 | 
					
						
							|  |  |  | #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"
 | 
					
						
							| 
									
										
										
										
											2017-03-20 11:21:56 +02:00
										 |  |  | #include <sys/time.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; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-11 00:25:15 +02:00
										 |  |  | void yield() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     vPortYield(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-20 11:21:56 +02:00
										 |  |  | portMUX_TYPE microsMux = portMUX_INITIALIZER_UNLOCKED; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-22 15:47:12 +03:00
										 |  |  | unsigned long IRAM_ATTR micros() | 
					
						
							| 
									
										
										
										
											2016-10-06 14:21:30 +03:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2017-05-22 15:47:12 +03:00
										 |  |  |     static unsigned long lccount = 0; | 
					
						
							|  |  |  |     static unsigned long overflow = 0; | 
					
						
							|  |  |  |     unsigned long ccount; | 
					
						
							| 
									
										
										
										
											2017-03-20 11:21:56 +02:00
										 |  |  |     portENTER_CRITICAL_ISR(µsMux); | 
					
						
							| 
									
										
										
										
											2016-10-06 14:21:30 +03:00
										 |  |  |     __asm__ __volatile__ ( "rsr     %0, ccount" : "=a" (ccount) ); | 
					
						
							| 
									
										
										
										
											2017-03-20 11:21:56 +02:00
										 |  |  |     if(ccount < lccount){ | 
					
						
							|  |  |  |         overflow += UINT32_MAX / CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     lccount = ccount; | 
					
						
							|  |  |  |     portEXIT_CRITICAL_ISR(µsMux); | 
					
						
							|  |  |  |     return overflow + (ccount / CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ); | 
					
						
							| 
									
										
										
										
											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
										 |  |  | { | 
					
						
							|  |  |  |     return xTaskGetTickCount() * portTICK_PERIOD_MS; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void delay(uint32_t ms) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     vTaskDelay(ms / portTICK_PERIOD_MS); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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() {} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-20 11:21:56 +02:00
										 |  |  | void initArduino() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											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); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											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
										 |  |  | 
 |