diff --git a/boards/arm/mps/mps2-an500/configs/xipfs/defconfig b/boards/arm/mps/mps2-an500/configs/xipfs/defconfig new file mode 100644 index 00000000000..8727ce5d5cb --- /dev/null +++ b/boards/arm/mps/mps2-an500/configs/xipfs/defconfig @@ -0,0 +1,88 @@ +# +# This file is autogenerated: PLEASE DO NOT EDIT IT. +# +# You can use "make menuconfig" to make any modifications to the installed .config file. +# You can then do "make savedefconfig" to generate a new defconfig file that includes your +# modifications. +# +CONFIG_ARCH="arm" +CONFIG_ARCH_BOARD="mps2-an500" +CONFIG_ARCH_BOARD_MPS2_AN500=y +CONFIG_ARCH_CHIP="mps" +CONFIG_ARCH_CHIP_MPS2_AN500=y +CONFIG_ARCH_CHIP_MPS=y +CONFIG_ARCH_INTERRUPTSTACK=2048 +CONFIG_ARCH_STACKDUMP=y +CONFIG_ARMV7M_SYSTICK=y +CONFIG_ARM_MPU=y +CONFIG_ARM_MPU_NREGIONS=1 +CONFIG_ARM_MPU_RESET=y +CONFIG_BUILTIN=y +CONFIG_CMSDK_UART0=y +CONFIG_CMSDK_UART0_BASE=0x40004000 +CONFIG_CMSDK_UART0_CLOCK=25000000 +CONFIG_CMSDK_UART0_OV_IRQ=28 +CONFIG_CMSDK_UART0_RX_IRQ=16 +CONFIG_CMSDK_UART0_SERIAL_CONSOLE=y +CONFIG_CMSDK_UART0_TX_IRQ=17 +CONFIG_CMSDK_UART=y +CONFIG_CXX_STANDARD="c++17" +CONFIG_DEBUG_ASSERTIONS=y +CONFIG_DEBUG_BUSFAULT=y +CONFIG_DEBUG_FEATURES=y +CONFIG_DEBUG_HARDFAULT_ALERT=y +CONFIG_DEBUG_SCHED=y +CONFIG_DEBUG_SCHED_ERROR=y +CONFIG_DEBUG_SCHED_INFO=y +CONFIG_DEBUG_SCHED_WARN=y +CONFIG_DEBUG_SYMBOLS=y +CONFIG_DEBUG_USAGEFAULT=y +CONFIG_DEFAULT_TASK_STACKSIZE=4096 +CONFIG_EXPERIMENTAL=y +CONFIG_FRAME_POINTER=y +CONFIG_FS_PROCFS=y +CONFIG_FS_ROMFS=y +CONFIG_FS_TMPFS=y +CONFIG_FS_XIPFS=y +CONFIG_FS_XIPFS_FAULT_INJECT=y +CONFIG_HAVE_CXX=y +CONFIG_HAVE_CXXINITIALIZE=y +CONFIG_IDLETHREAD_STACKSIZE=4096 +CONFIG_INIT_ENTRYPOINT="nsh_main" +CONFIG_INTELHEX_BINARY=y +CONFIG_LIBC_MEMFD_ERROR=y +CONFIG_LIBC_STRERROR=y +CONFIG_LIBC_STRERROR_ERRNUM=y +CONFIG_MTD=y +CONFIG_NSH_BUILTIN_APPS=y +CONFIG_NSH_FILEIOSIZE=512 +CONFIG_NSH_READLINE=y +CONFIG_PREALLOC_TIMERS=4 +CONFIG_PROFILE_ALL=y +CONFIG_PROFILE_MINI=y +CONFIG_RAMLOG=y +CONFIG_RAMMTD=y +CONFIG_RAMMTD_FLASHSIM=y +CONFIG_RAM_SIZE=2097152 +CONFIG_RAM_START=0x60000000 +CONFIG_RAW_BINARY=y +CONFIG_READLINE_CMD_HISTORY=y +CONFIG_RR_INTERVAL=200 +CONFIG_SCHED_HPWORK=y +CONFIG_SCHED_HPWORKPRIORITY=192 +CONFIG_SCHED_IRQMONITOR=y +CONFIG_SPINLOCK=y +CONFIG_STACK_COLORATION=y +CONFIG_STANDARD_SERIAL=y +CONFIG_START_DAY=25 +CONFIG_START_MONTH=4 +CONFIG_START_YEAR=2023 +CONFIG_SYMTAB_ORDEREDBYNAME=y +CONFIG_SYSTEM_GPROF=y +CONFIG_SYSTEM_NSH=y +CONFIG_SYSTEM_SYSTEM=y +CONFIG_SYSTEM_XIPFS=y +CONFIG_TESTING_FS_XIPFS=y +CONFIG_TIMER=y +CONFIG_TIMER_ARCH=y +CONFIG_USEC_PER_TICK=1000 diff --git a/boards/arm/mps/mps2-an500/src/mps2_bringup.c b/boards/arm/mps/mps2-an500/src/mps2_bringup.c index 8eca0570518..3d80e17ea9c 100644 --- a/boards/arm/mps/mps2-an500/src/mps2_bringup.c +++ b/boards/arm/mps/mps2-an500/src/mps2_bringup.c @@ -31,10 +31,20 @@ #include +#ifdef CONFIG_RAMMTD +# include +# include +# include +#endif + /**************************************************************************** * Pre-processor Definitions ****************************************************************************/ +#ifdef CONFIG_RAMMTD +# define MPS2_RAMMTD_SIZE (256 * 1024) +#endif + /**************************************************************************** * Private Functions ****************************************************************************/ @@ -73,6 +83,54 @@ static int mps2_bringup(void) } #endif +#ifdef CONFIG_RAMMTD + /* A RAM backed MTD device standing in for memory mapped NOR. rammtd + * answers BIOC_XIPBASE with the base of its buffer, so xipfs layered on it + * can hand out real, directly executable pointers -- which is what lets a + * module be executed in place rather than copied. This gives the xipfs + * test suite a target with no real flash. + */ + + { + FAR uint8_t *ramstart = kmm_malloc(MPS2_RAMMTD_SIZE); + FAR struct mtd_dev_s *mtd; + + if (ramstart == NULL) + { + syslog(LOG_ERR, "ERROR: Failed to allocate RAM MTD\n"); + } + else if ((mtd = rammtd_initialize(ramstart, MPS2_RAMMTD_SIZE)) == NULL) + { + syslog(LOG_ERR, "ERROR: rammtd_initialize failed\n"); + kmm_free(ramstart); + } + else + { + mtd->ioctl(mtd, MTDIOC_BULKERASE, 0); + + ret = register_mtddriver("/dev/rammtd", mtd, 0755, NULL); + if (ret < 0) + { + syslog(LOG_ERR, "ERROR: register_mtddriver failed: %d\n", ret); + } + +#ifdef CONFIG_FS_XIPFS + else + { + ret = nx_mount("/dev/rammtd", "/mnt/xipfs", "xipfs", 0, + "autoformat"); + if (ret < 0) + { + syslog(LOG_ERR, + "ERROR: Failed to mount xipfs at /mnt/xipfs: %d\n", + ret); + } + } +#endif + } + } +#endif + return ret; } diff --git a/boards/arm/mps/mps2-an521/configs/xipfs/defconfig b/boards/arm/mps/mps2-an521/configs/xipfs/defconfig new file mode 100644 index 00000000000..b5fee089c66 --- /dev/null +++ b/boards/arm/mps/mps2-an521/configs/xipfs/defconfig @@ -0,0 +1,78 @@ +# +# This file is autogenerated: PLEASE DO NOT EDIT IT. +# +# You can use "make menuconfig" to make any modifications to the installed .config file. +# You can then do "make savedefconfig" to generate a new defconfig file that includes your +# modifications. +# +# CONFIG_DEBUG_WARN is not set +CONFIG_ARCH="arm" +CONFIG_ARCH_BOARD="mps2-an521" +CONFIG_ARCH_BOARD_MPS2_AN521=y +CONFIG_ARCH_CHIP="mps" +CONFIG_ARCH_CHIP_MPS2_AN521=y +CONFIG_ARCH_CHIP_MPS=y +CONFIG_ARCH_INTERRUPTSTACK=2048 +CONFIG_ARCH_STACKDUMP=y +CONFIG_ARMV8M_SYSTICK=y +CONFIG_ARM_MPU=y +CONFIG_ARM_MPU_NREGIONS=1 +CONFIG_ARM_MPU_RESET=y +CONFIG_BUILTIN=y +CONFIG_CMSDK_UART0=y +CONFIG_CMSDK_UART0_BASE=0x50200000 +CONFIG_CMSDK_UART0_CLOCK=25000000 +CONFIG_CMSDK_UART0_OV_IRQ=63 +CONFIG_CMSDK_UART0_RX_IRQ=48 +CONFIG_CMSDK_UART0_SERIAL_CONSOLE=y +CONFIG_CMSDK_UART0_TX_IRQ=49 +CONFIG_CMSDK_UART=y +CONFIG_DEBUG_ASSERTIONS=y +CONFIG_DEBUG_FEATURES=y +CONFIG_DEBUG_SCHED=y +CONFIG_DEBUG_SCHED_ERROR=y +CONFIG_DEBUG_SYMBOLS=y +CONFIG_DEFAULT_TASK_STACKSIZE=4096 +CONFIG_EXPERIMENTAL=y +CONFIG_FS_PROCFS=y +CONFIG_FS_ROMFS=y +CONFIG_FS_TMPFS=y +CONFIG_FS_XIPFS=y +CONFIG_FS_XIPFS_FAULT_INJECT=y +CONFIG_HAVE_CXX=y +CONFIG_HAVE_CXXINITIALIZE=y +CONFIG_IDLETHREAD_STACKSIZE=4096 +CONFIG_INIT_ENTRYPOINT="nsh_main" +CONFIG_INTELHEX_BINARY=y +CONFIG_LIBC_MEMFD_ERROR=y +CONFIG_LIBC_STRERROR=y +CONFIG_LIBC_STRERROR_ERRNUM=y +CONFIG_MTD=y +CONFIG_NSH_BUILTIN_APPS=y +CONFIG_NSH_FILEIOSIZE=512 +CONFIG_NSH_READLINE=y +CONFIG_PREALLOC_TIMERS=4 +CONFIG_RAMLOG=y +CONFIG_RAMMTD=y +CONFIG_RAMMTD_FLASHSIM=y +CONFIG_RAM_SIZE=2097152 +CONFIG_RAM_START=0x38000000 +CONFIG_RAW_BINARY=y +CONFIG_READLINE_CMD_HISTORY=y +CONFIG_RR_INTERVAL=200 +CONFIG_SCHED_HPWORK=y +CONFIG_SCHED_HPWORKPRIORITY=192 +CONFIG_SPINLOCK=y +CONFIG_STACK_COLORATION=y +CONFIG_STANDARD_SERIAL=y +CONFIG_START_DAY=25 +CONFIG_START_MONTH=4 +CONFIG_START_YEAR=2023 +CONFIG_SYMTAB_ORDEREDBYNAME=y +CONFIG_SYSTEM_NSH=y +CONFIG_SYSTEM_SYSTEM=y +CONFIG_SYSTEM_XIPFS=y +CONFIG_TESTING_FS_XIPFS=y +CONFIG_TIMER=y +CONFIG_TIMER_ARCH=y +CONFIG_USEC_PER_TICK=1000 diff --git a/boards/arm/mps/mps2-an521/src/mps2_bringup.c b/boards/arm/mps/mps2-an521/src/mps2_bringup.c index e5bcb5a5780..d1a1483a3f3 100644 --- a/boards/arm/mps/mps2-an521/src/mps2_bringup.c +++ b/boards/arm/mps/mps2-an521/src/mps2_bringup.c @@ -31,10 +31,20 @@ #include +#ifdef CONFIG_RAMMTD +# include +# include +# include +#endif + /**************************************************************************** * Pre-processor Definitions ****************************************************************************/ +#ifdef CONFIG_RAMMTD +# define MPS2_RAMMTD_SIZE (256 * 1024) +#endif + /**************************************************************************** * Private Functions ****************************************************************************/ @@ -73,6 +83,54 @@ static int mps2_bringup(void) } #endif +#ifdef CONFIG_RAMMTD + /* A RAM backed MTD device standing in for memory mapped NOR. rammtd + * answers BIOC_XIPBASE with the base of its buffer, so xipfs layered on it + * can hand out real, directly executable pointers -- which is what lets a + * module be executed in place rather than copied. This gives the xipfs + * test suite a target with no real flash. + */ + + { + FAR uint8_t *ramstart = kmm_malloc(MPS2_RAMMTD_SIZE); + FAR struct mtd_dev_s *mtd; + + if (ramstart == NULL) + { + syslog(LOG_ERR, "ERROR: Failed to allocate RAM MTD\n"); + } + else if ((mtd = rammtd_initialize(ramstart, MPS2_RAMMTD_SIZE)) == NULL) + { + syslog(LOG_ERR, "ERROR: rammtd_initialize failed\n"); + kmm_free(ramstart); + } + else + { + mtd->ioctl(mtd, MTDIOC_BULKERASE, 0); + + ret = register_mtddriver("/dev/rammtd", mtd, 0755, NULL); + if (ret < 0) + { + syslog(LOG_ERR, "ERROR: register_mtddriver failed: %d\n", ret); + } + +#ifdef CONFIG_FS_XIPFS + else + { + ret = nx_mount("/dev/rammtd", "/mnt/xipfs", "xipfs", 0, + "autoformat"); + if (ret < 0) + { + syslog(LOG_ERR, + "ERROR: Failed to mount xipfs at /mnt/xipfs: %d\n", + ret); + } + } +#endif + } + } +#endif + return ret; }