53 lines
1.1 KiB
C
53 lines
1.1 KiB
C
|
// Module for RTC user memory access
|
||
|
|
||
|
#include "module.h"
|
||
|
#include "lauxlib.h"
|
||
|
#include "esp_attr.h"
|
||
|
|
||
|
#define RTC_USER_MEM_NUM_DWORDS 128
|
||
|
|
||
|
RTC_NOINIT_ATTR uint32_t rtc_memory[RTC_USER_MEM_NUM_DWORDS];
|
||
|
|
||
|
static int rtcmem_read32 (lua_State *L)
|
||
|
{
|
||
|
int idx = luaL_checkinteger (L, 1);
|
||
|
int n = (lua_gettop(L) < 2) ? 1 : lua_tointeger (L, 2);
|
||
|
if (n == 0 || !lua_checkstack (L, n)) {
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
int ret = 0;
|
||
|
while (n > 0 && idx >= 0 && idx < RTC_USER_MEM_NUM_DWORDS)
|
||
|
{
|
||
|
lua_pushinteger (L, rtc_memory[idx++]);
|
||
|
--n;
|
||
|
++ret;
|
||
|
}
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
|
||
|
static int rtcmem_write32 (lua_State *L)
|
||
|
{
|
||
|
int idx = luaL_checkinteger (L, 1);
|
||
|
int n = lua_gettop (L) - 1;
|
||
|
luaL_argcheck (
|
||
|
L, idx + n <= RTC_USER_MEM_NUM_DWORDS, 1, "RTC mem would overrun");
|
||
|
int src = 2;
|
||
|
while (n-- > 0)
|
||
|
{
|
||
|
rtc_memory[idx++] = (uint32_t) lua_tointeger(L, src++);
|
||
|
}
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
|
||
|
// Module function map
|
||
|
LROT_BEGIN(rtcmem, NULL, 0)
|
||
|
LROT_FUNCENTRY( read32, rtcmem_read32 )
|
||
|
LROT_FUNCENTRY( write32, rtcmem_write32 )
|
||
|
LROT_END(rtcmem, NULL, 0)
|
||
|
|
||
|
|
||
|
NODEMCU_MODULE(RTCMEM, "rtcmem", rtcmem, NULL);
|