From 3737a28eafd580a2bee2794e4f5edd0c0471a0c6 Mon Sep 17 00:00:00 2001 From: Roland Takacs <1487864+rtakacs@users.noreply.github.com> Date: Tue, 23 Nov 2021 13:21:24 +0100 Subject: [PATCH] Update NuttX target to releases/10.2 (#4822) JerryScript-DCO-1.0-Signed-off-by: Roland Takacs roland.takacs@h-lab.eu --- targets/nuttx-stm32f4/Kconfig | 24 +-- targets/nuttx-stm32f4/Make.defs | 4 +- targets/nuttx-stm32f4/Makefile | 33 ++-- targets/nuttx-stm32f4/Makefile.travis | 15 +- targets/nuttx-stm32f4/README.md | 264 ++++++++++++++++++-------- targets/nuttx-stm32f4/jerry_main.c | 1 + 6 files changed, 223 insertions(+), 118 deletions(-) diff --git a/targets/nuttx-stm32f4/Kconfig b/targets/nuttx-stm32f4/Kconfig index 96a70cd5be..ddc5fad869 100644 --- a/targets/nuttx-stm32f4/Kconfig +++ b/targets/nuttx-stm32f4/Kconfig @@ -3,28 +3,18 @@ # see the file kconfig-language.txt in the NuttX tools repository. # -config JERRYSCRIPT - bool "Jerryscript" +config INTERPRETERS_JERRYSCRIPT + bool "Jerryscript JavaScript engine" default n - ---help--- - Enable Jerryscript ECMAScript 5.1 interpreter -if JERRYSCRIPT +if INTERPRETERS_JERRYSCRIPT -config JERRYSCRIPT_PROGNAME - string "Program name" - default "jerry" - depends on BUILD_KERNEL - ---help--- - This is the name of the program that will be - use when the NSH ELF program is installed. - -config JERRYSCRIPT_PRIORITY - int "Jerryscript task priority" +config INTERPRETERS_JERRYSCRIPT_PRIORITY + int "Jerryscript priority" default 100 -config JERRYSCRIPT_STACKSIZE +config INTERPRETERS_JERRYSCRIPT_STACKSIZE int "Jerryscript stack size" default 16384 -endif # JERRYSCRIPT +endif # INTERPRETERS_JERRYSCRIPT diff --git a/targets/nuttx-stm32f4/Make.defs b/targets/nuttx-stm32f4/Make.defs index 8606a4ddea..8cdbe329a5 100644 --- a/targets/nuttx-stm32f4/Make.defs +++ b/targets/nuttx-stm32f4/Make.defs @@ -12,6 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -ifeq ($(CONFIG_JERRYSCRIPT),y) -CONFIGURED_APPS += interpreters/jerryscript +ifeq ($(CONFIG_INTERPRETERS_JERRYSCRIPT),y) +CONFIGURED_APPS += $(APPDIR)/interpreters/jerryscript endif diff --git a/targets/nuttx-stm32f4/Makefile b/targets/nuttx-stm32f4/Makefile index cee5a0f566..48193066e3 100644 --- a/targets/nuttx-stm32f4/Makefile +++ b/targets/nuttx-stm32f4/Makefile @@ -12,20 +12,17 @@ # See the License for the specific language governing permissions and # limitations under the License. --include $(TOPDIR)/Make.defs +include $(APPDIR)/Make.defs # Jerryscript built-in application information. -CONFIG_JERRYSCRIPT_PRIORITY ?= SCHED_PRIORITY_DEFAULT -CONFIG_JERRYSCRIPT_PROGNAME ?= jerry$(EXEEXT) -CONFIG_JERRYSCRIPT_STACKSIZE ?= 16384 +PROGNAME = jerry +PRIORITY = $(CONFIG_INTERPRETERS_JERRYSCRIPT_PRIORITY) +STACKSIZE = $(CONFIG_INTERPRETERS_JERRYSCRIPT_STACKSIZE) -PROGNAME = $(CONFIG_JERRYSCRIPT_PROGNAME) -PRIORITY = $(CONFIG_JERRYSCRIPT_PRIORITY) -STACKSIZE = $(CONFIG_JERRYSCRIPT_STACKSIZE) - -# Path to the JerryScript project. If not specified, it is supposed -# that JerryScript is located next to the nuttx-apps folder. +# Path to the JerryScript and NuttX projects. If not specified, it is +# supposed that JerryScript is located next to the nuttx folder. JERRYSCRIPT_ROOT_DIR ?= ../../../jerryscript +NUTTX_ROOT_DIR ?= $(JERRYSCRIPT_ROOT_DIR)/../nuttx CFLAGS += -std=c99 CFLAGS += -I$(JERRYSCRIPT_ROOT_DIR)/jerry-core/include @@ -35,7 +32,6 @@ CFLAGS += -I$(JERRYSCRIPT_ROOT_DIR)/jerry-math/include # These libs should be copied from the JerryScript project. LIBS = libjerry-core.a libjerry-ext.a libjerry-math.a -APPNAME = jerry ASRCS = setjmp.S CSRCS = jerry_port.c jerry_module.c MAINSRC = jerry_main.c @@ -55,8 +51,21 @@ updateobjs: cleanlibs: updateobjs rm -f $(OBJS) +.PHONY: libjerry +libjerry: + $(JERRYSCRIPT_ROOT_DIR)/tools/build.py \ + --clean \ + --lto=OFF \ + --jerry-cmdline=OFF \ + --jerry-math=ON \ + --amalgam=ON \ + --mem-heap=70 \ + --profile=es.next \ + --compile-flag="--sysroot=${NUTTX_ROOT_DIR}" \ + --toolchain=$(abspath $(JERRYSCRIPT_ROOT_DIR)/cmake/toolchain_mcu_stm32f4.cmake) + clean:: cleanlibs -.built: $(LIBS) updateobjs +archive: libjerry $(LIBS) updateobjs include $(APPDIR)/Application.mk diff --git a/targets/nuttx-stm32f4/Makefile.travis b/targets/nuttx-stm32f4/Makefile.travis index 50eadc14d5..fe33b295af 100644 --- a/targets/nuttx-stm32f4/Makefile.travis +++ b/targets/nuttx-stm32f4/Makefile.travis @@ -39,8 +39,8 @@ install-kconfig: # Fetch nuttx/{apps,nuttx} repositories. install-clone-nuttx: - git clone https://github.com/apache/incubator-nuttx-apps.git ../apps -b releases/9.0 - git clone https://github.com/apache/incubator-nuttx.git ../nuttx -b releases/9.0 + git clone https://github.com/apache/incubator-nuttx-apps.git ../apps -b releases/10.2 + git clone https://github.com/apache/incubator-nuttx.git ../nuttx -b releases/10.2 # Perform all the necessary (JerryScript-independent) installation steps. install-noapt: install-kconfig install-clone-nuttx @@ -49,22 +49,17 @@ install: install-apt-get-deps install-noapt ## Targets for building NuttX with JerryScript. -# Build JerryScript. -script-build-jerryscript: - tools/build.py --clean --toolchain cmake/toolchain_mcu_stm32f4.cmake --profile=es.next --jerry-cmdline OFF --lto OFF --jerry-math ON --amalgam ON --jerry-port-default OFF --mem-heap 70 --compile-flag='--sysroot=../nuttx' - # Link in the NuttX JerryScript target directory under the NuttX apps tree. script-add-jerryscript-app: ln -s ../../jerryscript/targets/nuttx-stm32f4 ../apps/interpreters/jerryscript # Configure USB shell. script-configure-usbnsh: - cd ../nuttx/tools && PATH=$(LOCAL_INSTALL)/bin:$$PATH ./configure.sh stm32f4discovery/usbnsh + cd ../nuttx/tools && PATH=$(LOCAL_INSTALL)/bin:$$PATH ./configure.sh stm32f4discovery:usbnsh # Configure and build the firmware (NuttX with JerryScript). -script: script-build-jerryscript script-add-jerryscript-app script-configure-usbnsh - echo 'CONFIG_HOST_LINUX=y' >> ../nuttx/.config +script: script-add-jerryscript-app script-configure-usbnsh echo 'CONFIG_ARCH_FPU=y' >> ../nuttx/.config - echo 'CONFIG_JERRYSCRIPT=y'>> ../nuttx/.config + echo 'CONFIG_INTERPRETERS_JERRYSCRIPT=y'>> ../nuttx/.config PATH=$(LOCAL_INSTALL)/bin:$$PATH $(MAKE) -C ../nuttx olddefconfig PATH=$(LOCAL_INSTALL)/bin:$$PATH $(MAKE) -C ../nuttx diff --git a/targets/nuttx-stm32f4/README.md b/targets/nuttx-stm32f4/README.md index 2eba1d7667..a323390348 100644 --- a/targets/nuttx-stm32f4/README.md +++ b/targets/nuttx-stm32f4/README.md @@ -1,21 +1,25 @@ ### About This folder contains files to run JerryScript on -[STM32F4-Discovery board](http://www.st.com/content/st_com/en/products/evaluation-tools/product-evaluation-tools/mcu-eval-tools/stm32-mcu-eval-tools/stm32-mcu-discovery-kits/stm32f4discovery.html) with [NuttX](http://nuttx.org/) +[STM32F4-Discovery board](https://www.st.com/en/evaluation-tools/stm32f4discovery.html) with +[NuttX](https://nuttx.apache.org/). +The document had been validated on Ubuntu 20.04 operating system. ### How to build #### 1. Setup the build environment for STM32F4-Discovery board -Clone the necessary projects into a `jerry-nuttx` directory. The last tested working version of NuttX is 9.0. +Clone the necessary projects into a `jerry-nuttx` directory. +The latest tested working version of NuttX is 10.2. ```sh # Create a base folder for all the projects. mkdir jerry-nuttx && cd jerry-nuttx git clone https://github.com/jerryscript-project/jerryscript.git -git clone https://bitbucket.org/nuttx/nuttx.git -b releases/9.0 -git clone https://bitbucket.org/nuttx/apps.git -b releases/9.0 +git clone https://github.com/apache/incubator-nuttx.git nuttx -b releases/10.2 +git clone https://github.com/apache/incubator-nuttx-apps.git apps -b releases/10.2 +git clone https://bitbucket.org/nuttx/tools.git tools git clone https://github.com/texane/stlink.git -b v1.5.1-patch ``` @@ -23,35 +27,38 @@ The following directory structure is created after these commands: ``` jerry-nuttx - + apps + jerryscript | + targets - | + nuttx-stm32f4 + | + nuttx-stm32f4 + nuttx + + apps + + tools + stlink ``` -#### 2. Build JerryScript for NuttX - -Build JerryScript as a static library using the NuttX folder as sysroot. The created static libraries will be used later by NuttX. +#### 2. Install dependencies of the projects ```sh # Assuming you are in jerry-nuttx folder. -jerryscript/tools/build.py \ - --clean \ - --lto=OFF \ - --jerry-cmdline=OFF \ - --jerry-math=ON \ - --amalgam=ON \ - --mem-heap=70 \ - --profile=es.next \ - --compile-flag="--sysroot=${PWD}/nuttx" \ - --toolchain=${PWD}/jerryscript/cmake/toolchain_mcu_stm32f4.cmake +jerryscript/tools/apt-get-install-deps.sh + +# Toolchain dependencies of NuttX. +sudo apt install gcc-arm-none-eabi binutils-arm-none-eabi + +# Tool dependencies of NuttX. +sudo apt install \ + bison flex gettext texinfo libncurses5-dev libncursesw5-dev \ + gperf automake libtool pkg-config build-essential gperf genromfs \ + libgmp-dev libmpc-dev libmpfr-dev libisl-dev binutils-dev libelf-dev \ + libexpat-dev gcc-multilib g++-multilib picocom u-boot-tools util-linux + +# ST-Link and serial communication dependencies. +sudo apt install libusb-1.0-0-dev minicom ``` #### 3. Copy JerryScript's application files to NuttX -After creating the static libs (see previous step), it is needed to move the JerryScript application files to the NuttX's interpreter path. +Move JerryScript application files to `apps/interpreters/jerryscript` folder. ```sh # Assuming you are in jerry-nuttx folder. @@ -62,84 +69,177 @@ cp jerryscript/targets/nuttx-stm32f4/* apps/interpreters/jerryscript/ # ln -s jerryscript/targets/nuttx-stm32f4 apps/interpreters/jerryscript ``` -#### 4. Configure NuttX +#### 4. Build kconfig-frontend to configure NuttX + +Skip this section if `kconfig-frontends` had alrady been installed by package manager. + +```sh +# Assuming you are in jerry-nuttx folder. +cd tools/kconfig-frontends + +./configure \ + --disable-nconf \ + --disable-gconf \ + --disable-qconf \ + --disable-shared \ + --enable-static \ + --prefix=${PWD}/install + +make +make install +# Add install folder to PATH +PATH=${PWD}/install/bin:$PATH +``` + +#### 5. Configure NuttX -NuttX requires configuration first. The configuration creates a `.config` file in the root folder of NuttX that has all the necessary options for the build. +Configure NuttX for serial communication. A `.config` file contains all the options for the build. ```sh # Assuming you are in jerry-nuttx folder. cd nuttx/tools # Configure NuttX to use USB console shell. -./configure.sh stm32f4discovery/usbnsh +./configure.sh stm32f4discovery:usbnsh ``` -By default, JerryScript is not enabled, so it is needed to modify the configuration file. +By default, JerryScript is disabled so it is needed to modify the configuration file. It can +be done by using menuconfig (section 5.1) or modifying the `.config` file directly (section 5.2). -##### 4.1 Enable JerryScript without user interaction +##### 5.1 Enable JerryScript using menuconfig ```sh # Assuming you are in jerry-nuttx folder. -sed --in-place "s/CONFIG_HOST_WINDOWS/# CONFIG_HOST_WINDOWS/g" nuttx/.config -sed --in-place "s/CONFIG_WINDOWS_CYGWIN/# CONFIG_WINDOWS_CYGWIN/g" nuttx/.config -sed --in-place "s/CONFIG_TOOLCHAIN_WINDOWS/# CONFIG_TOOLCHAIN_WINDOWS/g" nuttx/.config +# Might be required to run `make menuconfig` twice. +make -C nuttx menuconfig +``` + +* Enable `System Type -> FPU support` +* Enable `Application Configuration -> Interpreters -> JerryScript` +[Optional] Enabling ROMFS helps to flash JavaScript input files to the device's flash memory. + +* Enable `File systems -> ROMFS file system` +* Enable `Application configuration -> NSH library -> Scripting Support -> Support ROMFS start-up script` + +[Optional] Enabling MMCSD helps to mount sd card on the device. +Note: These options are for the micro-sd card slot of STM32F4-Discovery base-board. + +* Enable `System Type -> STM32 Peripheral Support -> SDIO` +* Enable `RTOS Features -> Work queue support -> High priority (kernel) worker thread` +* Enable `RTOS Features -> RTOS hooks -> Custom board late initialization` +* Enable `Driver Support -> MMC/SD Driver Support` +* Disable `Driver Support -> MMC/SD Driver Support -> MMC/SD write protect pin` +* Disable `Driver Support -> MMC/SD Driver Support -> MMC/SD SPI transfer support` +* Enable `Driver Support -> MMC/SD Driver Support -> MMC/SD SDIO transfer support` +* Enable `File systems -> FAT file system` +* Enable `File systems -> FAT file system -> FAT upper/lower names` +* Enable `File systems -> FAT file system -> FAT long file names` + +##### 5.2 Enable JerryScript without user interaction + +A simpler solution is to append the necessary content to the `.config` configuration file: + +```sh +# Assuming you are in jerry-nuttx folder. cat >> nuttx/.config << EOL -CONFIG_HOST_LINUX=y CONFIG_ARCH_FPU=y -CONFIG_JERRYSCRIPT=y -CONFIG_JERRYSCRIPT_PRIORITY=100 -CONFIG_JERRYSCRIPT_STACKSIZE=16384 +CONFIG_INTERPRETERS_JERRYSCRIPT=y +CONFIG_INTERPRETERS_JERRYSCRIPT_PRIORITY=100 +CONFIG_INTERPRETERS_JERRYSCRIPT_STACKSIZE=16384 EOL ``` -##### 4.2 Enable JerryScript using kconfig-frontend +[Optional] Enable ROM File System + +```sh +# Assuming you are in jerry-nuttx folder. +cat >> nuttx/.config << EOL +CONFIG_BOARDCTL_ROMDISK=y +CONFIG_FS_ROMFS=y +CONFIG_NSH_ROMFSETC=y +CONFIG_NSH_ROMFSMOUNTPT="/etc" +CONFIG_NSH_INITSCRIPT="init.d/rcS" +CONFIG_NSH_ROMFSDEVNO=0 +CONFIG_NSH_ROMFSSECTSIZE=64 +CONFIG_NSH_DEFAULTROMFS=y +EOL +``` -`kconfig-frontend` could be useful if there are another options that should be enabled or disabled in NuttX. +[Optional] Enable MMCSD driver and FAT File System -###### 4.2.1 Install kconfig-frontend +Note: These options are for the micro-sd card slot of STM32F4-Discovery base-board. ```sh # Assuming you are in jerry-nuttx folder. -git clone https://bitbucket.org/nuttx/tools.git nuttx-tools -cd nuttx-tools/kconfig-frontends +cat >> nuttx/.config << EOL +CONFIG_STM32_SDIO=y +CONFIG_STM32_SDIO_DMAPRIO=0x00010000 +CONFIG_MMCSD_HAVE_CARDDETECT=y +CONFIG_BOARD_LATE_INITIALIZE=y +CONFIG_BOARD_INITTHREAD_STACKSIZE=2048 +CONFIG_BOARD_INITTHREAD_PRIORITY=240 +CONFIG_SIG_SIGWORK=17 +CONFIG_SCHED_WORKQUEUE=y +CONFIG_SCHED_HPWORK=y +CONFIG_SCHED_HPNTHREADS=1 +CONFIG_SCHED_HPWORKPRIORITY=224 +CONFIG_SCHED_HPWORKSTACKSIZE=2048 +CONFIG_BCH=y +CONFIG_ARCH_HAVE_SDIO=y +CONFIG_ARCH_HAVE_SDIOWAIT_WRCOMPLETE=y +CONFIG_ARCH_HAVE_SDIO_PREFLIGHT=y +CONFIG_MMCSD=y +CONFIG_MMCSD_NSLOTS=1 +CONFIG_MMCSD_MMCSUPPORT=y +CONFIG_MMCSD_SDIO=y +CONFIG_FS_FAT=y +CONFIG_FAT_LCNAMES=y +CONFIG_FAT_LFN=y +CONFIG_FAT_MAXFNAME=32 +CONFIG_FAT_LFN_ALIAS_TRAILCHARS=0 +CONFIG_FSUTILS_MKFATFS=y +CONFIG_NSH_MMCSDSLOTNO=0 +EOL +``` -./configure \ - --disable-nconf \ - --disable-gconf \ - --disable-qconf \ - --disable-shared \ - --enable-static \ - --prefix=${PWD}/install +#### 6. Provide JavaScript files for STM32F4 device -make -sudo make install +##### 6.1. Create ROMFS image from a custom folder -# Add the install folder to PATH -PATH=$PATH:${PWD}/install/bin -``` +Skip this section if MMCSD is used. Otherwise, generate a C header file from a custom folder. +Try to minimize the size of the folder due to the limited capacity of flash memory. -###### 4.2.2 Enable JerryScript ```sh # Assuming you are in jerry-nuttx folder. -# Might be required to run `make menuconfig` twice. -make -C nuttx menuconfig +mkdir jerry-example +# Let hello.js be a possible JavaScript input for JerryScript. +cp jerryscript/tests/hello.js jerry-example + +# Generate ROMFS image from a custom folder. +genromfs -f romfs_img -d jerry-example + +# Dump image as C header file and override NuttX's default ROMFS file. +xxd -i romfs_img apps/nshlib/nsh_romfsimg.h + +# Add const modifier to place the content to flash memory. +sed -i "s/unsigned/const\ unsigned/g" apps/nshlib/nsh_romfsimg.h ``` -* Change `Build Setup -> Build Host Platform` to Linux -* Enable `System Type -> FPU support` -* Enable JerryScript `Application Configuration -> Interpreters -> JerryScript` +##### 6.2. Copy files to memory card -#### 5. Build NuttX +Skip this section if ROMFS is used. Otherwise, copy your files to a FAT32 formatted memory card. + +#### 7. Build NuttX (with JerryScript) ```sh # Assuming you are in jerry-nuttx folder. make -C nuttx ``` -#### 6. Flash the device +#### 8. Flash the device -Connect Mini-USB for power supply and connect Micro-USB for `NSH` console. +Connect Mini-USB for charging and flasing the device. ```sh # Assuming you are in jerry-nuttx folder. @@ -148,39 +248,49 @@ make -C stlink release sudo stlink/build/Release/st-flash write nuttx/nuttx.bin 0x8000000 ``` -### Running JerryScript +#### 9. Connect to the device -You can use `minicom` for terminal program, or any other you may like, but set -baud rate to `115200`. +Connect Micro-USB for serial communication. The device should be visible as `/dev/ttyACM0` on the host. +You can use `minicom` communication program with `115200` baud rate. ```sh sudo minicom --device=/dev/ttyACM0 --baud=115200 ``` -You may have to press `RESET` on the board and press `Enter` keys on the console -several times to make `nsh` prompt to appear. +Set `Add Carriage Ret` option in `minicom` by `CTRL-A -> Z -> U` key combinations. +You may have to press `RESET` on the board and press `Enter` key on the console several times to make `nsh` prompt visible. +NuttShell (NSH) prompt looks like as follows: -If the prompt shows like this, ``` -NuttShell (NSH) - nsh> - nsh> - nsh> +NuttShell (NSH) NuttX-10.2.0 +nsh> ``` -please set `Add Carriage Ret` option by `CTRL-A` > `Z` > `U` at the console, -if you're using `minicom`. - -Run `jerry` with javascript file(s) +#### 10. Run JerryScript -``` -NuttShell (NSH) -nsh> jerry full_path/any.js -``` +##### 10.1 Run `jerry` without input -Without argument it prints: ``` +NuttShell (NSH) NuttX-10.2.0 nsh> jerry No input files, running a hello world demo: Hello world 5 times from JerryScript ``` + +##### 10.2 Run `jerry` with files from ROMFS + +``` +NuttShell (NSH) NuttX-10.2.0 +nsh> jerry /etc/hello.js +``` + +##### 10.3 Run `jerry` with files from memory card + +After NuttX has initialized, the card reader should be visible as `/dev/mmcsd0` on the device. +Mount it to be JavaScript files reachable. + +``` +NuttShell (NSH) NuttX-10.2.0 +nsh> mount -t vfat /dev/mmcsd0 /mnt +nsh> jerry /mnt/hello.js +``` diff --git a/targets/nuttx-stm32f4/jerry_main.c b/targets/nuttx-stm32f4/jerry_main.c index 90b31fe563..3840b2cb30 100644 --- a/targets/nuttx-stm32f4/jerry_main.c +++ b/targets/nuttx-stm32f4/jerry_main.c @@ -13,6 +13,7 @@ * limitations under the License. */ +#include #include #include #include