Skip to content

Commit 955d272

Browse files
committed
RP2040 SleepMemory
1 parent 5885e2f commit 955d272

File tree

2 files changed

+35
-4
lines changed

2 files changed

+35
-4
lines changed

ports/raspberrypi/common-hal/alarm/SleepMemory.c

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,18 +30,47 @@
3030
#include "common-hal/alarm/SleepMemory.h"
3131
#include "shared-bindings/alarm/SleepMemory.h"
3232

33+
__attribute__((section(".uninitialized"))) static uint8_t _sleepmem[SLEEP_MEMORY_LENGTH];
34+
__attribute__((section(".uninitialized"))) static uint32_t _sleepmem_magicnum;
35+
#define SLEEP_MEMORY_DATA_GUARD 0xad0000af
36+
#define SLEEP_MEMORY_DATA_GUARD_MASK 0xff0000ff
37+
38+
static int is_sleep_memory_valid(void) {
39+
if ((_sleepmem_magicnum & SLEEP_MEMORY_DATA_GUARD_MASK)
40+
== SLEEP_MEMORY_DATA_GUARD) {
41+
return 1;
42+
}
43+
return 0;
44+
}
45+
46+
static void initialize_sleep_memory(void) {
47+
memset((uint8_t *)_sleepmem, 0, SLEEP_MEMORY_LENGTH);
48+
49+
_sleepmem_magicnum = SLEEP_MEMORY_DATA_GUARD;
50+
}
51+
3352
void alarm_sleep_memory_reset(void) {
53+
if (!is_sleep_memory_valid()) {
54+
initialize_sleep_memory();
55+
}
3456
}
3557

3658
uint32_t common_hal_alarm_sleep_memory_get_length(alarm_sleep_memory_obj_t *self) {
37-
return 0;
59+
return sizeof(_sleepmem);
3860
}
3961

4062
bool common_hal_alarm_sleep_memory_set_bytes(alarm_sleep_memory_obj_t *self, uint32_t start_index, const uint8_t *values, uint32_t len) {
41-
mp_raise_NotImplementedError(translate("Sleep Memory not available"));
42-
return false;
63+
if (start_index + len > sizeof(_sleepmem)) {
64+
return false;
65+
}
66+
67+
memcpy((uint8_t *)(_sleepmem + start_index), values, len);
68+
return true;
4369
}
4470

4571
void common_hal_alarm_sleep_memory_get_bytes(alarm_sleep_memory_obj_t *self, uint32_t start_index, uint8_t *values, uint32_t len) {
46-
mp_raise_NotImplementedError(translate("Sleep Memory not available"));
72+
if (start_index + len > sizeof(_sleepmem)) {
73+
return;
74+
}
75+
memcpy(values, (uint8_t *)(_sleepmem + start_index), len);
4776
}

ports/raspberrypi/common-hal/alarm/SleepMemory.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@
2828

2929
#include "py/obj.h"
3030

31+
#define SLEEP_MEMORY_LENGTH (256)
32+
3133
typedef struct {
3234
mp_obj_base_t base;
3335
} alarm_sleep_memory_obj_t;

0 commit comments

Comments
 (0)