From 4b438602761c6553dddb058b3b6ebbdcd8186f43 Mon Sep 17 00:00:00 2001 From: Ivan Grokhotkov Date: Thu, 2 Jun 2016 13:39:53 +0800 Subject: [PATCH] Add offset parameter to rtcUserMemoryRead/Write, expose RTC_USER_MEM in esp8266_peri.h --- cores/esp8266/Esp.cpp | 12 ++++++------ cores/esp8266/Esp.h | 4 ++-- cores/esp8266/esp8266_peri.h | 2 ++ doc/libraries.md | 2 +- 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/cores/esp8266/Esp.cpp b/cores/esp8266/Esp.cpp index bd0c5c6d3..0ea0fef1d 100644 --- a/cores/esp8266/Esp.cpp +++ b/cores/esp8266/Esp.cpp @@ -112,21 +112,21 @@ void EspClass::deepSleep(uint32_t time_us, WakeMode mode) esp_yield(); } -bool EspClass::rtcUserMemoryRead(uint32_t *data, size_t size) +bool EspClass::rtcUserMemoryRead(uint32_t offset, uint32_t *data, size_t size) { - if (size > 512) { + if (size + offset > 512) { return false; } else { - return system_rtc_mem_read(64, data, size); + return system_rtc_mem_read(64 + offset, data, size); } } -bool EspClass::rtcUserMemoryWrite(uint32_t *data, size_t size) +bool EspClass::rtcUserMemoryWrite(uint32_t offset, uint32_t *data, size_t size) { - if (size > 512) { + if (size + offset > 512) { return false; } else { - return system_rtc_mem_write(64, data, size); + return system_rtc_mem_write(64 + offset, data, size); } } diff --git a/cores/esp8266/Esp.h b/cores/esp8266/Esp.h index b6914cdd7..83f4b1b73 100644 --- a/cores/esp8266/Esp.h +++ b/cores/esp8266/Esp.h @@ -94,8 +94,8 @@ class EspClass { void deepSleep(uint32_t time_us, RFMode mode = RF_DEFAULT); - bool rtcUserMemoryRead(uint32_t *data, size_t size); - bool rtcUserMemoryWrite(uint32_t *data, size_t size); + bool rtcUserMemoryRead(uint32_t offset, uint32_t *data, size_t size); + bool rtcUserMemoryWrite(uint32_t offset, uint32_t *data, size_t size); void reset(); void restart(); diff --git a/cores/esp8266/esp8266_peri.h b/cores/esp8266/esp8266_peri.h index e7aab1f03..0ad689353 100644 --- a/cores/esp8266/esp8266_peri.h +++ b/cores/esp8266/esp8266_peri.h @@ -169,6 +169,8 @@ extern uint8_t esp8266_gpioToFn[16]; #define RTCIC ESP8266_REG(0x724) //RTC INT Clear #define RTCIE ESP8266_REG(0x728) //RTC INT Enable +#define RTC_USER_MEM ((volatile uint32_t*)0x60001200) + //IO SWAP Register #define IOSWAP ESP8266_DREG(0x28) #define IOSWAPU 0 //Swaps UART diff --git a/doc/libraries.md b/doc/libraries.md index ae0e9f0de..089b32126 100644 --- a/doc/libraries.md +++ b/doc/libraries.md @@ -83,7 +83,7 @@ APIs related to deep sleep and watchdog timer are available in the `ESP` object, `ESP.deepSleep(microseconds, mode)` will put the chip into deep sleep. `mode` is one of `WAKE_RF_DEFAULT`, `WAKE_RFCAL`, `WAKE_NO_RFCAL`, `WAKE_RF_DISABLED`. (GPIO16 needs to be tied to RST to wake from deepSleep.) -`ESP.rtcUserMemoryWrite(&data, sizeof(data))` and `ESP.rtcUserMemoryRead(&data, sizeof(data))` allow struct data with the maximum size of 512 bytes to be stored and retrieved from the RTC user memory of the chip respectively. The stored data can be retained between deep sleep cycles. However, the data might be lost after power cycling the chip. +`ESP.rtcUserMemoryWrite(offset, &data, sizeof(data))` and `ESP.rtcUserMemoryRead(offset, &data, sizeof(data))` allow data to be stored in and retrieved from the RTC user memory of the chip respectively. Total size of RTC user memory is 512 bytes, so offset + sizeof(data) shouldn't exceed 512. Data should be 4-byte aligned. The stored data can be retained between deep sleep cycles. However, the data might be lost after power cycling the chip. `ESP.restart()` restarts the CPU.