Skip to content

Commit 2d61032

Browse files
committed
feat: add xtensa trax memory helpers
1 parent 1451a70 commit 2d61032

File tree

11 files changed

+323
-0
lines changed

11 files changed

+323
-0
lines changed

CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,9 @@ target_include_directories(${ESP_STUB_LIB}
3434
INTERFACE include
3535
PRIVATE include/esp-stub-lib
3636
)
37+
# Public within the library
3738
include_directories(include)
39+
include_directories(include/esp-stub-lib)
3840

3941
# STUB_COMPILE_DEFS is optional definitions coming from the parent CMakeLists.txt
4042
target_compile_definitions(${ESP_STUB_LIB} PRIVATE ${STUB_COMPILE_DEFS})

include/esp-stub-lib/bit_utils.h

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
/*
2+
* SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD
3+
*
4+
* SPDX-License-Identifier: Apache-2.0 OR MIT
5+
*/
6+
7+
#pragma once
8+
9+
#ifdef __cplusplus
10+
extern "C" {
11+
#endif
12+
13+
#ifndef BIT
14+
#define BIT(nr) (1UL << (nr))
15+
#endif
16+
17+
#ifndef BIT64
18+
#define BIT64(nr) (1ULL << (nr))
19+
#endif
20+
21+
#ifndef ALIGN_MASK
22+
#define ALIGN_MASK(x, mask) \
23+
({ \
24+
typeof(mask) _mask = (mask); \
25+
((x) + _mask) & ~_mask; \
26+
})
27+
#endif
28+
29+
#ifndef ALIGN_UP
30+
#define ALIGN_UP(x, a) ALIGN_MASK(x, (typeof(x))(a) - 1)
31+
#endif
32+
33+
#ifndef ALIGN_DOWN
34+
#define ALIGN_DOWN(x, a) ((x) & ~((typeof(x))(a) - 1))
35+
#endif
36+
37+
#ifndef IS_ALIGNED
38+
#define IS_ALIGNED(x, a) (((x) & ((typeof(x))(a) - 1)) == 0)
39+
#endif
40+
41+
#ifndef MIN
42+
#define MIN(a, b) ((a) < (b) ? (a) : (b))
43+
#endif
44+
45+
#ifndef MAX
46+
#define MAX(a, b) ((a) > (b) ? (a) : (b))
47+
#endif
48+
49+
#ifdef __cplusplus
50+
}
51+
#endif

include/esp-stub-lib/trax_mem.h

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
/*
2+
* SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD
3+
*
4+
* SPDX-License-Identifier: Apache-2.0 OR MIT
5+
*/
6+
7+
#pragma once
8+
9+
#include <stdint.h>
10+
11+
#include <target/trax.h>
12+
#include "bit_utils.h"
13+
14+
#define ERI_DEBUG_OFFSET 0x100000
15+
#define ERI_TRAX_OFFSET (ERI_DEBUG_OFFSET + 0x0)
16+
#define ERI_TRAX_TRAXCTRL (ERI_TRAX_OFFSET + 0x4)
17+
#define ERI_TRAX_TRIGGERPC (ERI_TRAX_OFFSET + 0x14)
18+
#define ERI_TRAX_DELAYCNT (ERI_TRAX_OFFSET + 0x1C)
19+
20+
#define TRAXCTRL_TRSTP BIT(1) // Trace Stop. Make 1 to stop trace.
21+
#define TRAXCTRL_TMEN BIT(7) // Trace Memory Enable. Always set.
22+
23+
#ifdef __cplusplus
24+
extern "C" {
25+
#endif
26+
27+
static inline uint32_t eri_read(int addr)
28+
{
29+
uint32_t ret;
30+
asm volatile(
31+
"RER %0,%1"
32+
:"=r"(ret):"r"(addr)
33+
);
34+
return ret;
35+
}
36+
37+
static inline void eri_write(int addr, uint32_t data)
38+
{
39+
asm volatile(
40+
"WER %0,%1"
41+
::"r"(data), "r"(addr)
42+
);
43+
}
44+
45+
/*
46+
* Enable the TRAX memory. For ESP32 only.
47+
*/
48+
static inline void esp_stub_lib_trax_mem_enable(void)
49+
{
50+
stub_target_trax_mem_enable();
51+
}
52+
53+
/*
54+
* Select the memory block (0 or 1) to use.
55+
*/
56+
static inline void esp_stub_lib_trax_select_mem_block(int block)
57+
{
58+
stub_target_trax_select_mem_block(block);
59+
}
60+
61+
/*
62+
* Read a TRAX register using ERI.
63+
*/
64+
static inline uint32_t esp_stub_lib_trax_reg_read(int addr)
65+
{
66+
return eri_read(addr);
67+
}
68+
69+
/*
70+
* Write a TRAX register using ERI.
71+
*/
72+
static inline void esp_stub_lib_trax_reg_write(int addr, uint32_t data)
73+
{
74+
eri_write(addr, data);
75+
}
76+
77+
#ifdef __cplusplus
78+
}
79+
#endif

include/private/soc_utils.h

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
/*
2+
* SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD
3+
*
4+
* SPDX-License-Identifier: Apache-2.0 OR MIT
5+
*/
6+
7+
#pragma once
8+
9+
#define ETS_UNCACHED_ADDR(addr) (addr)
10+
#define ETS_CACHED_ADDR(addr) (addr)
11+
12+
// Base register read/write macros
13+
#define REG_READ(_r) ({ \
14+
(*(volatile uint32_t *)(_r)); \
15+
})
16+
17+
#define REG_WRITE(_r, _v) do { \
18+
(*(volatile uint32_t *)(_r)) = (_v); \
19+
} while(0)
20+
21+
// Bit manipulation macros
22+
#define REG_GET_BIT(_r, _b) ({ \
23+
(REG_READ(_r) & (_b)); \
24+
})
25+
26+
#define REG_SET_BIT(_r, _b) do { \
27+
REG_WRITE(_r, REG_READ(_r) | (_b)); \
28+
} while(0)
29+
30+
#define REG_CLR_BIT(_r, _b) do { \
31+
REG_WRITE(_r, REG_READ(_r) & (~(_b))); \
32+
} while(0)
33+
34+
#define REG_SET_BITS(_r, _b, _m) do { \
35+
REG_WRITE(_r, (REG_READ(_r) & ~(_m)) | ((_b) & (_m))); \
36+
} while(0)
37+
38+
// Field manipulation macros
39+
#define REG_GET_FIELD(_r, _f) ({ \
40+
((REG_READ(_r) >> (_f##_S)) & (_f##_V)); \
41+
})
42+
43+
#define REG_SET_FIELD(_r, _f, _v) do { \
44+
REG_WRITE(_r, (REG_READ(_r) & ~((_f##_V) << (_f##_S))) | (((_v) & (_f##_V)) << (_f##_S))); \
45+
} while(0)
46+
47+
// Value field manipulation macros
48+
#define VALUE_GET_FIELD(_r, _f) (((_r) >> (_f##_S)) & (_f))
49+
50+
#define VALUE_GET_FIELD2(_r, _f) (((_r) & (_f)) >> (_f##_S))
51+
52+
#define VALUE_SET_FIELD(_r, _f, _v) ((_r) = ((_r) & ~((_f) << (_f##_S))) | ((_v) << (_f##_S)))
53+
54+
#define VALUE_SET_FIELD2(_r, _f, _v) ((_r) = ((_r) & ~(_f)) | ((_v) << (_f##_S)))
55+
56+
// Field to value conversion macros
57+
#define FIELD_TO_VALUE(_f, _v) (((_v) & (_f)) << _f##_S)
58+
59+
#define FIELD_TO_VALUE2(_f, _v) (((_v) << _f##_S) & (_f))
60+
61+
// Peripheral register macros
62+
#define READ_PERI_REG(addr) REG_READ(ETS_UNCACHED_ADDR(addr))
63+
64+
#define WRITE_PERI_REG(addr, val) REG_WRITE(ETS_UNCACHED_ADDR(addr), (uint32_t)(val))
65+
66+
#define CLEAR_PERI_REG_MASK(reg, mask) do { \
67+
WRITE_PERI_REG(reg, READ_PERI_REG(reg) & (~(mask))); \
68+
} while(0)
69+
70+
#define SET_PERI_REG_MASK(reg, mask) do { \
71+
WRITE_PERI_REG(reg, READ_PERI_REG(reg) | (mask)); \
72+
} while(0)
73+
74+
#define GET_PERI_REG_MASK(reg, mask) ({ \
75+
(READ_PERI_REG(reg) & (mask)); \
76+
})
77+
78+
#define GET_PERI_REG_BITS(reg, hipos, lowpos) ({ \
79+
((READ_PERI_REG(reg) >> (lowpos)) & ((1 << ((hipos) - (lowpos) + 1)) - 1)); \
80+
})
81+
82+
#define SET_PERI_REG_BITS(reg, bit_map, value, shift) do { \
83+
WRITE_PERI_REG(reg, (READ_PERI_REG(reg) & (~((bit_map) << (shift)))) | (((value) & (bit_map)) << (shift))); \
84+
} while(0)
85+
86+
#define GET_PERI_REG_BITS2(reg, mask, shift) ({ \
87+
((READ_PERI_REG(reg) >> (shift)) & (mask)); \
88+
})

include/target/trax.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
/*
2+
* SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD
3+
*
4+
* SPDX-License-Identifier: Apache-2.0 OR MIT
5+
*/
6+
7+
#pragma once
8+
9+
void stub_target_trax_mem_enable(void);
10+
void stub_target_trax_select_mem_block(int block);

src/esp32/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
set(srcs
22
src/uart.c
33
src/flash.c
4+
src/trax.c
45
)
56

67
add_library(${ESP_TARGET_LIB} STATIC ${srcs})

src/esp32/src/trax.c

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
/*
2+
* SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD
3+
*
4+
* SPDX-License-Identifier: Apache-2.0 OR MIT
5+
*/
6+
7+
#include <stdint.h>
8+
9+
#include <private/soc_utils.h>
10+
11+
#include "reg_base.h"
12+
13+
#define TRACEMEM_MUX_MODE_REG (DR_REG_DPORT_BASE + 0x070)
14+
#define TRACEMEM_ENA_REG (DR_REG_DPORT_BASE + 0x074)
15+
#define TRACEMEM_ENA_M (0x1)
16+
17+
#define TRACEMEM_MUX_BLK0_ONLY 1
18+
#define TRACEMEM_MUX_BLK1_ONLY 2
19+
20+
void stub_target_trax_mem_enable(void)
21+
{
22+
WRITE_PERI_REG(TRACEMEM_ENA_REG, TRACEMEM_ENA_M);
23+
}
24+
25+
void stub_target_trax_select_mem_block(int block)
26+
{
27+
WRITE_PERI_REG(TRACEMEM_MUX_MODE_REG, block ? TRACEMEM_MUX_BLK0_ONLY : TRACEMEM_MUX_BLK1_ONLY);
28+
}

src/esp32s2/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
set(srcs
22
src/uart.c
33
src/flash.c
4+
src/trax.c
45
)
56

67
add_library(${ESP_TARGET_LIB} STATIC ${srcs})

src/esp32s2/src/trax.c

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
/*
2+
* SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD
3+
*
4+
* SPDX-License-Identifier: Apache-2.0 OR MIT
5+
*/
6+
7+
#include <stdint.h>
8+
9+
#include <bit_utils.h>
10+
#include <private/soc_utils.h>
11+
12+
#include "reg_base.h"
13+
14+
#define PMS_OCCUPY_3_REG (DR_REG_SENSITIVE_BASE + 0x0E0)
15+
16+
#define TRACEMEM_MUX_BLK0_NUM 19
17+
#define TRACEMEM_MUX_BLK1_NUM 20
18+
19+
void stub_target_trax_mem_enable(void)
20+
{
21+
/* nothing to do for ESP32S2 */
22+
}
23+
24+
void stub_target_trax_select_mem_block(int block)
25+
{
26+
WRITE_PERI_REG(PMS_OCCUPY_3_REG, block ? BIT(TRACEMEM_MUX_BLK0_NUM - 4) : BIT(TRACEMEM_MUX_BLK1_NUM - 4));
27+
}

src/esp32s3/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
set(srcs
22
src/uart.c
33
src/flash.c
4+
src/trax.c
45
)
56

67
add_library(${ESP_TARGET_LIB} STATIC ${srcs})

src/esp32s3/src/trax.c

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
/*
2+
* SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD
3+
*
4+
* SPDX-License-Identifier: Apache-2.0 OR MIT
5+
*/
6+
7+
#include <stdint.h>
8+
9+
#include <bit_utils.h>
10+
#include <private/soc_utils.h>
11+
12+
#include "reg_base.h"
13+
14+
#define SENSITIVE_INTERNAL_SRAM_USAGE_2_REG (DR_REG_SENSITIVE_BASE + 0x18)
15+
16+
#define TRACEMEM_MUX_BLK0_NUM 22
17+
#define TRACEMEM_MUX_BLK1_NUM 26
18+
19+
#define TRACEMEM_MUX_BLK_ALLOC(_n_) (((_n_) - 2UL) % 4UL)
20+
#define TRACEMEM_CORE0_MUX_BLK_BITS(_n_) (BIT(((_n_) - 2UL) / 4UL) | (TRACEMEM_MUX_BLK_ALLOC(_n_) << 14))
21+
#define TRACEMEM_CORE1_MUX_BLK_BITS(_n_) (BIT(7UL + ((_n_) - 2UL) / 4UL) | (TRACEMEM_MUX_BLK_ALLOC(_n_) << 16))
22+
23+
void stub_target_trax_mem_enable(void)
24+
{
25+
/* nothing to do for ESP32S3 */
26+
}
27+
28+
void stub_target_trax_select_mem_block(int block)
29+
{
30+
uint32_t block_bits = block ? TRACEMEM_CORE0_MUX_BLK_BITS(TRACEMEM_MUX_BLK0_NUM)
31+
: TRACEMEM_CORE0_MUX_BLK_BITS(TRACEMEM_MUX_BLK1_NUM);
32+
block_bits |= block ? TRACEMEM_CORE1_MUX_BLK_BITS(TRACEMEM_MUX_BLK0_NUM)
33+
: TRACEMEM_CORE1_MUX_BLK_BITS(TRACEMEM_MUX_BLK1_NUM);
34+
WRITE_PERI_REG(SENSITIVE_INTERNAL_SRAM_USAGE_2_REG, block_bits);
35+
}

0 commit comments

Comments
 (0)