Helmut Tschemernjak / SX1276GenericLib

Dependents:   DISCO-L072CZ-LRWAN1_LoRa_PingPong DISCO-L072CZ-LRWAN1_LoRa_PingPong DISCO-L072CZ-LRWAN1_LoRa_PingPong DISCO-L072CZ-LRWAN1_LoRa_USB_Rx ... more

Fork of SX1276Lib by Semtech

Committer:
Helmut Tschemernjak
Date:
Wed Nov 22 12:14:00 2017 +0100
Revision:
105:6e6d141c3da8
Parent:
104:b5183e348f9d
Moved ESP32 helper functions into arduino-esp32.cpp
Allow to change MAX_TIMEOUTS without need to change
custom d21 and ESP32 assembler files

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Helmut Tschemernjak 97:3d5d489206aa 1 /*
Helmut Tschemernjak 97:3d5d489206aa 2 * The file is Licensed under the Apache License, Version 2.0
Helmut Tschemernjak 97:3d5d489206aa 3 * (c) 2017 Helmut Tschemernjak
Helmut Tschemernjak 97:3d5d489206aa 4 * 30826 Garbsen (Hannover) Germany
Helmut Tschemernjak 97:3d5d489206aa 5 */
Helmut Tschemernjak 97:3d5d489206aa 6
Helmut Tschemernjak 97:3d5d489206aa 7 #ifdef ARDUINO
Helmut Tschemernjak 97:3d5d489206aa 8
Helmut Tschemernjak 97:3d5d489206aa 9 using namespace std;
Helmut Tschemernjak 97:3d5d489206aa 10
Helmut Tschemernjak 97:3d5d489206aa 11 #include "arduino-mbed.h"
Helmut Tschemernjak 97:3d5d489206aa 12 #include "arduino-util.h"
Helmut Tschemernjak 97:3d5d489206aa 13
Helmut Tschemernjak 104:b5183e348f9d 14 #if defined(ARDUINO_ARCH_ESP32)
Helmut Tschemernjak 97:3d5d489206aa 15
Helmut Tschemernjak 104:b5183e348f9d 16 #include "soc/efuse_reg.h"
Helmut Tschemernjak 104:b5183e348f9d 17
Helmut Tschemernjak 97:3d5d489206aa 18 /*
Helmut Tschemernjak 97:3d5d489206aa 19 * ARDUINO_ARCH_ESP32 ESP32 development board
Helmut Tschemernjak 97:3d5d489206aa 20 * Heltec ESP32 boards
Helmut Tschemernjak 97:3d5d489206aa 21 */
Helmut Tschemernjak 97:3d5d489206aa 22
Helmut Tschemernjak 104:b5183e348f9d 23 int CPUID(uint8_t *buf, int maxSize, uint32_t xorval)
Helmut Tschemernjak 97:3d5d489206aa 24 {
Helmut Tschemernjak 104:b5183e348f9d 25 uint8_t uuid[16];
Helmut Tschemernjak 104:b5183e348f9d 26 int f1 = 0x6aa0f551; // EFUSE_BLK0_RDATA1_REG address
Helmut Tschemernjak 104:b5183e348f9d 27 int f2 = 0x6aa0f55d; // EFUSE_BLK0_RDATA2_REG address
Helmut Tschemernjak 97:3d5d489206aa 28
Helmut Tschemernjak 104:b5183e348f9d 29 if (maxSize >= sizeof(uuid)) {
Helmut Tschemernjak 104:b5183e348f9d 30 int fa = f1 ^ xorval;
Helmut Tschemernjak 104:b5183e348f9d 31 int fb = f2 ^ xorval;
Helmut Tschemernjak 104:b5183e348f9d 32
Helmut Tschemernjak 104:b5183e348f9d 33 uint32_t mac_low = REG_READ(fa);
Helmut Tschemernjak 104:b5183e348f9d 34 uint32_t mac_high = REG_READ(fb);
Helmut Tschemernjak 104:b5183e348f9d 35
Helmut Tschemernjak 104:b5183e348f9d 36 uuid[0] = mac_high >> 8;
Helmut Tschemernjak 104:b5183e348f9d 37 uuid[1] = mac_high;
Helmut Tschemernjak 104:b5183e348f9d 38 uuid[2] = mac_low >> 24;
Helmut Tschemernjak 104:b5183e348f9d 39 uuid[3] = mac_low >> 16;
Helmut Tschemernjak 104:b5183e348f9d 40 uuid[4] = mac_low >> 8;
Helmut Tschemernjak 104:b5183e348f9d 41 uuid[5] = mac_low;
Helmut Tschemernjak 104:b5183e348f9d 42
Helmut Tschemernjak 104:b5183e348f9d 43 uuid[6] = uuid[0] ^ 0x16;
Helmut Tschemernjak 104:b5183e348f9d 44 uuid[7] = uuid[1] ^ 0x27;
Helmut Tschemernjak 104:b5183e348f9d 45 uuid[8] = uuid[2] ^ 0x38;
Helmut Tschemernjak 104:b5183e348f9d 46 uuid[9] = uuid[4] ^ 0x49;
Helmut Tschemernjak 104:b5183e348f9d 47 uuid[10] = uuid[5] ^ 0x50;
Helmut Tschemernjak 104:b5183e348f9d 48 uuid[11] = uuid[5] ^ 0x61;
Helmut Tschemernjak 104:b5183e348f9d 49
Helmut Tschemernjak 104:b5183e348f9d 50 uuid[12] = ESP.getChipRevision();
Helmut Tschemernjak 104:b5183e348f9d 51 uuid[13] = 0x12;
Helmut Tschemernjak 104:b5183e348f9d 52 uuid[14] = 0x34;
Helmut Tschemernjak 104:b5183e348f9d 53 uuid[15] = 0x56;
Helmut Tschemernjak 104:b5183e348f9d 54 memcpy(buf, &uuid[0], sizeof(uuid));
Helmut Tschemernjak 104:b5183e348f9d 55 return sizeof(uuid);
Helmut Tschemernjak 97:3d5d489206aa 56 }
Helmut Tschemernjak 97:3d5d489206aa 57 return 0;
Helmut Tschemernjak 97:3d5d489206aa 58 }
Helmut Tschemernjak 97:3d5d489206aa 59
Helmut Tschemernjak 97:3d5d489206aa 60 /*
Helmut Tschemernjak 97:3d5d489206aa 61 * see esp32-hal-timer.h is automatically included from:
Helmut Tschemernjak 97:3d5d489206aa 62 * Arduino15/packages/arduino/hardware/espressif/esp32/cores/esp32
Helmut Tschemernjak 97:3d5d489206aa 63 */
Helmut Tschemernjak 97:3d5d489206aa 64 static void initTimer(int timerID);
Helmut Tschemernjak 97:3d5d489206aa 65 void IRAM_ATTR onTimer(void);
Helmut Tschemernjak 97:3d5d489206aa 66 /*
Helmut Tschemernjak 103:59930a715bf8 67 * The Atmel ESP32 has four 64-bit timer.
Helmut Tschemernjak 103:59930a715bf8 68 * At present the solution uses two timers, one for counting ticks,
Helmut Tschemernjak 103:59930a715bf8 69 * a second for setting alarms. This is required for the rev-0 ESP
Helmut Tschemernjak 103:59930a715bf8 70 *
Helmut Tschemernjak 103:59930a715bf8 71 * For the rev. 1 ESP a single timer will work for counting as well for
Helmut Tschemernjak 103:59930a715bf8 72 * setting the alarm via timerAlarmWrite(timer, timerRead(timer) + 1000000, false)
Helmut Tschemernjak 103:59930a715bf8 73 * once we support only ESP32-R1 the timer functions can be optimized to use only a
Helmut Tschemernjak 103:59930a715bf8 74 * single 64-bit timer.
Helmut Tschemernjak 97:3d5d489206aa 75 */
Helmut Tschemernjak 97:3d5d489206aa 76 struct TIMER_config {
Helmut Tschemernjak 97:3d5d489206aa 77 int timerID;
Helmut Tschemernjak 97:3d5d489206aa 78 hw_timer_t *timer;
Helmut Tschemernjak 97:3d5d489206aa 79 uint8_t nbits;
Helmut Tschemernjak 97:3d5d489206aa 80 } Timer_data[] {
Helmut Tschemernjak 97:3d5d489206aa 81 { 0, NULL, 32 },
Helmut Tschemernjak 97:3d5d489206aa 82 { 1, NULL, 32 },
Helmut Tschemernjak 97:3d5d489206aa 83 { 2, NULL, 32 },
Helmut Tschemernjak 103:59930a715bf8 84 { 3, NULL, 32 },
Helmut Tschemernjak 97:3d5d489206aa 85 { -1, NULL, 0 }
Helmut Tschemernjak 97:3d5d489206aa 86 };
Helmut Tschemernjak 97:3d5d489206aa 87
Helmut Tschemernjak 97:3d5d489206aa 88 /*
Helmut Tschemernjak 97:3d5d489206aa 89 * We preferably use ESP32 timers because it supports 64-bit counters
Helmut Tschemernjak 97:3d5d489206aa 90 */
Helmut Tschemernjak 97:3d5d489206aa 91 #define USE_TIMER_TIMEOUT 0 // 0, 1, 2 (see ESP32 docs)
Helmut Tschemernjak 97:3d5d489206aa 92 #define USE_TIMER_TICKER 1 // 0, 1, 2 (see ESP32 docs)
Helmut Tschemernjak 97:3d5d489206aa 93 #define MAX_TIMERS 3
Helmut Tschemernjak 101:50377edb21c6 94 #define TIMER_DIVIDER 80
Helmut Tschemernjak 101:50377edb21c6 95 #define TIMER_CLOCK 80
Helmut Tschemernjak 97:3d5d489206aa 96
Helmut Tschemernjak 97:3d5d489206aa 97 /*
Helmut Tschemernjak 97:3d5d489206aa 98 * Calculation of ticks see timerBegin divider
Helmut Tschemernjak 97:3d5d489206aa 99 */
Helmut Tschemernjak 97:3d5d489206aa 100 #define NS_PER_CLOCK_CPU 1000 // ns secs per clock
Helmut Tschemernjak 97:3d5d489206aa 101 #define NS_PER_CLOCK_RTC 1000 // ns secs per clock
Helmut Tschemernjak 97:3d5d489206aa 102 #define TIMER_INFINITE 0x7fffffffffffffff // max esp alarm timeout
Helmut Tschemernjak 97:3d5d489206aa 103 #define NS_PER_CLOCK NS_PER_CLOCK_RTC
Helmut Tschemernjak 97:3d5d489206aa 104
Helmut Tschemernjak 97:3d5d489206aa 105
Helmut Tschemernjak 97:3d5d489206aa 106 const char *GetTimerName(int timerID)
Helmut Tschemernjak 97:3d5d489206aa 107 {
Helmut Tschemernjak 97:3d5d489206aa 108 switch(timerID) {
Helmut Tschemernjak 97:3d5d489206aa 109 case USE_TIMER_TIMEOUT:
Helmut Tschemernjak 97:3d5d489206aa 110 return "TIMEOUT";
Helmut Tschemernjak 97:3d5d489206aa 111 break;
Helmut Tschemernjak 97:3d5d489206aa 112 case USE_TIMER_TICKER:
Helmut Tschemernjak 97:3d5d489206aa 113 return "TICKER";
Helmut Tschemernjak 97:3d5d489206aa 114 break;
Helmut Tschemernjak 97:3d5d489206aa 115 default:
Helmut Tschemernjak 97:3d5d489206aa 116 return "Uknown";
Helmut Tschemernjak 97:3d5d489206aa 117 }
Helmut Tschemernjak 97:3d5d489206aa 118 }
Helmut Tschemernjak 97:3d5d489206aa 119
Helmut Tschemernjak 97:3d5d489206aa 120 /* ----------------- TICKER TIMER CODE ----------------------*/
Helmut Tschemernjak 97:3d5d489206aa 121
Helmut Tschemernjak 97:3d5d489206aa 122 /*
Helmut Tschemernjak 97:3d5d489206aa 123 * The global ns_counter contains the time in ns from the last time
Helmut Tschemernjak 97:3d5d489206aa 124 * the counter has been wrapped. It cannot be used directly because the
Helmut Tschemernjak 97:3d5d489206aa 125 * current counter has to be added fore using it. Use instead
Helmut Tschemernjak 97:3d5d489206aa 126 * ns_getTicker(), us_ ns_getTicker(), ms_getTicker()
Helmut Tschemernjak 97:3d5d489206aa 127 */
Helmut Tschemernjak 97:3d5d489206aa 128
Helmut Tschemernjak 97:3d5d489206aa 129 static volatile bool initTickerDone = false;
Helmut Tschemernjak 97:3d5d489206aa 130
Helmut Tschemernjak 97:3d5d489206aa 131 uint64_t ns_getTicker(void)
Helmut Tschemernjak 97:3d5d489206aa 132 {
Helmut Tschemernjak 97:3d5d489206aa 133 int timerID = Timer_data[USE_TIMER_TICKER].timerID;
Helmut Tschemernjak 97:3d5d489206aa 134
Helmut Tschemernjak 97:3d5d489206aa 135 if (!initTickerDone) {
Helmut Tschemernjak 97:3d5d489206aa 136 initTimer(timerID);
Helmut Tschemernjak 97:3d5d489206aa 137 initTickerDone = true;
Helmut Tschemernjak 97:3d5d489206aa 138 }
Helmut Tschemernjak 97:3d5d489206aa 139
Helmut Tschemernjak 97:3d5d489206aa 140 hw_timer_t *timer = Timer_data[USE_TIMER_TICKER].timer;
Helmut Tschemernjak 97:3d5d489206aa 141 uint64_t ns = timerRead(timer);
Helmut Tschemernjak 97:3d5d489206aa 142 uint16_t div = timerGetDivider(timer);
Helmut Tschemernjak 97:3d5d489206aa 143 ns *= div; // get to the real clocks
Helmut Tschemernjak 101:50377edb21c6 144 ns *= 1000; // convert micros to NS.
Helmut Tschemernjak 101:50377edb21c6 145 ns /= TIMER_CLOCK; // 80 MHz clock, convert to micro seconds
Helmut Tschemernjak 97:3d5d489206aa 146
Helmut Tschemernjak 97:3d5d489206aa 147 return ns;
Helmut Tschemernjak 97:3d5d489206aa 148 }
Helmut Tschemernjak 97:3d5d489206aa 149
Helmut Tschemernjak 97:3d5d489206aa 150
Helmut Tschemernjak 97:3d5d489206aa 151 /* ----------------- SUPPORT CODE FOR TCC TIMERS----------------------*/
Helmut Tschemernjak 97:3d5d489206aa 152
Helmut Tschemernjak 97:3d5d489206aa 153 static volatile bool initTimerDone = false;
Helmut Tschemernjak 97:3d5d489206aa 154
Helmut Tschemernjak 97:3d5d489206aa 155 static void initTimer(int timerID)
Helmut Tschemernjak 97:3d5d489206aa 156 {
Helmut Tschemernjak 97:3d5d489206aa 157 //dprintf("initTimer: %s", GetTimerName(timerID));
Helmut Tschemernjak 97:3d5d489206aa 158 struct TIMER_config *cp = &Timer_data[timerID];
Helmut Tschemernjak 97:3d5d489206aa 159 if (timerID > MAX_TIMERS-1)
Helmut Tschemernjak 97:3d5d489206aa 160 return;
Helmut Tschemernjak 97:3d5d489206aa 161
Helmut Tschemernjak 101:50377edb21c6 162 cp->timer = timerBegin(timerID, TIMER_DIVIDER, true);
Helmut Tschemernjak 97:3d5d489206aa 163 timerWrite(cp->timer, 0);
Helmut Tschemernjak 101:50377edb21c6 164 if (timerID == USE_TIMER_TICKER) {
Helmut Tschemernjak 101:50377edb21c6 165 time_t t = time(NULL);
Helmut Tschemernjak 101:50377edb21c6 166 if (t > 0) {
Helmut Tschemernjak 101:50377edb21c6 167 struct tm mytm;
Helmut Tschemernjak 101:50377edb21c6 168 uint64_t tstart;
Helmut Tschemernjak 101:50377edb21c6 169
Helmut Tschemernjak 101:50377edb21c6 170 localtime_r(&t, &mytm);
Helmut Tschemernjak 101:50377edb21c6 171 tstart = mytm.tm_sec + (mytm.tm_min * 60) + (mytm.tm_hour * 3600);
Helmut Tschemernjak 101:50377edb21c6 172 tstart *= 1000000;
Helmut Tschemernjak 101:50377edb21c6 173 tstart *= TIMER_CLOCK;
Helmut Tschemernjak 101:50377edb21c6 174 tstart /= TIMER_DIVIDER;
Helmut Tschemernjak 101:50377edb21c6 175 timerWrite(cp->timer, tstart);
Helmut Tschemernjak 101:50377edb21c6 176 }
Helmut Tschemernjak 97:3d5d489206aa 177 timerStart(cp->timer);
Helmut Tschemernjak 101:50377edb21c6 178 } else {
Helmut Tschemernjak 97:3d5d489206aa 179 timerAttachInterrupt(cp->timer, &onTimer, true);
Helmut Tschemernjak 97:3d5d489206aa 180 timerAlarmWrite(cp->timer, TIMER_INFINITE, true);
Helmut Tschemernjak 97:3d5d489206aa 181 timerAlarmEnable(cp->timer);
Helmut Tschemernjak 97:3d5d489206aa 182 timerStart(cp->timer);
Helmut Tschemernjak 97:3d5d489206aa 183 }
Helmut Tschemernjak 97:3d5d489206aa 184 /*
Helmut Tschemernjak 97:3d5d489206aa 185 * somehow the timer needs some time to initalize before being used.
Helmut Tschemernjak 97:3d5d489206aa 186 * otherwise it will not issue any alarms
Helmut Tschemernjak 97:3d5d489206aa 187 * This affects only ESP32 rev 0
Helmut Tschemernjak 97:3d5d489206aa 188 */
Helmut Tschemernjak 101:50377edb21c6 189 if (ESP.getChipRevision() == 0)
Helmut Tschemernjak 101:50377edb21c6 190 delay(20);
Helmut Tschemernjak 97:3d5d489206aa 191 }
Helmut Tschemernjak 97:3d5d489206aa 192
Helmut Tschemernjak 97:3d5d489206aa 193
Helmut Tschemernjak 97:3d5d489206aa 194 TIMER_REF *getTimeoutTimer(void)
Helmut Tschemernjak 97:3d5d489206aa 195 {
Helmut Tschemernjak 97:3d5d489206aa 196 struct TIMER_config *cp = &Timer_data[USE_TIMER_TIMEOUT];
Helmut Tschemernjak 97:3d5d489206aa 197
Helmut Tschemernjak 97:3d5d489206aa 198 return &cp->timerID;
Helmut Tschemernjak 97:3d5d489206aa 199 }
Helmut Tschemernjak 97:3d5d489206aa 200
Helmut Tschemernjak 97:3d5d489206aa 201
Helmut Tschemernjak 97:3d5d489206aa 202 void stopTimer(int *timerIDPtr)
Helmut Tschemernjak 97:3d5d489206aa 203 {
Helmut Tschemernjak 97:3d5d489206aa 204 struct TIMER_config *cp = &Timer_data[*timerIDPtr];
Helmut Tschemernjak 97:3d5d489206aa 205 if (*timerIDPtr > MAX_TIMERS-1)
Helmut Tschemernjak 97:3d5d489206aa 206 return;
Helmut Tschemernjak 97:3d5d489206aa 207
Helmut Tschemernjak 97:3d5d489206aa 208 if (cp->timer)
Helmut Tschemernjak 97:3d5d489206aa 209 timerAlarmWrite(cp->timer, TIMER_INFINITE, true);
Helmut Tschemernjak 97:3d5d489206aa 210 }
Helmut Tschemernjak 97:3d5d489206aa 211
Helmut Tschemernjak 97:3d5d489206aa 212
Helmut Tschemernjak 97:3d5d489206aa 213 /* ----------------- TIMEOUT TIMER CODE ----------------------*/
Helmut Tschemernjak 97:3d5d489206aa 214
Helmut Tschemernjak 97:3d5d489206aa 215 void startTimer(int *timerIDPtr, uint64_t delay_ns)
Helmut Tschemernjak 97:3d5d489206aa 216 {
Helmut Tschemernjak 97:3d5d489206aa 217 if (!initTimerDone) {
Helmut Tschemernjak 97:3d5d489206aa 218 initTimer(*timerIDPtr); // initial setup with stopped timer
Helmut Tschemernjak 97:3d5d489206aa 219 initTimerDone = true;
Helmut Tschemernjak 97:3d5d489206aa 220 }
Helmut Tschemernjak 97:3d5d489206aa 221
Helmut Tschemernjak 97:3d5d489206aa 222 struct TIMER_config *cp = &Timer_data[*timerIDPtr];
Helmut Tschemernjak 97:3d5d489206aa 223 if (*timerIDPtr > MAX_TIMERS-1)
Helmut Tschemernjak 97:3d5d489206aa 224 return;
Helmut Tschemernjak 97:3d5d489206aa 225 uint64_t usecs = delay_ns/1000;
Helmut Tschemernjak 97:3d5d489206aa 226 if (delay_ns == 1) // immediate timeout
Helmut Tschemernjak 97:3d5d489206aa 227 usecs = 1;
Helmut Tschemernjak 97:3d5d489206aa 228 timerAlarmWrite(cp->timer, usecs, true);
Helmut Tschemernjak 97:3d5d489206aa 229 // dprintf("startTimer: %s in %d us", GetTimerName(*timerIDPtr), usecs);
Helmut Tschemernjak 97:3d5d489206aa 230 }
Helmut Tschemernjak 97:3d5d489206aa 231
Helmut Tschemernjak 97:3d5d489206aa 232 /*
Helmut Tschemernjak 97:3d5d489206aa 233 * The onTimer is only called for every Timeout expired timer
Helmut Tschemernjak 97:3d5d489206aa 234 */
Helmut Tschemernjak 97:3d5d489206aa 235 void IRAM_ATTR onTimer(void) {
Helmut Tschemernjak 97:3d5d489206aa 236 //dprintf("onTimer int called");
Helmut Tschemernjak 97:3d5d489206aa 237 uint64_t nsecs = ns_getTicker();
Helmut Tschemernjak 97:3d5d489206aa 238
Helmut Tschemernjak 105:6e6d141c3da8 239 for (int i = 0; i < maxTimeouts-1; i++) {
Helmut Tschemernjak 97:3d5d489206aa 240 struct TimeoutVector *tvp = &TimeOuts[i];
Helmut Tschemernjak 97:3d5d489206aa 241 if (tvp->timer && nsecs >= tvp->timer->_timeout) {
Helmut Tschemernjak 97:3d5d489206aa 242 Timeout *saveTimer = tvp->timer;
Helmut Tschemernjak 97:3d5d489206aa 243 tvp->timer = NULL;
Helmut Tschemernjak 97:3d5d489206aa 244 Timeout::_irq_handler(saveTimer);
Helmut Tschemernjak 97:3d5d489206aa 245 }
Helmut Tschemernjak 97:3d5d489206aa 246 }
Helmut Tschemernjak 97:3d5d489206aa 247 /*
Helmut Tschemernjak 97:3d5d489206aa 248 * we need to restart the timer for remaining interrupts
Helmut Tschemernjak 97:3d5d489206aa 249 * Another reason is that we stopped this counter, in case there are
Helmut Tschemernjak 97:3d5d489206aa 250 * remaining counts, we need to re-schedule the counter.
Helmut Tschemernjak 97:3d5d489206aa 251 */
Helmut Tschemernjak 97:3d5d489206aa 252 Timeout::restart();
Helmut Tschemernjak 97:3d5d489206aa 253 }
Helmut Tschemernjak 97:3d5d489206aa 254
Helmut Tschemernjak 97:3d5d489206aa 255
Helmut Tschemernjak 97:3d5d489206aa 256 /* ----------------- ESP32 sleep() and deepsleep() code ----------------------*/
Helmut Tschemernjak 97:3d5d489206aa 257
Helmut Tschemernjak 97:3d5d489206aa 258 void sleep(void)
Helmut Tschemernjak 97:3d5d489206aa 259 {
Helmut Tschemernjak 97:3d5d489206aa 260 asm("waiti 0");
Helmut Tschemernjak 97:3d5d489206aa 261 }
Helmut Tschemernjak 97:3d5d489206aa 262
Helmut Tschemernjak 97:3d5d489206aa 263 /*
Helmut Tschemernjak 97:3d5d489206aa 264 * TODO
Helmut Tschemernjak 97:3d5d489206aa 265 * The ESP32 deepsleep can be enhanced to bring the ESP into low power mode.
Helmut Tschemernjak 97:3d5d489206aa 266 */
Helmut Tschemernjak 97:3d5d489206aa 267
Helmut Tschemernjak 97:3d5d489206aa 268 void deepsleep(void)
Helmut Tschemernjak 97:3d5d489206aa 269 {
Helmut Tschemernjak 101:50377edb21c6 270 // Light Sleep
Helmut Tschemernjak 97:3d5d489206aa 271 asm("waiti 0");
Helmut Tschemernjak 97:3d5d489206aa 272 }
Helmut Tschemernjak 97:3d5d489206aa 273
Helmut Tschemernjak 105:6e6d141c3da8 274
Helmut Tschemernjak 105:6e6d141c3da8 275 #if 0
Helmut Tschemernjak 105:6e6d141c3da8 276 esp_light_sleep_start();
Helmut Tschemernjak 105:6e6d141c3da8 277 #endif
Helmut Tschemernjak 105:6e6d141c3da8 278
Helmut Tschemernjak 105:6e6d141c3da8 279 #if 0
Helmut Tschemernjak 105:6e6d141c3da8 280 // esp_err = gpio_pullup_dis(GPIO_NUM_xx);
Helmut Tschemernjak 105:6e6d141c3da8 281 // esp_err = gpio_pulldown_en(GPIO_NUM_xx);
Helmut Tschemernjak 105:6e6d141c3da8 282 int err = esp_deep_sleep_enable_ext0_wakeup((gpio_num_t)SW0,0); //1 = High, 0 = Low
Helmut Tschemernjak 105:6e6d141c3da8 283 if (err) {
Helmut Tschemernjak 105:6e6d141c3da8 284 dprintf("esp_deep_sleep_enable_ext0_wakeup: error %d", err);
Helmut Tschemernjak 105:6e6d141c3da8 285 return;
Helmut Tschemernjak 105:6e6d141c3da8 286 }
Helmut Tschemernjak 105:6e6d141c3da8 287 esp_deep_sleep_enable_timer_wakeup(10000000); // or later esp_sleep_enable_timer_wakeup(10000000);
Helmut Tschemernjak 105:6e6d141c3da8 288 dprintf("Enter deep sleep");
Helmut Tschemernjak 105:6e6d141c3da8 289 esp_deep_sleep_start();
Helmut Tschemernjak 105:6e6d141c3da8 290 // esp_light_sleep_start(); // does not exists?
Helmut Tschemernjak 105:6e6d141c3da8 291 #endif
Helmut Tschemernjak 105:6e6d141c3da8 292
Helmut Tschemernjak 105:6e6d141c3da8 293
Helmut Tschemernjak 105:6e6d141c3da8 294 /*
Helmut Tschemernjak 105:6e6d141c3da8 295 * Convert compile time to system time
Helmut Tschemernjak 105:6e6d141c3da8 296 */
Helmut Tschemernjak 105:6e6d141c3da8 297 time_t cvt_date(char const *date, char const *time)
Helmut Tschemernjak 105:6e6d141c3da8 298 {
Helmut Tschemernjak 105:6e6d141c3da8 299 char s_month[5];
Helmut Tschemernjak 105:6e6d141c3da8 300 int year;
Helmut Tschemernjak 105:6e6d141c3da8 301 struct tm t;
Helmut Tschemernjak 105:6e6d141c3da8 302 static const char month_names[] = "JanFebMarAprMayJunJulAugSepOctNovDec";
Helmut Tschemernjak 105:6e6d141c3da8 303 sscanf(date, "%s %d %d", s_month, &t.tm_mday, &year);
Helmut Tschemernjak 105:6e6d141c3da8 304 sscanf(time, "%2d %*c %2d %*c %2d", &t.tm_hour, &t.tm_min, &t.tm_sec);
Helmut Tschemernjak 105:6e6d141c3da8 305 // Find where is s_month in month_names. Deduce month value.
Helmut Tschemernjak 105:6e6d141c3da8 306 t.tm_mon = (strstr(month_names, s_month) - month_names) / 3;
Helmut Tschemernjak 105:6e6d141c3da8 307 t.tm_year = year - 1900;
Helmut Tschemernjak 105:6e6d141c3da8 308 return (int)mktime(&t);
Helmut Tschemernjak 105:6e6d141c3da8 309 }
Helmut Tschemernjak 105:6e6d141c3da8 310
Helmut Tschemernjak 105:6e6d141c3da8 311
Helmut Tschemernjak 105:6e6d141c3da8 312 const char *ESP32ResetReason(RESET_REASON r)
Helmut Tschemernjak 105:6e6d141c3da8 313 {
Helmut Tschemernjak 105:6e6d141c3da8 314 const char *reason = "";
Helmut Tschemernjak 105:6e6d141c3da8 315
Helmut Tschemernjak 105:6e6d141c3da8 316 switch(r) {
Helmut Tschemernjak 105:6e6d141c3da8 317 case NO_MEAN:
Helmut Tschemernjak 105:6e6d141c3da8 318 reason = "no mean";
Helmut Tschemernjak 105:6e6d141c3da8 319 break;
Helmut Tschemernjak 105:6e6d141c3da8 320 case POWERON_RESET:
Helmut Tschemernjak 105:6e6d141c3da8 321 reason = "Vbat power on reset";
Helmut Tschemernjak 105:6e6d141c3da8 322 break;
Helmut Tschemernjak 105:6e6d141c3da8 323 case SW_RESET:
Helmut Tschemernjak 105:6e6d141c3da8 324 reason = "Software reset digital core";
Helmut Tschemernjak 105:6e6d141c3da8 325 break;
Helmut Tschemernjak 105:6e6d141c3da8 326 case OWDT_RESET:
Helmut Tschemernjak 105:6e6d141c3da8 327 reason = "Legacy watch dog reset digital core";
Helmut Tschemernjak 105:6e6d141c3da8 328 break;
Helmut Tschemernjak 105:6e6d141c3da8 329 case DEEPSLEEP_RESET:
Helmut Tschemernjak 105:6e6d141c3da8 330 reason = "Deep Sleep reset digital core";
Helmut Tschemernjak 105:6e6d141c3da8 331 break;
Helmut Tschemernjak 105:6e6d141c3da8 332 case SDIO_RESET:
Helmut Tschemernjak 105:6e6d141c3da8 333 reason = "Reset by SLC module, reset digital core";
Helmut Tschemernjak 105:6e6d141c3da8 334 break;
Helmut Tschemernjak 105:6e6d141c3da8 335 case TG0WDT_SYS_RESET:
Helmut Tschemernjak 105:6e6d141c3da8 336 reason = "Timer Group0 Watch dog reset digital core";
Helmut Tschemernjak 105:6e6d141c3da8 337 break;
Helmut Tschemernjak 105:6e6d141c3da8 338 case TG1WDT_SYS_RESET:
Helmut Tschemernjak 105:6e6d141c3da8 339 reason = "Timer Group1 Watch dog reset digital core";
Helmut Tschemernjak 105:6e6d141c3da8 340 break;
Helmut Tschemernjak 105:6e6d141c3da8 341 case RTCWDT_SYS_RESET:
Helmut Tschemernjak 105:6e6d141c3da8 342 reason = "RTC Watch dog Reset digital core";
Helmut Tschemernjak 105:6e6d141c3da8 343 break;
Helmut Tschemernjak 105:6e6d141c3da8 344 case INTRUSION_RESET:
Helmut Tschemernjak 105:6e6d141c3da8 345 reason = "Instrusion tested to reset CPU";
Helmut Tschemernjak 105:6e6d141c3da8 346 break;
Helmut Tschemernjak 105:6e6d141c3da8 347 case TGWDT_CPU_RESET:
Helmut Tschemernjak 105:6e6d141c3da8 348 reason = "Time Group reset CPU";
Helmut Tschemernjak 105:6e6d141c3da8 349 break;
Helmut Tschemernjak 105:6e6d141c3da8 350 case SW_CPU_RESET:
Helmut Tschemernjak 105:6e6d141c3da8 351 reason = "Software reset CPU";
Helmut Tschemernjak 105:6e6d141c3da8 352 break;
Helmut Tschemernjak 105:6e6d141c3da8 353 case RTCWDT_CPU_RESET:
Helmut Tschemernjak 105:6e6d141c3da8 354 reason = "RTC Watch dog Reset CPU";
Helmut Tschemernjak 105:6e6d141c3da8 355 break;
Helmut Tschemernjak 105:6e6d141c3da8 356 case EXT_CPU_RESET:
Helmut Tschemernjak 105:6e6d141c3da8 357 reason = "APP CPU reseted by PRO CPU";
Helmut Tschemernjak 105:6e6d141c3da8 358 break;
Helmut Tschemernjak 105:6e6d141c3da8 359 case RTCWDT_BROWN_OUT_RESET:
Helmut Tschemernjak 105:6e6d141c3da8 360 reason = "Reset when the vdd voltage is not stable";
Helmut Tschemernjak 105:6e6d141c3da8 361 break;
Helmut Tschemernjak 105:6e6d141c3da8 362 case RTCWDT_RTC_RESET:
Helmut Tschemernjak 105:6e6d141c3da8 363 reason = "RTC Watch dog reset digital core and rtc module";
Helmut Tschemernjak 105:6e6d141c3da8 364 break;
Helmut Tschemernjak 105:6e6d141c3da8 365 default:
Helmut Tschemernjak 105:6e6d141c3da8 366 reason = "unkown reset";
Helmut Tschemernjak 105:6e6d141c3da8 367 break;
Helmut Tschemernjak 105:6e6d141c3da8 368 }
Helmut Tschemernjak 105:6e6d141c3da8 369 return reason;
Helmut Tschemernjak 105:6e6d141c3da8 370 }
Helmut Tschemernjak 105:6e6d141c3da8 371
Helmut Tschemernjak 105:6e6d141c3da8 372
Helmut Tschemernjak 105:6e6d141c3da8 373 /*
Helmut Tschemernjak 105:6e6d141c3da8 374 * Method to print the reason by which ESP32
Helmut Tschemernjak 105:6e6d141c3da8 375 * has been awaken from sleep
Helmut Tschemernjak 105:6e6d141c3da8 376 */
Helmut Tschemernjak 105:6e6d141c3da8 377 const char *ESP32WakeUpReason(esp_deep_sleep_wakeup_cause_t wakeup_reason)
Helmut Tschemernjak 105:6e6d141c3da8 378 {
Helmut Tschemernjak 105:6e6d141c3da8 379 const char *reason = "";
Helmut Tschemernjak 105:6e6d141c3da8 380
Helmut Tschemernjak 105:6e6d141c3da8 381 switch(wakeup_reason)
Helmut Tschemernjak 105:6e6d141c3da8 382 {
Helmut Tschemernjak 105:6e6d141c3da8 383 case ESP_DEEP_SLEEP_WAKEUP_EXT0:
Helmut Tschemernjak 105:6e6d141c3da8 384 reason = "Wakeup caused by external signal using RTC_IO";
Helmut Tschemernjak 105:6e6d141c3da8 385 break;
Helmut Tschemernjak 105:6e6d141c3da8 386 case ESP_DEEP_SLEEP_WAKEUP_EXT1:
Helmut Tschemernjak 105:6e6d141c3da8 387 reason = "Wakeup caused by external signal using RTC_CNTL";
Helmut Tschemernjak 105:6e6d141c3da8 388 break;
Helmut Tschemernjak 105:6e6d141c3da8 389 case ESP_DEEP_SLEEP_WAKEUP_TIMER:
Helmut Tschemernjak 105:6e6d141c3da8 390 reason = "Wakeup caused by timer";
Helmut Tschemernjak 105:6e6d141c3da8 391 break;
Helmut Tschemernjak 105:6e6d141c3da8 392 case ESP_DEEP_SLEEP_WAKEUP_TOUCHPAD:
Helmut Tschemernjak 105:6e6d141c3da8 393 reason = "Wakeup caused by touchpad";
Helmut Tschemernjak 105:6e6d141c3da8 394 break;
Helmut Tschemernjak 105:6e6d141c3da8 395 case ESP_DEEP_SLEEP_WAKEUP_ULP:
Helmut Tschemernjak 105:6e6d141c3da8 396 reason = "Wakeup caused by ULP program";
Helmut Tschemernjak 105:6e6d141c3da8 397 break;
Helmut Tschemernjak 105:6e6d141c3da8 398 default:
Helmut Tschemernjak 105:6e6d141c3da8 399 reason = "Wakeup was not caused by deep sleep";
Helmut Tschemernjak 105:6e6d141c3da8 400 break;
Helmut Tschemernjak 105:6e6d141c3da8 401 }
Helmut Tschemernjak 105:6e6d141c3da8 402 return reason;
Helmut Tschemernjak 105:6e6d141c3da8 403 }
Helmut Tschemernjak 105:6e6d141c3da8 404
Helmut Tschemernjak 97:3d5d489206aa 405 #endif // ESp32 Timer, sleep, etc.
Helmut Tschemernjak 97:3d5d489206aa 406
Helmut Tschemernjak 97:3d5d489206aa 407 #endif // ARDUINO