This is an automated email from the ASF dual-hosted git repository.
xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git
The following commit(s) were added to refs/heads/master by this push:
new 77df430f30 xtensa/esp32s2: Add rtc heap support
77df430f30 is described below
commit 77df430f301ace141cd143f032afdacd3b910dab
Author: Eren Terzioglu <[email protected]>
AuthorDate: Thu Oct 5 14:39:36 2023 +0300
xtensa/esp32s2: Add rtc heap support
---
arch/xtensa/Kconfig | 1 +
arch/xtensa/src/esp32s2/Kconfig | 7 +
arch/xtensa/src/esp32s2/Make.defs | 12 +
arch/xtensa/src/esp32s2/esp32s2_extraheaps.c | 62 ++++
arch/xtensa/src/esp32s2/esp32s2_rtcheap.c | 226 +++++++++++++++
arch/xtensa/src/esp32s2/esp32s2_rtcheap.h | 188 ++++++++++++
arch/xtensa/src/esp32s2/esp32s2_textheap.c | 161 +++++++++++
arch/xtensa/src/esp32s2/esp32s2_user.c | 317 ---------------------
arch/xtensa/src/esp32s2/hardware/esp32s2_soc.h | 20 ++
.../esp32c3-devkit/configs/sotest/defconfig | 1 +
.../xtensa/esp32s2/common/scripts/flat_memory.ld | 4 +
.../esp32s2/common/scripts/legacy_sections.ld | 5 +
.../esp32s2/common/scripts/mcuboot_sections.ld | 5 +
.../esp32s2-saola-1}/configs/sotest/defconfig | 22 +-
14 files changed, 706 insertions(+), 325 deletions(-)
diff --git a/arch/xtensa/Kconfig b/arch/xtensa/Kconfig
index f18939c229..47671e8337 100644
--- a/arch/xtensa/Kconfig
+++ b/arch/xtensa/Kconfig
@@ -53,6 +53,7 @@ config ARCH_CHIP_ESP32S2
select XTENSA_HAVE_INTERRUPTS
select ARCH_HAVE_BOOTLOADER
select ARCH_HAVE_RESET
+ select ARCH_HAVE_TEXT_HEAP
select ARCH_VECNOTIRQ
select LIBC_ARCH_ATOMIC
select LIBC_ARCH_MEMCPY
diff --git a/arch/xtensa/src/esp32s2/Kconfig b/arch/xtensa/src/esp32s2/Kconfig
index 12e56a62eb..c0a9537d08 100644
--- a/arch/xtensa/src/esp32s2/Kconfig
+++ b/arch/xtensa/src/esp32s2/Kconfig
@@ -476,6 +476,13 @@ config ESP32S2_ULP_COPROC_RESERVE_MEM
int "Reserved ULP co-processor DRAM"
default 0
+comment "Additional Heaps"
+
+config ESP32S2_RTC_HEAP
+ bool "Use the RTC memory as a separate heap"
+ select ARCH_HAVE_EXTRA_HEAPS
+ default n
+
endmenu # Memory Configuration
config ESP32S2_GPIO_IRQ
diff --git a/arch/xtensa/src/esp32s2/Make.defs
b/arch/xtensa/src/esp32s2/Make.defs
index f8fb5c8e2a..2ffbc48385 100644
--- a/arch/xtensa/src/esp32s2/Make.defs
+++ b/arch/xtensa/src/esp32s2/Make.defs
@@ -98,6 +98,18 @@ ifeq ($(CONFIG_WATCHDOG),y)
CHIP_CSRCS += esp32s2_wdt_lowerhalf.c
endif
+ifeq ($(CONFIG_ARCH_HAVE_EXTRA_HEAPS),y)
+CHIP_CSRCS += esp32s2_extraheaps.c
+endif
+
+ifeq ($(CONFIG_ESP32S2_RTC_HEAP),y)
+CHIP_CSRCS += esp32s2_rtcheap.c
+endif
+
+ifeq ($(CONFIG_ARCH_USE_TEXT_HEAP),y)
+CHIP_CSRCS += esp32s2_textheap.c
+endif
+
ifeq ($(CONFIG_ESP32S2_FREERUN),y)
CHIP_CSRCS += esp32s2_freerun.c
endif
diff --git a/arch/xtensa/src/esp32s2/esp32s2_extraheaps.c
b/arch/xtensa/src/esp32s2/esp32s2_extraheaps.c
new file mode 100644
index 0000000000..0fcb8f7801
--- /dev/null
+++ b/arch/xtensa/src/esp32s2/esp32s2_extraheaps.c
@@ -0,0 +1,62 @@
+/****************************************************************************
+ * arch/xtensa/src/esp32s2/esp32s2_extraheaps.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership. The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+#include <sys/types.h>
+#include <stdint.h>
+#include <string.h>
+#include <assert.h>
+#include <debug.h>
+
+#include <nuttx/arch.h>
+#include <nuttx/kmalloc.h>
+
+#include "hardware/esp32s2_soc.h"
+
+#ifdef CONFIG_ESP32S2_RTC_HEAP
+#include "esp32s2_rtcheap.h"
+#endif
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: up_extraheaps_init
+ *
+ * Description:
+ * Initialize any extra heap.
+ *
+ ****************************************************************************/
+
+void up_extraheaps_init()
+{
+#ifdef CONFIG_ESP32S2_RTC_HEAP
+ /* Initialize the RTC heap */
+
+ esp32s2_rtcheap_initialize();
+#endif
+}
+
diff --git a/arch/xtensa/src/esp32s2/esp32s2_rtcheap.c
b/arch/xtensa/src/esp32s2/esp32s2_rtcheap.c
new file mode 100644
index 0000000000..947aaa32bb
--- /dev/null
+++ b/arch/xtensa/src/esp32s2/esp32s2_rtcheap.c
@@ -0,0 +1,226 @@
+/****************************************************************************
+ * arch/xtensa/src/esp32s2/esp32s2_rtcheap.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership. The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+#include <nuttx/arch.h>
+#include <nuttx/mm/mm.h>
+
+#include "esp32s2_rtcheap.h"
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+static struct mm_heap_s *g_rtcheap;
+
+/****************************************************************************
+ * Extern values declaration
+ ****************************************************************************/
+
+/* These values come from the linker scripts. Check boards/xtensa/esp32s2. */
+
+extern uint8_t _srtcheap[];
+extern uint8_t _ertcheap[];
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: esp32s2_rtcheap_initialize
+ *
+ * Description:
+ * Initialize the RTC heap.
+ *
+ ****************************************************************************/
+
+void esp32s2_rtcheap_initialize(void)
+{
+ void *start;
+ size_t size;
+
+ start = (void *)_srtcheap;
+ size = _ertcheap - _srtcheap;
+ g_rtcheap = mm_initialize("rtcheap", start, size);
+}
+
+/****************************************************************************
+ * Name: esp32s2_rtcheap_malloc
+ *
+ * Description:
+ * Allocate memory from the RTC heap.
+ *
+ * Parameters:
+ * size - Size (in bytes) of the memory region to be allocated.
+ *
+ * Return Value:
+ * Adress of the allocated memory space. NULL, if allocation fails.
+ *
+ ****************************************************************************/
+
+void *esp32s2_rtcheap_malloc(size_t size)
+{
+ return mm_malloc(g_rtcheap, size);
+}
+
+/****************************************************************************
+ * Name: esp32s2_rtcheap_calloc
+ *
+ * Description:
+ * Calculates the size of the allocation and allocate memory from
+ * the RTC heap.
+ *
+ * Parameters:
+ * n - Size (in types) of the memory region to be allocated.
+ * elem_size - Size (in bytes) of the type to be allocated.
+ *
+ * Return Value:
+ * Adress of the allocated memory space. NULL, if allocation fails.
+ *
+ ****************************************************************************/
+
+void *esp32s2_rtcheap_calloc(size_t n, size_t elem_size)
+{
+ return mm_calloc(g_rtcheap, n, elem_size);
+}
+
+/****************************************************************************
+ * Name: esp32s2_rtcheap_realloc
+ *
+ * Description:
+ * Reallocate memory from the RTC heap.
+ *
+ * Parameters:
+ * ptr - Adress to be reallocate.
+ * size - Size (in bytes) to be reallocate.
+ *
+ * Return Value:
+ * Adress of the possibly moved memory space. NULL, if allocation fails.
+ *
+ ****************************************************************************/
+
+void *esp32s2_rtcheap_realloc(void *ptr, size_t size)
+{
+ return mm_realloc(g_rtcheap, ptr, size);
+}
+
+/****************************************************************************
+ * Name: esp32s2_rtcheap_zalloc
+ *
+ * Description:
+ * Allocate and zero memory from the RTC heap.
+ *
+ * Parameters:
+ * size - Size (in bytes) of the memory region to be allocated.
+ *
+ * Return Value:
+ * Adress of the allocated memory space. NULL, if allocation fails.
+ *
+ ****************************************************************************/
+
+void *esp32s2_rtcheap_zalloc(size_t size)
+{
+ return mm_zalloc(g_rtcheap, size);
+}
+
+/****************************************************************************
+ * Name: esp32s2_rtcheap_free
+ *
+ * Description:
+ * Free memory from the RTC heap.
+ *
+ * Parameters:
+ * mem - Adress to be freed.
+ *
+ ****************************************************************************/
+
+void esp32s2_rtcheap_free(void *mem)
+{
+ mm_free(g_rtcheap, mem);
+}
+
+/****************************************************************************
+ * Name: esp32s2_rtcheap_memalign
+ *
+ * Description:
+ * memalign requests more than enough space from malloc, finds a region
+ * within that chunk that meets the alignment request and then frees any
+ * leading or trailing space.
+ *
+ * The alignment argument must be a power of two (not checked). 8-byte
+ * alignment is guaranteed by normal malloc calls.
+ *
+ * Parameters:
+ * alignment - Requested alignment.
+ * size - Size (in bytes) of the memory region to be allocated.
+ *
+ * Return Value:
+ * Adress of the allocated adress. NULL, if allocation fails.
+ *
+ ****************************************************************************/
+
+void *esp32s2_rtcheap_memalign(size_t alignment, size_t size)
+{
+ return mm_memalign(g_rtcheap, alignment, size);
+}
+
+/****************************************************************************
+ * Name: esp32s2_rtcheap_heapmember
+ *
+ * Description:
+ * Check if an address lies in the RTC heap.
+ *
+ * Parameters:
+ * mem - The address to check.
+ *
+ * Return Value:
+ * True if the address is a member of the RTC heap. False if not.
+ *
+ ****************************************************************************/
+
+bool esp32s2_rtcheap_heapmember(void *mem)
+{
+ return mm_heapmember(g_rtcheap, mem);
+}
+
+/****************************************************************************
+ * Name: esp32s2_rtcheap_mallinfo
+ *
+ * Description:
+ * mallinfo returns a copy of updated current heap information for the
+ * user heap.
+ *
+ * Parameters:
+ * None.
+ *
+ * Return Value:
+ * info - Where memory information will be copied.
+ *
+ ****************************************************************************/
+
+struct mallinfo esp32s2_rtcheap_mallinfo(void)
+{
+ return mm_mallinfo(g_rtcheap);
+}
diff --git a/arch/xtensa/src/esp32s2/esp32s2_rtcheap.h
b/arch/xtensa/src/esp32s2/esp32s2_rtcheap.h
new file mode 100644
index 0000000000..fce10cac63
--- /dev/null
+++ b/arch/xtensa/src/esp32s2/esp32s2_rtcheap.h
@@ -0,0 +1,188 @@
+/****************************************************************************
+ * arch/xtensa/src/esp32s2/esp32s2_rtcheap.h
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership. The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+#ifndef __ARCH_XTENSA_SRC_ESP32S2_ESP32S2_RTCHEAP_H
+#define __ARCH_XTENSA_SRC_ESP32S2_ESP32S2_RTCHEAP_H
+
+/****************************************************************************
+ * Public Function Prototypes
+ ****************************************************************************/
+
+#ifdef __cplusplus
+#define EXTERN extern "C"
+extern "C"
+{
+#else
+#define EXTERN extern
+#endif
+
+struct mallinfo; /* Forward reference, see malloc.h */
+
+/****************************************************************************
+ * Name: esp32s2_rtcheap_initialize
+ *
+ * Description:
+ * Initialize the RTC heap.
+ *
+ ****************************************************************************/
+
+void esp32s2_rtcheap_initialize(void);
+
+/****************************************************************************
+ * Name: esp32s2_rtcheap_malloc
+ *
+ * Description:
+ * Allocate memory from the RTC heap.
+ *
+ * Parameters:
+ * size - Size (in bytes) of the memory region to be allocated.
+ *
+ * Return Value:
+ * Adress of the allocated memory space. NULL, if allocation fails.
+ *
+ ****************************************************************************/
+
+void *esp32s2_rtcheap_malloc(size_t size);
+
+/****************************************************************************
+ * Name: esp32s2_rtcheap_calloc
+ *
+ * Description:
+ * Calculates the size of the allocation and allocate memory from
+ * the RTC heap.
+ *
+ * Parameters:
+ * n - Size (in types) of the memory region to be allocated.
+ * elem_size - Size (in bytes) of the type to be allocated.
+ *
+ * Return Value:
+ * Adress of the allocated memory space. NULL, if allocation fails.
+ *
+ ****************************************************************************/
+
+void *esp32s2_rtcheap_calloc(size_t n, size_t elem_size);
+
+/****************************************************************************
+ * Name: esp32s2_rtcheap_realloc
+ *
+ * Description:
+ * Reallocate memory from the RTC heap.
+ *
+ * Parameters:
+ * ptr - Adress to be reallocate.
+ * size - Size (in bytes) to be reallocate.
+ *
+ * Return Value:
+ * Adress of the possibly moved memory space. NULL, if allocation fails.
+ *
+ ****************************************************************************/
+
+void *esp32s2_rtcheap_realloc(void *ptr, size_t size);
+
+/****************************************************************************
+ * Name: esp32s2_rtcheap_zalloc
+ *
+ * Description:
+ * Allocate and zero memory from the RTC heap.
+ *
+ * Parameters:
+ * size - Size (in bytes) of the memory region to be allocated.
+ *
+ * Return Value:
+ * Adress of the allocated memory space. NULL, if allocation fails.
+ *
+ ****************************************************************************/
+
+void *esp32s2_rtcheap_zalloc(size_t size);
+
+/****************************************************************************
+ * Name: esp32s2_rtcheap_free
+ *
+ * Description:
+ * Free memory from the RTC heap.
+ *
+ * Parameters:
+ * mem - Adress to be freed.
+ *
+ ****************************************************************************/
+
+void esp32s2_rtcheap_free(void *mem);
+
+/****************************************************************************
+ * Name: esp32s2_rtcheap_memalign
+ *
+ * Description:
+ * memalign requests more than enough space from malloc, finds a region
+ * within that chunk that meets the alignment request and then frees any
+ * leading or trailing space.
+ *
+ * The alignment argument must be a power of two (not checked). 8-byte
+ * alignment is guaranteed by normal malloc calls.
+ *
+ * Parameters:
+ * alignment - Requested alignment.
+ * size - Size (in bytes) of the memory region to be allocated.
+ *
+ * Return Value:
+ * Adress of the allocated adress. NULL, if allocation fails.
+ *
+ ****************************************************************************/
+
+void *esp32s2_rtcheap_memalign(size_t alignment, size_t size);
+
+/****************************************************************************
+ * Name: esp32s2_rtcheap_heapmember
+ *
+ * Description:
+ * Check if an address lies in the RTC heap.
+ *
+ * Parameters:
+ * mem - The address to check.
+ *
+ * Return Value:
+ * True if the address is a member of the RTC heap. False if not.
+ *
+ ****************************************************************************/
+
+bool esp32s2_rtcheap_heapmember(void *mem);
+
+/****************************************************************************
+ * Name: esp32s2_rtcheap_mallinfo
+ *
+ * Description:
+ * mallinfo returns a copy of updated current heap information for the
+ * user heap.
+ *
+ * Parameters:
+ * None.
+ *
+ * Return Value:
+ * info - Where memory information will be copied.
+ *
+ ****************************************************************************/
+
+struct mallinfo esp32s2_rtcheap_mallinfo(void);
+
+#undef EXTERN
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __ARCH_XTENSA_SRC_ESP32S2_ESP32S2_RTCHEAP_H */
diff --git a/arch/xtensa/src/esp32s2/esp32s2_textheap.c
b/arch/xtensa/src/esp32s2/esp32s2_textheap.c
new file mode 100644
index 0000000000..d98e4c06a7
--- /dev/null
+++ b/arch/xtensa/src/esp32s2/esp32s2_textheap.c
@@ -0,0 +1,161 @@
+/****************************************************************************
+ * arch/xtensa/src/esp32s2/esp32s2_textheap.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership. The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+#include <nuttx/arch.h>
+#include <nuttx/fs/procfs.h>
+#include <nuttx/mm/mm.h>
+
+#include <sys/types.h>
+#include <debug.h>
+#include <nuttx/kmalloc.h>
+
+#include "hardware/esp32s2_soc.h"
+
+#ifdef CONFIG_ESP32S2_RTC_HEAP
+#include "esp32s2_rtcheap.h"
+#endif
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+#ifndef CONFIG_ESP32S2_RTC_HEAP
+#error "No suitable heap available. Enable ESP32S2_RTC_HEAP."
+#endif
+
+#define D_I_BUS_OFFSET 0x700000
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: up_textheap_memalign
+ *
+ * Description:
+ * memalign requests more than enough space from malloc, finds a region
+ * within that chunk that meets the alignment request and then frees any
+ * leading or trailing space in text heap.
+ *
+ * The alignment argument must be a power of two (not checked). 8-byte
+ * alignment is guaranteed by normal malloc calls.
+ *
+ * Parameters:
+ * alignment - Requested alignment.
+ * size - Size (in bytes) of the memory region to be allocated.
+ *
+ * Return Value:
+ * Adress of the allocated adress. NULL, if allocation fails.
+ *
+ ****************************************************************************/
+
+void *up_textheap_memalign(size_t align, size_t size)
+{
+ void *ret = NULL;
+
+ /* Prioritise allocating from RTC. If that fails, allocate from the
+ * main heap.
+ */
+
+#ifdef CONFIG_ESP32S2_RTC_HEAP
+ ret = esp32s2_rtcheap_memalign(align, size);
+#endif
+
+ if (ret == NULL)
+ {
+ ret = kmm_memalign(align, size);
+ if (ret)
+ {
+ /* kmm_memalign buffer is at the Data bus offset. Adjust it so we
+ * can access it from the Instruction bus.
+ */
+
+ ret += D_I_BUS_OFFSET;
+ }
+ }
+
+ return ret;
+}
+
+/****************************************************************************
+ * Name: up_textheap_free
+ *
+ * Description:
+ * Free memory from the text heap.
+ *
+ * Parameters:
+ * mem - Adress to be freed.
+ *
+ ****************************************************************************/
+
+void up_textheap_free(void *p)
+{
+ if (p)
+ {
+#ifdef CONFIG_ESP32S2_RTC_HEAP
+ if (esp32s2_ptr_rtc(p))
+ {
+ esp32s2_rtcheap_free(p);
+ }
+ else
+#endif
+ {
+ p -= D_I_BUS_OFFSET;
+ kmm_free(p);
+ }
+ }
+}
+
+/****************************************************************************
+ * Name: up_textheap_heapmember
+ *
+ * Description:
+ * Check if an address lies in text heap.
+ *
+ * Parameters:
+ * mem - The address to check.
+ *
+ * Return Value:
+ * True if the address is a member of the text heap. False if not.
+ *
+ ****************************************************************************/
+
+bool up_textheap_heapmember(void *p)
+{
+ if (p == NULL)
+ {
+ return false;
+ }
+
+#ifdef CONFIG_ESP32S2_RTC_HEAP
+ if (esp32s2_ptr_rtc(p))
+ {
+ return esp32s2_rtcheap_heapmember(p);
+ }
+#endif
+
+ p -= D_I_BUS_OFFSET;
+ return kmm_heapmember(p);
+}
diff --git a/arch/xtensa/src/esp32s2/esp32s2_user.c
b/arch/xtensa/src/esp32s2/esp32s2_user.c
index db6f9cb87e..fa6debd85b 100644
--- a/arch/xtensa/src/esp32s2/esp32s2_user.c
+++ b/arch/xtensa/src/esp32s2/esp32s2_user.c
@@ -38,11 +38,6 @@
* Public Data
****************************************************************************/
-#ifdef CONFIG_ARCH_USE_TEXT_HEAP
-extern char _stextheap[];
-extern char _etextheap[];
-#endif
-
/****************************************************************************
* Private Data
****************************************************************************/
@@ -58,225 +53,6 @@ extern char _etextheap[];
#ifndef CONFIG_BUILD_FLAT
#error permission check not implemented
#endif
-
-/****************************************************************************
- * Name: load_uint8
- *
- * Description:
- * Fetch a byte using 32-bit aligned access.
- *
- ****************************************************************************/
-
-static uint8_t load_uint8(const uint8_t *p)
-{
- const uint32_t *aligned;
- uint32_t value;
- unsigned int offset;
-
- aligned = (const uint32_t *)(((uintptr_t)p) & ~3);
- value = l32i(aligned);
- offset = ((uintptr_t)p) & 3;
- switch (offset)
- {
- case 0:
- return value & 0xff;
- case 1:
- return (value >> 8) & 0xff;
- case 2:
- return (value >> 16) & 0xff;
- case 3:
- return (value >> 24) & 0xff;
- }
-
- /* not reached */
-
- PANIC();
-}
-
-/****************************************************************************
- * Name: store_uint8
- *
- * Description:
- * Store a byte using 32-bit aligned access.
- *
- ****************************************************************************/
-
-static void store_uint8(uint8_t *p, uint8_t v)
-{
- uint32_t *aligned;
- uint32_t value;
- unsigned int offset;
-
- aligned = (uint32_t *)(((uintptr_t)p) & ~3);
- value = l32i(aligned);
- offset = ((uintptr_t)p) & 3;
- switch (offset)
- {
- case 0:
- value = (value & 0xffffff00) | v;
- break;
- case 1:
- value = (value & 0xffff00ff) | (v << 8);
- break;
- case 2:
- value = (value & 0xff00ffff) | (v << 16);
- break;
- case 3:
- value = (value & 0x00ffffff) | (v << 24);
- break;
- }
-
- s32i(aligned, value);
-}
-
-/****************************************************************************
- * Name: decode_s8i
- *
- * Description:
- * Decode S8I instruction using 32-bit aligned access.
- * Return non-zero on successful decoding.
- *
- ****************************************************************************/
-
-static int decode_s8i(const uint8_t *p, uint8_t *imm8, uint8_t *s,
- uint8_t *t)
-{
- /* 23 16 15 12 11 8 7 4 3 0
- * | imm8 |0 1 0 0| s | t |0 0 1 0|
- */
-
- uint8_t b0 = load_uint8(p);
- uint8_t b1 = load_uint8(p + 1);
-
- if ((b0 & 0xf) == 2 && (b1 & 0xf0) == 0x40)
- {
- *t = b0 >> 4;
- *s = b1 & 0xf;
- *imm8 = load_uint8(p + 2);
- return 1;
- }
-
- return 0;
-}
-
-/****************************************************************************
- * Name: decode_s16i
- *
- * Description:
- * Decode S16I instruction using 32-bit aligned access.
- * Return non-zero on successful decoding.
- *
- ****************************************************************************/
-
-static int decode_s16i(const uint8_t *p, uint8_t *imm8, uint8_t *s,
- uint8_t *t)
-{
- /* 23 16 15 12 11 8 7 4 3 0
- * | imm8 |0 1 0 1| s | t |0 0 1 0|
- */
-
- uint8_t b0 = load_uint8(p);
- uint8_t b1 = load_uint8(p + 1);
-
- if ((b0 & 0xf) == 2 && (b1 & 0xf0) == 0x50)
- {
- *t = b0 >> 4;
- *s = b1 & 0xf;
- *imm8 = load_uint8(p + 2);
- return 1;
- }
-
- return 0;
-}
-
-/****************************************************************************
- * Name: decode_l8ui
- *
- * Description:
- * Decode L8UI instruction using 32-bit aligned access.
- * Return non-zero on successful decoding.
- *
- ****************************************************************************/
-
-static int decode_l8ui(const uint8_t *p, uint8_t *imm8, uint8_t *s,
- uint8_t *t)
-{
- /* 23 16 15 12 11 8 7 4 3 0
- * | imm8 |0 0 0 0| s | t |0 0 1 0|
- */
-
- uint8_t b0 = load_uint8(p);
- uint8_t b1 = load_uint8(p + 1);
-
- if ((b0 & 0xf) == 2 && (b1 & 0xf0) == 0)
- {
- *t = b0 >> 4;
- *s = b1 & 0xf;
- *imm8 = load_uint8(p + 2);
- return 1;
- }
-
- return 0;
-}
-
-/****************************************************************************
- * Name: decode_l16ui
- *
- * Description:
- * Decode L16UI instruction using 32-bit aligned access.
- * Return non-zero on successful decoding.
- *
- ****************************************************************************/
-
-static int decode_l16ui(const uint8_t *p, uint8_t *imm8, uint8_t *s,
- uint8_t *t)
-{
- /* 23 16 15 12 11 8 7 4 3 0
- * | imm8 |0 0 0 1| s | t |0 0 1 0|
- */
-
- uint8_t b0 = load_uint8(p);
- uint8_t b1 = load_uint8(p + 1);
-
- if ((b0 & 0xf) == 2 && (b1 & 0xf0) == 0x10)
- {
- *t = b0 >> 4;
- *s = b1 & 0xf;
- *imm8 = load_uint8(p + 2);
- return 1;
- }
-
- return 0;
-}
-
-/****************************************************************************
- * Name: advance_pc
- *
- * Description:
- * Advance PC register by the given value.
- *
- ****************************************************************************/
-
-static void advance_pc(uint32_t *regs, int diff)
-{
- uint32_t nextpc;
-
- /* Advance to the next instruction. */
-
- nextpc = regs[REG_PC] + diff;
-#if XCHAL_HAVE_LOOPS
- /* See Xtensa ISA 4.3.2.4 Loopback Semantics */
-
- if (regs[REG_LCOUNT] != 0 && nextpc == regs[REG_LEND])
- {
- regs[REG_LCOUNT]--;
- nextpc = regs[REG_LBEG];
- }
-
-#endif
- regs[REG_PC] = nextpc;
-}
-
#endif
/****************************************************************************
@@ -293,99 +69,6 @@ static void advance_pc(uint32_t *regs, int diff)
uint32_t *xtensa_user(int exccause, uint32_t *regs)
{
-#ifdef CONFIG_ARCH_USE_TEXT_HEAP
- /* Emulate byte access for module text.
- *
- * ESP32S2 only allows word-aligned accesses to the instruction memory
- * regions. A non-aligned access raises a LoadStoreErrorCause exception.
- * We catch those exception and emulate byte access here because it's
- * necessary in a few places during dynamic code loading:
- *
- * - memcpy as a part of read(2) when loading code from a file system.
- * - relocation needs to inspect and modify text.
- *
- * (thus binfo() is used below)
- */
-
- if (exccause == EXCCAUSE_LOAD_STORE_ERROR &&
- (uintptr_t)_stextheap <= regs[REG_EXCVADDR] &&
- (uintptr_t)_etextheap > regs[REG_EXCVADDR])
- {
- uint8_t *pc = (uint8_t *)regs[REG_PC];
- uint8_t imm8;
- uint8_t s;
- uint8_t t;
-
- binfo("EXCCAUSE_LOAD_STORE_ERROR at %p, pc=%p\n",
- (void *)regs[REG_EXCVADDR],
- pc);
-
- if (decode_s8i(pc, &imm8, &s, &t))
- {
- binfo("Emulating S8I imm8=%u, s=%u (%p), t=%u (%p)\n",
- (unsigned int)imm8,
- (unsigned int)s,
- (void *)regs[REG_A0 + s],
- (unsigned int)t,
- (void *)regs[REG_A0 + t]);
-
- DEBUGASSERT(regs[REG_A0 + s] + imm8 == regs[REG_EXCVADDR]);
- store_uint8(((uint8_t *)regs[REG_A0 + s]) + imm8,
- regs[REG_A0 + t]);
- advance_pc(regs, 3);
- return regs;
- }
- else if (decode_s16i(pc, &imm8, &s, &t))
- {
- binfo("Emulating S16I imm8=%u, s=%u (%p), t=%u (%p)\n",
- (unsigned int)imm8,
- (unsigned int)s,
- (void *)regs[REG_A0 + s],
- (unsigned int)t,
- (void *)regs[REG_A0 + t]);
-
- DEBUGASSERT(regs[REG_A0 + s] + imm8 == regs[REG_EXCVADDR]);
- store_uint8(((uint8_t *)regs[REG_A0 + s]) + imm8,
- regs[REG_A0 + t]);
- store_uint8(((uint8_t *)regs[REG_A0 + s]) + imm8 + 1,
- regs[REG_A0 + t] >> 8);
- advance_pc(regs, 3);
- return regs;
- }
- else if (decode_l8ui(pc, &imm8, &s, &t))
- {
- binfo("Emulating L8UI imm8=%u, s=%u (%p), t=%u (%p)\n",
- (unsigned int)imm8,
- (unsigned int)s,
- (void *)regs[REG_A0 + s],
- (unsigned int)t,
- (void *)regs[REG_A0 + t]);
-
- DEBUGASSERT(regs[REG_A0 + s] + imm8 == regs[REG_EXCVADDR]);
- regs[REG_A0 + t] = load_uint8(((uint8_t *)regs[REG_A0 + s]) +
- imm8);
- advance_pc(regs, 3);
- return regs;
- }
- else if (decode_l16ui(pc, &imm8, &s, &t))
- {
- binfo("Emulating L16UI imm8=%u, s=%u (%p), t=%u (%p)\n",
- (unsigned int)imm8,
- (unsigned int)s,
- (void *)regs[REG_A0 + s],
- (unsigned int)t,
- (void *)regs[REG_A0 + t]);
-
- DEBUGASSERT(regs[REG_A0 + s] + imm8 == regs[REG_EXCVADDR]);
- uint8_t lo = load_uint8(((uint8_t *)regs[REG_A0 + s]) + imm8);
- uint8_t hi = load_uint8(((uint8_t *)regs[REG_A0 + s]) + imm8 + 1);
- regs[REG_A0 + t] = (hi << 8) | lo;
- advance_pc(regs, 3);
- return regs;
- }
- }
-
-#endif
/* xtensa_user_panic never returns. */
xtensa_user_panic(exccause, regs);
diff --git a/arch/xtensa/src/esp32s2/hardware/esp32s2_soc.h
b/arch/xtensa/src/esp32s2/hardware/esp32s2_soc.h
index c68b45f741..aa0c30cd1f 100644
--- a/arch/xtensa/src/esp32s2/hardware/esp32s2_soc.h
+++ b/arch/xtensa/src/esp32s2/hardware/esp32s2_soc.h
@@ -759,4 +759,24 @@ static inline bool IRAM_ATTR esp32s2_ptr_exec(const void
*p)
|| (ip >= SOC_RTC_IRAM_LOW && ip < SOC_RTC_IRAM_HIGH);
}
+/****************************************************************************
+ * Name: esp32s2_ptr_rtc
+ *
+ * Description:
+ * Check if the buffer comes from the RTC RAM.
+ *
+ * Parameters:
+ * p - Adress of the buffer.
+ *
+ * Return Value:
+ * True if given buffer comes from RTC RAM. False if not.
+ *
+ ****************************************************************************/
+
+static inline bool IRAM_ATTR esp32s2_ptr_rtc(const void *p)
+{
+ return ((intptr_t)p >= SOC_RTC_DATA_LOW &&
+ (intptr_t)p < SOC_RTC_DATA_HIGH);
+}
+
#endif /* __ARCH_XTENSA_SRC_ESP32_HARDWARE_ESP32S2_SOC_H */
diff --git a/boards/risc-v/esp32c3/esp32c3-devkit/configs/sotest/defconfig
b/boards/risc-v/esp32c3/esp32c3-devkit/configs/sotest/defconfig
index b39d2ffa69..f0aa1d1934 100644
--- a/boards/risc-v/esp32c3/esp32c3-devkit/configs/sotest/defconfig
+++ b/boards/risc-v/esp32c3/esp32c3-devkit/configs/sotest/defconfig
@@ -21,6 +21,7 @@ CONFIG_BOARDCTL_OS_SYMTAB=y
CONFIG_BOARDCTL_ROMDISK=y
CONFIG_BOARD_LOOPSPERMSEC=16717
CONFIG_BUILTIN=y
+CONFIG_ESP32C3_RTC_HEAP=y
CONFIG_EXAMPLES_SOTEST=y
CONFIG_FS_PROCFS=y
CONFIG_FS_ROMFS=y
diff --git a/boards/xtensa/esp32s2/common/scripts/flat_memory.ld
b/boards/xtensa/esp32s2/common/scripts/flat_memory.ld
index 24e5fe3b54..a4fde38598 100644
--- a/boards/xtensa/esp32s2/common/scripts/flat_memory.ld
+++ b/boards/xtensa/esp32s2/common/scripts/flat_memory.ld
@@ -157,3 +157,7 @@ MEMORY
REGION_ALIAS("default_rodata_seg", drom0_0_seg);
REGION_ALIAS("default_code_seg", irom0_0_seg);
#endif /* CONFIG_ESP32S2_RUN_IRAM */
+
+/* Mark the end of the RTC heap (top of the RTC region) */
+
+_ertcheap = 0x50001fff;
diff --git a/boards/xtensa/esp32s2/common/scripts/legacy_sections.ld
b/boards/xtensa/esp32s2/common/scripts/legacy_sections.ld
index f0b7e97244..9e77a98763 100644
--- a/boards/xtensa/esp32s2/common/scripts/legacy_sections.ld
+++ b/boards/xtensa/esp32s2/common/scripts/legacy_sections.ld
@@ -226,5 +226,10 @@ SECTIONS
{
*(.rtc.data)
*(.rtc.rodata)
+
+ /* Whatever is left from the RTC memory is used as a special heap. */
+
+ . = ALIGN (4);
+ _srtcheap = ABSOLUTE(.);
} >rtc_slow_seg
}
diff --git a/boards/xtensa/esp32s2/common/scripts/mcuboot_sections.ld
b/boards/xtensa/esp32s2/common/scripts/mcuboot_sections.ld
index 0af713f173..dfc0790ff3 100644
--- a/boards/xtensa/esp32s2/common/scripts/mcuboot_sections.ld
+++ b/boards/xtensa/esp32s2/common/scripts/mcuboot_sections.ld
@@ -313,5 +313,10 @@ SECTIONS
{
*(.rtc.data)
*(.rtc.rodata)
+
+ /* Whatever is left from the RTC memory is used as a special heap. */
+
+ . = ALIGN (4);
+ _srtcheap = ABSOLUTE(.);
} >rtc_data_seg AT>ROM
}
diff --git a/boards/risc-v/esp32c3/esp32c3-devkit/configs/sotest/defconfig
b/boards/xtensa/esp32s2/esp32s2-saola-1/configs/sotest/defconfig
similarity index 72%
copy from boards/risc-v/esp32c3/esp32c3-devkit/configs/sotest/defconfig
copy to boards/xtensa/esp32s2/esp32s2-saola-1/configs/sotest/defconfig
index b39d2ffa69..9ebdb60fd6 100644
--- a/boards/risc-v/esp32c3/esp32c3-devkit/configs/sotest/defconfig
+++ b/boards/xtensa/esp32s2/esp32s2-saola-1/configs/sotest/defconfig
@@ -5,23 +5,26 @@
# You can then do "make savedefconfig" to generate a new defconfig file that
includes your
# modifications.
#
+# CONFIG_ARCH_LEDS is not set
# CONFIG_NSH_ARGCAT is not set
# CONFIG_NSH_CMDOPT_HEXDUMP is not set
-CONFIG_ARCH="risc-v"
-CONFIG_ARCH_BOARD="esp32c3-devkit"
+CONFIG_ARCH="xtensa"
+CONFIG_ARCH_BOARD="esp32s2-saola-1"
CONFIG_ARCH_BOARD_COMMON=y
-CONFIG_ARCH_BOARD_ESP32C3_DEVKIT=y
-CONFIG_ARCH_CHIP="esp32c3"
-CONFIG_ARCH_CHIP_ESP32C3=y
-CONFIG_ARCH_CHIP_ESP32C3WROOM02=y
-CONFIG_ARCH_INTERRUPTSTACK=1536
-CONFIG_ARCH_RISCV=y
+CONFIG_ARCH_BOARD_ESP32S2_SAOLA_1=y
+CONFIG_ARCH_CHIP="esp32s2"
+CONFIG_ARCH_CHIP_ESP32S2=y
+CONFIG_ARCH_CHIP_ESP32S2WROVER=y
CONFIG_ARCH_STACKDUMP=y
+CONFIG_ARCH_XTENSA=y
CONFIG_BOARDCTL_OS_SYMTAB=y
CONFIG_BOARDCTL_ROMDISK=y
CONFIG_BOARD_LOOPSPERMSEC=16717
CONFIG_BUILTIN=y
+CONFIG_ESP32S2_RTC_HEAP=y
+CONFIG_ESP32S2_UART0=y
CONFIG_EXAMPLES_SOTEST=y
+CONFIG_EXPERIMENTAL=y
CONFIG_FS_PROCFS=y
CONFIG_FS_ROMFS=y
CONFIG_HAVE_CXX=y
@@ -36,10 +39,13 @@ CONFIG_NSH_FILEIOSIZE=512
CONFIG_NSH_LINELEN=64
CONFIG_NSH_READLINE=y
CONFIG_PREALLOC_TIMERS=4
+CONFIG_RAM_SIZE=114688
+CONFIG_RAM_START=0x20000000
CONFIG_RR_INTERVAL=200
CONFIG_SCHED_WAITPID=y
CONFIG_START_DAY=6
CONFIG_START_MONTH=12
CONFIG_START_YEAR=2011
+CONFIG_SYSLOG_BUFFER=y
CONFIG_SYSTEM_NSH=y
CONFIG_UART0_SERIAL_CONSOLE=y