Linux Audio

Check our new training course

Loading...
/*
 * Copyright (c) 2017 Linaro Limited.
 *
 * SPDX-License-Identifier: Apache-2.0
 */
#include <stdlib.h>

#include <zephyr.h>
#include <flash.h>
#include <misc/printk.h>
#include <shell/shell.h>

/* Assumption: our devices have less than 64MB of memory */
#define RESERVED_MEM_MAP (CONFIG_SRAM_BASE_ADDRESS + 0x4000000)
#define FLASH_MEM         CONFIG_FLASH_BASE_ADDRESS
#define RAM_MEM           CONFIG_SRAM_BASE_ADDRESS

/* MPU test command help texts */
#define READ_CMD_HELP  "Read from a reserved address in the memory map"
#define WRITE_CMD_HELP "Write in to boot FLASH/ROM"
#define RUN_CMD_HELP   "Run code located in RAM"
#define MTEST_CMD_HELP "Memory Test writes or reads a memory location"

static int shell_cmd_read(int argc, char *argv[])
{
	ARG_UNUSED(argc);
	ARG_UNUSED(argv);

	u32_t *p_mem = (u32_t *) RESERVED_MEM_MAP;

	/* Reads from an address that is reserved in the memory map */
	printk("The value is: %d", *p_mem);

	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(FLASH_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(FLASH_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);

	/* 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[])
{
	ARG_UNUSED(argc);
	ARG_UNUSED(argv);

	void (*func_ptr)(void) = (void (*)(void)) RAM_MEM;

	/* Run code located in RAM */
	func_ptr();

	return 0;
}

static int shell_cmd_mtest(int argc, char *argv[])
{
	if (argc > 3) {
		printk("mtest accepts 1 (Read) or 2 (Write) parameters\n");
		return 1;
	}

	u32_t val = (u32_t)strtol(argv[1], NULL, 16);

	u32_t *mem = (u32_t *) val;

	if (argc == 2) {
		printk("The value is: 0x%x\n", *mem);
	} else {
		*mem = (u32_t) strtol(argv[2], NULL, 16);
	}

	return 0;
}

#define SHELL_MODULE "mpu_test"

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 }
};

void main(void)
{
	SHELL_REGISTER(SHELL_MODULE, commands);
}