Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
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
Arduino-mbed-APIs/arduino-esp32.cpp@105:6e6d141c3da8, 2017-11-22 (annotated)
- 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?
| User | Revision | Line number | New 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 |

