samples: boards: mimxrt11xx_cm7: Magic addr sample
Add magic address sample to show how to use flexram
magic address using memc flexram driver.
Signed-off-by: Declan Snyder <declan.snyder@nxp.com>
diff --git a/samples/boards/mimxrt1170_evk_cm7/magic_addr/CMakeLists.txt b/samples/boards/mimxrt1170_evk_cm7/magic_addr/CMakeLists.txt
new file mode 100644
index 0000000..b8af716
--- /dev/null
+++ b/samples/boards/mimxrt1170_evk_cm7/magic_addr/CMakeLists.txt
@@ -0,0 +1,10 @@
+# SPDX-License-Identifier: Apache-2.0
+
+cmake_minimum_required(VERSION 3.20.0)
+
+find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
+project(magic_addr)
+
+zephyr_library_include_directories(${ZEPHYR_BASE}/drivers/memc)
+
+target_sources(app PRIVATE src/main.c)
diff --git a/samples/boards/mimxrt1170_evk_cm7/magic_addr/README.rst b/samples/boards/mimxrt1170_evk_cm7/magic_addr/README.rst
new file mode 100644
index 0000000..679343d
--- /dev/null
+++ b/samples/boards/mimxrt1170_evk_cm7/magic_addr/README.rst
@@ -0,0 +1,18 @@
+.. _flexram_magic_addr:
+
+FLEXRAM Magic Addr
+##################
+
+Overview
+********
+
+A sample that shows how to use RT11XX FLEXRAM Magic Addr functionality
+
+Magic Addr is a feature of FlexRAM that allows user to configure an interrupt
+on an arbitrary RAM/TCM address access. This sample shows how to use the custom
+API for the flexram in zephyr to use this unique feature.
+
+Building and Running
+********************
+
+see board documentation
diff --git a/samples/boards/mimxrt1170_evk_cm7/magic_addr/prj.conf b/samples/boards/mimxrt1170_evk_cm7/magic_addr/prj.conf
new file mode 100644
index 0000000..b58887f
--- /dev/null
+++ b/samples/boards/mimxrt1170_evk_cm7/magic_addr/prj.conf
@@ -0,0 +1,3 @@
+CONFIG_MEMC_NXP_FLEXRAM_MAGIC_ADDR_API=y
+CONFIG_CONSOLE_SUBSYS=y
+CONFIG_CONSOLE_GETCHAR=y
diff --git a/samples/boards/mimxrt1170_evk_cm7/magic_addr/sample.yaml b/samples/boards/mimxrt1170_evk_cm7/magic_addr/sample.yaml
new file mode 100644
index 0000000..10e8768
--- /dev/null
+++ b/samples/boards/mimxrt1170_evk_cm7/magic_addr/sample.yaml
@@ -0,0 +1,12 @@
+sample:
+ description: RT1170 FLEXRAM Magic Addr example
+ name: magic addr
+common:
+ integration_platforms:
+ - mimxrt1170_evk_cm7
+ - mimxrt1160_evk_cm7
+tests:
+ sample.boards.mimxrt1170_evk.magic_addr:
+ platform_allow:
+ - mimxrt1170_evk_cm7
+ - mimxrt1160_evk_cm7
diff --git a/samples/boards/mimxrt1170_evk_cm7/magic_addr/src/main.c b/samples/boards/mimxrt1170_evk_cm7/magic_addr/src/main.c
new file mode 100644
index 0000000..6856ca8
--- /dev/null
+++ b/samples/boards/mimxrt1170_evk_cm7/magic_addr/src/main.c
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2023 NXP
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+#include <stdio.h>
+#include <zephyr/linker/section_tags.h>
+#include "memc_nxp_flexram.h"
+#include <zephyr/kernel.h>
+#include <zephyr/console/console.h>
+#include <zephyr/cache.h>
+
+K_SEM_DEFINE(dtcm_magic, 0, 1);
+
+__dtcm_bss_section uint8_t var;
+int cnt;
+
+void flexram_magic_addr_isr_cb(enum memc_flexram_interrupt_cause cause,
+ void *data)
+{
+ ARG_UNUSED(data);
+
+ if (cause == flexram_dtcm_magic_addr) {
+ printf("Magic DTCM address accessed %d times\n", ++cnt);
+ k_sem_give(&dtcm_magic);
+ }
+}
+
+
+int main(void)
+{
+ memc_flexram_register_callback(flexram_magic_addr_isr_cb, NULL);
+
+ console_init();
+
+ printf("%s is opening spellbook...\n", CONFIG_BOARD);
+ printf("Cast some characters:\n");
+
+ uint32_t dtcm_addr = (uint32_t)&var;
+
+ memc_flexram_set_dtcm_magic_addr(dtcm_addr);
+
+ uint8_t tmp;
+
+ while (1) {
+ printf("\n");
+ tmp = console_getchar();
+ printf("Writing %c to magic addr...\n", tmp);
+ var = tmp;
+ k_sem_take(&dtcm_magic, K_FOREVER);
+ printf("Reading from magic addr...\n");
+ printf("Magic variable got: %c\n", var);
+ k_sem_take(&dtcm_magic, K_FOREVER);
+ }
+
+ return 0;
+}