diff --git a/targets/mbed-stm32f401nucleo/.yotta.json b/targets/mbed-stm32f401nucleo/.yotta.json new file mode 100644 index 0000000000..0aaa599204 --- /dev/null +++ b/targets/mbed-stm32f401nucleo/.yotta.json @@ -0,0 +1,6 @@ +{ + "build": { + "target": "st-nucleo-f401re-gcc,*", + "targetSetExplicitly": true + } +} diff --git a/targets/mbed-stm32f401nucleo/Makefile.stm32f401nucleo b/targets/mbed-stm32f401nucleo/Makefile.stm32f401nucleo new file mode 100644 index 0000000000..e0df1b193d --- /dev/null +++ b/targets/mbed-stm32f401nucleo/Makefile.stm32f401nucleo @@ -0,0 +1,86 @@ +# Copyright 2015 Samsung Electronics Co., Ltd. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# use TAB-8 + +CURDIR = `pwd` +TYPE = release +INTERM = build/obj-mbed-stm32f401nucleo +OUTPUT = build/bin/$(TYPE).mbed-stm32f401nucleo +COPYTARGET = targets/mbed-stm32f401nucleo/libjerry +JERRYHEAP ?= 16 +TARGET_DIR ?= /media/$(USER)/MBED + +EXT_CFLAGS := -D__TARGET_MBED_F401 +EXT_CFLAGS += -mlittle-endian -mthumb -mcpu=cortex-m4 +EXT_CFLAGS += -Wno-error=format= +EXT_CFLAGS += -DMEM_STAT + + +.PHONY: jerry js2c yotta flash check_mbed clean + + +all: jerry js2c yotta + + +jerry: + mkdir -p $(INTERM) + mkdir -p $(OUTPUT) + mkdir -p $(COPYTARGET) + cmake -B$(INTERM) -H./ \ + -DENABLE_LTO=OFF \ + -DENABLE_VALGRIND=OFF \ + -DCMAKE_TOOLCHAIN_FILE=build/configs/toolchain_external.cmake \ + -DUSE_COMPILER_DEFAULT_LIBC=YES \ + -DEXTERNAL_CMAKE_SYSTEM_PROCESSOR=arm7-m \ + -DEXTERNAL_CMAKE_C_COMPILER_ID=GNU \ + -DEXTERNAL_CMAKE_C_COMPILER=arm-none-eabi-gcc \ + -DEXTERNAL_COMPILE_FLAGS="$(EXT_CFLAGS)" \ + -DEXTERNAL_MEM_HEAP_SIZE_KB=$(JERRYHEAP) + + + make -C $(INTERM) $(TYPE).external-mem_stats + cp `cat $(INTERM)/$(TYPE).external-mem_stats/list` $(OUTPUT)/. + cp $(OUTPUT)/lib$(TYPE)-mem_stats.jerry-core.a $(COPYTARGET)/libjerrycore.a + cp $(OUTPUT)/lib$(TYPE)-mem_stats.jerry-fdlibm.third_party.lib.a $(COPYTARGET)/libfdlibm.a + + +js2c: + cd targets/mbed-stm32f401nucleo; ../tools/js2c.py; + + +yotta: + cd targets/mbed-stm32f401nucleo; \ + yotta target st-nucleo-f401re-gcc; \ + yotta build + + +flash: check_mbed + cp targets/mbed-stm32f401nucleo/build/st-nucleo-f401re-gcc/source/jerry.bin \ + "$(TARGET_DIR)/." + @echo "Wait till LED flashing stops..." + + +check_mbed: + @if [ ! -d "${TARGET_DIR}" ] ; then \ + echo "MBED not mounted at ${TARGET_DIR}"; \ + exit 1; \ + fi + + +clean: + rm -rf $(INTERM) + rm -rf $(OUTPUT) + rm -rf targets/mbed-stm32f401nucleo/build + \ No newline at end of file diff --git a/targets/mbed-stm32f401nucleo/js/blink.js b/targets/mbed-stm32f401nucleo/js/blink.js new file mode 100644 index 0000000000..484b1b449c --- /dev/null +++ b/targets/mbed-stm32f401nucleo/js/blink.js @@ -0,0 +1,10 @@ +var check = 1; + +function blink() +{ + var blk = (check > 8) ? 1 : 0; + led(1, blk); + check = (check >= 10) ? 1 : check+1; +} + +print("blink js OK\n"); diff --git a/targets/mbed-stm32f401nucleo/js/main.js b/targets/mbed-stm32f401nucleo/js/main.js new file mode 100644 index 0000000000..3956ab8ad9 --- /dev/null +++ b/targets/mbed-stm32f401nucleo/js/main.js @@ -0,0 +1,5 @@ +function sysloop(ticknow) +{ + blink(); +} +print("main js OK\n"); diff --git a/targets/mbed-stm32f401nucleo/module.json b/targets/mbed-stm32f401nucleo/module.json new file mode 100644 index 0000000000..78a3478dae --- /dev/null +++ b/targets/mbed-stm32f401nucleo/module.json @@ -0,0 +1,12 @@ +{ + "name": "jerry", + "version": "1.0.0", + "bin": "./source", + "private": true, + "description": "There is a target bugfix for ST32F401 Nucleo board.", + "author": "orbanl", + "license": "Apache-2.0", + "dependencies": { + "mbed-drivers": "^1.4.0" + } +} diff --git a/targets/mbed-stm32f401nucleo/source/jerry_extapi.cpp b/targets/mbed-stm32f401nucleo/source/jerry_extapi.cpp new file mode 100644 index 0000000000..230fb02d71 --- /dev/null +++ b/targets/mbed-stm32f401nucleo/source/jerry_extapi.cpp @@ -0,0 +1,126 @@ +/* Copyright 2014-2015 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#include +#include + +#include "jerry-core/jerry.h" +#include "jerry_extapi.h" +#include "native_stm32f401nucleo.h" + +#ifndef MIN +#define MIN(A,B) ((A)<(B)?(A):(B)) +#endif + +//----------------------------------------------------------------------------- + +#define __UNSED__ __attribute__((unused)) +#define DECLARE_HANDLER(NAME) \ +static bool \ +NAME ## _handler (const jerry_api_object_t * function_obj_p __UNSED__, \ + const jerry_api_value_t * this_p __UNSED__, \ + jerry_api_value_t * ret_val_p __UNSED__, \ + const jerry_api_value_t args_p[], \ + const jerry_api_length_t args_cnt) + +#define REGISTER_HANDLER(NAME) \ + register_native_function ( # NAME, NAME ## _handler); + +//----------------------------------------------------------------------------- + +DECLARE_HANDLER(assert) +{ + if (args_cnt == 1 + && args_p[0].type == JERRY_API_DATA_TYPE_BOOLEAN + && args_p[0].u.v_bool == true) + { + printf (">> Jerry assert true\r\n"); + return true; + } + printf ("ERROR: Script assertion failed\n"); + exit (JERRY_STANDALONE_EXIT_CODE_FAIL); + return false; +} + +DECLARE_HANDLER(led) +{ + if (args_cnt < 2) + { + return false; + } + + int port, value; + port = (int)JS_VALUE_TO_NUMBER (&args_p[0]); + value = (int)JS_VALUE_TO_NUMBER (&args_p[1]); + + ret_val_p->type = JERRY_API_DATA_TYPE_BOOLEAN; + if (port >=0 && port <= 3) + { + native_led(port, value); + ret_val_p->u.v_bool = true; + } + else { + ret_val_p->u.v_bool = false; + } + return true; +} + +//----------------------------------------------------------------------------- + +static bool +register_native_function (const char* name, + jerry_external_handler_t handler) +{ + jerry_api_object_t *global_obj_p; + jerry_api_object_t *reg_func_p; + jerry_api_value_t reg_value; + bool bok; + + global_obj_p = jerry_api_get_global (); + reg_func_p = jerry_api_create_external_function (handler); + + if (!(reg_func_p != NULL + && jerry_api_is_function (reg_func_p) + && jerry_api_is_constructor (reg_func_p))) + { + printf ("Error: create_external_function failed !!!\r\n"); + jerry_api_release_object (global_obj_p); + return false; + } + + jerry_api_acquire_object (reg_func_p); + reg_value.type = JERRY_API_DATA_TYPE_OBJECT; + reg_value.u.v_object = reg_func_p; + + bok = jerry_api_set_object_field_value (global_obj_p, + (jerry_api_char_t *)name, + ®_value); + + jerry_api_release_value (®_value); + jerry_api_release_object (reg_func_p); + jerry_api_release_object (global_obj_p); + + if (!bok) + { + printf ("Error: register_native_function failed: [%s]\r\n", name); + } + + return bok; +} + +void js_register_functions (void) +{ + REGISTER_HANDLER (assert); + REGISTER_HANDLER (led); +} diff --git a/targets/mbed-stm32f401nucleo/source/jerry_extapi.h b/targets/mbed-stm32f401nucleo/source/jerry_extapi.h new file mode 100644 index 0000000000..b468ec72ce --- /dev/null +++ b/targets/mbed-stm32f401nucleo/source/jerry_extapi.h @@ -0,0 +1,38 @@ +/* Copyright 2015 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __JERRY_EXTAPI_H__ +#define __JERRY_EXTAPI_H__ + +#define JERRY_STANDALONE_EXIT_CODE_OK (0) +#define JERRY_STANDALONE_EXIT_CODE_FAIL (1) + +#define API_DATA_IS_OBJECT(val_p) \ + ((val_p)->type == JERRY_API_DATA_TYPE_OBJECT) + +#define API_DATA_IS_FUNCTION(val_p) \ + (API_DATA_IS_OBJECT(val_p) && \ + jerry_api_is_function((val_p)->u.v_object)) + +#define JS_VALUE_TO_NUMBER(val_p) \ + ((val_p)->type == JERRY_API_DATA_TYPE_FLOAT32 ? \ + (double) ((val_p)->u.v_float32) : \ + (val_p)->type == JERRY_API_DATA_TYPE_FLOAT64 ? \ + (double) ((val_p)->u.v_float64) : \ + (double) ((val_p)->u.v_uint32)) + +void js_register_functions (void); + +#endif diff --git a/targets/mbedk64f/source/jerry_port.c b/targets/mbed-stm32f401nucleo/source/jerry_port.c similarity index 97% rename from targets/mbedk64f/source/jerry_port.c rename to targets/mbed-stm32f401nucleo/source/jerry_port.c index 8c4dcb02de..b8e5e65272 100644 --- a/targets/mbedk64f/source/jerry_port.c +++ b/targets/mbed-stm32f401nucleo/source/jerry_port.c @@ -13,11 +13,10 @@ * limitations under the License. */ -#include "mbed-drivers/mbed.h" - +#include + #include "jerry-core/jerry.h" - /** * Provide log message to filestream implementation for the engine. */ diff --git a/targets/mbed-stm32f401nucleo/source/jerry_run.cpp b/targets/mbed-stm32f401nucleo/source/jerry_run.cpp new file mode 100644 index 0000000000..509a17a329 --- /dev/null +++ b/targets/mbed-stm32f401nucleo/source/jerry_run.cpp @@ -0,0 +1,123 @@ +/* Copyright 2014-2015 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "jerry-core/jerry.h" +#include +#include +#include "jerry_run.h" +#include "jerry_extapi.h" + +static const char* fn_sys_loop_name = "sysloop"; + +int js_entry (const char *source_p, const size_t source_size) +{ + jerry_api_object_t *err_obj_p = NULL; + const jerry_api_char_t *jerry_src = (const jerry_api_char_t *) source_p; + jerry_completion_code_t ret_code = JERRY_COMPLETION_CODE_OK; + jerry_flag_t flags = JERRY_FLAG_MEM_STATS; + + jerry_init (flags); + + js_register_functions (); + + if (!jerry_parse (jerry_src, source_size, &err_obj_p)) + { + printf ("Error: jerry_parse failed\r\n"); + ret_code = JERRY_COMPLETION_CODE_UNHANDLED_EXCEPTION; + jerry_api_release_object (err_obj_p); + } + else + { + if ((flags & JERRY_FLAG_PARSE_ONLY) == 0) + { + ret_code = jerry_run (&err_obj_p); + if( err_obj_p != NULL) + { + jerry_api_release_object (err_obj_p); + } + } + } + + return ret_code; +} + +int js_eval (const char *source_p, const size_t source_size) +{ + jerry_completion_code_t status; + jerry_api_value_t res; + + status = jerry_api_eval ((jerry_api_char_t *) source_p, + source_size, + false, + false, + &res); + + jerry_api_release_value (&res); + + return status; +} + +int js_loop (uint32_t ticknow) +{ + jerry_api_object_t *global_obj_p; + jerry_api_value_t sysloop_func; + bool is_ok; + + global_obj_p = jerry_api_get_global (); + is_ok = jerry_api_get_object_field_value (global_obj_p, + (const jerry_api_char_t*)fn_sys_loop_name, + &sysloop_func); + if (!is_ok) + { + printf ("Error: '%s' not defined!!!\r\n", fn_sys_loop_name); + jerry_api_release_object (global_obj_p); + return -1; + } + + if (!API_DATA_IS_FUNCTION (&sysloop_func)) + { + printf ("Error: '%s' is not a function!!!\r\n", fn_sys_loop_name); + jerry_api_release_value (&sysloop_func); + jerry_api_release_object (global_obj_p); + return -2; + } + + jerry_api_value_t* val_args; + uint16_t val_argv; + + val_argv = 1; + val_args = (jerry_api_value_t*)malloc (sizeof (jerry_api_value_t) * val_argv); + val_args[0].type = JERRY_API_DATA_TYPE_UINT32; + val_args[0].u.v_uint32 = ticknow; + + jerry_api_value_t res; + is_ok = jerry_api_call_function (sysloop_func.u.v_object, + global_obj_p, + &res, + val_args, + val_argv); + jerry_api_release_value (&res); + free (val_args); + + jerry_api_release_value (&sysloop_func); + jerry_api_release_object (global_obj_p); + + return 0; +} + +void js_exit (void) +{ + jerry_cleanup (); +} diff --git a/targets/mbed-stm32f401nucleo/source/jerry_run.h b/targets/mbed-stm32f401nucleo/source/jerry_run.h new file mode 100644 index 0000000000..f595b0e9a5 --- /dev/null +++ b/targets/mbed-stm32f401nucleo/source/jerry_run.h @@ -0,0 +1,24 @@ +/* Copyright 2015 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __JERRY_RUN_H__ +#define __JERRY_RUN_H__ + +int js_entry (const char *source_p, const size_t source_size); +int js_eval (const char *source_p, const size_t source_size); +int js_loop (uint32_t ticknow); +void js_exit (void); + +#endif diff --git a/targets/mbed-stm32f401nucleo/source/main.cpp b/targets/mbed-stm32f401nucleo/source/main.cpp new file mode 100644 index 0000000000..755a2dc7cc --- /dev/null +++ b/targets/mbed-stm32f401nucleo/source/main.cpp @@ -0,0 +1,74 @@ +/* Copyright 2014-2015 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "mbed-drivers/mbed.h" +#include "jerry-core/jerry.h" +#include "jerry_run.h" +#include "jerry_targetjs.h" + +static int jerry_init(void) +{ + int retcode,src; + + DECLARE_JS_CODES; + + printf("run main.js: "); + /* run main.js */ + retcode = js_entry(js_codes[0].source, js_codes[0].length); + if (retcode != 0) + { + printf("js_entry failed code(%d) [%s]\r\n", retcode, js_codes[0].name); + js_exit(); + return -1; + } + + /* run rest of the js files */ + for (src = 1; js_codes[src].source; src++) + { + retcode = js_eval(js_codes[src].source, js_codes[src].length); + if (retcode != 0) + { + printf("js_eval failed code(%d) [%s]\r\n", retcode, js_codes[src].name); + js_exit(); + return -2; + } + } + return 0; +} + +static void jerry_loop(void) +{ + static uint32_t _jcount = 0; + + js_loop(_jcount++); +} + +void app_start(int, char**) +{ + static Serial pc(USBTX, USBRX); + // set 9600 baud rate for stdout + pc.baud(9600); + + printf ("\r\nJerryScript in ST32 Nucleo F4 board.\r\n"); + printf (" build %s\r\n", jerry_build_date); + printf (" hash %s\r\n", jerry_commit_hash); + printf (" branch %s\r\n", jerry_branch_name); + + if (jerry_init() == 0) + { + minar::Scheduler::postCallback(jerry_loop).period(minar::milliseconds(100)); + js_exit(); + } +} diff --git a/targets/mbed-stm32f401nucleo/source/makejerry.cmake b/targets/mbed-stm32f401nucleo/source/makejerry.cmake new file mode 100644 index 0000000000..90a9efe56a --- /dev/null +++ b/targets/mbed-stm32f401nucleo/source/makejerry.cmake @@ -0,0 +1,30 @@ +# Copyright 2015 Samsung Electronics Co., Ltd. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# application name +set(MBEDMODULE "jerry") + +# add include jerry-core +set(LJCORE ${CMAKE_CURRENT_LIST_DIR}/../../../) +include_directories(${LJCORE}) + +# compile flags +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mlittle-endian -mthumb -mcpu=cortex-m4") + +# link jerryscript +set(LJPATH ${CMAKE_CURRENT_LIST_DIR}/../libjerry) +set(LJFILES "") +set(LJFILES ${LJFILES} ${LJPATH}/libfdlibm.a) +set(LJFILES ${LJFILES} ${LJPATH}/libjerrycore.a) +target_link_libraries(${MBEDMODULE} ${LJFILES}) diff --git a/targets/mbedk64f/source/native_mbedk64f.c b/targets/mbed-stm32f401nucleo/source/native_stm32f401nucleo.cpp similarity index 84% rename from targets/mbedk64f/source/native_mbedk64f.c rename to targets/mbed-stm32f401nucleo/source/native_stm32f401nucleo.cpp index 5dc122cb61..c5202a9cc4 100644 --- a/targets/mbedk64f/source/native_mbedk64f.c +++ b/targets/mbed-stm32f401nucleo/source/native_stm32f401nucleo.cpp @@ -14,12 +14,11 @@ */ #include "mbed-drivers/mbed.h" +#include "native_stm32f401nucleo.h" -#include "native_mbedk64f.h" - - -void native_led(int port, int val) { - static const PinName portmap[] = { LED1, LED2, LED3, LED4 }; +void native_led(int port, int val) +{ + static const PinName portmap[] = { LED1, LED2 }; DigitalOut led(portmap[port]); led = val; } diff --git a/targets/mbedk64f/source/native_mbedk64f.h b/targets/mbed-stm32f401nucleo/source/native_stm32f401nucleo.h similarity index 89% rename from targets/mbedk64f/source/native_mbedk64f.h rename to targets/mbed-stm32f401nucleo/source/native_stm32f401nucleo.h index ed453d01cf..aef8af9ca0 100644 --- a/targets/mbedk64f/source/native_mbedk64f.h +++ b/targets/mbed-stm32f401nucleo/source/native_stm32f401nucleo.h @@ -13,11 +13,9 @@ * limitations under the License. */ -#ifndef __NATIVE_MBEDK64F_H__ -#define __NATIVE_MBEDK64F_H__ - +#ifndef __NATIVE_STM32F401NUCLEO_H__ +#define __NATIVE_STM32f401NUCLEO_H__ void native_led(int port, int val); - #endif