1 /*
2 * Copyright (c) 2020, Teslabs Engineering S.L.
3 * Copyright (c) 2022, Basalte bv
4 * Copyright (c) 2025, ZAL Zentrum für Angewandte Luftfahrtforschung GmbH
5 *
6 * SPDX-License-Identifier: Apache-2.0
7 */
8
9 #include <zephyr/linker/devicetree_regions.h>
10 #include <zephyr/kernel.h>
11 #include <zephyr/ztest.h>
12
13 /** Buffer size. */
14 #define BUF_SIZE_PSRAM 524288U
15 #define BUF_SIZE_SDRAM 64U
16 #define BUF_SIZE_SRAM 64U
17
18 #define BUF_DEF(label, size) static uint32_t buf_##label[(size) / sizeof(uint32_t)] \
19 Z_GENERIC_SECTION(LINKER_DT_NODE_REGION_NAME(DT_NODELABEL(label)))
20
21 /**
22 * @brief Helper function to test RAM r/w.
23 *
24 * @param mem RAM memory location to be tested.
25 */
test_ram_rw(uint32_t * mem,size_t size_byte)26 static void test_ram_rw(uint32_t *mem, size_t size_byte)
27 {
28 size_t size_32b = size_byte / sizeof(uint32_t);
29
30 /* fill memory with number range (0, BUF_SIZE - 1) */
31 for (size_t i = 0U; i < size_32b; i++) {
32 mem[i] = i;
33 }
34
35 /* check that memory contains written range */
36 for (size_t i = 0U; i < size_32b; i++) {
37 zassert_equal(mem[i], i, "Unexpected content @%p: 0x%x != 0x%zx",
38 mem + i, mem[i], i);
39 }
40 }
41
42 #if DT_NODE_HAS_STATUS_OKAY(DT_NODELABEL(sdram1))
43 BUF_DEF(sdram1, BUF_SIZE_SDRAM);
44 #endif
45 #if DT_NODE_HAS_STATUS_OKAY(DT_NODELABEL(sdram2))
46 BUF_DEF(sdram2, BUF_SIZE_SDRAM);
47 #endif
48 #if DT_NODE_HAS_STATUS_OKAY(DT_NODELABEL(sram1))
49 BUF_DEF(sram1, BUF_SIZE_SRAM);
50 #endif
51 #if DT_NODE_HAS_STATUS_OKAY(DT_NODELABEL(sram2))
52 BUF_DEF(sram2, BUF_SIZE_SRAM);
53 #endif
54 #if DT_NODE_HAS_STATUS_OKAY(DT_NODELABEL(memc))
55 BUF_DEF(psram, BUF_SIZE_PSRAM);
56 #endif
57
58 #if DT_NODE_HAS_STATUS_OKAY(DT_NODELABEL(ram0))
59 #define RAM_SIZE DT_REG_SIZE(DT_NODELABEL(ram0))
60 static uint32_t *buf_ram0 = (uint32_t *)DT_REG_ADDR(DT_NODELABEL(ram0));
61 #endif
62
63 ZTEST_SUITE(test_ram, NULL, NULL, NULL, NULL, NULL);
64
ZTEST(test_ram,test_sdram1)65 ZTEST(test_ram, test_sdram1)
66 {
67 #if DT_NODE_HAS_STATUS_OKAY(DT_NODELABEL(sdram1))
68 test_ram_rw(buf_sdram1, BUF_SIZE_SDRAM);
69 #else
70 ztest_test_skip();
71 #endif
72 }
73
ZTEST(test_ram,test_ram0)74 ZTEST(test_ram, test_ram0)
75 {
76 #if DT_NODE_HAS_STATUS_OKAY(DT_NODELABEL(ram0))
77 test_ram_rw(buf_ram0, RAM_SIZE);
78 #else
79 ztest_test_skip();
80 #endif
81 }
82
ZTEST(test_ram,test_sdram2)83 ZTEST(test_ram, test_sdram2)
84 {
85 #if DT_NODE_HAS_STATUS_OKAY(DT_NODELABEL(sdram2))
86 test_ram_rw(buf_sdram2, BUF_SIZE_SDRAM);
87 #else
88 ztest_test_skip();
89 #endif
90 }
91
ZTEST(test_ram,test_sram1)92 ZTEST(test_ram, test_sram1)
93 {
94 #if DT_NODE_HAS_STATUS_OKAY(DT_NODELABEL(sram1))
95 test_ram_rw(buf_sram1, BUF_SIZE_SRAM);
96 #else
97 ztest_test_skip();
98 #endif
99 }
100
ZTEST(test_ram,test_sram2)101 ZTEST(test_ram, test_sram2)
102 {
103 #if DT_NODE_HAS_STATUS_OKAY(DT_NODELABEL(sram2))
104 test_ram_rw(buf_sram2, BUF_SIZE_SRAM);
105 #else
106 ztest_test_skip();
107 #endif
108 }
109
ZTEST(test_ram,test_psram)110 ZTEST(test_ram, test_psram)
111 {
112 #if DT_NODE_HAS_STATUS_OKAY(DT_NODELABEL(memc))
113 test_ram_rw(buf_psram, BUF_SIZE_PSRAM);
114 #else
115 ztest_test_skip();
116 #endif
117 }
118