From 8162bb63c433d6d48db2d885c5a4ffceb04884c9 Mon Sep 17 00:00:00 2001 From: Vincenzo Frascino Date: Wed, 10 May 2017 11:50:24 +0100 Subject: [PATCH] samples: mpu_test: Add controller specific write This patch add a controller specific write function and fixes a documentation error in the mpu_test README file. Signed-off-by: Vincenzo Frascino --- samples/mpu_test/README.rst | 22 +++++------- samples/mpu_test/src/main.c | 72 ++++++++++++++++++++++++++++++++++++- 2 files changed, 80 insertions(+), 14 deletions(-) diff --git a/samples/mpu_test/README.rst b/samples/mpu_test/README.rst index c06612faaa3..a312096f5d2 100644 --- a/samples/mpu_test/README.rst +++ b/samples/mpu_test/README.rst @@ -51,16 +51,12 @@ Sample Output .. code-block:: console - ***** BOOTING ZEPHYR OS v1.7.99 - BUILD: Mar 9 2017 13:01:59 ***** - *** MPU test options *** - 1 - Read a reserved address in the memory map - 2 - Write in to boot FLASH/ROM - 3 - Run code located in RAM - Select an option: - 1 - Read a reserved address in the memory map - ***** MPU FAULT ***** - Executing thread ID (thread): 0x20000258 - Faulting instruction address: 0x2ac - Data Access Violation - Address: 0x20040000 - Fatal fault in essential thread! Spinning... + ***** BOOTING ZEPHYR OS v1.7.99 - BUILD: May 12 2017 09:47:02 ***** + shell> select mpu_test + mpu_test> read + ***** BUS FAULT ***** + Executing thread ID (thread): 0x200003b8 + Faulting instruction address: 0x290 + Precise data bus error + Address: 0x24000000 + Fatal fault in thread 0x200003b8! Aborting. diff --git a/samples/mpu_test/src/main.c b/samples/mpu_test/src/main.c index fe47d150b6e..4308874a84e 100644 --- a/samples/mpu_test/src/main.c +++ b/samples/mpu_test/src/main.c @@ -6,6 +6,7 @@ #include #include +#include #include #include @@ -33,18 +34,81 @@ static int shell_cmd_read(int argc, char *argv[]) return 0; } +#if defined(CONFIG_SOC_FLASH_MCUX) +static int shell_cmd_write_mcux(int argc, char *argv[]) +{ + ARG_UNUSED(argc); + ARG_UNUSED(argv); + + struct device *flash_dev; + flash_dev = device_get_binding(CONFIG_SOC_FLASH_MCUX_DEV_NAME); + + u32_t value[2]; + + /* 128K reserved to the application */ + u32_t offset = FLASH_MEM + 0x20000; + value[0] = 0xBADC0DE; + value[1] = 0xBADC0DE; + + printk("write address: 0x%x\n", offset); + + flash_write_protection_set(flash_dev, false); + + if (flash_write(flash_dev, offset, value, + sizeof(value)) != 0) { + printk("Flash write failed!\n"); + return 1; + } + + flash_write_protection_set(flash_dev, true); + + return 0; + +} +#elif defined(CONFIG_SOC_FLASH_STM32) +static int shell_cmd_write_stm32(int argc, char *argv[]) +{ + ARG_UNUSED(argc); + ARG_UNUSED(argv); + + struct device *flash_dev; + flash_dev = device_get_binding(CONFIG_SOC_FLASH_STM32_DEV_NAME); + + /* 16K reserved to the application */ + u32_t offset = FLASH_MEM + 0x4000; + u32_t value = 0xBADC0DE; + + printk("write address: 0x%x\n", offset); + + flash_write_protection_set(flash_dev, false); + + if (flash_write(flash_dev, offset, &value, + sizeof(value)) != 0) { + printk("Flash write failed!\n"); + return 1; + } + + flash_write_protection_set(flash_dev, true); + + return 0; +} +#else static int shell_cmd_write(int argc, char *argv[]) { ARG_UNUSED(argc); ARG_UNUSED(argv); - u32_t *p_mem = (u32_t *) FLASH_MEM; + /* 16K reserved to the application */ + u32_t *p_mem = (u32_t *) (FLASH_MEM + 0x4000); + + printk("write address: 0x%x\n", FLASH_MEM + 0x4000); /* Write in to boot FLASH/ROM */ *p_mem = 0xBADC0DE; return 0; } +#endif /* SOC_FLASH_MCUX */ static int shell_cmd_run(int argc, char *argv[]) { @@ -83,7 +147,13 @@ static int shell_cmd_mtest(int argc, char *argv[]) static struct shell_cmd commands[] = { { "read", shell_cmd_read, READ_CMD_HELP}, +#if defined(CONFIG_SOC_FLASH_MCUX) + { "write", shell_cmd_write_mcux, WRITE_CMD_HELP }, +#elif defined(CONFIG_SOC_FLASH_STM32) + { "write", shell_cmd_write_stm32, WRITE_CMD_HELP }, +#else { "write", shell_cmd_write, WRITE_CMD_HELP }, +#endif /* SOC_FLASH_MCUX*/ { "run", shell_cmd_run, RUN_CMD_HELP }, { "mtest", shell_cmd_mtest, MTEST_CMD_HELP }, { NULL, NULL, NULL }