summaryrefslogtreecommitdiffstats
path: root/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl
diff options
context:
space:
mode:
Diffstat (limited to 'fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl')
-rw-r--r--fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/LICENCE.txt8
-rw-r--r--fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/README.md174
-rwxr-xr-xfluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/build.sh102
-rw-r--r--fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/lv_config/lv_conf.h389
-rw-r--r--fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/lv_config/lv_drv_conf.h310
-rw-r--r--fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-native-ui-app/CMakeLists.txt137
-rw-r--r--fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-native-ui-app/CMakeLists.txt.in18
-rw-r--r--fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-native-ui-app/lv-drivers/.gitignore1
-rw-r--r--fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-native-ui-app/lv-drivers/display_indev.h28
-rw-r--r--fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-native-ui-app/lv-drivers/indev/mouse.c96
-rw-r--r--fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-native-ui-app/lv-drivers/indev/mouse.h73
-rw-r--r--fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-native-ui-app/lv-drivers/linux_display_indev.c319
-rw-r--r--fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-native-ui-app/lv-drivers/system_header.h9
-rw-r--r--fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-native-ui-app/main.c170
-rw-r--r--fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-wasm-runtime/CMakeLists.txt36
-rw-r--r--fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-wasm-runtime/src/display_indev.h96
-rw-r--r--fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-wasm-runtime/src/platform/linux/display_indev.c347
-rw-r--r--fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-wasm-runtime/src/platform/linux/iwasm_main.c544
-rw-r--r--fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-wasm-runtime/src/platform/linux/main.c11
-rw-r--r--fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-wasm-runtime/src/platform/linux/mouse.c97
-rw-r--r--fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-wasm-runtime/src/platform/zephyr/LICENSE202
-rw-r--r--fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-wasm-runtime/src/platform/zephyr/XPT2046.c345
-rw-r--r--fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-wasm-runtime/src/platform/zephyr/XPT2046.h87
-rw-r--r--fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-wasm-runtime/src/platform/zephyr/board_config.h9
-rw-r--r--fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-wasm-runtime/src/platform/zephyr/display.h418
-rw-r--r--fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-wasm-runtime/src/platform/zephyr/display_ili9340.c284
-rw-r--r--fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-wasm-runtime/src/platform/zephyr/display_ili9340.h70
-rw-r--r--fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-wasm-runtime/src/platform/zephyr/display_ili9340_adafruit_1480.c80
-rw-r--r--fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-wasm-runtime/src/platform/zephyr/display_indev.c105
-rw-r--r--fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-wasm-runtime/src/platform/zephyr/iwasm_main.c131
-rw-r--r--fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-wasm-runtime/src/platform/zephyr/main.c26
-rw-r--r--fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-wasm-runtime/src/platform/zephyr/pin_config_jlf.h26
-rw-r--r--fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-wasm-runtime/src/platform/zephyr/pin_config_stm32.h30
-rw-r--r--fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/wamr_config_littlevgl.cmake9
-rw-r--r--fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/wasm-apps/Makefile_wasm_app57
-rw-r--r--fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/wasm-apps/Makefile_wasm_app_no_wasi59
-rwxr-xr-xfluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/wasm-apps/build_wasm_app.sh22
-rw-r--r--fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/wasm-apps/src/display_indev.h42
-rw-r--r--fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/wasm-apps/src/main.c189
-rw-r--r--fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/wasm-apps/src/system_header.h9
40 files changed, 5165 insertions, 0 deletions
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/LICENCE.txt b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/LICENCE.txt
new file mode 100644
index 000000000..beaef1d26
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/LICENCE.txt
@@ -0,0 +1,8 @@
+MIT licence
+Copyright (c) 2016 Gábor Kiss-Vámosi
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/README.md b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/README.md
new file mode 100644
index 000000000..87fd2bd42
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/README.md
@@ -0,0 +1,174 @@
+"littlevgl" sample introduction
+==============
+This sample demonstrates that a graphic user interface application in WebAssembly by compiling the LittlevGL v5.3, an open-source embedded 2d graphic library into the WASM bytecode.
+
+In this sample, the whole LittlevGL v5.3 source code is built into the WebAssembly code with the user application. The platform interfaces defined by LittlevGL is implemented in the runtime and registered for WASM application through calling wasm_runtime_full_init().
+
+```C
+static NativeSymbol native_symbols[] = {
+ EXPORT_WASM_API_WITH_SIG(display_input_read, "(*)i"),
+ EXPORT_WASM_API_WITH_SIG(display_flush, "(iiii*)"),
+ EXPORT_WASM_API_WITH_SIG(display_fill, "(iiii*)"),
+ EXPORT_WASM_API_WITH_SIG(display_vdb_write, "(*iii*i)"),
+ EXPORT_WASM_API_WITH_SIG(display_map, "(iiii*)"),
+ EXPORT_WASM_API_WITH_SIG(time_get_ms, "()i")
+};
+```
+
+The runtime component supports building target for Linux and Zephyr/STM Nucleo board. The beauty of this sample is the WebAssembly application can have identical display and behavior when running from both runtime environments. That implies we can do majority of application validation from desktop environment as long as two runtime distributions support the same set of application interface.
+
+
+Below pictures show the WASM application is running on an STM board with an LCD touch panel.
+
+![WAMR UI SAMPLE](../../doc/pics/vgl_demo2.png "WAMR UI DEMO STM32")
+
+![WAMR UI SAMPLE](../../doc/pics/vgl_demo_linux.png "WAMR UI DEMO LINUX")
+
+
+The number on top will plus one each second, and the number on the bottom will plus one when clicked. When users click the blue button, the WASM application increases the counter, and the latest counter value is displayed on the top banner of the touch panel.
+
+The sample also provides the native Linux version of application without the runtime under folder "vgl-native-ui-app". It can help to check differences between the implementations in native and WebAssembly.
+
+Test on Linux
+================================
+
+Install required SDK and libraries
+--------------
+- 32 bit SDL(simple directmedia layer) (Note: only necessary when `WAMR_BUILD_TARGET` is set to `X86_32` when building WAMR runtime)
+Use apt-get:
+ ```bash
+ sudo apt-get install libsdl2-dev:i386
+ ```
+Or download source from www.libsdl.org:
+ ```bash
+ ./configure C_FLAGS=-m32 CXX_FLAGS=-m32 LD_FLAGS=-m32
+ make
+ sudo make install
+ ```
+- 64 bit SDL(simple directmedia layer) (Note: only necessary when `WAMR_BUILD_TARGET` is set to `X86_64` when building WAMR runtime)
+Use apt-get:
+ ```bash
+ sudo apt-get install libsdl2-dev
+ ```
+Or download source from www.libsdl.org:
+ ```bash
+ ./configure
+ make
+ sudo make install
+ ```
+
+Build and Run
+--------------
+
+- Build
+ ```bash
+ ./build.sh
+ ```
+ All binaries are in "out", which contains "host_tool", "vgl_native_ui_app", "ui_app.wasm" "ui_app_no_wasi.wasm "and "vgl_wasm_runtime".
+- Run the native Linux build of the lvgl sample (no wasm)
+ ```bash
+ ./vgl_native_ui_app
+ ```
+
+- Run WASM VM Linux applicaton & install WASM APP
+ First start vgl_wasm_runtime in server mode.
+ ```bash
+ ./vgl_wasm_runtime -s
+ ```
+ Then install and uninstall wasm APPs by using host tool.
+ ```bash
+ ./host_tool -i ui_wasi -f ui_app_wasi.wasm
+ ./host_tool -q
+ ./host_tool -u ui_wasi
+ ./host_tool -i ui_no_wasi -f ui_app_builtin_libc.wasm
+ ./host_tool -q
+ ./host_tool -u ui_no_wasi
+ ```
+
+Test on Zephyr
+================================
+We can use a STM32 NUCLEO_F767ZI board with ILI9341 display and XPT2046 touch screen to run the test. Then use host_tool to remotely install wasm app into STM32.
+- Build WASM VM into Zephyr system
+ a. clone zephyr source code
+ Refer to [Zephyr getting started](https://docs.zephyrproject.org/latest/getting_started/index.html).
+
+ ```bash
+ west init zephyrproject
+ cd zephyrproject/zephyr
+ git checkout zephyr-v2.3.0
+ cd ..
+ west update
+ ```
+
+ b. copy samples
+ ```bash
+ cd zephyr/samples/
+ cp -a <wamr_root>/samples/littlevgl/vgl-wasm-runtime vgl-wasm-runtime
+ cd vgl-wasm-runtime/zephyr_build
+ ```
+ c. create a link to wamr root dir
+ ```bash
+ ln -s <wamr_root> wamr
+ ```
+
+d. build source code
+ Since ui_app incorporated LittlevGL source code, so it needs more RAM on the device to install the application. It is recommended that RAM SIZE not less than 380KB. In our test use nucleo_f767zi, which is supported by Zephyr. Since the littlevgl wasm app is quite big (~100KB in wasm format and ~200KB in AOT format ), there isn't enough SRAM to build interpreter and AOT together. You can only choose one of them:
+
+ - Interpreter
+ ```bash
+ mkdir build && cd build
+ source ../../../../zephyr-env.sh
+ cmake -GNinja -DBOARD=nucleo_f767zi -DWAMR_BUILD_INTERP=1 -DWAMR_BUILD_AOT=0 ..
+ ninja flash
+ ```
+
+ - AOT
+ ```bash
+ mkdir build && cd build
+ source ../../../../zephyr-env.sh
+ cmake -GNinja -DBOARD=nucleo_f767zi -DWAMR_BUILD_INTERP=0 -DWAMR_BUILD_AOT=1 ..
+ ninja flash
+ ```
+
+- Hardware Connections
+
+```
++-------------------+-+------------------+
+|NUCLEO-F767ZI | ILI9341 Display |
++-------------------+-+------------------+
+| CN7.10 | CLK |
++-------------------+-+------------------+
+| CN7.12 | MISO |
++-------------------+-+------------------+
+| CN7.14 | MOSI |
++-------------------+-+------------------+
+| CN11.1 | CS1 for ILI9341 |
++-------------------+-+------------------+
+| CN11.2 | D/C |
++-------------------+-+------------------+
+| CN11.3 | RESET |
++-------------------+-+------------------+
+| CN9.25 | PEN interrupt |
++-------------------+-+------------------+
+| CN9.27 | CS2 for XPT2046 |
++-------------------+-+------------------+
+| CN10.14 | PC UART RX |
++-------------------+-+------------------+
+| CN11.16 | PC UART RX |
++-------------------+-+------------------+
+```
+
+- Install WASM application to Zephyr using host_tool
+First, connect PC and STM32 with UART. Then install to use host_tool.
+ ```bash
+ sudo ./host_tool -D /dev/ttyUSBXXX -i ui_app -f ui_app_builtin_libc.wasm
+ # /dev/ttyUSBXXX is the UART device, e.g. /dev/ttyUSB0
+ ```
+**Note**: WASI is unavailable on zephyr currently, so you have to use the ui_app_builtin_libc.wasm which doesn't depend on WASI.
+
+- Install AOT version WASM application
+ ```bash
+ wamrc --target=thumbv7 --target-abi=eabi --cpu=cortex-m7 -o ui_app_no_wasi.aot ui_app_builtin_libc.wasm
+ ./host_tool -D /dev/ttyUSBXXX -i ui_app -f ui_app_no_wasi.aot
+ ```
+
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/build.sh b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/build.sh
new file mode 100755
index 000000000..81f2e67f4
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/build.sh
@@ -0,0 +1,102 @@
+#
+# Copyright (C) 2019 Intel Corporation. All rights reserved.
+# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+#
+
+#!/bin/bash
+
+PROJECT_DIR=$PWD
+WAMR_DIR=${PWD}/../..
+OUT_DIR=${PWD}/out
+BUILD_DIR=${PWD}/build
+LV_CFG_PATH=${PROJECT_DIR}/lv_config
+
+
+
+if [ -z $KW_BUILD ] || [ -z $KW_OUT_FILE ];then
+ echo "Local Build Env"
+ cmakewrap="cmake"
+ makewrap="make"
+else
+ echo "Klocwork Build Env"
+ cmakewrap="cmake -DCMAKE_BUILD_TYPE=Debug"
+ makewrap="kwinject -o $KW_OUT_FILE make"
+fi
+
+if [ ! -d $BUILD_DIR ]; then
+ mkdir ${BUILD_DIR}
+fi
+
+rm -rf ${OUT_DIR}
+mkdir ${OUT_DIR}
+
+
+cd ${BUILD_DIR}
+if [ ! -d "lvgl" ]; then
+ echo "starting download lvgl for v5.3 ..."
+ git clone https://github.com/lvgl/lvgl.git --branch v5.3
+ if [ $? != 0 ];then
+ echo "download lvgl repo failed: $?\n"
+ exit 2
+ fi
+fi
+
+echo "##################### 0. build wamr-sdk littlevgl start#####################"
+cd ${WAMR_DIR}/wamr-sdk
+./build_sdk.sh -n littlevgl -x ${PROJECT_DIR}/wamr_config_littlevgl.cmake -e ${LV_CFG_PATH} -c
+[ $? -eq 0 ] || exit $?
+echo "#####################build wamr-sdk littlevgl success"
+
+echo -e "\n\n"
+echo "##################### 1. build native-ui-app start#####################"
+cd $BUILD_DIR
+mkdir -p vgl-native-ui-app
+cd vgl-native-ui-app
+$cmakewrap ${PROJECT_DIR}/vgl-native-ui-app
+$makewrap
+if [ $? != 0 ];then
+ echo "BUILD_FAIL native-ui-app $?\n"
+ exit 2
+fi
+echo $PWD
+cp vgl_native_ui_app ${OUT_DIR}
+echo "#####################build native-ui-app success"
+
+echo -e "\n\n"
+echo "##################### 2. build littlevgl wasm runtime start#####################"
+cd $BUILD_DIR
+mkdir -p vgl-wasm-runtime
+cd vgl-wasm-runtime
+$cmakewrap ${PROJECT_DIR}/vgl-wasm-runtime
+$makewrap
+[ $? -eq 0 ] || exit $?
+cp vgl_wasm_runtime ${OUT_DIR}/
+
+echo "##################### build littlevgl wasm runtime end#####################"
+
+echo -e "\n\n"
+echo "#####################build host-tool"
+cd $BUILD_DIR
+mkdir -p host-tool
+cd host-tool
+$cmakewrap ${WAMR_DIR}/test-tools/host-tool
+$makewrap
+if [ $? != 0 ];then
+ echo "BUILD_FAIL host tool exit as $?\n"
+ exit 2
+fi
+cp host_tool ${OUT_DIR}
+echo "#####################build host-tool success"
+
+echo -e "\n\n"
+echo "##################### 3. build wasm ui app start#####################"
+cd ${PROJECT_DIR}/wasm-apps
+if [ ! -d "${PROJECT_DIR}/wasm-apps/lvgl" ]; then
+ if [ -d "$BUILD_DIR/vgl-native-ui-app/lvgl" ]; then
+ cp -fr $BUILD_DIR/vgl-native-ui-app/lvgl ${PROJECT_DIR}/wasm-apps
+ fi
+fi
+./build_wasm_app.sh
+mv *.wasm ${OUT_DIR}/
+
+echo "##################### build wasm ui app end#####################"
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/lv_config/lv_conf.h b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/lv_config/lv_conf.h
new file mode 100644
index 000000000..76533a8e1
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/lv_config/lv_conf.h
@@ -0,0 +1,389 @@
+/**
+ * @file lv_conf.h
+ *
+ */
+
+#if 1 /*Set it to "1" to enable content*/
+
+#ifndef LV_CONF_H
+#define LV_CONF_H
+/*===================
+ Dynamic memory
+ *===================*/
+
+/* Memory size which will be used by the library
+ * to store the graphical objects and other data */
+#define LV_MEM_CUSTOM 1 /*1: use custom malloc/free, 0: use the built-in lv_mem_alloc/lv_mem_free*/
+#if LV_MEM_CUSTOM == 0
+# define LV_MEM_SIZE (64U * 1024U) /*Size memory used by `lv_mem_alloc` in bytes (>= 2kB)*/
+# define LV_MEM_ATTR /*Complier prefix for big array declaration*/
+# define LV_MEM_ADR 0 /*Set an address for memory pool instead of allocation it as an array. Can be in external SRAM too.*/
+# define LV_MEM_AUTO_DEFRAG 1 /*Automatically defrag on free*/
+#else /*LV_MEM_CUSTOM*/
+# define LV_MEM_CUSTOM_INCLUDE <stdlib.h> /*Header for the dynamic memory function*/
+# define LV_MEM_CUSTOM_ALLOC malloc /*Wrapper to malloc*/
+# define LV_MEM_CUSTOM_FREE free /*Wrapper to free*/
+#endif /*LV_MEM_CUSTOM*/
+
+/* Garbage Collector settings
+ * Used if lvgl is binded to higher language and the memory is managed by that language */
+#define LV_ENABLE_GC 0
+#if LV_ENABLE_GC != 0
+# define LV_MEM_CUSTOM_REALLOC your_realloc /*Wrapper to realloc*/
+# define LV_MEM_CUSTOM_GET_SIZE your_mem_get_size /*Wrapper to lv_mem_get_size*/
+# define LV_GC_INCLUDE "gc.h" /*Include Garbage Collector related things*/
+#endif /* LV_ENABLE_GC */
+
+/*===================
+ Graphical settings
+ *===================*/
+
+/* Horizontal and vertical resolution of the library.*/
+#define LV_HOR_RES (320)
+#define LV_VER_RES (240)
+
+/* Dot Per Inch: used to initialize default sizes. E.g. a button with width = LV_DPI / 2 -> half inch wide
+ * (Not so important, you can adjust it to modify default sizes and spaces)*/
+#define LV_DPI 100
+
+/* Enable anti-aliasing (lines, and radiuses will be smoothed) */
+#define LV_ANTIALIAS 0 /*1: Enable anti-aliasing*/
+
+/*Screen refresh period in milliseconds*/
+#define LV_REFR_PERIOD 30
+
+/*-----------------
+ * VDB settings
+ *----------------*/
+
+/* VDB (Virtual Display Buffer) is an internal graphics buffer.
+ * The GUI will be drawn into this buffer first and then
+ * the buffer will be passed to your `disp_drv.disp_flush` function to
+ * copy it to your frame buffer.
+ * VDB is required for: buffered drawing, opacity, anti-aliasing and shadows
+ * Learn more: https://docs.littlevgl.com/#Drawing*/
+
+/* Size of the VDB in pixels. Typical size: ~1/10 screen. Must be >= LV_HOR_RES
+ * Setting it to 0 will disable VDB and `disp_drv.disp_fill` and `disp_drv.disp_map` functions
+ * will be called to draw to the frame buffer directly*/
+#define LV_VDB_SIZE ((LV_VER_RES * LV_HOR_RES) / 10)
+
+/* Bit-per-pixel of VDB. Useful for monochrome or non-standard color format displays.
+ * Special formats are handled with `disp_drv.vdb_wr`)*/
+#define LV_VDB_PX_BPP LV_COLOR_SIZE /*LV_COLOR_SIZE comes from LV_COLOR_DEPTH below to set 8, 16 or 32 bit pixel size automatically */
+
+/* Place VDB to a specific address (e.g. in external RAM)
+ * 0: allocate automatically into RAM
+ * LV_VDB_ADR_INV: to replace it later with `lv_vdb_set_adr()`*/
+#define LV_VDB_ADR 0
+
+/* Use two Virtual Display buffers (VDB) to parallelize rendering and flushing
+ * The flushing should use DMA to write the frame buffer in the background */
+#define LV_VDB_DOUBLE 0
+
+/* Place VDB2 to a specific address (e.g. in external RAM)
+ * 0: allocate automatically into RAM
+ * LV_VDB_ADR_INV: to replace it later with `lv_vdb_set_adr()`*/
+#define LV_VDB2_ADR 0
+
+/* Using true double buffering in `disp_drv.disp_flush` you will always get the image of the whole screen.
+ * Your only task is to set the rendered image (`color_p` parameter) as frame buffer address or send it to your display.
+ * The best if you do in the blank period of you display to avoid tearing effect.
+ * Requires:
+ * - LV_VDB_SIZE = LV_HOR_RES * LV_VER_RES
+ * - LV_VDB_DOUBLE = 1
+ */
+#define LV_VDB_TRUE_DOUBLE_BUFFERED 0
+
+/*=================
+ Misc. setting
+ *=================*/
+
+/*Input device settings*/
+#define LV_INDEV_READ_PERIOD 50 /*Input device read period in milliseconds*/
+#define LV_INDEV_POINT_MARKER 0 /*Mark the pressed points (required: USE_LV_REAL_DRAW = 1)*/
+#define LV_INDEV_DRAG_LIMIT 10 /*Drag threshold in pixels */
+#define LV_INDEV_DRAG_THROW 20 /*Drag throw slow-down in [%]. Greater value means faster slow-down */
+#define LV_INDEV_LONG_PRESS_TIME 400 /*Long press time in milliseconds*/
+#define LV_INDEV_LONG_PRESS_REP_TIME 100 /*Repeated trigger period in long press [ms] */
+
+/*Color settings*/
+#define LV_COLOR_DEPTH 32 /*Color depth: 1/8/16/32*/
+#define LV_COLOR_16_SWAP 0 /*Swap the 2 bytes of RGB565 color. Useful if the display has a 8 bit interface (e.g. SPI)*/
+#define LV_COLOR_SCREEN_TRANSP 0 /*1: Enable screen transparency. Useful for OSD or other overlapping GUIs. Requires ARGB8888 colors*/
+#define LV_COLOR_TRANSP LV_COLOR_LIME /*Images pixels with this color will not be drawn (with chroma keying)*/
+
+/*Text settings*/
+#define LV_TXT_UTF8 1 /*Enable UTF-8 coded Unicode character usage */
+#define LV_TXT_BREAK_CHARS " ,.;:-_" /*Can break texts on these chars*/
+#define LV_TXT_LINE_BREAK_LONG_LEN 12 /* If a character is at least this long, will break wherever "prettiest" */
+#define LV_TXT_LINE_BREAK_LONG_PRE_MIN_LEN 3 /* Minimum number of characters of a word to put on a line before a break */
+#define LV_TXT_LINE_BREAK_LONG_POST_MIN_LEN 1 /* Minimum number of characters of a word to put on a line after a break */
+
+/*Feature usage*/
+#define USE_LV_ANIMATION 1 /*1: Enable all animations*/
+#define USE_LV_SHADOW 1 /*1: Enable shadows*/
+#define USE_LV_GROUP 1 /*1: Enable object groups (for keyboards)*/
+#define USE_LV_GPU 0 /*1: Enable GPU interface*/
+#define USE_LV_REAL_DRAW 1 /*1: Enable function which draw directly to the frame buffer instead of VDB (required if LV_VDB_SIZE = 0)*/
+#define USE_LV_FILESYSTEM 0 /*1: Enable file system (might be required for images*/
+#define USE_LV_MULTI_LANG 0 /* Number of languages for labels to store (0: to disable this feature)*/
+
+/*Compiler settings*/
+#define LV_ATTRIBUTE_TICK_INC /* Define a custom attribute to `lv_tick_inc` function */
+#define LV_ATTRIBUTE_TASK_HANDLER /* Define a custom attribute to `lv_task_handler` function */
+#define LV_COMPILER_VLA_SUPPORTED 1 /* 1: Variable length array is supported*/
+#define LV_COMPILER_NON_CONST_INIT_SUPPORTED 1 /* 1: Initialization with non constant values are supported */
+
+/*HAL settings*/
+#define LV_TICK_CUSTOM 1 /*1: use a custom tick source (removing the need to manually update the tick with `lv_tick_inc`) */
+#if LV_TICK_CUSTOM == 1
+#define LV_TICK_CUSTOM_INCLUDE "system_header.h" /*Header for the sys time function*/
+#define LV_TICK_CUSTOM_SYS_TIME_EXPR (time_get_ms()) /*Expression evaluating to current systime in ms*/
+#endif /*LV_TICK_CUSTOM*/
+
+/*Log settings*/
+#define USE_LV_LOG 1 /*Enable/disable the log module*/
+#if USE_LV_LOG
+/* How important log should be added:
+ * LV_LOG_LEVEL_TRACE A lot of logs to give detailed information
+ * LV_LOG_LEVEL_INFO Log important events
+ * LV_LOG_LEVEL_WARN Log if something unwanted happened but didn't caused problem
+ * LV_LOG_LEVEL_ERROR Only critical issue, when the system may fail
+ */
+# define LV_LOG_LEVEL LV_LOG_LEVEL_WARN
+/* 1: Print the log with 'printf'; 0: user need to register a callback*/
+
+# define LV_LOG_PRINTF 0
+#endif /*USE_LV_LOG*/
+
+/*================
+ * THEME USAGE
+ *================*/
+#define LV_THEME_LIVE_UPDATE 1 /*1: Allow theme switching at run time. Uses 8..10 kB of RAM*/
+
+#define USE_LV_THEME_TEMPL 0 /*Just for test*/
+#define USE_LV_THEME_DEFAULT 1 /*Built mainly from the built-in styles. Consumes very few RAM*/
+#define USE_LV_THEME_ALIEN 0 /*Dark futuristic theme*/
+#define USE_LV_THEME_NIGHT 0 /*Dark elegant theme*/
+#define USE_LV_THEME_MONO 0 /*Mono color theme for monochrome displays*/
+#define USE_LV_THEME_MATERIAL 0 /*Flat theme with bold colors and light shadows*/
+#define USE_LV_THEME_ZEN 0 /*Peaceful, mainly light theme */
+#define USE_LV_THEME_NEMO 0 /*Water-like theme based on the movie "Finding Nemo"*/
+
+/*==================
+ * FONT USAGE
+ *===================*/
+
+/* More info about fonts: https://docs.littlevgl.com/#Fonts
+ * To enable a built-in font use 1,2,4 or 8 values
+ * which will determine the bit-per-pixel. Higher value means smoother fonts */
+#define USE_LV_FONT_DEJAVU_10 0
+#define USE_LV_FONT_DEJAVU_10_LATIN_SUP 0
+#define USE_LV_FONT_DEJAVU_10_CYRILLIC 0
+#define USE_LV_FONT_SYMBOL_10 0
+
+#define USE_LV_FONT_DEJAVU_20 4
+#define USE_LV_FONT_DEJAVU_20_LATIN_SUP 0
+#define USE_LV_FONT_DEJAVU_20_CYRILLIC 0
+#define USE_LV_FONT_SYMBOL_20 0
+
+#define USE_LV_FONT_DEJAVU_30 0
+#define USE_LV_FONT_DEJAVU_30_LATIN_SUP 0
+#define USE_LV_FONT_DEJAVU_30_CYRILLIC 0
+#define USE_LV_FONT_SYMBOL_30 0
+
+#define USE_LV_FONT_DEJAVU_40 0
+#define USE_LV_FONT_DEJAVU_40_LATIN_SUP 0
+#define USE_LV_FONT_DEJAVU_40_CYRILLIC 0
+#define USE_LV_FONT_SYMBOL_40 0
+
+#define USE_LV_FONT_MONOSPACE_8 1
+
+/* Optionally declare your custom fonts here.
+ * You can use these fonts as default font too
+ * and they will be available globally. E.g.
+ * #define LV_FONT_CUSTOM_DECLARE LV_FONT_DECLARE(my_font_1) \
+ * LV_FONT_DECLARE(my_font_2) \
+ */
+#define LV_FONT_CUSTOM_DECLARE
+
+#define LV_FONT_DEFAULT &lv_font_dejavu_20 /*Always set a default font from the built-in fonts*/
+
+/*===================
+ * LV_OBJ SETTINGS
+ *==================*/
+#define LV_OBJ_FREE_NUM_TYPE uint32_t /*Type of free number attribute (comment out disable free number)*/
+#define LV_OBJ_FREE_PTR 1 /*Enable the free pointer attribute*/
+#define LV_OBJ_REALIGN 1 /*Enable `lv_obj_realaign()` based on `lv_obj_align()` parameters*/
+
+/*==================
+ * LV OBJ X USAGE
+ *================*/
+/*
+ * Documentation of the object types: https://docs.littlevgl.com/#Object-types
+ */
+
+/*****************
+ * Simple object
+ *****************/
+
+/*Label (dependencies: -*/
+#define USE_LV_LABEL 1
+#if USE_LV_LABEL != 0
+# define LV_LABEL_SCROLL_SPEED 25 /*Hor, or ver. scroll speed [px/sec] in 'LV_LABEL_LONG_SCROLL/ROLL' mode*/
+#endif
+
+/*Image (dependencies: lv_label*/
+#define USE_LV_IMG 1
+#if USE_LV_IMG != 0
+# define LV_IMG_CF_INDEXED 1 /*Enable indexed (palette) images*/
+# define LV_IMG_CF_ALPHA 1 /*Enable alpha indexed images*/
+#endif
+
+/*Line (dependencies: -*/
+#define USE_LV_LINE 1
+
+/*Arc (dependencies: -)*/
+#define USE_LV_ARC 1
+
+/*******************
+ * Container objects
+ *******************/
+
+/*Container (dependencies: -*/
+#define USE_LV_CONT 1
+
+/*Page (dependencies: lv_cont)*/
+#define USE_LV_PAGE 1
+
+/*Window (dependencies: lv_cont, lv_btn, lv_label, lv_img, lv_page)*/
+#define USE_LV_WIN 1
+
+/*Tab (dependencies: lv_page, lv_btnm)*/
+#define USE_LV_TABVIEW 1
+# if USE_LV_TABVIEW != 0
+# define LV_TABVIEW_ANIM_TIME 300 /*Time of slide animation [ms] (0: no animation)*/
+#endif
+
+/*Tileview (dependencies: lv_page) */
+#define USE_LV_TILEVIEW 1
+#if USE_LV_TILEVIEW
+# define LV_TILEVIEW_ANIM_TIME 300 /*Time of slide animation [ms] (0: no animation)*/
+#endif
+
+/*************************
+ * Data visualizer objects
+ *************************/
+
+/*Bar (dependencies: -)*/
+#define USE_LV_BAR 1
+
+/*Line meter (dependencies: *;)*/
+#define USE_LV_LMETER 1
+
+/*Gauge (dependencies:lv_bar, lv_lmeter)*/
+#define USE_LV_GAUGE 1
+
+/*Chart (dependencies: -)*/
+#define USE_LV_CHART 1
+
+/*Table (dependencies: lv_label)*/
+#define USE_LV_TABLE 1
+#if USE_LV_TABLE
+# define LV_TABLE_COL_MAX 12
+#endif
+
+/*LED (dependencies: -)*/
+#define USE_LV_LED 1
+
+/*Message box (dependencies: lv_rect, lv_btnm, lv_label)*/
+#define USE_LV_MBOX 1
+
+/*Text area (dependencies: lv_label, lv_page)*/
+#define USE_LV_TA 1
+#if USE_LV_TA != 0
+# define LV_TA_CURSOR_BLINK_TIME 400 /*ms*/
+# define LV_TA_PWD_SHOW_TIME 1500 /*ms*/
+#endif
+
+/*Spinbox (dependencies: lv_ta)*/
+#define USE_LV_SPINBOX 1
+
+/*Calendar (dependencies: -)*/
+#define USE_LV_CALENDAR 1
+
+/*Preload (dependencies: lv_arc)*/
+#define USE_LV_PRELOAD 1
+#if USE_LV_PRELOAD != 0
+# define LV_PRELOAD_DEF_ARC_LENGTH 60 /*[deg]*/
+# define LV_PRELOAD_DEF_SPIN_TIME 1000 /*[ms]*/
+# define LV_PRELOAD_DEF_ANIM LV_PRELOAD_TYPE_SPINNING_ARC
+#endif
+
+/*Canvas (dependencies: lv_img)*/
+#define USE_LV_CANVAS 1
+/*************************
+ * User input objects
+ *************************/
+
+/*Button (dependencies: lv_cont*/
+#define USE_LV_BTN 1
+#if USE_LV_BTN != 0
+# define LV_BTN_INK_EFFECT 1 /*Enable button-state animations - draw a circle on click (dependencies: USE_LV_ANIMATION)*/
+#endif
+
+/*Image Button (dependencies: lv_btn*/
+#define USE_LV_IMGBTN 1
+#if USE_LV_IMGBTN
+# define LV_IMGBTN_TILED 0 /*1: The imgbtn requires left, mid and right parts and the width can be set freely*/
+#endif
+
+/*Button matrix (dependencies: -)*/
+#define USE_LV_BTNM 1
+
+/*Keyboard (dependencies: lv_btnm)*/
+#define USE_LV_KB 1
+
+/*Check box (dependencies: lv_btn, lv_label)*/
+#define USE_LV_CB 1
+
+/*List (dependencies: lv_page, lv_btn, lv_label, (lv_img optionally for icons ))*/
+#define USE_LV_LIST 1
+#if USE_LV_LIST != 0
+# define LV_LIST_FOCUS_TIME 100 /*Default animation time of focusing to a list element [ms] (0: no animation) */
+#endif
+
+/*Drop down list (dependencies: lv_page, lv_label, lv_symbol_def.h)*/
+#define USE_LV_DDLIST 1
+#if USE_LV_DDLIST != 0
+# define LV_DDLIST_ANIM_TIME 200 /*Open and close default animation time [ms] (0: no animation)*/
+#endif
+
+/*Roller (dependencies: lv_ddlist)*/
+#define USE_LV_ROLLER 1
+#if USE_LV_ROLLER != 0
+# define LV_ROLLER_ANIM_TIME 200 /*Focus animation time [ms] (0: no animation)*/
+#endif
+
+/*Slider (dependencies: lv_bar)*/
+#define USE_LV_SLIDER 1
+
+/*Switch (dependencies: lv_slider)*/
+#define USE_LV_SW 1
+
+/*************************
+ * Non-user section
+ *************************/
+#if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_WARNINGS) /* Disable warnings for Visual Studio*/
+# define _CRT_SECURE_NO_WARNINGS
+#endif
+
+/*--END OF LV_CONF_H--*/
+
+/*Be sure every define has a default value*/
+#include "lvgl/lv_conf_checker.h"
+
+#endif /*LV_CONF_H*/
+
+#endif /*End of "Content enable"*/
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/lv_config/lv_drv_conf.h b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/lv_config/lv_drv_conf.h
new file mode 100644
index 000000000..d216a3e90
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/lv_config/lv_drv_conf.h
@@ -0,0 +1,310 @@
+/**
+ * @file lv_drv_conf.h
+ *
+ */
+
+/*
+ * COPY THIS FILE AS lv_drv_conf.h
+ */
+
+#if 1 /*Set it to "1" to enable the content*/
+
+#ifndef LV_DRV_CONF_H
+#define LV_DRV_CONF_H
+
+#include "lv_conf.h"
+
+/*********************
+ * DELAY INTERFACE
+ *********************/
+#define LV_DRV_DELAY_INCLUDE <stdint.h> /*Dummy include by default*/
+#define LV_DRV_DELAY_US(us) /*delay_us(us)*/ /*Delay the given number of microseconds*/
+#define LV_DRV_DELAY_MS(ms) /*delay_ms(ms)*/ /*Delay the given number of milliseconds*/
+
+/*********************
+ * DISPLAY INTERFACE
+ *********************/
+
+/*------------
+ * Common
+ *------------*/
+#define LV_DRV_DISP_INCLUDE <stdint.h> /*Dummy include by default*/
+#define LV_DRV_DISP_CMD_DATA(val) /*pin_x_set(val)*/ /*Set the command/data pin to 'val'*/
+#define LV_DRV_DISP_RST(val) /*pin_x_set(val)*/ /*Set the reset pin to 'val'*/
+
+/*---------
+ * SPI
+ *---------*/
+#define LV_DRV_DISP_SPI_CS(val) /*spi_cs_set(val)*/ /*Set the SPI's Chip select to 'val'*/
+#define LV_DRV_DISP_SPI_WR_BYTE(data) /*spi_wr(data)*/ /*Write a byte the SPI bus*/
+#define LV_DRV_DISP_SPI_WR_ARRAY(adr, n) /*spi_wr_mem(adr, n)*/ /*Write 'n' bytes to SPI bus from 'adr'*/
+
+/*------------------
+ * Parallel port
+ *-----------------*/
+#define LV_DRV_DISP_PAR_CS(val) /*par_cs_set(val)*/ /*Set the Parallel port's Chip select to 'val'*/
+#define LV_DRV_DISP_PAR_SLOW /*par_slow()*/ /*Set low speed on the parallel port*/
+#define LV_DRV_DISP_PAR_FAST /*par_fast()*/ /*Set high speed on the parallel port*/
+#define LV_DRV_DISP_PAR_WR_WORD(data) /*par_wr(data)*/ /*Write a word to the parallel port*/
+#define LV_DRV_DISP_PAR_WR_ARRAY(adr, n) /*par_wr_mem(adr,n)*/ /*Write 'n' bytes to Parallel ports from 'adr'*/
+
+/***************************
+ * INPUT DEVICE INTERFACE
+ ***************************/
+
+/*----------
+ * Common
+ *----------*/
+#define LV_DRV_INDEV_INCLUDE <stdint.h> /*Dummy include by default*/
+#define LV_DRV_INDEV_RST(val) /*pin_x_set(val)*/ /*Set the reset pin to 'val'*/
+#define LV_DRV_INDEV_IRQ_READ 0 /*pn_x_read()*/ /*Read the IRQ pin*/
+
+/*---------
+ * SPI
+ *---------*/
+#define LV_DRV_INDEV_SPI_CS(val) /*spi_cs_set(val)*/ /*Set the SPI's Chip select to 'val'*/
+#define LV_DRV_INDEV_SPI_XCHG_BYTE(data) 0 /*spi_xchg(val)*/ /*Write 'val' to SPI and give the read value*/
+
+/*---------
+ * I2C
+ *---------*/
+#define LV_DRV_INDEV_I2C_START /*i2c_start()*/ /*Make an I2C start*/
+#define LV_DRV_INDEV_I2C_STOP /*i2c_stop()*/ /*Make an I2C stop*/
+#define LV_DRV_INDEV_I2C_RESTART /*i2c_restart()*/ /*Make an I2C restart*/
+#define LV_DRV_INDEV_I2C_WR(data) /*i2c_wr(data)*/ /*Write a byte to the I1C bus*/
+#define LV_DRV_INDEV_I2C_READ(last_read) 0 /*i2c_rd()*/ /*Read a byte from the I2C bud*/
+
+
+/*********************
+ * DISPLAY DRIVERS
+ *********************/
+
+/*-------------------
+ * Monitor of PC
+ *-------------------*/
+#ifndef USE_MONITOR
+# define USE_MONITOR 1
+#endif
+
+#if USE_MONITOR
+# define MONITOR_HOR_RES LV_HOR_RES_MAX
+# define MONITOR_VER_RES LV_VER_RES_MAX
+
+/* Scale window by this factor (useful when simulating small screens) */
+# define MONITOR_ZOOM 1
+
+/* Used to test true double buffering with only address changing.
+ * Set LV_VDB_SIZE = (LV_HOR_RES * LV_VER_RES) and LV_VDB_DOUBLE = 1 and LV_COLOR_DEPTH = 32" */
+# define MONITOR_DOUBLE_BUFFERED 0
+
+/*Eclipse: <SDL2/SDL.h> Visual Studio: <SDL.h>*/
+# define MONITOR_SDL_INCLUDE_PATH <SDL2/SDL.h>
+
+/*Different rendering might be used if running in a Virtual machine*/
+# define MONITOR_VIRTUAL_MACHINE 0
+
+/*Open two windows to test multi display support*/
+# define MONITOR_DUAL 0
+#endif
+
+/*-----------------------------------
+ * Native Windows (including mouse)
+ *----------------------------------*/
+#ifndef USE_WINDOWS
+# define USE_WINDOWS 0
+#endif
+
+#define USE_WINDOWS 0
+#if USE_WINDOWS
+# define WINDOW_HOR_RES 480
+# define WINDOW_VER_RES 320
+#endif
+
+/*----------------
+ * SSD1963
+ *--------------*/
+#ifndef USE_SSD1963
+# define USE_SSD1963 0
+#endif
+
+#if USE_SSD1963
+# define SSD1963_HOR_RES LV_HOR_RES
+# define SSD1963_VER_RES LV_VER_RES
+# define SSD1963_HT 531
+# define SSD1963_HPS 43
+# define SSD1963_LPS 8
+# define SSD1963_HPW 10
+# define SSD1963_VT 288
+# define SSD1963_VPS 12
+# define SSD1963_FPS 4
+# define SSD1963_VPW 10
+# define SSD1963_HS_NEG 0 /*Negative hsync*/
+# define SSD1963_VS_NEG 0 /*Negative vsync*/
+# define SSD1963_ORI 0 /*0, 90, 180, 270*/
+# define SSD1963_COLOR_DEPTH 16
+#endif
+
+/*----------------
+ * R61581
+ *--------------*/
+#ifndef USE_R61581
+# define USE_R61581 0
+#endif
+
+#if USE_R61581
+# define R61581_HOR_RES LV_HOR_RES
+# define R61581_VER_RES LV_VER_RES
+# define R61581_HSPL 0 /*HSYNC signal polarity*/
+# define R61581_HSL 10 /*HSYNC length (Not Implemented)*/
+# define R61581_HFP 10 /*Horitontal Front poarch (Not Implemented)*/
+# define R61581_HBP 10 /*Horitontal Back poarch (Not Implemented */
+# define R61581_VSPL 0 /*VSYNC signal polarity*/
+# define R61581_VSL 10 /*VSYNC length (Not Implemented)*/
+# define R61581_VFP 8 /*Vertical Front poarch*/
+# define R61581_VBP 8 /*Vertical Back poarch */
+# define R61581_DPL 0 /*DCLK signal polarity*/
+# define R61581_EPL 1 /*ENABLE signal polarity*/
+# define R61581_ORI 0 /*0, 180*/
+# define R61581_LV_COLOR_DEPTH 16 /*Fix 16 bit*/
+#endif
+
+/*------------------------------
+ * ST7565 (Monochrome, low res.)
+ *-----------------------------*/
+#ifndef USE_ST7565
+# define USE_ST7565 0
+#endif
+
+#if USE_ST7565
+/*No settings*/
+#endif /*USE_ST7565*/
+
+/*-----------------------------------------
+ * Linux frame buffer device (/dev/fbx)
+ *-----------------------------------------*/
+#ifndef USE_FBDEV
+# define USE_FBDEV 1
+#endif
+
+#if USE_FBDEV
+# define FBDEV_PATH "/dev/fb0"
+#endif
+
+/*********************
+ * INPUT DEVICES
+ *********************/
+
+/*--------------
+ * XPT2046
+ *--------------*/
+#ifndef USE_XPT2046
+# define USE_XPT2046 0
+#endif
+
+#if USE_XPT2046
+# define XPT2046_HOR_RES 480
+# define XPT2046_VER_RES 320
+# define XPT2046_X_MIN 200
+# define XPT2046_Y_MIN 200
+# define XPT2046_X_MAX 3800
+# define XPT2046_Y_MAX 3800
+# define XPT2046_AVG 4
+# define XPT2046_INV 0
+#endif
+
+/*-----------------
+ * FT5406EE8
+ *-----------------*/
+#ifndef USE_FT5406EE8
+# define USE_FT5406EE8 0
+#endif
+
+#if USE_FT5406EE8
+# define FT5406EE8_I2C_ADR 0x38 /*7 bit address*/
+#endif
+
+/*---------------
+ * AD TOUCH
+ *--------------*/
+#ifndef USE_AD_TOUCH
+# define USE_AD_TOUCH 0
+#endif
+
+#if USE_AD_TOUCH
+/*No settings*/
+#endif
+
+
+/*---------------------------------------
+ * Mouse or touchpad on PC (using SDL)
+ *-------------------------------------*/
+#ifndef USE_MOUSE
+# define USE_MOUSE 1
+#endif
+
+#if USE_MOUSE
+/*No settings*/
+#endif
+
+/*-------------------------------------------
+ * Mousewheel as encoder on PC (using SDL)
+ *------------------------------------------*/
+#ifndef USE_MOUSEWHEEL
+# define USE_MOUSEWHEEL 1
+#endif
+
+#if USE_MOUSEWHEEL
+/*No settings*/
+#endif
+
+/*-------------------------------------------------
+ * Touchscreen as libinput interface (for Linux based systems)
+ *------------------------------------------------*/
+#ifndef USE_LIBINPUT
+# define USE_LIBINPUT 0
+#endif
+
+#if USE_LIBINPUT
+# define LIBINPUT_NAME "/dev/input/event0" /*You can use the "evtest" Linux tool to get the list of devices and test them*/
+#endif /*USE_LIBINPUT*/
+
+/*-------------------------------------------------
+ * Mouse or touchpad as evdev interface (for Linux based systems)
+ *------------------------------------------------*/
+#ifndef USE_EVDEV
+# define USE_EVDEV 0
+#endif
+
+#if USE_EVDEV
+# define EVDEV_NAME "/dev/input/event0" /*You can use the "evtest" Linux tool to get the list of devices and test them*/
+# define EVDEV_SWAP_AXES 0 /*Swap the x and y axes of the touchscreen*/
+
+# define EVDEV_SCALE 0 /* Scale input, e.g. if touchscreen resolution does not match display resolution */
+# if EVDEV_SCALE
+# define EVDEV_SCALE_HOR_RES (4096) /* Horizontal resolution of touchscreen */
+# define EVDEV_SCALE_VER_RES (4096) /* Vertical resolution of touchscreen */
+# endif /*EVDEV_SCALE*/
+
+# define EVDEV_CALIBRATE 0 /*Scale and offset the touchscreen coordinates by using maximum and minimum values for each axis*/
+# if EVDEV_CALIBRATE
+# define EVDEV_HOR_MIN 3800 /*If EVDEV_XXX_MIN > EVDEV_XXX_MAX the XXX axis is automatically inverted*/
+# define EVDEV_HOR_MAX 200
+# define EVDEV_VER_MIN 200
+# define EVDEV_VER_MAX 3800
+# endif /*EVDEV_SCALE*/
+#endif /*USE_EVDEV*/
+
+/*-------------------------------
+ * Keyboard of a PC (using SDL)
+ *------------------------------*/
+#ifndef USE_KEYBOARD
+# define USE_KEYBOARD 1
+#endif
+
+#if USE_KEYBOARD
+/*No settings*/
+#endif
+
+#endif /*LV_DRV_CONF_H*/
+
+#endif /*End of "Content enable"*/
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-native-ui-app/CMakeLists.txt b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-native-ui-app/CMakeLists.txt
new file mode 100644
index 000000000..9778e821b
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-native-ui-app/CMakeLists.txt
@@ -0,0 +1,137 @@
+# Copyright (C) 2019 Intel Corporation. All rights reserved.
+# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+
+cmake_minimum_required (VERSION 2.9)
+message ("vgl_native_ui_app...")
+project (vgl_native_ui_app)
+
+
+SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DPLATFORM_NATIVE_LINUX -DUSE_MONITOR -DUSE_MOUSE=1")
+
+# Currently build as 64-bit by default. Set to "NO" to build 32-bit binaries.
+set (BUILD_AS_64BIT_SUPPORT "YES")
+
+if (CMAKE_SIZEOF_VOID_P EQUAL 8)
+ if (${BUILD_AS_64BIT_SUPPORT} STREQUAL "YES")
+ # Add -fPIC flag if build as 64-bit
+ set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
+ set (CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "${CMAKE_SHARED_LIBRARY_LINK_C_FLAGS} -fPIC")
+ else ()
+ add_definitions (-m32)
+ set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -m32")
+ set (CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -m32")
+ endif ()
+endif ()
+
+set(lv_name lvgl)
+set(LVGL_SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/../build/lvgl)
+set(LVGL_DRIVER_DIR ${CMAKE_CURRENT_LIST_DIR}/lv-drivers)
+
+message(${LVGL_SOURCE_DIR})
+include( ExternalProject )
+
+add_definitions(-DLV_CONF_INCLUDE_SIMPLE)
+
+SET (LVGL_SOURCES
+ ${LVGL_SOURCE_DIR}/lv_core/lv_group.c
+ ${LVGL_SOURCE_DIR}/lv_core/lv_indev.c
+ ${LVGL_SOURCE_DIR}/lv_core/lv_lang.c
+ ${LVGL_SOURCE_DIR}/lv_core/lv_obj.c
+ ${LVGL_SOURCE_DIR}/lv_core/lv_refr.c
+ ${LVGL_SOURCE_DIR}/lv_core/lv_style.c
+ ${LVGL_SOURCE_DIR}/lv_core/lv_vdb.c
+
+ ${LVGL_SOURCE_DIR}/lv_draw/lv_draw.c
+ ${LVGL_SOURCE_DIR}/lv_draw/lv_draw_arc.c
+ ${LVGL_SOURCE_DIR}/lv_draw/lv_draw_img.c
+ ${LVGL_SOURCE_DIR}/lv_draw/lv_draw_label.c
+ ${LVGL_SOURCE_DIR}/lv_draw/lv_draw_line.c
+ ${LVGL_SOURCE_DIR}/lv_draw/lv_draw_rbasic.c
+ ${LVGL_SOURCE_DIR}/lv_draw/lv_draw_rect.c
+ ${LVGL_SOURCE_DIR}/lv_draw/lv_draw_triangle.c
+ ${LVGL_SOURCE_DIR}/lv_draw/lv_draw_vbasic.c
+
+ ${LVGL_SOURCE_DIR}/lv_hal/lv_hal_disp.c
+ ${LVGL_SOURCE_DIR}/lv_hal/lv_hal_indev.c
+ ${LVGL_SOURCE_DIR}/lv_hal/lv_hal_tick.c
+
+ ${LVGL_SOURCE_DIR}/lv_misc/lv_anim.c
+ ${LVGL_SOURCE_DIR}/lv_misc/lv_area.c
+ ${LVGL_SOURCE_DIR}/lv_misc/lv_circ.c
+ ${LVGL_SOURCE_DIR}/lv_misc/lv_color.c
+ ${LVGL_SOURCE_DIR}/lv_misc/lv_font.c
+ ${LVGL_SOURCE_DIR}/lv_misc/lv_fs.c
+ ${LVGL_SOURCE_DIR}/lv_misc/lv_gc.c
+ ${LVGL_SOURCE_DIR}/lv_misc/lv_ll.c
+ ${LVGL_SOURCE_DIR}/lv_misc/lv_log.c
+ ${LVGL_SOURCE_DIR}/lv_misc/lv_math.c
+ ${LVGL_SOURCE_DIR}/lv_misc/lv_mem.c
+ ${LVGL_SOURCE_DIR}/lv_misc/lv_task.c
+ ${LVGL_SOURCE_DIR}/lv_misc/lv_templ.c
+ ${LVGL_SOURCE_DIR}/lv_misc/lv_txt.c
+
+ ${LVGL_SOURCE_DIR}/lv_objx/lv_arc.c
+ ${LVGL_SOURCE_DIR}/lv_objx/lv_bar.c
+ ${LVGL_SOURCE_DIR}/lv_objx/lv_btn.c
+ ${LVGL_SOURCE_DIR}/lv_objx/lv_btnm.c
+ ${LVGL_SOURCE_DIR}/lv_objx/lv_calendar.c
+ ${LVGL_SOURCE_DIR}/lv_objx/lv_canvas.c
+ ${LVGL_SOURCE_DIR}/lv_objx/lv_cb.c
+ ${LVGL_SOURCE_DIR}/lv_objx/lv_chart.c
+ ${LVGL_SOURCE_DIR}/lv_objx/lv_cont.c
+ ${LVGL_SOURCE_DIR}/lv_objx/lv_ddlist.c
+ ${LVGL_SOURCE_DIR}/lv_objx/lv_gauge.c
+ ${LVGL_SOURCE_DIR}/lv_objx/lv_img.c
+ ${LVGL_SOURCE_DIR}/lv_objx/lv_imgbtn.c
+ ${LVGL_SOURCE_DIR}/lv_objx/lv_kb.c
+ ${LVGL_SOURCE_DIR}/lv_objx/lv_label.c
+ ${LVGL_SOURCE_DIR}/lv_objx/lv_led.c
+ ${LVGL_SOURCE_DIR}/lv_objx/lv_line.c
+ ${LVGL_SOURCE_DIR}/lv_objx/lv_list.c
+ ${LVGL_SOURCE_DIR}/lv_objx/lv_lmeter.c
+ ${LVGL_SOURCE_DIR}/lv_objx/lv_mbox.c
+ ${LVGL_SOURCE_DIR}/lv_objx/lv_objx_templ.c
+ ${LVGL_SOURCE_DIR}/lv_objx/lv_page.c
+ ${LVGL_SOURCE_DIR}/lv_objx/lv_preload.c
+ ${LVGL_SOURCE_DIR}/lv_objx/lv_roller.c
+ ${LVGL_SOURCE_DIR}/lv_objx/lv_slider.c
+ ${LVGL_SOURCE_DIR}/lv_objx/lv_spinbox.c
+ ${LVGL_SOURCE_DIR}/lv_objx/lv_sw.c
+ ${LVGL_SOURCE_DIR}/lv_objx/lv_ta.c
+ ${LVGL_SOURCE_DIR}/lv_objx/lv_table.c
+ ${LVGL_SOURCE_DIR}/lv_objx/lv_tabview.c
+ ${LVGL_SOURCE_DIR}/lv_objx/lv_tileview.c
+ ${LVGL_SOURCE_DIR}/lv_objx/lv_win.c
+
+ ${LVGL_SOURCE_DIR}/lv_themes/lv_theme.c
+ ${LVGL_SOURCE_DIR}/lv_themes/lv_theme_alien.c
+ ${LVGL_SOURCE_DIR}/lv_themes/lv_theme_default.c
+ ${LVGL_SOURCE_DIR}/lv_themes/lv_theme_material.c
+ ${LVGL_SOURCE_DIR}/lv_themes/lv_theme_mono.c
+ ${LVGL_SOURCE_DIR}/lv_themes/lv_theme_nemo.c
+ ${LVGL_SOURCE_DIR}/lv_themes/lv_theme_night.c
+ ${LVGL_SOURCE_DIR}/lv_themes/lv_theme_templ.c
+ ${LVGL_SOURCE_DIR}/lv_themes/lv_theme_zen.c
+
+ ${LVGL_SOURCE_DIR}/lv_fonts/lv_font_builtin.c
+ ${LVGL_SOURCE_DIR}/lv_fonts/lv_font_dejavu_20.c
+ ${LVGL_DRIVER_DIR}/linux_display_indev.c
+ ${LVGL_DRIVER_DIR}/indev/mouse.c
+
+)
+SET(SOURCES
+ ${LVGL_SOURCES}
+ ${CMAKE_CURRENT_LIST_DIR}/main.c
+ )
+include_directories(
+ ${LVGL_DRIVER_DIR}
+ ${LVGL_DRIVER_DIR}/display
+ ${LVGL_DRIVER_DIR}/indev
+ ${LVGL_SOURCE_DIR}
+ ${LVGL_SOURCE_DIR}/..
+ ${CMAKE_CURRENT_BINARY_DIR}
+ ${CMAKE_CURRENT_LIST_DIR}
+ ${CMAKE_CURRENT_LIST_DIR}/../lv_config
+)
+add_executable(vgl_native_ui_app ${SOURCES} )
+target_link_libraries( vgl_native_ui_app -lSDL2)
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-native-ui-app/CMakeLists.txt.in b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-native-ui-app/CMakeLists.txt.in
new file mode 100644
index 000000000..25f4db955
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-native-ui-app/CMakeLists.txt.in
@@ -0,0 +1,18 @@
+# Copyright (C) 2019 Intel Corporation. All rights reserved.
+# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+
+cmake_minimum_required(VERSION 2.8.2)
+
+project(lvgl_download NONE)
+
+include(ExternalProject)
+ExternalProject_Add(${lv_name}
+ GIT_REPOSITORY https://github.com/lvgl/lvgl.git
+ GIT_TAG v5.3
+ BINARY_DIR ""
+ SOURCE_DIR "${CMAKE_CURRENT_BINARY_DIR}/../build/lvgl"
+ CONFIGURE_COMMAND ""
+ BUILD_COMMAND ""
+ INSTALL_COMMAND ""
+ TEST_COMMAND ""
+ )
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-native-ui-app/lv-drivers/.gitignore b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-native-ui-app/lv-drivers/.gitignore
new file mode 100644
index 000000000..2372cca06
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-native-ui-app/lv-drivers/.gitignore
@@ -0,0 +1 @@
+**/*.o \ No newline at end of file
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-native-ui-app/lv-drivers/display_indev.h b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-native-ui-app/lv-drivers/display_indev.h
new file mode 100644
index 000000000..95136e285
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-native-ui-app/lv-drivers/display_indev.h
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2019 Intel Corporation. All rights reserved.
+ * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+ */
+
+#ifndef DISPLAY_INDEV_H_
+#define DISPLAY_INDEV_H_
+#include <stdio.h>
+#include <inttypes.h>
+#include "mouse.h"
+#include "lvgl/lv_misc/lv_color.h"
+#include "lvgl/lv_hal/lv_hal_indev.h"
+extern void
+display_init(void);
+extern void
+display_flush(int32_t x1, int32_t y1, int32_t x2, int32_t y2,
+ const lv_color_t *color_p);
+extern bool
+display_input_read(lv_indev_data_t *data);
+extern void
+display_deinit(void);
+extern void
+display_vdb_write(void *buf, lv_coord_t buf_w, lv_coord_t x, lv_coord_t y,
+ lv_color_t *color, lv_opa_t opa);
+extern int
+time_get_ms();
+
+#endif
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-native-ui-app/lv-drivers/indev/mouse.c b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-native-ui-app/lv-drivers/indev/mouse.c
new file mode 100644
index 000000000..848b2eca2
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-native-ui-app/lv-drivers/indev/mouse.c
@@ -0,0 +1,96 @@
+/**
+ * @file mouse.c
+ *
+ */
+
+/*********************
+ * INCLUDES
+ *********************/
+#include "mouse.h"
+#if USE_MOUSE != 0
+
+/*********************
+ * DEFINES
+ *********************/
+#ifndef MONITOR_ZOOM
+#define MONITOR_ZOOM 1
+#endif
+
+/**********************
+ * TYPEDEFS
+ **********************/
+
+/**********************
+ * STATIC PROTOTYPES
+ **********************/
+
+/**********************
+ * STATIC VARIABLES
+ **********************/
+static bool left_button_down = false;
+static int16_t last_x = 0;
+static int16_t last_y = 0;
+
+/**********************
+ * MACROS
+ **********************/
+
+/**********************
+ * GLOBAL FUNCTIONS
+ **********************/
+
+/**
+ * Initialize the mouse
+ */
+void
+mouse_init(void)
+{}
+
+/**
+ * Get the current position and state of the mouse
+ * @param data store the mouse data here
+ * @return false: because the points are not buffered, so no more data to be
+ * read
+ */
+bool
+mouse_read(lv_indev_data_t *data)
+{
+ /*Store the collected data*/
+ data->point.x = last_x;
+ data->point.y = last_y;
+ data->state = left_button_down ? LV_INDEV_STATE_PR : LV_INDEV_STATE_REL;
+
+ return false;
+}
+
+/**
+ * It will be called from the main SDL thread
+ */
+void
+mouse_handler(SDL_Event *event)
+{
+ switch (event->type) {
+ case SDL_MOUSEBUTTONUP:
+ if (event->button.button == SDL_BUTTON_LEFT)
+ left_button_down = false;
+ break;
+ case SDL_MOUSEBUTTONDOWN:
+ if (event->button.button == SDL_BUTTON_LEFT) {
+ left_button_down = true;
+ last_x = event->motion.x / MONITOR_ZOOM;
+ last_y = event->motion.y / MONITOR_ZOOM;
+ }
+ break;
+ case SDL_MOUSEMOTION:
+ last_x = event->motion.x / MONITOR_ZOOM;
+ last_y = event->motion.y / MONITOR_ZOOM;
+
+ break;
+ }
+}
+
+/**********************
+ * STATIC FUNCTIONS
+ **********************/
+
+#endif
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-native-ui-app/lv-drivers/indev/mouse.h b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-native-ui-app/lv-drivers/indev/mouse.h
new file mode 100644
index 000000000..07e492f96
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-native-ui-app/lv-drivers/indev/mouse.h
@@ -0,0 +1,73 @@
+/**
+ * @file mouse.h
+ *
+ */
+
+#ifndef MOUSE_H
+#define MOUSE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*********************
+ * INCLUDES
+ *********************/
+
+#include "lv_drv_conf.h"
+
+#if USE_MOUSE
+
+#include <stdint.h>
+#include <stdbool.h>
+#include "lvgl/lv_hal/lv_hal_indev.h"
+
+#ifndef MONITOR_SDL_INCLUDE_PATH
+#define MONITOR_SDL_INCLUDE_PATH <SDL2/SDL.h>
+#endif
+
+#include MONITOR_SDL_INCLUDE_PATH
+
+/*********************
+ * DEFINES
+ *********************/
+
+/**********************
+ * TYPEDEFS
+ **********************/
+
+/**********************
+ * GLOBAL PROTOTYPES
+ **********************/
+
+/**
+ * Initialize the mouse
+ */
+void
+mouse_init(void);
+/**
+ * Get the current position and state of the mouse
+ * @param data store the mouse data here
+ * @return false: because the points are not buffered, so no more data to be
+ * read
+ */
+bool
+mouse_read(lv_indev_data_t *data);
+
+/**
+ * It will be called from the main SDL thread
+ */
+void
+mouse_handler(SDL_Event *event);
+
+/**********************
+ * MACROS
+ **********************/
+
+#endif /* USE_MOUSE */
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* MOUSE_H */
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-native-ui-app/lv-drivers/linux_display_indev.c b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-native-ui-app/lv-drivers/linux_display_indev.c
new file mode 100644
index 000000000..bd5071067
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-native-ui-app/lv-drivers/linux_display_indev.c
@@ -0,0 +1,319 @@
+/*
+ * Copyright (C) 2019 Intel Corporation. All rights reserved.
+ * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+ */
+
+#include <stdio.h>
+#include <stdbool.h>
+#include "display_indev.h"
+#include "sys/time.h"
+#include "SDL2/SDL.h"
+#define MONITOR_HOR_RES 320
+#define MONITOR_VER_RES 240
+#ifndef MONITOR_ZOOM
+#define MONITOR_ZOOM 1
+#endif
+#define SDL_REFR_PERIOD 50
+void
+monitor_sdl_init(void);
+void
+monitor_sdl_refr_core(void);
+void
+monitor_sdl_clean_up(void);
+static uint32_t tft_fb[MONITOR_HOR_RES * MONITOR_VER_RES];
+
+void
+display_vdb_write(void *buf, lv_coord_t buf_w, lv_coord_t x, lv_coord_t y,
+ lv_color_t *color, lv_opa_t opa)
+{
+ unsigned char *buf_xy = buf + 4 * x + 4 * y * buf_w;
+ lv_color_t *temp = (lv_color_t *)buf_xy;
+ *temp = *color;
+ /*
+ if (opa != LV_OPA_COVER) {
+ lv_color_t mix_color;
+
+ mix_color.red = *buf_xy;
+ mix_color.green = *(buf_xy+1);
+ mix_color.blue = *(buf_xy+2);
+ color = lv_color_mix(color, mix_color, opa);
+ }
+ */
+}
+int
+time_get_ms()
+{
+ static struct timeval tv;
+ gettimeofday(&tv, NULL);
+ long long time_in_mill = (tv.tv_sec) * 1000 + (tv.tv_usec) / 1000;
+
+ return (int)time_in_mill;
+}
+
+SDL_Window *window;
+SDL_Renderer *renderer;
+SDL_Texture *texture;
+static volatile bool sdl_inited = false;
+static volatile bool sdl_refr_qry = false;
+static volatile bool sdl_quit_qry = false;
+
+void
+monitor_flush(int32_t x1, int32_t y1, int32_t x2, int32_t y2,
+ const lv_color_t *color_p)
+{
+ /*Return if the area is out the screen*/
+ if (x2 < 0 || y2 < 0 || x1 > MONITOR_HOR_RES - 1
+ || y1 > MONITOR_VER_RES - 1) {
+ return;
+ }
+
+ int32_t y;
+ uint32_t w = x2 - x1 + 1;
+ for (y = y1; y <= y2; y++) {
+ memcpy(&tft_fb[y * MONITOR_HOR_RES + x1], color_p,
+ w * sizeof(lv_color_t));
+
+ color_p += w;
+ }
+ sdl_refr_qry = true;
+
+ /*IMPORTANT! It must be called to tell the system the flush is ready*/
+}
+
+/**
+ * Fill out the marked area with a color
+ * @param x1 left coordinate
+ * @param y1 top coordinate
+ * @param x2 right coordinate
+ * @param y2 bottom coordinate
+ * @param color fill color
+ */
+void
+monitor_fill(int32_t x1, int32_t y1, int32_t x2, int32_t y2, lv_color_t color)
+{
+ /*Return if the area is out the screen*/
+ if (x2 < 0)
+ return;
+ if (y2 < 0)
+ return;
+ if (x1 > MONITOR_HOR_RES - 1)
+ return;
+ if (y1 > MONITOR_VER_RES - 1)
+ return;
+
+ /*Truncate the area to the screen*/
+ int32_t act_x1 = x1 < 0 ? 0 : x1;
+ int32_t act_y1 = y1 < 0 ? 0 : y1;
+ int32_t act_x2 = x2 > MONITOR_HOR_RES - 1 ? MONITOR_HOR_RES - 1 : x2;
+ int32_t act_y2 = y2 > MONITOR_VER_RES - 1 ? MONITOR_VER_RES - 1 : y2;
+
+ int32_t x;
+ int32_t y;
+ uint32_t color32 = color.full; // lv_color_to32(color);
+
+ for (x = act_x1; x <= act_x2; x++) {
+ for (y = act_y1; y <= act_y2; y++) {
+ tft_fb[y * MONITOR_HOR_RES + x] = color32;
+ }
+ }
+
+ sdl_refr_qry = true;
+}
+
+/**
+ * Put a color map to the marked area
+ * @param x1 left coordinate
+ * @param y1 top coordinate
+ * @param x2 right coordinate
+ * @param y2 bottom coordinate
+ * @param color_p an array of colors
+ */
+void
+monitor_map(int32_t x1, int32_t y1, int32_t x2, int32_t y2,
+ const lv_color_t *color_p)
+{
+ /*Return if the area is out the screen*/
+ if (x2 < 0)
+ return;
+ if (y2 < 0)
+ return;
+ if (x1 > MONITOR_HOR_RES - 1)
+ return;
+ if (y1 > MONITOR_VER_RES - 1)
+ return;
+
+ /*Truncate the area to the screen*/
+ int32_t act_x1 = x1 < 0 ? 0 : x1;
+ int32_t act_y1 = y1 < 0 ? 0 : y1;
+ int32_t act_x2 = x2 > MONITOR_HOR_RES - 1 ? MONITOR_HOR_RES - 1 : x2;
+ int32_t act_y2 = y2 > MONITOR_VER_RES - 1 ? MONITOR_VER_RES - 1 : y2;
+
+ int32_t x;
+ int32_t y;
+
+ for (y = act_y1; y <= act_y2; y++) {
+ for (x = act_x1; x <= act_x2; x++) {
+ tft_fb[y * MONITOR_HOR_RES + x] =
+ color_p->full; // lv_color_to32(*color_p);
+ color_p++;
+ }
+
+ color_p += x2 - act_x2;
+ }
+
+ sdl_refr_qry = true;
+}
+
+void
+display_init(void)
+{}
+
+void
+display_flush(int32_t x1, int32_t y1, int32_t x2, int32_t y2,
+ const lv_color_t *color_p)
+{
+ monitor_flush(x1, y1, x2, y2, color_p);
+}
+void
+display_fill(int32_t x1, int32_t y1, int32_t x2, int32_t y2, lv_color_t color_p)
+{
+ monitor_fill(x1, y1, x2, y2, color_p);
+}
+void
+display_map(int32_t x1, int32_t y1, int32_t x2, int32_t y2,
+ const lv_color_t *color_p)
+{
+ monitor_map(x1, y1, x2, y2, color_p);
+}
+
+bool
+display_input_read(lv_indev_data_t *data)
+{
+ return mouse_read(data);
+}
+
+void
+display_deinit(void)
+{}
+
+int
+monitor_sdl_refr_thread(void *param)
+{
+ (void)param;
+
+ /*If not OSX initialize SDL in the Thread*/
+ monitor_sdl_init();
+ /*Run until quit event not arrives*/
+ while (sdl_quit_qry == false) {
+ /*Refresh handling*/
+ monitor_sdl_refr_core();
+ }
+
+ monitor_sdl_clean_up();
+ exit(0);
+
+ return 0;
+}
+
+void
+monitor_sdl_refr_core(void)
+{
+ if (sdl_refr_qry != false) {
+ sdl_refr_qry = false;
+
+ SDL_UpdateTexture(texture, NULL, tft_fb,
+ MONITOR_HOR_RES * sizeof(uint32_t));
+ SDL_RenderClear(renderer);
+ /*Test: Draw a background to test transparent screens
+ * (LV_COLOR_SCREEN_TRANSP)*/
+ // SDL_SetRenderDrawColor(renderer, 0xff, 0, 0, 0xff);
+ // SDL_Rect r;
+ // r.x = 0; r.y = 0; r.w = MONITOR_HOR_RES; r.w =
+ // MONITOR_VER_RES; SDL_RenderDrawRect(renderer, &r);
+ /*Update the renderer with the texture containing the rendered image*/
+ SDL_RenderCopy(renderer, texture, NULL, NULL);
+ SDL_RenderPresent(renderer);
+ }
+
+ SDL_Event event;
+ while (SDL_PollEvent(&event)) {
+#if USE_MOUSE != 0
+ mouse_handler(&event);
+#endif
+ if ((&event)->type == SDL_WINDOWEVENT) {
+ switch ((&event)->window.event) {
+#if SDL_VERSION_ATLEAST(2, 0, 5)
+ case SDL_WINDOWEVENT_TAKE_FOCUS:
+#endif
+ case SDL_WINDOWEVENT_EXPOSED:
+
+ SDL_UpdateTexture(texture, NULL, tft_fb,
+ MONITOR_HOR_RES * sizeof(uint32_t));
+ SDL_RenderClear(renderer);
+ SDL_RenderCopy(renderer, texture, NULL, NULL);
+ SDL_RenderPresent(renderer);
+ break;
+ default:
+ break;
+ }
+ }
+ }
+
+ /*Sleep some time*/
+ SDL_Delay(SDL_REFR_PERIOD);
+}
+int
+quit_filter(void *userdata, SDL_Event *event)
+{
+ (void)userdata;
+
+ if (event->type == SDL_QUIT) {
+ sdl_quit_qry = true;
+ }
+
+ return 1;
+}
+
+void
+monitor_sdl_clean_up(void)
+{
+ SDL_DestroyTexture(texture);
+ SDL_DestroyRenderer(renderer);
+ SDL_DestroyWindow(window);
+ SDL_Quit();
+}
+
+void
+monitor_sdl_init(void)
+{
+ /*Initialize the SDL*/
+ SDL_Init(SDL_INIT_VIDEO);
+
+ SDL_SetEventFilter(quit_filter, NULL);
+
+ window = SDL_CreateWindow(
+ "TFT Simulator", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
+ MONITOR_HOR_RES * MONITOR_ZOOM, MONITOR_VER_RES * MONITOR_ZOOM,
+ 0); /*last param. SDL_WINDOW_BORDERLESS to hide borders*/
+
+ renderer = SDL_CreateRenderer(window, -1, 0);
+ texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_ARGB8888,
+ SDL_TEXTUREACCESS_STATIC, MONITOR_HOR_RES,
+ MONITOR_VER_RES);
+ SDL_SetTextureBlendMode(texture, SDL_BLENDMODE_BLEND);
+
+ /*Initialize the frame buffer to gray (77 is an empirical value) */
+ memset(tft_fb, 0x44, MONITOR_HOR_RES * MONITOR_VER_RES * sizeof(uint32_t));
+ SDL_UpdateTexture(texture, NULL, tft_fb,
+ MONITOR_HOR_RES * sizeof(uint32_t));
+ sdl_refr_qry = true;
+ sdl_inited = true;
+}
+
+void
+display_SDL_init()
+{
+ SDL_CreateThread(monitor_sdl_refr_thread, "sdl_refr", NULL);
+ while (sdl_inited == false)
+ ; /*Wait until 'sdl_refr' initializes the SDL*/
+}
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-native-ui-app/lv-drivers/system_header.h b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-native-ui-app/lv-drivers/system_header.h
new file mode 100644
index 000000000..a0d790c8e
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-native-ui-app/lv-drivers/system_header.h
@@ -0,0 +1,9 @@
+/*
+ * Copyright (C) 2019 Intel Corporation. All rights reserved.
+ * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+ */
+
+#include <stdio.h>
+
+int
+time_get_ms();
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-native-ui-app/main.c b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-native-ui-app/main.c
new file mode 100644
index 000000000..e67847c6c
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-native-ui-app/main.c
@@ -0,0 +1,170 @@
+/*
+ * Copyright (C) 2019 Intel Corporation. All rights reserved.
+ * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+ */
+
+/**
+ * @file main
+ *
+ */
+
+/*********************
+ * INCLUDES
+ *********************/
+#include <stdlib.h>
+#include <inttypes.h>
+#include "lvgl/lvgl.h"
+#include "display_indev.h"
+#include <unistd.h>
+
+/*********************
+ * DEFINES
+ *********************/
+
+/**********************
+ * TYPEDEFS
+ **********************/
+
+/**********************
+ * STATIC PROTOTYPES
+ **********************/
+static void
+hal_init(void);
+// static int tick_thread(void * data);
+// static void memory_monitor(void * param);
+
+/**********************
+ * STATIC VARIABLES
+ **********************/
+
+/**********************
+ * MACROS
+ **********************/
+
+/**********************
+ * GLOBAL FUNCTIONS
+ **********************/
+uint32_t count = 0;
+char count_str[11] = { 0 };
+lv_obj_t *hello_world_label;
+lv_obj_t *count_label;
+lv_obj_t *btn1;
+
+lv_obj_t *label_count1;
+int label_count1_value = 0;
+char label_count1_str[11] = { 0 };
+static lv_res_t
+btn_rel_action(lv_obj_t *btn)
+{
+ label_count1_value++;
+ snprintf(label_count1_str, sizeof(label_count1_str), "%d",
+ label_count1_value);
+ lv_label_set_text(label_count1, label_count1_str);
+ return LV_RES_OK;
+}
+
+int
+main()
+{
+ void display_SDL_init();
+ display_SDL_init();
+
+ /*Initialize LittlevGL*/
+ lv_init();
+
+ /*Initialize the HAL (display, input devices, tick) for LittlevGL*/
+ hal_init();
+
+ hello_world_label = lv_label_create(lv_scr_act(), NULL);
+ lv_label_set_text(hello_world_label, "Hello world!");
+ lv_obj_align(hello_world_label, NULL, LV_ALIGN_IN_TOP_LEFT, 0, 0);
+
+ count_label = lv_label_create(lv_scr_act(), NULL);
+ lv_obj_align(count_label, NULL, LV_ALIGN_IN_TOP_MID, 0, 0);
+
+ btn1 = lv_btn_create(
+ lv_scr_act(), NULL); /*Create a button on the currently loaded screen*/
+ lv_btn_set_action(btn1, LV_BTN_ACTION_CLICK,
+ btn_rel_action); /*Set function to be called when the
+ button is released*/
+ lv_obj_align(btn1, NULL, LV_ALIGN_CENTER, 0, 20); /*Align below the label*/
+
+ /*Create a label on the button*/
+ lv_obj_t *btn_label = lv_label_create(btn1, NULL);
+ lv_label_set_text(btn_label, "Click ++");
+
+ label_count1 = lv_label_create(lv_scr_act(), NULL);
+ lv_label_set_text(label_count1, "0");
+ lv_obj_align(label_count1, NULL, LV_ALIGN_IN_BOTTOM_MID, 0, 0);
+
+ while (1) {
+ /* Periodically call the lv_task handler.
+ * It could be done in a timer interrupt or an OS task too.*/
+ if ((count % 100) == 0) {
+ snprintf(count_str, sizeof(count_str), "%d", count / 100);
+ lv_label_set_text(count_label, count_str);
+ }
+ lv_task_handler();
+ ++count;
+ usleep(10 * 1000); /*Just to let the system breath*/
+ }
+
+ return 0;
+}
+
+/**********************
+ * STATIC FUNCTIONS
+ **********************/
+
+/**
+ * Initialize the Hardware Abstraction Layer (HAL) for the Littlev graphics
+ * library
+ */
+void
+display_flush_wrapper(int32_t x1, int32_t y1, int32_t x2, int32_t y2,
+ const lv_color_t *color_p)
+{
+ display_flush(x1, y1, x2, y2, color_p);
+ lv_flush_ready();
+}
+void
+display_vdb_write_wrapper(uint8_t *buf, lv_coord_t buf_w, lv_coord_t x,
+ lv_coord_t y, lv_color_t color, lv_opa_t opa)
+{
+ display_vdb_write(buf, buf_w, x, y, &color, opa);
+}
+extern void
+display_fill(int32_t x1, int32_t y1, int32_t x2, int32_t y2,
+ lv_color_t color_p);
+extern void
+display_map(int32_t x1, int32_t y1, int32_t x2, int32_t y2,
+ const lv_color_t *color_p);
+static void
+hal_init(void)
+{
+ /* Add a display*/
+ lv_disp_drv_t disp_drv;
+ lv_disp_drv_init(&disp_drv); /*Basic initialization*/
+ disp_drv.disp_flush =
+ display_flush_wrapper; /*Used when `LV_VDB_SIZE != 0` in lv_conf.h
+ (buffered drawing)*/
+ disp_drv.disp_fill = display_fill; /*Used when `LV_VDB_SIZE == 0` in
+ lv_conf.h (unbuffered drawing)*/
+ disp_drv.disp_map = display_map; /*Used when `LV_VDB_SIZE == 0` in lv_conf.h
+ (unbuffered drawing)*/
+#if LV_VDB_SIZE != 0
+ disp_drv.vdb_wr = display_vdb_write_wrapper;
+#endif
+ lv_disp_drv_register(&disp_drv);
+
+ /* Add the mouse as input device
+ * Use the 'mouse' driver which reads the PC's mouse*/
+ // mouse_init();
+ lv_indev_drv_t indev_drv;
+ lv_indev_drv_init(&indev_drv); /*Basic initialization*/
+ indev_drv.type = LV_INDEV_TYPE_POINTER;
+ indev_drv.read =
+ display_input_read; /*This function will be called periodically (by the
+ library) to get the mouse position and state*/
+ lv_indev_t *mouse_indev = lv_indev_drv_register(&indev_drv);
+}
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-wasm-runtime/CMakeLists.txt b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-wasm-runtime/CMakeLists.txt
new file mode 100644
index 000000000..a99959ad5
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-wasm-runtime/CMakeLists.txt
@@ -0,0 +1,36 @@
+# Copyright (C) 2019 Intel Corporation. All rights reserved.
+# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+
+cmake_minimum_required (VERSION 2.9)
+
+project (vgl_wasm_runtime)
+
+set (WAMR_BUILD_PLATFORM "linux")
+
+# Reset default linker flags
+set (CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "")
+set (CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "")
+
+################ wamr runtime settings ################
+
+set (WAMR_ROOT_DIR ${CMAKE_CURRENT_LIST_DIR}/../../..)
+
+## use library and headers in the SDK
+link_directories(${WAMR_ROOT_DIR}/wamr-sdk/out/littlevgl/runtime-sdk/lib)
+include_directories(
+ ${WAMR_ROOT_DIR}/wamr-sdk/out/littlevgl/runtime-sdk/include
+ ${WAMR_ROOT_DIR}/wamr-sdk/out/littlevgl/runtime-sdk/include/bi-inc/deps
+ ${WAMR_ROOT_DIR}/core/shared/utils
+ ${WAMR_ROOT_DIR}/core/shared/platform/${WAMR_BUILD_PLATFORM}
+)
+
+############### application related ###############
+include_directories(${CMAKE_CURRENT_LIST_DIR}/src)
+
+add_executable (vgl_wasm_runtime src/platform/${WAMR_BUILD_PLATFORM}/main.c
+ src/platform/${WAMR_BUILD_PLATFORM}/iwasm_main.c
+ src/platform/${WAMR_BUILD_PLATFORM}/display_indev.c
+ src/platform/${WAMR_BUILD_PLATFORM}/mouse.c)
+
+target_link_libraries (vgl_wasm_runtime vmlib -lm -ldl -lpthread -lSDL2)
+
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-wasm-runtime/src/display_indev.h b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-wasm-runtime/src/display_indev.h
new file mode 100644
index 000000000..273d0ad03
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-wasm-runtime/src/display_indev.h
@@ -0,0 +1,96 @@
+#ifndef DISPLAY_INDEV_H_
+#define DISPLAY_INDEV_H_
+#include <stdio.h>
+#include <stdbool.h>
+#include <inttypes.h>
+#include "bh_platform.h"
+#include "wasm_export.h"
+
+#define USE_MOUSE 1
+typedef union {
+ struct {
+ uint8_t blue;
+ uint8_t green;
+ uint8_t red;
+ uint8_t alpha;
+ };
+ uint32_t full;
+} lv_color32_t;
+
+typedef lv_color32_t lv_color_t;
+typedef uint8_t lv_indev_state_t;
+typedef int16_t lv_coord_t;
+typedef uint8_t lv_opa_t;
+typedef struct {
+ lv_coord_t x;
+ lv_coord_t y;
+} lv_point_t;
+
+typedef struct {
+ union {
+ lv_point_t
+ point; /*For LV_INDEV_TYPE_POINTER the currently pressed point*/
+ uint32_t key; /*For LV_INDEV_TYPE_KEYPAD the currently pressed key*/
+ uint32_t btn; /*For LV_INDEV_TYPE_BUTTON the currently pressed button*/
+ int16_t enc_diff; /*For LV_INDEV_TYPE_ENCODER number of steps since the
+ previous read*/
+ };
+ void *user_data; /*'lv_indev_drv_t.priv' for this driver*/
+ lv_indev_state_t state; /*LV_INDEV_STATE_REL or LV_INDEV_STATE_PR*/
+} lv_indev_data_t;
+
+enum { LV_INDEV_STATE_REL = 0, LV_INDEV_STATE_PR };
+enum {
+ LV_OPA_TRANSP = 0,
+ LV_OPA_0 = 0,
+ LV_OPA_10 = 25,
+ LV_OPA_20 = 51,
+ LV_OPA_30 = 76,
+ LV_OPA_40 = 102,
+ LV_OPA_50 = 127,
+ LV_OPA_60 = 153,
+ LV_OPA_70 = 178,
+ LV_OPA_80 = 204,
+ LV_OPA_90 = 229,
+ LV_OPA_100 = 255,
+ LV_OPA_COVER = 255,
+};
+
+extern void
+xpt2046_init(void);
+
+extern bool
+touchscreen_read(lv_indev_data_t *data);
+
+extern bool
+mouse_read(lv_indev_data_t *data);
+
+extern void
+display_init(void);
+
+extern void
+display_deinit(wasm_exec_env_t exec_env);
+
+extern int
+time_get_ms(wasm_exec_env_t exec_env);
+
+extern void
+display_flush(wasm_exec_env_t exec_env, int32_t x1, int32_t y1, int32_t x2,
+ int32_t y2, lv_color_t *color);
+
+extern void
+display_fill(wasm_exec_env_t exec_env, int32_t x1, int32_t y1, int32_t x2,
+ int32_t y2, lv_color_t *color);
+
+extern void
+display_map(wasm_exec_env_t exec_env, int32_t x1, int32_t y1, int32_t x2,
+ int32_t y2, const lv_color_t *color);
+
+extern bool
+display_input_read(wasm_exec_env_t exec_env, void *data);
+
+void
+display_vdb_write(wasm_exec_env_t exec_env, void *buf, lv_coord_t buf_w,
+ lv_coord_t x, lv_coord_t y, lv_color_t *color, lv_opa_t opa);
+
+#endif
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-wasm-runtime/src/platform/linux/display_indev.c b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-wasm-runtime/src/platform/linux/display_indev.c
new file mode 100644
index 000000000..2b3b00067
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-wasm-runtime/src/platform/linux/display_indev.c
@@ -0,0 +1,347 @@
+/*
+ * Copyright (C) 2019 Intel Corporation. All rights reserved.
+ * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+ */
+
+#include <stdio.h>
+#include <stdbool.h>
+#include "display_indev.h"
+#include "SDL2/SDL.h"
+#include "sys/time.h"
+#include "wasm_export.h"
+#include "app_manager_export.h"
+
+#define MONITOR_HOR_RES 320
+#define MONITOR_VER_RES 240
+#ifndef MONITOR_ZOOM
+#define MONITOR_ZOOM 1
+#endif
+#define SDL_REFR_PERIOD 50
+void
+monitor_sdl_init(void);
+void
+monitor_sdl_refr_core(void);
+void
+monitor_sdl_clean_up(void);
+
+static uint32_t tft_fb[MONITOR_HOR_RES * MONITOR_VER_RES];
+
+int
+time_get_ms(wasm_exec_env_t exec_env)
+{
+ static struct timeval tv;
+ gettimeofday(&tv, NULL);
+ long long time_in_mill = (tv.tv_sec) * 1000 + (tv.tv_usec) / 1000;
+
+ return (int)time_in_mill;
+}
+
+SDL_Window *window;
+SDL_Renderer *renderer;
+SDL_Texture *texture;
+static volatile bool sdl_inited = false;
+static volatile bool sdl_refr_qry = false;
+static volatile bool sdl_quit_qry = false;
+
+void
+monitor_flush(int32_t x1, int32_t y1, int32_t x2, int32_t y2,
+ const lv_color_t *color)
+{
+ /*Return if the area is out the screen*/
+ if (x2 < 0 || y2 < 0 || x1 > MONITOR_HOR_RES - 1
+ || y1 > MONITOR_VER_RES - 1) {
+ return;
+ }
+
+ int32_t y;
+ uint32_t w = x2 - x1 + 1;
+
+ for (y = y1; y <= y2; y++) {
+ memcpy(&tft_fb[y * MONITOR_HOR_RES + x1], color,
+ w * sizeof(lv_color_t));
+
+ color += w;
+ }
+ sdl_refr_qry = true;
+
+ /*IMPORTANT! It must be called to tell the system the flush is ready*/
+}
+
+/**
+ * Fill out the marked area with a color
+ * @param x1 left coordinate
+ * @param y1 top coordinate
+ * @param x2 right coordinate
+ * @param y2 bottom coordinate
+ * @param color fill color
+ */
+void
+monitor_fill(int32_t x1, int32_t y1, int32_t x2, int32_t y2, lv_color_t *color)
+{
+ /*Return if the area is out the screen*/
+ if (x2 < 0)
+ return;
+ if (y2 < 0)
+ return;
+ if (x1 > MONITOR_HOR_RES - 1)
+ return;
+ if (y1 > MONITOR_VER_RES - 1)
+ return;
+
+ /*Truncate the area to the screen*/
+ int32_t act_x1 = x1 < 0 ? 0 : x1;
+ int32_t act_y1 = y1 < 0 ? 0 : y1;
+ int32_t act_x2 = x2 > MONITOR_HOR_RES - 1 ? MONITOR_HOR_RES - 1 : x2;
+ int32_t act_y2 = y2 > MONITOR_VER_RES - 1 ? MONITOR_VER_RES - 1 : y2;
+
+ int32_t x;
+ int32_t y;
+ uint32_t color32 = color->full; // lv_color_to32(color);
+
+ for (x = act_x1; x <= act_x2; x++) {
+ for (y = act_y1; y <= act_y2; y++) {
+ tft_fb[y * MONITOR_HOR_RES + x] = color32;
+ }
+ }
+
+ sdl_refr_qry = true;
+}
+
+/**
+ * Put a color map to the marked area
+ * @param x1 left coordinate
+ * @param y1 top coordinate
+ * @param x2 right coordinate
+ * @param y2 bottom coordinate
+ * @param color an array of colors
+ */
+void
+monitor_map(int32_t x1, int32_t y1, int32_t x2, int32_t y2,
+ const lv_color_t *color)
+{
+ /*Return if the area is out the screen*/
+ if (x2 < 0)
+ return;
+ if (y2 < 0)
+ return;
+ if (x1 > MONITOR_HOR_RES - 1)
+ return;
+ if (y1 > MONITOR_VER_RES - 1)
+ return;
+
+ /*Truncate the area to the screen*/
+ int32_t act_x1 = x1 < 0 ? 0 : x1;
+ int32_t act_y1 = y1 < 0 ? 0 : y1;
+ int32_t act_x2 = x2 > MONITOR_HOR_RES - 1 ? MONITOR_HOR_RES - 1 : x2;
+ int32_t act_y2 = y2 > MONITOR_VER_RES - 1 ? MONITOR_VER_RES - 1 : y2;
+
+ int32_t x;
+ int32_t y;
+
+ for (y = act_y1; y <= act_y2; y++) {
+ for (x = act_x1; x <= act_x2; x++) {
+ tft_fb[y * MONITOR_HOR_RES + x] =
+ color->full; // lv_color_to32(*color);
+ color++;
+ }
+
+ color += x2 - act_x2;
+ }
+
+ sdl_refr_qry = true;
+}
+
+void
+display_init(void)
+{}
+
+void
+display_flush(wasm_exec_env_t exec_env, int32_t x1, int32_t y1, int32_t x2,
+ int32_t y2, lv_color_t *color)
+{
+ wasm_module_inst_t module_inst = get_module_inst(exec_env);
+
+ if (!wasm_runtime_validate_native_addr(module_inst, color,
+ sizeof(lv_color_t)))
+ return;
+
+ monitor_flush(x1, y1, x2, y2, color);
+}
+
+void
+display_fill(wasm_exec_env_t exec_env, int32_t x1, int32_t y1, int32_t x2,
+ int32_t y2, lv_color_t *color)
+{
+ monitor_fill(x1, y1, x2, y2, color);
+}
+
+void
+display_map(wasm_exec_env_t exec_env, int32_t x1, int32_t y1, int32_t x2,
+ int32_t y2, const lv_color_t *color)
+{
+ monitor_map(x1, y1, x2, y2, color);
+}
+
+typedef struct display_input_data {
+ lv_point_t point;
+ uint32 user_data_offset;
+ uint8 state;
+} display_input_data;
+
+bool
+display_input_read(wasm_exec_env_t exec_env, void *input_data_app)
+{
+ wasm_module_inst_t module_inst = get_module_inst(exec_env);
+ display_input_data *data_app = (display_input_data *)input_data_app;
+ bool ret;
+
+ if (!wasm_runtime_validate_native_addr(module_inst, data_app,
+ sizeof(display_input_data)))
+ return false;
+
+ lv_indev_data_t data = { 0 };
+
+ ret = mouse_read(&data);
+
+ data_app->point = data.point;
+ data_app->user_data_offset =
+ wasm_runtime_addr_native_to_app(module_inst, data.user_data);
+ data_app->state = data.state;
+
+ return ret;
+}
+
+void
+display_deinit(wasm_exec_env_t exec_env)
+{}
+
+void
+display_vdb_write(wasm_exec_env_t exec_env, void *buf, lv_coord_t buf_w,
+ lv_coord_t x, lv_coord_t y, lv_color_t *color, lv_opa_t opa)
+{
+ wasm_module_inst_t module_inst = get_module_inst(exec_env);
+ unsigned char *buf_xy = (unsigned char *)buf + 4 * x + 4 * y * buf_w;
+
+ if (!wasm_runtime_validate_native_addr(module_inst, color,
+ sizeof(lv_color_t)))
+ return;
+
+ *(lv_color_t *)buf_xy = *color;
+}
+
+int
+monitor_sdl_refr_thread(void *param)
+{
+ (void)param;
+
+ /*If not OSX initialize SDL in the Thread*/
+ monitor_sdl_init();
+ /*Run until quit event not arrives*/
+ while (sdl_quit_qry == false) {
+ /*Refresh handling*/
+ monitor_sdl_refr_core();
+ }
+
+ monitor_sdl_clean_up();
+ exit(0);
+
+ return 0;
+}
+extern void
+mouse_handler(SDL_Event *event);
+void
+monitor_sdl_refr_core(void)
+{
+ if (sdl_refr_qry != false) {
+ sdl_refr_qry = false;
+
+ SDL_UpdateTexture(texture, NULL, tft_fb,
+ MONITOR_HOR_RES * sizeof(uint32_t));
+ SDL_RenderClear(renderer);
+ /*Update the renderer with the texture containing the rendered image*/
+ SDL_RenderCopy(renderer, texture, NULL, NULL);
+ SDL_RenderPresent(renderer);
+ }
+
+ SDL_Event event;
+ while (SDL_PollEvent(&event)) {
+
+ mouse_handler(&event);
+
+ if ((&event)->type == SDL_WINDOWEVENT) {
+ switch ((&event)->window.event) {
+#if SDL_VERSION_ATLEAST(2, 0, 5)
+ case SDL_WINDOWEVENT_TAKE_FOCUS:
+#endif
+ case SDL_WINDOWEVENT_EXPOSED:
+
+ SDL_UpdateTexture(texture, NULL, tft_fb,
+ MONITOR_HOR_RES * sizeof(uint32_t));
+ SDL_RenderClear(renderer);
+ SDL_RenderCopy(renderer, texture, NULL, NULL);
+ SDL_RenderPresent(renderer);
+ break;
+ default:
+ break;
+ }
+ }
+ }
+
+ /*Sleep some time*/
+ SDL_Delay(SDL_REFR_PERIOD);
+}
+int
+quit_filter(void *userdata, SDL_Event *event)
+{
+ (void)userdata;
+
+ if (event->type == SDL_QUIT) {
+ sdl_quit_qry = true;
+ }
+
+ return 1;
+}
+
+void
+monitor_sdl_clean_up(void)
+{
+ SDL_DestroyTexture(texture);
+ SDL_DestroyRenderer(renderer);
+ SDL_DestroyWindow(window);
+ SDL_Quit();
+}
+
+void
+monitor_sdl_init(void)
+{
+ /*Initialize the SDL*/
+ SDL_Init(SDL_INIT_VIDEO);
+
+ SDL_SetEventFilter(quit_filter, NULL);
+
+ window = SDL_CreateWindow(
+ "TFT Simulator", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
+ MONITOR_HOR_RES * MONITOR_ZOOM, MONITOR_VER_RES * MONITOR_ZOOM,
+ 0); /*last param. SDL_WINDOW_BORDERLESS to hide borders*/
+
+ renderer = SDL_CreateRenderer(window, -1, 0);
+ texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_ARGB8888,
+ SDL_TEXTUREACCESS_STATIC, MONITOR_HOR_RES,
+ MONITOR_VER_RES);
+ SDL_SetTextureBlendMode(texture, SDL_BLENDMODE_BLEND);
+
+ /*Initialize the frame buffer to gray (77 is an empirical value) */
+ memset(tft_fb, 0x44, MONITOR_HOR_RES * MONITOR_VER_RES * sizeof(uint32_t));
+ SDL_UpdateTexture(texture, NULL, tft_fb,
+ MONITOR_HOR_RES * sizeof(uint32_t));
+ sdl_refr_qry = true;
+ sdl_inited = true;
+}
+
+void
+display_SDL_init()
+{
+ SDL_CreateThread(monitor_sdl_refr_thread, "sdl_refr", NULL);
+ while (sdl_inited == false)
+ ; /*Wait until 'sdl_refr' initializes the SDL*/
+}
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-wasm-runtime/src/platform/linux/iwasm_main.c b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-wasm-runtime/src/platform/linux/iwasm_main.c
new file mode 100644
index 000000000..e2253bb5e
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-wasm-runtime/src/platform/linux/iwasm_main.c
@@ -0,0 +1,544 @@
+
+#ifndef CONNECTION_UART
+#include <netdb.h>
+#include <netinet/in.h>
+#include <sys/socket.h>
+#include <arpa/inet.h>
+#else
+#include <termios.h>
+#endif
+
+#include <arpa/inet.h>
+#include <unistd.h>
+#include <getopt.h>
+#include <stdlib.h>
+#include <strings.h>
+#include <sys/types.h>
+#include <fcntl.h>
+#include <pthread.h>
+#include <signal.h>
+#include <unistd.h>
+#include <strings.h>
+
+#include "runtime_lib.h"
+#include "runtime_timer.h"
+#include "native_interface.h"
+#include "app_manager_export.h"
+#include "bh_platform.h"
+#include "bi-inc/attr_container.h"
+#include "module_wasm_app.h"
+#include "wasm_export.h"
+#include "sensor_native_api.h"
+#include "connection_native_api.h"
+#include "display_indev.h"
+
+#define MAX 2048
+
+#ifndef CONNECTION_UART
+#define SA struct sockaddr
+static char *host_address = "127.0.0.1";
+static int port = 8888;
+#else
+static char *uart_device = "/dev/ttyS2";
+static int baudrate = B115200;
+#endif
+
+extern bool
+init_sensor_framework();
+extern void
+exit_sensor_framework();
+extern void
+exit_connection_framework();
+extern int
+aee_host_msg_callback(void *msg, uint32_t msg_len);
+extern bool
+init_connection_framework();
+
+#ifndef CONNECTION_UART
+int listenfd = -1;
+int sockfd = -1;
+static pthread_mutex_t sock_lock = PTHREAD_MUTEX_INITIALIZER;
+#else
+int uartfd = -1;
+#endif
+
+#ifndef CONNECTION_UART
+static bool server_mode = false;
+
+// Function designed for chat between client and server.
+void *
+func(void *arg)
+{
+ char buff[MAX];
+ int n;
+ struct sockaddr_in servaddr;
+
+ while (1) {
+ if (sockfd != -1)
+ close(sockfd);
+ // socket create and verification
+ sockfd = socket(AF_INET, SOCK_STREAM, 0);
+ if (sockfd == -1) {
+ printf("socket creation failed...\n");
+ return NULL;
+ }
+ else
+ printf("Socket successfully created..\n");
+ bzero(&servaddr, sizeof(servaddr));
+ // assign IP, PORT
+ servaddr.sin_family = AF_INET;
+ servaddr.sin_addr.s_addr = inet_addr(host_address);
+ servaddr.sin_port = htons(port);
+
+ // connect the client socket to server socket
+ if (connect(sockfd, (SA *)&servaddr, sizeof(servaddr)) != 0) {
+ printf("connection with the server failed...\n");
+ sleep(10);
+ continue;
+ }
+ else {
+ printf("connected to the server..\n");
+ }
+
+ // infinite loop for chat
+ for (;;) {
+ bzero(buff, MAX);
+
+ // read the message from client and copy it in buffer
+ n = read(sockfd, buff, sizeof(buff));
+ // print buffer which contains the client contents
+ // fprintf(stderr, "recieved %d bytes from host: %s", n, buff);
+
+ // socket disconnected
+ if (n <= 0)
+ break;
+
+ aee_host_msg_callback(buff, n);
+ }
+ }
+
+ // After chatting close the socket
+ close(sockfd);
+}
+
+static bool
+host_init()
+{
+ return true;
+}
+
+int
+host_send(void *ctx, const char *buf, int size)
+{
+ int ret;
+
+ if (pthread_mutex_trylock(&sock_lock) == 0) {
+ if (sockfd == -1) {
+ pthread_mutex_unlock(&sock_lock);
+ return 0;
+ }
+
+ ret = write(sockfd, buf, size);
+
+ pthread_mutex_unlock(&sock_lock);
+ return ret;
+ }
+
+ return -1;
+}
+
+void
+host_destroy()
+{
+ if (server_mode)
+ close(listenfd);
+
+ pthread_mutex_lock(&sock_lock);
+ close(sockfd);
+ pthread_mutex_unlock(&sock_lock);
+}
+
+host_interface interface = { .init = host_init,
+ .send = host_send,
+ .destroy = host_destroy };
+
+void *
+func_server_mode(void *arg)
+{
+ int clilent;
+ struct sockaddr_in serv_addr, cli_addr;
+ int n;
+ char buff[MAX];
+ struct sigaction sa;
+
+ sa.sa_handler = SIG_IGN;
+ sa.sa_flags = 0;
+ sigemptyset(&sa.sa_mask);
+ sigaction(SIGPIPE, &sa, 0);
+
+ /* First call to socket() function */
+ listenfd = socket(AF_INET, SOCK_STREAM, 0);
+
+ if (listenfd < 0) {
+ perror("ERROR opening socket");
+ exit(1);
+ }
+
+ /* Initialize socket structure */
+ bzero((char *)&serv_addr, sizeof(serv_addr));
+
+ serv_addr.sin_family = AF_INET;
+ serv_addr.sin_addr.s_addr = INADDR_ANY;
+ serv_addr.sin_port = htons(port);
+
+ /* Now bind the host address using bind() call.*/
+ if (bind(listenfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
+ perror("ERROR on binding");
+ exit(1);
+ }
+
+ listen(listenfd, 5);
+ clilent = sizeof(cli_addr);
+
+ while (1) {
+ pthread_mutex_lock(&sock_lock);
+
+ sockfd = accept(listenfd, (struct sockaddr *)&cli_addr, &clilent);
+
+ pthread_mutex_unlock(&sock_lock);
+
+ if (sockfd < 0) {
+ perror("ERROR on accept");
+ exit(1);
+ }
+
+ printf("connection established!\n");
+
+ for (;;) {
+ bzero(buff, MAX);
+
+ // read the message from client and copy it in buffer
+ n = read(sockfd, buff, sizeof(buff));
+
+ // socket disconnected
+ if (n <= 0) {
+ pthread_mutex_lock(&sock_lock);
+ close(sockfd);
+ sockfd = -1;
+ pthread_mutex_unlock(&sock_lock);
+
+ sleep(2);
+ break;
+ }
+
+ aee_host_msg_callback(buff, n);
+ }
+ }
+}
+
+#else
+static int
+parse_baudrate(int baud)
+{
+ switch (baud) {
+ case 9600:
+ return B9600;
+ case 19200:
+ return B19200;
+ case 38400:
+ return B38400;
+ case 57600:
+ return B57600;
+ case 115200:
+ return B115200;
+ case 230400:
+ return B230400;
+ case 460800:
+ return B460800;
+ case 500000:
+ return B500000;
+ case 576000:
+ return B576000;
+ case 921600:
+ return B921600;
+ case 1000000:
+ return B1000000;
+ case 1152000:
+ return B1152000;
+ case 1500000:
+ return B1500000;
+ case 2000000:
+ return B2000000;
+ case 2500000:
+ return B2500000;
+ case 3000000:
+ return B3000000;
+ case 3500000:
+ return B3500000;
+ case 4000000:
+ return B4000000;
+ default:
+ return -1;
+ }
+}
+static bool
+uart_init(const char *device, int baudrate, int *fd)
+{
+ int uart_fd;
+ struct termios uart_term;
+
+ uart_fd = open(device, O_RDWR | O_NOCTTY);
+
+ if (uart_fd <= 0)
+ return false;
+
+ memset(&uart_term, 0, sizeof(uart_term));
+ uart_term.c_cflag = baudrate | CS8 | CLOCAL | CREAD;
+ uart_term.c_iflag = IGNPAR;
+ uart_term.c_oflag = 0;
+
+ /* set noncanonical mode */
+ uart_term.c_lflag = 0;
+ uart_term.c_cc[VTIME] = 30;
+ uart_term.c_cc[VMIN] = 1;
+ tcflush(uart_fd, TCIFLUSH);
+
+ if (tcsetattr(uart_fd, TCSANOW, &uart_term) != 0) {
+ close(uart_fd);
+ return false;
+ }
+
+ *fd = uart_fd;
+
+ return true;
+}
+
+static void *
+func_uart_mode(void *arg)
+{
+ int n;
+ char buff[MAX];
+
+ if (!uart_init(uart_device, baudrate, &uartfd)) {
+ printf("open uart fail! %s\n", uart_device);
+ return NULL;
+ }
+
+ for (;;) {
+ bzero(buff, MAX);
+
+ n = read(uartfd, buff, sizeof(buff));
+
+ if (n <= 0) {
+ close(uartfd);
+ uartfd = -1;
+ break;
+ }
+
+ aee_host_msg_callback(buff, n);
+ }
+
+ return NULL;
+}
+
+static int
+uart_send(void *ctx, const char *buf, int size)
+{
+ int ret;
+
+ ret = write(uartfd, buf, size);
+
+ return ret;
+}
+
+static void
+uart_destroy()
+{
+ close(uartfd);
+}
+
+static host_interface interface = { .send = uart_send,
+ .destroy = uart_destroy };
+
+#endif
+
+#ifdef __x86_64__
+static char global_heap_buf[400 * 1024] = { 0 };
+#else
+static char global_heap_buf[270 * 1024] = { 0 };
+#endif
+
+/* clang-format off */
+static void showUsage()
+{
+#ifndef CONNECTION_UART
+ printf("Usage:\n");
+ printf("\nWork as TCP server mode:\n");
+ printf("\tvgl_wasm_runtime -s|--server_mode -p|--port <Port>\n");
+ printf("where\n");
+ printf("\t<Port> represents the port that would be listened on and the default is 8888\n");
+ printf("\nWork as TCP client mode:\n");
+ printf("\tvgl_wasm_runtime -a|--host_address <Host Address> -p|--port <Port>\n");
+ printf("where\n");
+ printf("\t<Host Address> represents the network address of host and the default is 127.0.0.1\n");
+ printf("\t<Port> represents the listen port of host and the default is 8888\n");
+#else
+ printf("Usage:\n");
+ printf("\tvgl_wasm_runtime -u <Uart Device> -b <Baudrate>\n\n");
+ printf("where\n");
+ printf("\t<Uart Device> represents the UART device name and the default is /dev/ttyS2\n");
+ printf("\t<Baudrate> represents the UART device baudrate and the default is 115200\n");
+#endif
+ printf("\nNote:\n");
+ printf("\tUse -w|--wasi_root to specify the root dir (default to '.') of WASI wasm modules. \n");
+}
+/* clang-format on */
+
+static bool
+parse_args(int argc, char *argv[])
+{
+ int c;
+
+ while (1) {
+ int optIndex = 0;
+ static struct option longOpts[] = {
+#ifndef CONNECTION_UART
+ { "server_mode", no_argument, NULL, 's' },
+ { "host_address", required_argument, NULL, 'a' },
+ { "port", required_argument, NULL, 'p' },
+#else
+ { "uart", required_argument, NULL, 'u' },
+ { "baudrate", required_argument, NULL, 'b' },
+#endif
+#if WASM_ENABLE_LIBC_WASI != 0
+ { "wasi_root", required_argument, NULL, 'w' },
+#endif
+ { "help", required_argument, NULL, 'h' },
+ { 0, 0, 0, 0 }
+ };
+
+ c = getopt_long(argc, argv, "sa:p:u:b:w:h", longOpts, &optIndex);
+ if (c == -1)
+ break;
+
+ switch (c) {
+#ifndef CONNECTION_UART
+ case 's':
+ server_mode = true;
+ break;
+ case 'a':
+ host_address = optarg;
+ printf("host address: %s\n", host_address);
+ break;
+ case 'p':
+ port = atoi(optarg);
+ printf("port: %d\n", port);
+ break;
+#else
+ case 'u':
+ uart_device = optarg;
+ printf("uart device: %s\n", uart_device);
+ break;
+ case 'b':
+ baudrate = parse_baudrate(atoi(optarg));
+ printf("uart baudrate: %s\n", optarg);
+ break;
+#endif
+#if WASM_ENABLE_LIBC_WASI != 0
+ case 'w':
+ if (!wasm_set_wasi_root_dir(optarg)) {
+ printf("Fail to set wasi root dir: %s\n", optarg);
+ return false;
+ }
+ break;
+#endif
+ case 'h':
+ showUsage();
+ return false;
+ default:
+ showUsage();
+ return false;
+ }
+ }
+
+ return true;
+}
+
+static NativeSymbol native_symbols[] = {
+ EXPORT_WASM_API_WITH_SIG(display_input_read, "(*)i"),
+ EXPORT_WASM_API_WITH_SIG(display_flush, "(iiii*)"),
+ EXPORT_WASM_API_WITH_SIG(display_fill, "(iiii*)"),
+ EXPORT_WASM_API_WITH_SIG(display_vdb_write, "(*iii*i)"),
+ EXPORT_WASM_API_WITH_SIG(display_map, "(iiii*)"),
+ EXPORT_WASM_API_WITH_SIG(time_get_ms, "()i")
+};
+
+// Driver function
+int
+iwasm_main(int argc, char *argv[])
+{
+ RuntimeInitArgs init_args;
+ korp_tid tid;
+ uint32 n_native_symbols;
+
+ if (!parse_args(argc, argv))
+ return -1;
+
+ memset(&init_args, 0, sizeof(RuntimeInitArgs));
+
+ init_args.mem_alloc_type = Alloc_With_Pool;
+ init_args.mem_alloc_option.pool.heap_buf = global_heap_buf;
+ init_args.mem_alloc_option.pool.heap_size = sizeof(global_heap_buf);
+
+ init_args.native_module_name = "env";
+ init_args.n_native_symbols = sizeof(native_symbols) / sizeof(NativeSymbol);
+ init_args.native_symbols = native_symbols;
+
+ /* initialize runtime environment */
+ if (!wasm_runtime_full_init(&init_args)) {
+ printf("Init runtime environment failed.\n");
+ return -1;
+ }
+
+ if (!init_connection_framework()) {
+ goto fail1;
+ }
+
+ extern void display_SDL_init();
+ display_SDL_init();
+
+ if (!init_sensor_framework()) {
+ goto fail2;
+ }
+
+ /* timer manager */
+ if (!init_wasm_timer()) {
+ goto fail3;
+ }
+
+#ifndef CONNECTION_UART
+ if (server_mode)
+ os_thread_create(&tid, func_server_mode, NULL,
+ BH_APPLET_PRESERVED_STACK_SIZE);
+ else
+ os_thread_create(&tid, func, NULL, BH_APPLET_PRESERVED_STACK_SIZE);
+#else
+ os_thread_create(&tid, func_uart_mode, NULL,
+ BH_APPLET_PRESERVED_STACK_SIZE);
+#endif
+
+ app_manager_startup(&interface);
+
+ exit_wasm_timer();
+
+fail3:
+ exit_sensor_framework();
+
+fail2:
+ exit_connection_framework();
+
+fail1:
+ wasm_runtime_destroy();
+
+ return -1;
+}
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-wasm-runtime/src/platform/linux/main.c b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-wasm-runtime/src/platform/linux/main.c
new file mode 100644
index 000000000..63e24f11d
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-wasm-runtime/src/platform/linux/main.c
@@ -0,0 +1,11 @@
+/*
+ * Copyright (C) 2019 Intel Corporation. All rights reserved.
+ * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+ */
+extern int
+iwasm_main(int argc, char *argv[]);
+int
+main(int argc, char *argv[])
+{
+ return iwasm_main(argc, argv);
+}
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-wasm-runtime/src/platform/linux/mouse.c b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-wasm-runtime/src/platform/linux/mouse.c
new file mode 100644
index 000000000..45eb8cfe5
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-wasm-runtime/src/platform/linux/mouse.c
@@ -0,0 +1,97 @@
+/**
+ * @file mouse.c
+ *
+ */
+
+/*********************
+ * INCLUDES
+ *********************/
+#include "display_indev.h"
+#include "SDL2/SDL.h"
+#if USE_MOUSE != 0
+
+/*********************
+ * DEFINES
+ *********************/
+#ifndef MONITOR_ZOOM
+#define MONITOR_ZOOM 1
+#endif
+
+/**********************
+ * TYPEDEFS
+ **********************/
+
+/**********************
+ * STATIC PROTOTYPES
+ **********************/
+
+/**********************
+ * STATIC VARIABLES
+ **********************/
+static bool left_button_down = false;
+static int16_t last_x = 0;
+static int16_t last_y = 0;
+
+/**********************
+ * MACROS
+ **********************/
+
+/**********************
+ * GLOBAL FUNCTIONS
+ **********************/
+
+/**
+ * Initialize the mouse
+ */
+void
+mouse_init(void)
+{}
+
+/**
+ * Get the current position and state of the mouse
+ * @param data store the mouse data here
+ * @return false: because the points are not buffered, so no more data to be
+ * read
+ */
+bool
+mouse_read(lv_indev_data_t *data)
+{
+ /*Store the collected data*/
+ data->point.x = last_x;
+ data->point.y = last_y;
+ data->state = left_button_down ? LV_INDEV_STATE_PR : LV_INDEV_STATE_REL;
+
+ return false;
+}
+
+/**
+ * It will be called from the main SDL thread
+ */
+void
+mouse_handler(SDL_Event *event)
+{
+ switch (event->type) {
+ case SDL_MOUSEBUTTONUP:
+ if (event->button.button == SDL_BUTTON_LEFT)
+ left_button_down = false;
+ break;
+ case SDL_MOUSEBUTTONDOWN:
+ if (event->button.button == SDL_BUTTON_LEFT) {
+ left_button_down = true;
+ last_x = event->motion.x / MONITOR_ZOOM;
+ last_y = event->motion.y / MONITOR_ZOOM;
+ }
+ break;
+ case SDL_MOUSEMOTION:
+ last_x = event->motion.x / MONITOR_ZOOM;
+ last_y = event->motion.y / MONITOR_ZOOM;
+
+ break;
+ }
+}
+
+/**********************
+ * STATIC FUNCTIONS
+ **********************/
+
+#endif
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-wasm-runtime/src/platform/zephyr/LICENSE b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-wasm-runtime/src/platform/zephyr/LICENSE
new file mode 100644
index 000000000..8f71f43fe
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-wasm-runtime/src/platform/zephyr/LICENSE
@@ -0,0 +1,202 @@
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "{}"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright {yyyy} {name of copyright owner}
+
+ 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.
+
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-wasm-runtime/src/platform/zephyr/XPT2046.c b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-wasm-runtime/src/platform/zephyr/XPT2046.c
new file mode 100644
index 000000000..d59b6c9b7
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-wasm-runtime/src/platform/zephyr/XPT2046.c
@@ -0,0 +1,345 @@
+/**
+ * @file XPT2046.c
+ */
+/*********************
+ * INCLUDES
+ *********************/
+#include "XPT2046.h"
+#include "board_config.h"
+#include "stdio.h"
+#include <string.h>
+#include "drivers/spi.h"
+
+#include "zephyr.h"
+#include "kernel.h"
+
+#if USE_XPT2046
+
+#include <stddef.h>
+
+#define abs(x) ((x) < 0 ? -(x) : (x))
+
+/*********************
+ * DEFINES
+ *********************/
+
+/**********************
+ * TYPEDEFS
+ **********************/
+
+/**********************
+ * STATIC PROTOTYPES
+ **********************/
+static void
+xpt2046_corr(int16_t *x, int16_t *y);
+#if 0
+static void xpt2046_avg(int16_t * x, int16_t * y);
+#endif
+
+/**********************
+ * STATIC VARIABLES
+ **********************/
+int16_t avg_buf_x[XPT2046_AVG];
+int16_t avg_buf_y[XPT2046_AVG];
+uint8_t avg_last;
+
+/**********************
+ * MACROS
+ **********************/
+
+/**********************
+ * GLOBAL FUNCTIONS
+ **********************/
+
+/**
+ * Initialize the XPT2046
+ */
+struct device *input_dev;
+
+struct spi_config spi_conf_xpt2046;
+struct spi_cs_control xpt2046_cs_ctrl;
+struct device *xpt2046_pen_gpio_dev;
+static struct gpio_callback gpio_cb;
+lv_indev_data_t touch_point;
+lv_indev_data_t last_touch_point;
+
+#define TOUCH_READ_THREAD_STACK_SIZE 4096
+static K_THREAD_STACK_DEFINE(touch_read_thread_stack,
+ TOUCH_READ_THREAD_STACK_SIZE);
+static struct k_thread touch_thread_data;
+static struct k_sem sem_touch_read;
+
+K_MUTEX_DEFINE(spi_display_touch_mutex);
+
+int cnt = 0;
+int touch_read_times = 0;
+int last_pen_interrupt_time = 0;
+
+void
+xpt2046_pen_gpio_callback(struct device *port, struct gpio_callback *cb,
+ uint32_t pins)
+{
+ cnt++;
+ if ((k_uptime_get_32() - last_pen_interrupt_time) > 500) {
+ k_sem_give(&sem_touch_read);
+ touch_read_times++;
+ last_pen_interrupt_time = k_uptime_get_32();
+ }
+}
+
+void
+disable_pen_interrupt()
+{
+ int ret = 0;
+ ret = gpio_disable_callback(xpt2046_pen_gpio_dev, XPT2046_PEN_GPIO_PIN);
+ if (ret != 0) {
+ printf("gpio_pin_configure GPIO_INPUT failed\n");
+ }
+}
+void
+enable_pen_interrupt()
+{
+ int ret = 0;
+ ret = gpio_enable_callback(xpt2046_pen_gpio_dev, XPT2046_PEN_GPIO_PIN);
+ if (ret != 0) {
+ printf("gpio_pin_configure failed\n");
+ }
+}
+
+void
+touch_screen_read_thread()
+{
+ int i;
+ bool ret = false;
+
+ for (;;) {
+ k_sem_take(&sem_touch_read, K_FOREVER);
+ memset(&last_touch_point, 0, sizeof(lv_indev_data_t));
+ memset(&touch_point, 0, sizeof(lv_indev_data_t));
+ memset(avg_buf_x, 0, sizeof(avg_buf_x));
+ memset(avg_buf_y, 0, sizeof(avg_buf_y));
+ k_mutex_lock(&spi_display_touch_mutex, K_FOREVER);
+ disable_pen_interrupt();
+ for (i = 0; i < 100; i++) {
+ ret = xpt2046_read(&touch_point);
+ if (ret) {
+ if ((abs(last_touch_point.point.x - touch_point.point.x) < 4)
+ && (abs(last_touch_point.point.y - touch_point.point.y)
+ < 4)) {
+ break;
+ }
+ last_touch_point = touch_point;
+ }
+ }
+ enable_pen_interrupt();
+ k_mutex_unlock(&spi_display_touch_mutex);
+ }
+}
+
+void
+xpt2046_init(void)
+{
+ int ret;
+ input_dev = device_get_binding(XPT2046_SPI_DEVICE_NAME);
+
+ if (input_dev == NULL) {
+ printf("device not found. Aborting test.");
+ return;
+ }
+ memset((void *)&touch_point, 0, sizeof(lv_indev_data_t));
+
+ spi_conf_xpt2046.frequency = XPT2046_SPI_MAX_FREQUENCY;
+ spi_conf_xpt2046.operation = SPI_OP_MODE_MASTER | SPI_WORD_SET(8);
+ spi_conf_xpt2046.slave = 0;
+ spi_conf_xpt2046.cs = NULL;
+#ifdef XPT2046_CS_GPIO_CONTROLLER
+ xpt2046_cs_ctrl.gpio_dev = device_get_binding(XPT2046_CS_GPIO_CONTROLLER);
+ if (xpt2046_cs_ctrl.gpio_dev == NULL) {
+ printk("Cannot find %s!\n", XPT2046_CS_GPIO_CONTROLLER);
+ return;
+ }
+ gpio_pin_configure(xpt2046_cs_ctrl.gpio_dev, XPT2046_CS_GPIO_PIN,
+ GPIO_OUTPUT);
+ gpio_pin_set(xpt2046_cs_ctrl.gpio_dev, XPT2046_CS_GPIO_PIN, 1);
+ xpt2046_cs_ctrl.gpio_pin = XPT2046_CS_GPIO_PIN;
+ xpt2046_cs_ctrl.delay = 0;
+ spi_conf_xpt2046.cs = &xpt2046_cs_ctrl;
+
+#endif
+
+#ifdef XPT2046_PEN_GPIO_CONTROLLER
+
+ xpt2046_pen_gpio_dev = device_get_binding(XPT2046_PEN_GPIO_CONTROLLER);
+ if (!xpt2046_pen_gpio_dev) {
+ printk("Cannot find %s!\n", XPT2046_PEN_GPIO_CONTROLLER);
+ return;
+ }
+ /* Setup GPIO input */
+ ret = gpio_pin_configure(xpt2046_pen_gpio_dev, XPT2046_PEN_GPIO_PIN,
+ (GPIO_INPUT | GPIO_INT_ENABLE | GPIO_INT_EDGE
+ | GPIO_INT_LOW_0 | GPIO_INT_DEBOUNCE));
+ if (ret) {
+ printk("Error configuring pin %d!\n", XPT2046_PEN_GPIO_PIN);
+ }
+
+ gpio_init_callback(&gpio_cb, xpt2046_pen_gpio_callback,
+ BIT(XPT2046_PEN_GPIO_PIN));
+
+ ret = gpio_add_callback(xpt2046_pen_gpio_dev, &gpio_cb);
+ if (ret) {
+ printk("gpio_add_callback error\n");
+ }
+ ret = gpio_enable_callback(xpt2046_pen_gpio_dev, XPT2046_PEN_GPIO_PIN);
+ if (ret) {
+ printk("gpio_enable_callback error\n");
+ }
+#endif
+
+ k_sem_init(&sem_touch_read, 0, 1);
+
+ k_thread_create(&touch_thread_data, touch_read_thread_stack,
+ TOUCH_READ_THREAD_STACK_SIZE, touch_screen_read_thread,
+ NULL, NULL, NULL, 5, 0, K_NO_WAIT);
+ printf("xpt2046_init ok \n");
+}
+
+/**
+ * Get the current position and state of the touchpad
+ * @param data store the read data here
+ * @return false: because no ore data to be read
+ */
+bool
+xpt2046_read(lv_indev_data_t *data)
+{
+ static int16_t last_x = 0;
+ static int16_t last_y = 0;
+ bool valid = true;
+ int s32_ret = 0;
+
+ int16_t x = 0;
+ int16_t y = 0;
+
+ char tx1[16] = { 0 };
+ char rx1[16] = { 0 };
+
+ struct spi_buf tx_buf = { .buf = &tx1, .len = 3 };
+ struct spi_buf_set tx_bufs = { .buffers = &tx_buf, .count = 1 };
+ struct spi_buf rx_buf = { .buf = &rx1, .len = 3 };
+ struct spi_buf_set rx_bufs = { .buffers = &rx_buf, .count = 1 };
+
+ tx1[0] = CMD_X_READ;
+ s32_ret = spi_transceive(input_dev, &spi_conf_xpt2046, &tx_bufs, &rx_bufs);
+ if (s32_ret != 0) {
+ printf("spi_transceive return failed:%d\n", s32_ret);
+ }
+ x = rx1[1] << 8;
+ x += rx1[2];
+
+ tx1[0] = CMD_Y_READ;
+ s32_ret = spi_transceive(input_dev, &spi_conf_xpt2046, &tx_bufs, &rx_bufs);
+ if (s32_ret != 0) {
+ printf("spi_transceive return failed:%d\n", s32_ret);
+ }
+ y = rx1[1] << 8;
+ y += rx1[2];
+ x = x >> 3;
+ y = y >> 3;
+
+ xpt2046_corr(&x, &y);
+ if (y <= 0 || (x > 320)) {
+ valid = false;
+ }
+
+ last_x = x;
+ last_y = y;
+
+ data->point.x = x;
+ data->point.y = y;
+ data->state = valid == false ? LV_INDEV_STATE_REL : LV_INDEV_STATE_PR;
+
+ return valid;
+}
+
+/**********************
+ * STATIC FUNCTIONS
+ **********************/
+static void
+xpt2046_corr(int16_t *x, int16_t *y)
+{
+#if XPT2046_XY_SWAP != 0
+ int16_t swap_tmp;
+ swap_tmp = *x;
+ *x = *y;
+ *y = swap_tmp;
+#endif
+
+ if ((*x) > XPT2046_X_MIN)
+ (*x) -= XPT2046_X_MIN;
+ else
+ (*x) = 0;
+
+ if ((*y) > XPT2046_Y_MIN)
+ (*y) -= XPT2046_Y_MIN;
+ else
+ (*y) = 0;
+
+ (*x) = (uint32_t)((uint32_t)(*x) * XPT2046_HOR_RES)
+ / (XPT2046_X_MAX - XPT2046_X_MIN);
+
+ (*y) = (uint32_t)((uint32_t)(*y) * XPT2046_VER_RES)
+ / (XPT2046_Y_MAX - XPT2046_Y_MIN);
+
+#if XPT2046_X_INV != 0
+ (*x) = XPT2046_HOR_RES - (*x);
+#endif
+
+#if XPT2046_Y_INV != 0
+ (*y) = XPT2046_VER_RES - (*y);
+#endif
+}
+
+#if 0
+static void xpt2046_avg(int16_t * x, int16_t * y)
+{
+ /*Shift out the oldest data*/
+ uint8_t i;
+ for (i = XPT2046_AVG - 1; i > 0; i--) {
+ avg_buf_x[i] = avg_buf_x[i - 1];
+ avg_buf_y[i] = avg_buf_y[i - 1];
+ }
+
+ /*Insert the new point*/
+ avg_buf_x[0] = *x;
+ avg_buf_y[0] = *y;
+ if (avg_last < XPT2046_AVG)
+ avg_last++;
+
+ /*Sum the x and y coordinates*/
+ int32_t x_sum = 0;
+ int32_t y_sum = 0;
+ for (i = 0; i < avg_last; i++) {
+ x_sum += avg_buf_x[i];
+ y_sum += avg_buf_y[i];
+ }
+
+ /*Normalize the sums*/
+ (*x) = (int32_t) x_sum / avg_last;
+ (*y) = (int32_t) y_sum / avg_last;
+}
+#endif
+
+bool
+touchscreen_read(lv_indev_data_t *data)
+{
+ /*Store the collected data*/
+ data->point.x = last_touch_point.point.x;
+ data->point.y = last_touch_point.point.y;
+ data->state = last_touch_point.state;
+
+ if (last_touch_point.state == LV_INDEV_STATE_PR) {
+ last_touch_point.state = LV_INDEV_STATE_REL;
+ }
+ return false;
+}
+
+#endif
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-wasm-runtime/src/platform/zephyr/XPT2046.h b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-wasm-runtime/src/platform/zephyr/XPT2046.h
new file mode 100644
index 000000000..3cd3a571d
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-wasm-runtime/src/platform/zephyr/XPT2046.h
@@ -0,0 +1,87 @@
+/**
+ * @file XPT2046.h
+ *
+ */
+
+#ifndef XPT2046_H
+#define XPT2046_H
+
+#define USE_XPT2046 1
+
+#define XPT2046_HOR_RES 320
+#define XPT2046_VER_RES 240
+#define XPT2046_X_MIN 200
+#define XPT2046_Y_MIN 200
+#define XPT2046_X_MAX 3800
+#define XPT2046_Y_MAX 3800
+#define XPT2046_AVG 4
+#define XPT2046_INV 0
+
+#define CMD_X_READ 0b10010000
+#define CMD_Y_READ 0b11010000
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*********************
+ * INCLUDES
+ *********************/
+
+#if USE_XPT2046
+#include <autoconf.h>
+#include <stdint.h>
+#include <stdbool.h>
+//#include "lvgl/lv_hal/lv_hal_indev.h"
+#include "device.h"
+#include "drivers/gpio.h"
+#if 1
+enum { LV_INDEV_STATE_REL = 0, LV_INDEV_STATE_PR };
+typedef uint8_t lv_indev_state_t;
+typedef int16_t lv_coord_t;
+typedef struct {
+ lv_coord_t x;
+ lv_coord_t y;
+} lv_point_t;
+
+typedef struct {
+ union {
+ lv_point_t
+ point; /*For LV_INDEV_TYPE_POINTER the currently pressed point*/
+ uint32_t key; /*For LV_INDEV_TYPE_KEYPAD the currently pressed key*/
+ uint32_t btn; /*For LV_INDEV_TYPE_BUTTON the currently pressed button*/
+ int16_t enc_diff; /*For LV_INDEV_TYPE_ENCODER number of steps since the
+ previous read*/
+ };
+ void *user_data; /*'lv_indev_drv_t.priv' for this driver*/
+ lv_indev_state_t state; /*LV_INDEV_STATE_REL or LV_INDEV_STATE_PR*/
+} lv_indev_data_t;
+#endif
+
+/*********************
+ * DEFINES
+ *********************/
+
+/**********************
+ * TYPEDEFS
+ **********************/
+
+/**********************
+ * GLOBAL PROTOTYPES
+ **********************/
+void
+xpt2046_init(void);
+bool
+xpt2046_read(lv_indev_data_t *data);
+
+/**********************
+ * MACROS
+ **********************/
+
+#endif /* USE_XPT2046 */
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* XPT2046_H */
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-wasm-runtime/src/platform/zephyr/board_config.h b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-wasm-runtime/src/platform/zephyr/board_config.h
new file mode 100644
index 000000000..d7ea279a9
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-wasm-runtime/src/platform/zephyr/board_config.h
@@ -0,0 +1,9 @@
+/*
+ * Copyright (C) 2019 Intel Corporation. All rights reserved.
+ * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+ */
+#ifndef __BOARD_CONFIG_H__
+#define __BOARD_CONFIG_H__
+#include "pin_config_stm32.h"
+
+#endif /* __BOARD_CONFIG_H__ */
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-wasm-runtime/src/platform/zephyr/display.h b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-wasm-runtime/src/platform/zephyr/display.h
new file mode 100644
index 000000000..c6657a40a
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-wasm-runtime/src/platform/zephyr/display.h
@@ -0,0 +1,418 @@
+/*
+ * Copyright (c) 2017 Jan Van Winkel <jan.van_winkel@dxplore.eu>
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+/**
+ * @file
+ * @brief Public API for display drivers and applications
+ */
+
+#ifndef ZEPHYR_INCLUDE_DISPLAY_H_
+#define ZEPHYR_INCLUDE_DISPLAY_H_
+
+/**
+ * @brief Display Interface
+ * @defgroup display_interface Display Interface
+ * @ingroup display_interfaces
+ * @{
+ */
+
+#include <device.h>
+#include <stddef.h>
+#include <zephyr/types.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+enum display_pixel_format {
+ PIXEL_FORMAT_RGB_888 = BIT(0),
+ PIXEL_FORMAT_MONO01 = BIT(1), /* 0=Black 1=White */
+ PIXEL_FORMAT_MONO10 = BIT(2), /* 1=Black 0=White */
+ PIXEL_FORMAT_ARGB_8888 = BIT(3),
+ PIXEL_FORMAT_RGB_565 = BIT(4),
+};
+
+enum display_screen_info {
+ /**
+ * If selected, one octet represents 8 pixels ordered vertically,
+ * otherwise ordered horizontally.
+ */
+ SCREEN_INFO_MONO_VTILED = BIT(0),
+ /**
+ * If selected, the MSB represents the first pixel,
+ * otherwise MSB represents the last pixel.
+ */
+ SCREEN_INFO_MONO_MSB_FIRST = BIT(1),
+ /**
+ * Electrophoretic Display.
+ */
+ SCREEN_INFO_EPD = BIT(2),
+ /**
+ * Screen has two alternating ram buffers
+ */
+ SCREEN_INFO_DOUBLE_BUFFER = BIT(3),
+};
+
+/**
+ * @enum display_orientation
+ * @brief Enumeration with possible display orientation
+ *
+ */
+enum display_orientation {
+ DISPLAY_ORIENTATION_NORMAL,
+ DISPLAY_ORIENTATION_ROTATED_90,
+ DISPLAY_ORIENTATION_ROTATED_180,
+ DISPLAY_ORIENTATION_ROTATED_270,
+};
+
+/**
+ * @struct display_capabilities
+ * @brief Structure holding display capabilities
+ *
+ * @var u16_t display_capabilities::x_resolution
+ * Display resolution in the X direction
+ *
+ * @var u16_t display_capabilities::y_resolution
+ * Display resolution in the Y direction
+ *
+ * @var u32_t display_capabilities::supported_pixel_formats
+ * Bitwise or of pixel formats supported by the display
+ *
+ * @var u32_t display_capabilities::screen_info
+ * Information about display panel
+ *
+ * @var enum display_pixel_format display_capabilities::current_pixel_format
+ * Currently active pixel format for the display
+ *
+ * @var enum display_orientation display_capabilities::current_orientation
+ * Current display orientation
+ *
+ */
+struct display_capabilities {
+ uint16_t x_resolution;
+ uint16_t y_resolution;
+ uint32_t supported_pixel_formats;
+ uint32_t screen_info;
+ enum display_pixel_format current_pixel_format;
+ enum display_orientation current_orientation;
+};
+
+/**
+ * @struct display_buffer_descriptor
+ * @brief Structure to describe display data buffer layout
+ *
+ * @var u32_t display_buffer_descriptor::buf_size
+ * Data buffer size in bytes
+ *
+ * @var u16_t display_buffer_descriptor::width
+ * Data buffer row width in pixels
+ *
+ * @var u16_t display_buffer_descriptor::height
+ * Data buffer column height in pixels
+ *
+ * @var u16_t display_buffer_descriptor::pitch
+ * Number of pixels between consecutive rows in the data buffer
+ *
+ */
+struct display_buffer_descriptor {
+ uint32_t buf_size;
+ uint16_t width;
+ uint16_t height;
+ uint16_t pitch;
+};
+
+/**
+ * @typedef display_blanking_on_api
+ * @brief Callback API to turn on display blanking
+ * See display_blanking_on() for argument description
+ */
+typedef int (*display_blanking_on_api)(const struct device *dev);
+
+/**
+ * @typedef display_blanking_off_api
+ * @brief Callback API to turn off display blanking
+ * See display_blanking_off() for argument description
+ */
+typedef int (*display_blanking_off_api)(const struct device *dev);
+
+/**
+ * @typedef display_write_api
+ * @brief Callback API for writing data to the display
+ * See display_write() for argument description
+ */
+typedef int (*display_write_api)(const struct device *dev, const uint16_t x,
+ const uint16_t y,
+ const struct display_buffer_descriptor *desc,
+ const void *buf);
+
+/**
+ * @typedef display_read_api
+ * @brief Callback API for reading data from the display
+ * See display_read() for argument description
+ */
+typedef int (*display_read_api)(const struct device *dev, const uint16_t x,
+ const uint16_t y,
+ const struct display_buffer_descriptor *desc,
+ void *buf);
+
+/**
+ * @typedef display_get_framebuffer_api
+ * @brief Callback API to get framebuffer pointer
+ * See display_get_framebuffer() for argument description
+ */
+typedef void *(*display_get_framebuffer_api)(const struct device *dev);
+
+/**
+ * @typedef display_set_brightness_api
+ * @brief Callback API to set display brightness
+ * See display_set_brightness() for argument description
+ */
+typedef int (*display_set_brightness_api)(const struct device *dev,
+ const uint8_t brightness);
+
+/**
+ * @typedef display_set_contrast_api
+ * @brief Callback API to set display contrast
+ * See display_set_contrast() for argument description
+ */
+typedef int (*display_set_contrast_api)(const struct device *dev,
+ const uint8_t contrast);
+
+/**
+ * @typedef display_get_capabilities_api
+ * @brief Callback API to get display capabilities
+ * See display_get_capabilities() for argument description
+ */
+typedef void (*display_get_capabilities_api)(
+ const struct device *dev, struct display_capabilities *capabilities);
+
+/**
+ * @typedef display_set_pixel_format_api
+ * @brief Callback API to set pixel format used by the display
+ * See display_set_pixel_format() for argument description
+ */
+typedef int (*display_set_pixel_format_api)(
+ const struct device *dev, const enum display_pixel_format pixel_format);
+
+/**
+ * @typedef display_set_orientation_api
+ * @brief Callback API to set orientation used by the display
+ * See display_set_orientation() for argument description
+ */
+typedef int (*display_set_orientation_api)(
+ const struct device *dev, const enum display_orientation orientation);
+
+/**
+ * @brief Display driver API
+ * API which a display driver should expose
+ */
+struct display_driver_api {
+ display_blanking_on_api blanking_on;
+ display_blanking_off_api blanking_off;
+ display_write_api write;
+ display_read_api read;
+ display_get_framebuffer_api get_framebuffer;
+ display_set_brightness_api set_brightness;
+ display_set_contrast_api set_contrast;
+ display_get_capabilities_api get_capabilities;
+ display_set_pixel_format_api set_pixel_format;
+ display_set_orientation_api set_orientation;
+};
+extern struct ili9340_data ili9340_data1;
+extern struct display_driver_api ili9340_api1;
+/**
+ * @brief Write data to display
+ *
+ * @param dev Pointer to device structure
+ * @param x x Coordinate of the upper left corner where to write the buffer
+ * @param y y Coordinate of the upper left corner where to write the buffer
+ * @param desc Pointer to a structure describing the buffer layout
+ * @param buf Pointer to buffer array
+ *
+ * @retval 0 on success else negative errno code.
+ */
+static inline int
+display_write(const struct device *dev, const uint16_t x, const uint16_t y,
+ const struct display_buffer_descriptor *desc, const void *buf)
+{
+ struct display_driver_api *api = &ili9340_api1;
+ //(struct display_driver_api *)dev->driver_api;
+
+ return api->write(dev, x, y, desc, buf);
+}
+
+/**
+ * @brief Read data from display
+ *
+ * @param dev Pointer to device structure
+ * @param x x Coordinate of the upper left corner where to read from
+ * @param y y Coordinate of the upper left corner where to read from
+ * @param desc Pointer to a structure describing the buffer layout
+ * @param buf Pointer to buffer array
+ *
+ * @retval 0 on success else negative errno code.
+ */
+static inline int
+display_read(const struct device *dev, const uint16_t x, const uint16_t y,
+ const struct display_buffer_descriptor *desc, void *buf)
+{
+ struct display_driver_api *api = &ili9340_api1;
+ //(struct display_driver_api *)dev->driver_api;
+
+ return api->read(dev, x, y, desc, buf);
+}
+
+/**
+ * @brief Get pointer to framebuffer for direct access
+ *
+ * @param dev Pointer to device structure
+ *
+ * @retval Pointer to frame buffer or NULL if direct framebuffer access
+ * is not supported
+ *
+ */
+static inline void *
+display_get_framebuffer(const struct device *dev)
+{
+ struct display_driver_api *api = &ili9340_api1;
+ //(struct display_driver_api *)dev->driver_api;
+
+ return api->get_framebuffer(dev);
+}
+
+/**
+ * @brief Turn display blanking on
+ *
+ * @param dev Pointer to device structure
+ *
+ * @retval 0 on success else negative errno code.
+ */
+static inline int
+display_blanking_on(const struct device *dev)
+{
+ struct display_driver_api *api = &ili9340_api1;
+ //(struct display_driver_api *)dev->driver_api;
+
+ return api->blanking_on(dev);
+}
+
+/**
+ * @brief Turn display blanking off
+ *
+ * @param dev Pointer to device structure
+ *
+ * @retval 0 on success else negative errno code.
+ */
+static inline int
+display_blanking_off(const struct device *dev)
+{
+ struct display_driver_api *api = &ili9340_api1;
+ //(struct display_driver_api *)dev->driver_api;
+
+ return api->blanking_off(dev);
+}
+
+/**
+ * @brief Set the brightness of the display
+ *
+ * Set the brightness of the display in steps of 1/256, where 255 is full
+ * brightness and 0 is minimal.
+ *
+ * @param dev Pointer to device structure
+ * @param brightness Brightness in steps of 1/256
+ *
+ * @retval 0 on success else negative errno code.
+ */
+static inline int
+display_set_brightness(const struct device *dev, uint8_t brightness)
+{
+ struct display_driver_api *api = &ili9340_api1;
+ //(struct display_driver_api *)dev->driver_api;
+
+ return api->set_brightness(dev, brightness);
+}
+
+/**
+ * @brief Set the contrast of the display
+ *
+ * Set the contrast of the display in steps of 1/256, where 255 is maximum
+ * difference and 0 is minimal.
+ *
+ * @param dev Pointer to device structure
+ * @param contrast Contrast in steps of 1/256
+ *
+ * @retval 0 on success else negative errno code.
+ */
+static inline int
+display_set_contrast(const struct device *dev, uint8_t contrast)
+{
+ struct display_driver_api *api = &ili9340_api1;
+ //(struct display_driver_api *)dev->driver_api;
+
+ return api->set_contrast(dev, contrast);
+}
+
+/**
+ * @brief Get display capabilities
+ *
+ * @param dev Pointer to device structure
+ * @param capabilities Pointer to capabilities structure to populate
+ */
+static inline void
+display_get_capabilities(const struct device *dev,
+ struct display_capabilities *capabilities)
+{
+ struct display_driver_api *api = &ili9340_api1;
+ //(struct display_driver_api *)dev->driver_api;
+
+ api->get_capabilities(dev, capabilities);
+}
+
+/**
+ * @brief Set pixel format used by the display
+ *
+ * @param dev Pointer to device structure
+ * @param pixel_format Pixel format to be used by display
+ *
+ * @retval 0 on success else negative errno code.
+ */
+static inline int
+display_set_pixel_format(const struct device *dev,
+ const enum display_pixel_format pixel_format)
+{
+ struct display_driver_api *api = &ili9340_api1;
+ //(struct display_driver_api *)dev->driver_api;
+
+ return api->set_pixel_format(dev, pixel_format);
+}
+
+/**
+ * @brief Set display orientation
+ *
+ * @param dev Pointer to device structure
+ * @param orientation Orientation to be used by display
+ *
+ * @retval 0 on success else negative errno code.
+ */
+static inline int
+display_set_orientation(const struct device *dev,
+ const enum display_orientation orientation)
+{
+ struct display_driver_api *api = &ili9340_api1;
+ //(struct display_driver_api *)dev->driver_api;
+
+ return api->set_orientation(dev, orientation);
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+/**
+ * @}
+ */
+
+#endif /* ZEPHYR_INCLUDE_DISPLAY_H_*/
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-wasm-runtime/src/platform/zephyr/display_ili9340.c b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-wasm-runtime/src/platform/zephyr/display_ili9340.c
new file mode 100644
index 000000000..e5b0d771a
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-wasm-runtime/src/platform/zephyr/display_ili9340.c
@@ -0,0 +1,284 @@
+/*
+ * Copyright (c) 2017 Jan Van Winkel <jan.van_winkel@dxplore.eu>
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+#include "display_ili9340.h"
+#include <display.h>
+
+//#define LOG_LEVEL CONFIG_DISPLAY_LOG_LEVEL
+//#include <logging/log.h>
+// LOG_MODULE_REGISTER(display_ili9340);
+#define LOG_ERR printf
+#define LOG_DBG printf
+#define LOG_WRN printf
+
+#include <drivers/gpio.h>
+#include <sys/byteorder.h>
+#include <drivers/spi.h>
+#include <string.h>
+#include <stdio.h>
+
+struct ili9340_data {
+ struct device *reset_gpio;
+ struct device *command_data_gpio;
+ struct device *spi_dev;
+ struct spi_config spi_config;
+#ifdef DT_ILITEK_ILI9340_0_CS_GPIO_CONTROLLER
+ struct spi_cs_control cs_ctrl;
+#endif
+};
+
+struct ili9340_data ili9340_data1;
+
+#define ILI9340_CMD_DATA_PIN_COMMAND 0
+#define ILI9340_CMD_DATA_PIN_DATA 1
+
+static void
+ili9340_exit_sleep(struct ili9340_data *data)
+{
+ ili9340_transmit(data, ILI9340_CMD_EXIT_SLEEP, NULL, 0);
+ // k_sleep(Z_TIMEOUT_MS(120));
+}
+
+int
+ili9340_init()
+{
+ struct ili9340_data *data = &ili9340_data1;
+
+ printf("Initializing display driver\n");
+ data->spi_dev = device_get_binding(DT_ILITEK_ILI9340_0_BUS_NAME);
+ if (data->spi_dev == NULL) {
+ return -EPERM;
+ }
+ data->spi_config.frequency = DT_ILITEK_ILI9340_0_SPI_MAX_FREQUENCY;
+ data->spi_config.operation =
+ SPI_OP_MODE_MASTER
+ | SPI_WORD_SET(8); // SPI_OP_MODE_MASTER | SPI_WORD_SET(8);
+ data->spi_config.slave = DT_ILITEK_ILI9340_0_BASE_ADDRESS;
+
+#ifdef DT_ILITEK_ILI9340_0_CS_GPIO_CONTROLLER
+ data->cs_ctrl.gpio_dev =
+ device_get_binding(DT_ILITEK_ILI9340_0_CS_GPIO_CONTROLLER);
+ data->cs_ctrl.gpio_pin = DT_ILITEK_ILI9340_0_CS_GPIO_PIN;
+ data->cs_ctrl.delay = 0;
+ data->spi_config.cs = &(data->cs_ctrl);
+#else
+ data->spi_config.cs = NULL;
+#endif
+ data->reset_gpio =
+ device_get_binding(DT_ILITEK_ILI9340_0_RESET_GPIOS_CONTROLLER);
+ if (data->reset_gpio == NULL) {
+ return -EPERM;
+ }
+
+ gpio_pin_configure(data->reset_gpio, DT_ILITEK_ILI9340_0_RESET_GPIOS_PIN,
+ GPIO_OUTPUT);
+
+ data->command_data_gpio =
+ device_get_binding(DT_ILITEK_ILI9340_0_CMD_DATA_GPIOS_CONTROLLER);
+ if (data->command_data_gpio == NULL) {
+ return -EPERM;
+ }
+
+ gpio_pin_configure(data->command_data_gpio,
+ DT_ILITEK_ILI9340_0_CMD_DATA_GPIOS_PIN, GPIO_OUTPUT);
+
+ LOG_DBG("Resetting display driver\n");
+ gpio_pin_set(data->reset_gpio, DT_ILITEK_ILI9340_0_RESET_GPIOS_PIN, 1);
+ k_sleep(Z_TIMEOUT_MS(1));
+ gpio_pin_set(data->reset_gpio, DT_ILITEK_ILI9340_0_RESET_GPIOS_PIN, 0);
+ k_sleep(Z_TIMEOUT_MS(1));
+ gpio_pin_set(data->reset_gpio, DT_ILITEK_ILI9340_0_RESET_GPIOS_PIN, 1);
+ k_sleep(Z_TIMEOUT_MS(5));
+
+ LOG_DBG("Initializing LCD\n");
+ ili9340_lcd_init(data);
+
+ LOG_DBG("Exiting sleep mode\n");
+ ili9340_exit_sleep(data);
+
+ return 0;
+}
+
+static void
+ili9340_set_mem_area(struct ili9340_data *data, const uint16_t x,
+ const uint16_t y, const uint16_t w, const uint16_t h)
+{
+ uint16_t spi_data[2];
+
+ spi_data[0] = sys_cpu_to_be16(x);
+ spi_data[1] = sys_cpu_to_be16(x + w - 1);
+ ili9340_transmit(data, ILI9340_CMD_COLUMN_ADDR, &spi_data[0], 4);
+
+ spi_data[0] = sys_cpu_to_be16(y);
+ spi_data[1] = sys_cpu_to_be16(y + h - 1);
+ ili9340_transmit(data, ILI9340_CMD_PAGE_ADDR, &spi_data[0], 4);
+}
+
+static int
+ili9340_write(const struct device *dev, const uint16_t x, const uint16_t y,
+ const struct display_buffer_descriptor *desc, const void *buf)
+{
+ struct ili9340_data *data = (struct ili9340_data *)&ili9340_data1;
+ const uint8_t *write_data_start = (uint8_t *)buf;
+ struct spi_buf tx_buf;
+ struct spi_buf_set tx_bufs;
+ uint16_t write_cnt;
+ uint16_t nbr_of_writes;
+ uint16_t write_h;
+
+ __ASSERT(desc->width <= desc->pitch, "Pitch is smaller then width");
+ __ASSERT((3 * desc->pitch * desc->height) <= desc->buf_size,
+ "Input buffer to small");
+ ili9340_set_mem_area(data, x, y, desc->width, desc->height);
+
+ if (desc->pitch > desc->width) {
+ write_h = 1U;
+ nbr_of_writes = desc->height;
+ }
+ else {
+ write_h = desc->height;
+ nbr_of_writes = 1U;
+ }
+ ili9340_transmit(data, ILI9340_CMD_MEM_WRITE, (void *)write_data_start,
+ 3 * desc->width * write_h);
+
+ tx_bufs.buffers = &tx_buf;
+ tx_bufs.count = 1;
+
+ write_data_start += (3 * desc->pitch);
+ for (write_cnt = 1U; write_cnt < nbr_of_writes; ++write_cnt) {
+ tx_buf.buf = (void *)write_data_start;
+ tx_buf.len = 3 * desc->width * write_h;
+ spi_transceive(data->spi_dev, &data->spi_config, &tx_bufs, NULL);
+ write_data_start += (3 * desc->pitch);
+ }
+
+ return 0;
+}
+
+static int
+ili9340_read(const struct device *dev, const uint16_t x, const uint16_t y,
+ const struct display_buffer_descriptor *desc, void *buf)
+{
+ LOG_ERR("Reading not supported\n");
+ return -ENOTSUP;
+}
+
+static void *
+ili9340_get_framebuffer(const struct device *dev)
+{
+ LOG_ERR("Direct framebuffer access not supported\n");
+ return NULL;
+}
+
+static int
+ili9340_display_blanking_off(const struct device *dev)
+{
+ struct ili9340_data *data = (struct ili9340_data *)dev->driver_data;
+
+ LOG_DBG("Turning display blanking off\n");
+ ili9340_transmit(data, ILI9340_CMD_DISPLAY_ON, NULL, 0);
+ return 0;
+}
+
+static int
+ili9340_display_blanking_on(const struct device *dev)
+{
+ struct ili9340_data *data = (struct ili9340_data *)dev->driver_data;
+
+ LOG_DBG("Turning display blanking on\n");
+ ili9340_transmit(data, ILI9340_CMD_DISPLAY_OFF, NULL, 0);
+ return 0;
+}
+
+static int
+ili9340_set_brightness(const struct device *dev, const uint8_t brightness)
+{
+ LOG_WRN("Set brightness not implemented\n");
+ return -ENOTSUP;
+}
+
+static int
+ili9340_set_contrast(const struct device *dev, const uint8_t contrast)
+{
+ LOG_ERR("Set contrast not supported\n");
+ return -ENOTSUP;
+}
+
+static int
+ili9340_set_pixel_format(const struct device *dev,
+ const enum display_pixel_format pixel_format)
+{
+ if (pixel_format == PIXEL_FORMAT_RGB_888) {
+ return 0;
+ }
+ LOG_ERR("Pixel format change not implemented\n");
+ return -ENOTSUP;
+}
+
+static int
+ili9340_set_orientation(const struct device *dev,
+ const enum display_orientation orientation)
+{
+ if (orientation == DISPLAY_ORIENTATION_NORMAL) {
+ return 0;
+ }
+ LOG_ERR("Changing display orientation not implemented\n");
+ return -ENOTSUP;
+}
+
+static void
+ili9340_get_capabilities(const struct device *dev,
+ struct display_capabilities *capabilities)
+{
+ memset(capabilities, 0, sizeof(struct display_capabilities));
+ capabilities->x_resolution = 320;
+ capabilities->y_resolution = 240;
+ capabilities->supported_pixel_formats = PIXEL_FORMAT_RGB_888;
+ capabilities->current_pixel_format = PIXEL_FORMAT_RGB_888;
+ capabilities->current_orientation = DISPLAY_ORIENTATION_NORMAL;
+}
+
+void
+ili9340_transmit(struct ili9340_data *data, uint8_t cmd, void *tx_data,
+ size_t tx_len)
+{
+ struct spi_buf tx_buf = { .buf = &cmd, .len = 1 };
+ struct spi_buf_set tx_bufs = { .buffers = &tx_buf, .count = 1 };
+
+ data = (struct ili9340_data *)&ili9340_data1;
+ gpio_pin_set(data->command_data_gpio,
+ DT_ILITEK_ILI9340_0_CMD_DATA_GPIOS_PIN,
+ ILI9340_CMD_DATA_PIN_COMMAND);
+ spi_transceive(data->spi_dev, &data->spi_config, &tx_bufs, NULL);
+ if (tx_data != NULL) {
+ tx_buf.buf = tx_data;
+ tx_buf.len = tx_len;
+ gpio_pin_set(data->command_data_gpio,
+ DT_ILITEK_ILI9340_0_CMD_DATA_GPIOS_PIN,
+ ILI9340_CMD_DATA_PIN_DATA);
+ spi_transceive(data->spi_dev, &data->spi_config, &tx_bufs, NULL);
+ }
+}
+
+struct display_driver_api ili9340_api1 = {
+ .blanking_on = ili9340_display_blanking_on,
+ .blanking_off = ili9340_display_blanking_off,
+ .write = ili9340_write,
+ .read = ili9340_read,
+ .get_framebuffer = ili9340_get_framebuffer,
+ .set_brightness = ili9340_set_brightness,
+ .set_contrast = ili9340_set_contrast,
+ .get_capabilities = ili9340_get_capabilities,
+ .set_pixel_format = ili9340_set_pixel_format,
+ .set_orientation = ili9340_set_orientation
+};
+
+/*
+DEVICE_AND_API_INIT(ili9340, DT_ILITEK_ILI9340_0_LABEL, &ili9340_init,
+ &ili9340_data, NULL, APPLICATION,
+ CONFIG_APPLICATION_INIT_PRIORITY, &ili9340_api);
+*/
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-wasm-runtime/src/platform/zephyr/display_ili9340.h b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-wasm-runtime/src/platform/zephyr/display_ili9340.h
new file mode 100644
index 000000000..4eb11e2d1
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-wasm-runtime/src/platform/zephyr/display_ili9340.h
@@ -0,0 +1,70 @@
+/*
+ * Copyright (c) 2017 Jan Van Winkel <jan.van_winkel@dxplore.eu>
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+#ifndef ZEPHYR_DRIVERS_DISPLAY_DISPLAY_ILI9340_H_
+#define ZEPHYR_DRIVERS_DISPLAY_DISPLAY_ILI9340_H_
+#include "board_config.h"
+#include <autoconf.h>
+#include <zephyr.h>
+
+#define ILI9340_CMD_ENTER_SLEEP 0x10
+#define ILI9340_CMD_EXIT_SLEEP 0x11
+#define ILI9340_CMD_GAMMA_SET 0x26
+#define ILI9340_CMD_DISPLAY_OFF 0x28
+#define ILI9340_CMD_DISPLAY_ON 0x29
+#define ILI9340_CMD_COLUMN_ADDR 0x2a
+#define ILI9340_CMD_PAGE_ADDR 0x2b
+#define ILI9340_CMD_MEM_WRITE 0x2c
+#define ILI9340_CMD_MEM_ACCESS_CTRL 0x36
+#define ILI9340_CMD_PIXEL_FORMAT_SET 0x3A
+#define ILI9340_CMD_FRAME_CTRL_NORMAL_MODE 0xB1
+#define ILI9340_CMD_DISPLAY_FUNCTION_CTRL 0xB6
+#define ILI9340_CMD_POWER_CTRL_1 0xC0
+#define ILI9340_CMD_POWER_CTRL_2 0xC1
+#define ILI9340_CMD_VCOM_CTRL_1 0xC5
+#define ILI9340_CMD_VCOM_CTRL_2 0xC7
+#define ILI9340_CMD_POSITVE_GAMMA_CORRECTION 0xE0
+#define ILI9340_CMD_NEGATIVE_GAMMA_CORRECTION 0xE1
+
+#define ILI9340_DATA_MEM_ACCESS_CTRL_MY 0x80
+#define ILI9340_DATA_MEM_ACCESS_CTRL_MX 0x40
+#define ILI9340_DATA_MEM_ACCESS_CTRL_MV 0x20
+#define ILI9340_DATA_MEM_ACCESS_CTRL_ML 0x10
+#define ILI9340_DATA_MEM_ACCESS_CTRL_BGR 0x08
+#define ILI9340_DATA_MEM_ACCESS_CTRL_MH 0x04
+
+#define ILI9340_DATA_PIXEL_FORMAT_RGB_18_BIT 0x60
+#define ILI9340_DATA_PIXEL_FORMAT_RGB_16_BIT 0x50
+#define ILI9340_DATA_PIXEL_FORMAT_MCU_18_BIT 0x06
+#define ILI9340_DATA_PIXEL_FORMAT_MCU_16_BIT 0x05
+
+struct ili9340_data;
+
+/**
+ * Send data to ILI9340 display controller
+ *
+ * @param data Device data structure
+ * @param cmd Command to send to display controller
+ * @param tx_data Data to transmit to the display controller
+ * In case no data should be transmitted pass a NULL pointer
+ * @param tx_len Number of bytes in tx_data buffer
+ *
+ */
+void
+ili9340_transmit(struct ili9340_data *data, uint8_t cmd, void *tx_data,
+ size_t tx_len);
+
+/**
+ * Perform LCD specific initialization
+ *
+ * @param data Device data structure
+ */
+void
+ili9340_lcd_init(struct ili9340_data *data);
+
+#define DT_ILITEK_ILI9340_0_LABEL "DISPLAY"
+#define CONFIG_DISPLAY_LOG_LEVEL 0
+
+#endif /* ZEPHYR_DRIVERS_DISPLAY_DISPLAY_ILI9340_H_ */
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-wasm-runtime/src/platform/zephyr/display_ili9340_adafruit_1480.c b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-wasm-runtime/src/platform/zephyr/display_ili9340_adafruit_1480.c
new file mode 100644
index 000000000..65aa618b5
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-wasm-runtime/src/platform/zephyr/display_ili9340_adafruit_1480.c
@@ -0,0 +1,80 @@
+/*
+ * Copyright (c) 2017 Jan Van Winkel <jan.van_winkel@dxplore.eu>
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+#include "display_ili9340.h"
+
+void
+ili9340_lcd_init(struct ili9340_data *data)
+{
+ uint8_t tx_data[15];
+
+ tx_data[0] = 0x23;
+ ili9340_transmit(data, ILI9340_CMD_POWER_CTRL_1, tx_data, 1);
+
+ tx_data[0] = 0x10;
+ ili9340_transmit(data, ILI9340_CMD_POWER_CTRL_2, tx_data, 1);
+
+ tx_data[0] = 0x3e;
+ tx_data[1] = 0x28;
+ ili9340_transmit(data, ILI9340_CMD_VCOM_CTRL_1, tx_data, 2);
+
+ tx_data[0] = 0x86;
+ ili9340_transmit(data, ILI9340_CMD_VCOM_CTRL_2, tx_data, 1);
+
+ tx_data[0] =
+ ILI9340_DATA_MEM_ACCESS_CTRL_MV | ILI9340_DATA_MEM_ACCESS_CTRL_BGR;
+ ili9340_transmit(data, ILI9340_CMD_MEM_ACCESS_CTRL, tx_data, 1);
+
+ tx_data[0] = ILI9340_DATA_PIXEL_FORMAT_MCU_18_BIT
+ | ILI9340_DATA_PIXEL_FORMAT_RGB_18_BIT;
+ ili9340_transmit(data, ILI9340_CMD_PIXEL_FORMAT_SET, tx_data, 1);
+
+ tx_data[0] = 0x00;
+ tx_data[1] = 0x18;
+ ili9340_transmit(data, ILI9340_CMD_FRAME_CTRL_NORMAL_MODE, tx_data, 2);
+
+ tx_data[0] = 0x08;
+ tx_data[1] = 0x82;
+ tx_data[2] = 0x27;
+ ili9340_transmit(data, ILI9340_CMD_DISPLAY_FUNCTION_CTRL, tx_data, 3);
+
+ tx_data[0] = 0x01;
+ ili9340_transmit(data, ILI9340_CMD_GAMMA_SET, tx_data, 1);
+
+ tx_data[0] = 0x0F;
+ tx_data[1] = 0x31;
+ tx_data[2] = 0x2B;
+ tx_data[3] = 0x0C;
+ tx_data[4] = 0x0E;
+ tx_data[5] = 0x08;
+ tx_data[6] = 0x4E;
+ tx_data[7] = 0xF1;
+ tx_data[8] = 0x37;
+ tx_data[9] = 0x07;
+ tx_data[10] = 0x10;
+ tx_data[11] = 0x03;
+ tx_data[12] = 0x0E;
+ tx_data[13] = 0x09;
+ tx_data[14] = 0x00;
+ ili9340_transmit(data, ILI9340_CMD_POSITVE_GAMMA_CORRECTION, tx_data, 15);
+
+ tx_data[0] = 0x00;
+ tx_data[1] = 0x0E;
+ tx_data[2] = 0x14;
+ tx_data[3] = 0x03;
+ tx_data[4] = 0x11;
+ tx_data[5] = 0x07;
+ tx_data[6] = 0x31;
+ tx_data[7] = 0xC1;
+ tx_data[8] = 0x48;
+ tx_data[9] = 0x08;
+ tx_data[10] = 0x0F;
+ tx_data[11] = 0x0C;
+ tx_data[12] = 0x31;
+ tx_data[13] = 0x36;
+ tx_data[14] = 0x0F;
+ ili9340_transmit(data, ILI9340_CMD_NEGATIVE_GAMMA_CORRECTION, tx_data, 15);
+}
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-wasm-runtime/src/platform/zephyr/display_indev.c b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-wasm-runtime/src/platform/zephyr/display_indev.c
new file mode 100644
index 000000000..b2f9f8e52
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-wasm-runtime/src/platform/zephyr/display_indev.c
@@ -0,0 +1,105 @@
+/*
+ * Copyright (C) 2019 Intel Corporation. All rights reserved.
+ * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+ */
+#include <stdio.h>
+#include <stdbool.h>
+#include "display_indev.h"
+#include "display.h"
+#include "wasm_export.h"
+#include "app_manager_export.h"
+
+#define MONITOR_HOR_RES 320
+#define MONITOR_VER_RES 240
+#ifndef MONITOR_ZOOM
+#define MONITOR_ZOOM 1
+#endif
+
+extern int
+ili9340_init();
+
+static int lcd_initialized = 0;
+
+void
+display_init(void)
+{
+ if (lcd_initialized != 0) {
+ return;
+ }
+ lcd_initialized = 1;
+ xpt2046_init();
+ ili9340_init();
+ display_blanking_off(NULL);
+}
+
+void
+display_flush(wasm_exec_env_t exec_env, int32_t x1, int32_t y1, int32_t x2,
+ int32_t y2, lv_color_t *color)
+{
+ wasm_module_inst_t module_inst = get_module_inst(exec_env);
+ struct display_buffer_descriptor desc;
+
+ if (!wasm_runtime_validate_native_addr(module_inst, color,
+ sizeof(lv_color_t)))
+ return;
+
+ uint16_t w = x2 - x1 + 1;
+ uint16_t h = y2 - y1 + 1;
+
+ desc.buf_size = 3 * w * h;
+ desc.width = w;
+ desc.pitch = w;
+ desc.height = h;
+ display_write(NULL, x1, y1, &desc, (void *)color);
+
+ /*lv_flush_ready();*/
+}
+
+void
+display_fill(wasm_exec_env_t exec_env, int32_t x1, int32_t y1, int32_t x2,
+ int32_t y2, lv_color_t *color)
+{}
+
+void
+display_map(wasm_exec_env_t exec_env, int32_t x1, int32_t y1, int32_t x2,
+ int32_t y2, const lv_color_t *color)
+{}
+
+bool
+display_input_read(wasm_exec_env_t exec_env, void *data)
+{
+ wasm_module_inst_t module_inst = get_module_inst(exec_env);
+ lv_indev_data_t *lv_data = (lv_indev_data_t *)data;
+
+ if (!wasm_runtime_validate_native_addr(module_inst, lv_data,
+ sizeof(lv_indev_data_t)))
+ return false;
+
+ return touchscreen_read(lv_data);
+}
+
+void
+display_deinit(wasm_exec_env_t exec_env)
+{}
+
+void
+display_vdb_write(wasm_exec_env_t exec_env, void *buf, lv_coord_t buf_w,
+ lv_coord_t x, lv_coord_t y, lv_color_t *color, lv_opa_t opa)
+{
+ wasm_module_inst_t module_inst = get_module_inst(exec_env);
+ uint8_t *buf_xy = (uint8_t *)buf + 3 * x + 3 * y * buf_w;
+
+ if (!wasm_runtime_validate_native_addr(module_inst, color,
+ sizeof(lv_color_t)))
+ return;
+
+ *buf_xy = color->red;
+ *(buf_xy + 1) = color->green;
+ *(buf_xy + 2) = color->blue;
+}
+
+int
+time_get_ms(wasm_exec_env_t exec_env)
+{
+ return k_uptime_get_32();
+}
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-wasm-runtime/src/platform/zephyr/iwasm_main.c b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-wasm-runtime/src/platform/zephyr/iwasm_main.c
new file mode 100644
index 000000000..dceb5786b
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-wasm-runtime/src/platform/zephyr/iwasm_main.c
@@ -0,0 +1,131 @@
+/*
+ * Copyright (C) 2019 Intel Corporation. All rights reserved.
+ * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+ */
+#include "bh_platform.h"
+#include "runtime_lib.h"
+#include "native_interface.h"
+#include "app_manager_export.h"
+#include "board_config.h"
+#include "bh_platform.h"
+#include "runtime_sensor.h"
+#include "bi-inc/attr_container.h"
+#include "module_wasm_app.h"
+#include "wasm_export.h"
+#include "sensor_native_api.h"
+#include "connection_native_api.h"
+#include "display_indev.h"
+
+#include <zephyr.h>
+#include <drivers/uart.h>
+#include <device.h>
+
+extern bool
+init_sensor_framework();
+extern void
+exit_sensor_framework();
+extern int
+aee_host_msg_callback(void *msg, uint32_t msg_len);
+
+int uart_char_cnt = 0;
+
+static void
+uart_irq_callback(const struct device *dev, void *user_data)
+{
+ unsigned char ch;
+
+ while (uart_poll_in(dev, &ch) == 0) {
+ uart_char_cnt++;
+ aee_host_msg_callback(&ch, 1);
+ }
+ (void)user_data;
+}
+
+const struct device *uart_dev = NULL;
+
+static bool
+host_init()
+{
+ uart_dev = device_get_binding(HOST_DEVICE_COMM_UART_NAME);
+ if (!uart_dev) {
+ printf("UART: Device driver not found.\n");
+ return false;
+ }
+ uart_irq_rx_enable(uart_dev);
+ uart_irq_callback_set(uart_dev, uart_irq_callback);
+ return true;
+}
+
+int
+host_send(void *ctx, const char *buf, int size)
+{
+ if (!uart_dev)
+ return 0;
+
+ for (int i = 0; i < size; i++)
+ uart_poll_out(uart_dev, buf[i]);
+
+ return size;
+}
+
+void
+host_destroy()
+{}
+
+/* clang-format off */
+host_interface interface = {
+ .init = host_init,
+ .send = host_send,
+ .destroy = host_destroy
+};
+/* clang-format on */
+
+timer_ctx_t timer_ctx;
+
+static char global_heap_buf[350 * 1024] = { 0 };
+
+static NativeSymbol native_symbols[] = {
+ EXPORT_WASM_API_WITH_SIG(display_input_read, "(*)i"),
+ EXPORT_WASM_API_WITH_SIG(display_flush, "(iiii*)"),
+ EXPORT_WASM_API_WITH_SIG(display_fill, "(iiii*)"),
+ EXPORT_WASM_API_WITH_SIG(display_vdb_write, "(*iii*i)"),
+ EXPORT_WASM_API_WITH_SIG(display_map, "(iiii*)"),
+ EXPORT_WASM_API_WITH_SIG(time_get_ms, "()i")
+};
+
+int
+iwasm_main()
+{
+ RuntimeInitArgs init_args;
+
+ host_init();
+
+ memset(&init_args, 0, sizeof(RuntimeInitArgs));
+
+ init_args.mem_alloc_type = Alloc_With_Pool;
+ init_args.mem_alloc_option.pool.heap_buf = global_heap_buf;
+ init_args.mem_alloc_option.pool.heap_size = sizeof(global_heap_buf);
+
+ init_args.native_module_name = "env";
+ init_args.n_native_symbols = sizeof(native_symbols) / sizeof(NativeSymbol);
+ init_args.native_symbols = native_symbols;
+
+ /* initialize runtime environment */
+ if (!wasm_runtime_full_init(&init_args)) {
+ printf("Init runtime environment failed.\n");
+ return -1;
+ }
+
+ display_init();
+
+ /* timer manager */
+ if (!init_wasm_timer()) {
+ goto fail;
+ }
+
+ app_manager_startup(&interface);
+
+fail:
+ wasm_runtime_destroy();
+ return -1;
+}
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-wasm-runtime/src/platform/zephyr/main.c b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-wasm-runtime/src/platform/zephyr/main.c
new file mode 100644
index 000000000..c331306ed
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-wasm-runtime/src/platform/zephyr/main.c
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2019 Intel Corporation. All rights reserved.
+ * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+ */
+
+#include <stdlib.h>
+#include <string.h>
+#include "bh_platform.h"
+#include "bh_assert.h"
+#include "bh_log.h"
+#include "wasm_export.h"
+
+extern void
+display_init(void);
+extern int
+iwasm_main();
+
+void
+main(void)
+{
+ display_init();
+ iwasm_main();
+ for (;;) {
+ k_sleep(Z_TIMEOUT_MS(1000));
+ }
+}
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-wasm-runtime/src/platform/zephyr/pin_config_jlf.h b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-wasm-runtime/src/platform/zephyr/pin_config_jlf.h
new file mode 100644
index 000000000..bb20ecbb8
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-wasm-runtime/src/platform/zephyr/pin_config_jlf.h
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2019 Intel Corporation. All rights reserved.
+ * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+ */
+#ifndef __PIN_CONFIG_JLF_H__
+#define __PIN_CONFIG_JLF_H__
+
+#define DT_ILITEK_ILI9340_0_BUS_NAME "SPI_2"
+#define DT_ILITEK_ILI9340_0_SPI_MAX_FREQUENCY 10 * 1000
+
+#define DT_ILITEK_ILI9340_0_BASE_ADDRESS 1
+#define DT_ILITEK_ILI9340_0_RESET_GPIOS_CONTROLLER "GPIO_0"
+#define DT_ILITEK_ILI9340_0_RESET_GPIOS_PIN 5
+#define DT_ILITEK_ILI9340_0_CMD_DATA_GPIOS_CONTROLLER "GPIO_0"
+#define DT_ILITEK_ILI9340_0_CMD_DATA_GPIOS_PIN 4
+
+#define XPT2046_SPI_DEVICE_NAME "SPI_2"
+#define XPT2046_SPI_MAX_FREQUENCY 10 * 1000
+#define XPT2046_CS_GPIO_CONTROLLER "GPIO_0"
+#define XPT2046_CS_GPIO_PIN 6
+
+#define XPT2046_PEN_GPIO_CONTROLLER "GPIO_0"
+#define XPT2046_PEN_GPIO_PIN 7
+
+#define HOST_DEVICE_COMM_UART_NAME "UART_1"
+#endif /* __PIN_CONFIG_JLF_H__ */
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-wasm-runtime/src/platform/zephyr/pin_config_stm32.h b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-wasm-runtime/src/platform/zephyr/pin_config_stm32.h
new file mode 100644
index 000000000..523ce2308
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/vgl-wasm-runtime/src/platform/zephyr/pin_config_stm32.h
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2019 Intel Corporation. All rights reserved.
+ * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+ */
+#ifndef __PIN_CONFIG_STM32_H__
+#define __PIN_CONFIG_STM32_H__
+
+#define DT_ILITEK_ILI9340_0_BUS_NAME "SPI_1"
+#define DT_ILITEK_ILI9340_0_SPI_MAX_FREQUENCY 24 * 1000 * 1000
+
+#define DT_ILITEK_ILI9340_0_BASE_ADDRESS 1
+#define DT_ILITEK_ILI9340_0_RESET_GPIOS_CONTROLLER "GPIOC"
+#define DT_ILITEK_ILI9340_0_RESET_GPIOS_PIN 12
+#define DT_ILITEK_ILI9340_0_CMD_DATA_GPIOS_CONTROLLER "GPIOC"
+#define DT_ILITEK_ILI9340_0_CMD_DATA_GPIOS_PIN 11
+
+#define DT_ILITEK_ILI9340_0_CS_GPIO_CONTROLLER "GPIOC"
+#define DT_ILITEK_ILI9340_0_CS_GPIO_PIN 10
+
+#define XPT2046_SPI_DEVICE_NAME "SPI_1"
+#define XPT2046_SPI_MAX_FREQUENCY 12 * 1000 * 1000
+#define XPT2046_CS_GPIO_CONTROLLER "GPIOD"
+#define XPT2046_CS_GPIO_PIN 0
+
+#define XPT2046_PEN_GPIO_CONTROLLER "GPIOD"
+#define XPT2046_PEN_GPIO_PIN 1
+
+#define HOST_DEVICE_COMM_UART_NAME "UART_6"
+
+#endif /* __PIN_CONFIG_STM32_H__ */
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/wamr_config_littlevgl.cmake b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/wamr_config_littlevgl.cmake
new file mode 100644
index 000000000..7a9065ab5
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/wamr_config_littlevgl.cmake
@@ -0,0 +1,9 @@
+set (WAMR_BUILD_PLATFORM "linux")
+set (WAMR_BUILD_TARGET X86_64)
+set (WAMR_BUILD_INTERP 1)
+set (WAMR_BUILD_AOT 1)
+set (WAMR_BUILD_JIT 0)
+set (WAMR_BUILD_LIBC_BUILTIN 1)
+set (WAMR_BUILD_LIBC_WASI 1)
+set (WAMR_BUILD_APP_FRAMEWORK 1)
+set (WAMR_BUILD_APP_LIST WAMR_APP_BUILD_BASE WAMR_APP_BUILD_SENSOR WAMR_APP_BUILD_CONNECTION)
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/wasm-apps/Makefile_wasm_app b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/wasm-apps/Makefile_wasm_app
new file mode 100644
index 000000000..8c053cc6d
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/wasm-apps/Makefile_wasm_app
@@ -0,0 +1,57 @@
+# Copyright (C) 2019 Intel Corporation. All rights reserved.
+# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+
+CC = /opt/wasi-sdk/bin/clang
+LVGL_DIR = ${shell pwd}
+SDK_DIR = $(LVGL_DIR)/../../../wamr-sdk/out/littlevgl/app-sdk
+APP_FRAMEWORK_DIR = $(SDK_DIR)/wamr-app-framework
+LVGL_REPO_PATH=../build/lvgl
+
+CFLAGS += -O3 \
+ -I$(LVGL_DIR) \
+ -I$(LVGL_DIR)/../build \
+ -I$(LVGL_DIR)/lv_drivers \
+ -I$(LVGL_DIR)/src \
+ -I$(LVGL_DIR)/../lv_config \
+ -I$(APP_FRAMEWORK_DIR)/include
+
+SRCS += ${LVGL_REPO_PATH}/lv_draw/lv_draw_line.c ${LVGL_REPO_PATH}/lv_draw/lv_draw_rbasic.c
+SRCS += ${LVGL_REPO_PATH}/lv_draw/lv_draw_img.c ${LVGL_REPO_PATH}/lv_draw/lv_draw_arc.c
+SRCS += ${LVGL_REPO_PATH}/lv_draw/lv_draw_rect.c ${LVGL_REPO_PATH}/lv_draw/lv_draw_triangle.c
+SRCS += ${LVGL_REPO_PATH}/lv_draw/lv_draw.c ${LVGL_REPO_PATH}/lv_draw/lv_draw_label.c
+SRCS += ${LVGL_REPO_PATH}/lv_draw/lv_draw_vbasic.c ${LVGL_REPO_PATH}/lv_fonts/lv_font_builtin.c
+SRCS += ${LVGL_REPO_PATH}/lv_fonts/lv_font_dejavu_20.c
+SRCS += ${LVGL_REPO_PATH}/lv_objx/lv_img.c
+SRCS += ${LVGL_REPO_PATH}/lv_objx/lv_roller.c ${LVGL_REPO_PATH}/lv_objx/lv_cb.c ${LVGL_REPO_PATH}/lv_objx/lv_led.c ${LVGL_REPO_PATH}/lv_objx/lv_cont.c
+SRCS += ${LVGL_REPO_PATH}/lv_objx/lv_calendar.c ${LVGL_REPO_PATH}/lv_objx/lv_gauge.c ${LVGL_REPO_PATH}/lv_objx/lv_page.c
+SRCS += ${LVGL_REPO_PATH}/lv_objx/lv_list.c ${LVGL_REPO_PATH}/lv_objx/lv_bar.c ${LVGL_REPO_PATH}/lv_objx/lv_tabview.c
+SRCS += ${LVGL_REPO_PATH}/lv_objx/lv_mbox.c ${LVGL_REPO_PATH}/lv_objx/lv_objx_templ.c ${LVGL_REPO_PATH}/lv_objx/lv_sw.c
+SRCS += ${LVGL_REPO_PATH}/lv_objx/lv_label.c ${LVGL_REPO_PATH}/lv_objx/lv_slider.c ${LVGL_REPO_PATH}/lv_objx/lv_ddlist.c
+SRCS += ${LVGL_REPO_PATH}/lv_objx/lv_imgbtn.c ${LVGL_REPO_PATH}/lv_objx/lv_line.c ${LVGL_REPO_PATH}/lv_objx/lv_chart.c
+SRCS += ${LVGL_REPO_PATH}/lv_objx/lv_btnm.c ${LVGL_REPO_PATH}/lv_objx/lv_arc.c ${LVGL_REPO_PATH}/lv_objx/lv_preload.c
+SRCS += ${LVGL_REPO_PATH}/lv_objx/lv_win.c ${LVGL_REPO_PATH}/lv_objx/lv_lmeter.c ${LVGL_REPO_PATH}/lv_objx/lv_btn.c
+SRCS += ${LVGL_REPO_PATH}/lv_objx/lv_ta.c ${LVGL_REPO_PATH}/lv_misc/lv_log.c ${LVGL_REPO_PATH}/lv_misc/lv_fs.c
+SRCS += ${LVGL_REPO_PATH}/lv_misc/lv_task.c ${LVGL_REPO_PATH}/lv_misc/lv_circ.c ${LVGL_REPO_PATH}/lv_misc/lv_anim.c
+SRCS += ${LVGL_REPO_PATH}/lv_misc/lv_color.c ${LVGL_REPO_PATH}/lv_misc/lv_txt.c ${LVGL_REPO_PATH}/lv_misc/lv_math.c
+SRCS += ${LVGL_REPO_PATH}/lv_misc/lv_mem.c ${LVGL_REPO_PATH}/lv_misc/lv_font.c ${LVGL_REPO_PATH}/lv_misc/lv_ll.c
+SRCS += ${LVGL_REPO_PATH}/lv_misc/lv_area.c ${LVGL_REPO_PATH}/lv_misc/lv_templ.c ${LVGL_REPO_PATH}/lv_misc/lv_ufs.c
+SRCS += ${LVGL_REPO_PATH}/lv_misc/lv_gc.c
+SRCS += ${LVGL_REPO_PATH}/lv_hal/lv_hal_tick.c ${LVGL_REPO_PATH}/lv_hal/lv_hal_indev.c ${LVGL_REPO_PATH}/lv_hal/lv_hal_disp.c
+SRCS += ${LVGL_REPO_PATH}/lv_themes/lv_theme_mono.c ${LVGL_REPO_PATH}/lv_themes/lv_theme_templ.c
+SRCS += ${LVGL_REPO_PATH}/lv_themes/lv_theme_material.c ${LVGL_REPO_PATH}/lv_themes/lv_theme.c
+SRCS += ${LVGL_REPO_PATH}/lv_themes/lv_theme_night.c ${LVGL_REPO_PATH}/lv_themes/lv_theme_zen.c ${LVGL_REPO_PATH}/lv_themes/lv_theme_nemo.c
+SRCS += ${LVGL_REPO_PATH}/lv_themes/lv_theme_alien.c ${LVGL_REPO_PATH}/lv_themes/lv_theme_default.c
+SRCS += ${LVGL_REPO_PATH}/lv_core/lv_group.c ${LVGL_REPO_PATH}/lv_core/lv_style.c ${LVGL_REPO_PATH}/lv_core/lv_indev.c
+SRCS += ${LVGL_REPO_PATH}/lv_core/lv_vdb.c ${LVGL_REPO_PATH}/lv_core/lv_obj.c ${LVGL_REPO_PATH}/lv_core/lv_refr.c
+SRCS += $(LVGL_DIR)/src/main.c
+
+all:
+ @$(CC) $(CFLAGS) $(SRCS) \
+ -O3 -z stack-size=2048 -Wl,--initial-memory=65536 \
+ -DLV_CONF_INCLUDE_SIMPLE \
+ -L$(APP_FRAMEWORK_DIR)/lib -lapp_framework \
+ -Wl,--allow-undefined \
+ -Wl,--strip-all,--no-entry \
+ -Wl,--export=on_init -Wl,--export=on_timer_callback \
+ -Wl,--export=__heap_base,--export=__data_end \
+ -o ui_app_wasi.wasm
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/wasm-apps/Makefile_wasm_app_no_wasi b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/wasm-apps/Makefile_wasm_app_no_wasi
new file mode 100644
index 000000000..d18c0a222
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/wasm-apps/Makefile_wasm_app_no_wasi
@@ -0,0 +1,59 @@
+# Copyright (C) 2019 Intel Corporation. All rights reserved.
+# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+
+CC = /opt/wasi-sdk/bin/clang
+LVGL_DIR = ${shell pwd}
+WAMR_DIR = ${LVGL_DIR}/../../..
+SDK_DIR = $(LVGL_DIR)/../../../wamr-sdk/out/littlevgl/app-sdk
+APP_FRAMEWORK_DIR = $(SDK_DIR)/wamr-app-framework
+LVGL_REPO_PATH=../build/lvgl
+
+CFLAGS += -O3 \
+ -I$(LVGL_DIR) \
+ -I$(LVGL_DIR)/../build \
+ -I$(LVGL_DIR)/lv_drivers \
+ -I$(LVGL_DIR)/src \
+ -I$(LVGL_DIR)/../lv_config \
+ -I$(APP_FRAMEWORK_DIR)/include
+
+SRCS += $(LVGL_REPO_PATH)/lv_draw/lv_draw_line.c $(LVGL_REPO_PATH)/lv_draw/lv_draw_rbasic.c
+SRCS += $(LVGL_REPO_PATH)/lv_draw/lv_draw_img.c $(LVGL_REPO_PATH)/lv_draw/lv_draw_arc.c
+SRCS += $(LVGL_REPO_PATH)/lv_draw/lv_draw_rect.c $(LVGL_REPO_PATH)/lv_draw/lv_draw_triangle.c
+SRCS += $(LVGL_REPO_PATH)/lv_draw/lv_draw.c $(LVGL_REPO_PATH)/lv_draw/lv_draw_label.c
+SRCS += $(LVGL_REPO_PATH)/lv_draw/lv_draw_vbasic.c $(LVGL_REPO_PATH)/lv_fonts/lv_font_builtin.c
+SRCS += $(LVGL_REPO_PATH)/lv_fonts/lv_font_dejavu_20.c
+SRCS += $(LVGL_REPO_PATH)/lv_objx/lv_img.c
+SRCS += $(LVGL_REPO_PATH)/lv_objx/lv_roller.c $(LVGL_REPO_PATH)/lv_objx/lv_cb.c $(LVGL_REPO_PATH)/lv_objx/lv_led.c $(LVGL_REPO_PATH)/lv_objx/lv_cont.c
+SRCS += $(LVGL_REPO_PATH)/lv_objx/lv_calendar.c $(LVGL_REPO_PATH)/lv_objx/lv_gauge.c $(LVGL_REPO_PATH)/lv_objx/lv_page.c
+SRCS += $(LVGL_REPO_PATH)/lv_objx/lv_list.c $(LVGL_REPO_PATH)/lv_objx/lv_bar.c $(LVGL_REPO_PATH)/lv_objx/lv_tabview.c
+SRCS += $(LVGL_REPO_PATH)/lv_objx/lv_mbox.c $(LVGL_REPO_PATH)/lv_objx/lv_objx_templ.c $(LVGL_REPO_PATH)/lv_objx/lv_sw.c
+SRCS += $(LVGL_REPO_PATH)/lv_objx/lv_label.c $(LVGL_REPO_PATH)/lv_objx/lv_slider.c $(LVGL_REPO_PATH)/lv_objx/lv_ddlist.c
+SRCS += $(LVGL_REPO_PATH)/lv_objx/lv_imgbtn.c $(LVGL_REPO_PATH)/lv_objx/lv_line.c $(LVGL_REPO_PATH)/lv_objx/lv_chart.c
+SRCS += $(LVGL_REPO_PATH)/lv_objx/lv_btnm.c $(LVGL_REPO_PATH)/lv_objx/lv_arc.c $(LVGL_REPO_PATH)/lv_objx/lv_preload.c
+SRCS += $(LVGL_REPO_PATH)/lv_objx/lv_win.c $(LVGL_REPO_PATH)/lv_objx/lv_lmeter.c $(LVGL_REPO_PATH)/lv_objx/lv_btn.c
+SRCS += $(LVGL_REPO_PATH)/lv_objx/lv_ta.c $(LVGL_REPO_PATH)/lv_misc/lv_log.c $(LVGL_REPO_PATH)/lv_misc/lv_fs.c
+SRCS += $(LVGL_REPO_PATH)/lv_misc/lv_task.c $(LVGL_REPO_PATH)/lv_misc/lv_circ.c $(LVGL_REPO_PATH)/lv_misc/lv_anim.c
+SRCS += $(LVGL_REPO_PATH)/lv_misc/lv_color.c $(LVGL_REPO_PATH)/lv_misc/lv_txt.c $(LVGL_REPO_PATH)/lv_misc/lv_math.c
+SRCS += $(LVGL_REPO_PATH)/lv_misc/lv_mem.c $(LVGL_REPO_PATH)/lv_misc/lv_font.c $(LVGL_REPO_PATH)/lv_misc/lv_ll.c
+SRCS += $(LVGL_REPO_PATH)/lv_misc/lv_area.c $(LVGL_REPO_PATH)/lv_misc/lv_templ.c $(LVGL_REPO_PATH)/lv_misc/lv_ufs.c
+SRCS += $(LVGL_REPO_PATH)/lv_misc/lv_gc.c
+SRCS += $(LVGL_REPO_PATH)/lv_hal/lv_hal_tick.c $(LVGL_REPO_PATH)/lv_hal/lv_hal_indev.c $(LVGL_REPO_PATH)/lv_hal/lv_hal_disp.c
+SRCS += $(LVGL_REPO_PATH)/lv_themes/lv_theme_mono.c $(LVGL_REPO_PATH)/lv_themes/lv_theme_templ.c
+SRCS += $(LVGL_REPO_PATH)/lv_themes/lv_theme_material.c $(LVGL_REPO_PATH)/lv_themes/lv_theme.c
+SRCS += $(LVGL_REPO_PATH)/lv_themes/lv_theme_night.c $(LVGL_REPO_PATH)/lv_themes/lv_theme_zen.c $(LVGL_REPO_PATH)/lv_themes/lv_theme_nemo.c
+SRCS += $(LVGL_REPO_PATH)/lv_themes/lv_theme_alien.c $(LVGL_REPO_PATH)/lv_themes/lv_theme_default.c
+SRCS += $(LVGL_REPO_PATH)/lv_core/lv_group.c $(LVGL_REPO_PATH)/lv_core/lv_style.c $(LVGL_REPO_PATH)/lv_core/lv_indev.c
+SRCS += $(LVGL_REPO_PATH)/lv_core/lv_vdb.c $(LVGL_REPO_PATH)/lv_core/lv_obj.c $(LVGL_REPO_PATH)/lv_core/lv_refr.c
+SRCS += $(LVGL_DIR)/src/main.c
+
+all:
+ @$(CC) $(CFLAGS) $(SRCS) \
+ --target=wasm32 -Wl,--allow-undefined \
+ --sysroot=$(WAMR_DIR)/wamr-sdk/app/libc-builtin-sysroot \
+ -O3 -z stack-size=2048 -Wl,--initial-memory=65536 \
+ -DLV_CONF_INCLUDE_SIMPLE \
+ -L$(APP_FRAMEWORK_DIR)/lib -lapp_framework \
+ -Wl,--allow-undefined \
+ -Wl,--strip-all,--no-entry -nostdlib \
+ -Wl,--export=on_init -Wl,--export=on_timer_callback \
+ -o ui_app_builtin_libc.wasm
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/wasm-apps/build_wasm_app.sh b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/wasm-apps/build_wasm_app.sh
new file mode 100755
index 000000000..a86784e2a
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/wasm-apps/build_wasm_app.sh
@@ -0,0 +1,22 @@
+#!/bin/sh
+
+# Copyright (C) 2019 Intel Corporation. All rights reserved.
+# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+
+WAMR_DIR=${PWD}/../../..
+
+if [ -z $KW_BUILD ] || [ -z $KW_OUT_FILE ];then
+ echo "Local Build Env"
+ makewrap="make"
+else
+ echo "Klocwork Build Env"
+ makewrap="kwinject -o $KW_OUT_FILE make"
+fi
+
+echo "make Makefile_wasm_app"
+$makewrap -f Makefile_wasm_app
+
+echo "make Makefile_wasm_app_no_wasi"
+$makewrap -f Makefile_wasm_app_no_wasi
+
+echo "completed." \ No newline at end of file
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/wasm-apps/src/display_indev.h b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/wasm-apps/src/display_indev.h
new file mode 100644
index 000000000..9285699b6
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/wasm-apps/src/display_indev.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2019 Intel Corporation. All rights reserved.
+ * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+ */
+
+#ifndef DISPLAY_INDEV_H_
+#define DISPLAY_INDEV_H_
+#include <stdio.h>
+#include <inttypes.h>
+
+#include "lvgl/lv_misc/lv_color.h"
+#include "lvgl/lv_hal/lv_hal_indev.h"
+
+extern void
+display_init(void);
+
+extern void
+display_deinit(void);
+
+extern void
+display_flush(int32_t x1, int32_t y1, int32_t x2, int32_t y2,
+ const lv_color_t *color);
+
+extern bool
+display_input_read(lv_indev_data_t *data);
+
+extern void
+display_vdb_write(void *buf, lv_coord_t buf_w, lv_coord_t x, lv_coord_t y,
+ lv_color_t *color, lv_opa_t opa);
+
+void
+display_fill(int32_t x1, int32_t y1, int32_t x2, int32_t y2,
+ const lv_color_t *color);
+
+void
+display_map(int32_t x1, int32_t y1, int32_t x2, int32_t y2,
+ const lv_color_t *color);
+
+extern uint32_t
+time_get_ms(void);
+
+#endif
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/wasm-apps/src/main.c b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/wasm-apps/src/main.c
new file mode 100644
index 000000000..8676d41b5
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/wasm-apps/src/main.c
@@ -0,0 +1,189 @@
+/*
+ * Copyright (C) 2019 Intel Corporation. All rights reserved.
+ * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+ */
+
+/**
+ * @file main
+ *
+ */
+
+/*********************
+ * INCLUDES
+ *********************/
+#include <stdlib.h>
+//#include <unistd.h>
+#include <inttypes.h>
+#include "lvgl/lvgl.h"
+#include "display_indev.h"
+#include "wasm_app.h"
+#include "wa-inc/timer_wasm_app.h"
+/*********************
+ * DEFINES
+ *********************/
+
+/**********************
+ * TYPEDEFS
+ **********************/
+
+/**********************
+ * STATIC PROTOTYPES
+ **********************/
+static void
+hal_init(void);
+// static int tick_thread(void * data);
+// static void memory_monitor(void * param);
+
+/**********************
+ * STATIC VARIABLES
+ **********************/
+
+/**********************
+ * MACROS
+ **********************/
+
+/**********************
+ * GLOBAL FUNCTIONS
+ **********************/
+uint32_t count = 0;
+char count_str[11] = { 0 };
+lv_obj_t *hello_world_label;
+lv_obj_t *count_label;
+lv_obj_t *btn1;
+
+lv_obj_t *label_count1;
+int label_count1_value = 0;
+char label_count1_str[11] = { 0 };
+
+void
+timer1_update(user_timer_t timer1)
+{
+ if ((count % 100) == 0) {
+ snprintf(count_str, sizeof(count_str), "%d", count / 100);
+ lv_label_set_text(count_label, count_str);
+ }
+ lv_task_handler();
+ ++count;
+}
+
+static lv_res_t
+btn_rel_action(lv_obj_t *btn)
+{
+ label_count1_value++;
+ snprintf(label_count1_str, sizeof(label_count1_str), "%d",
+ label_count1_value);
+ lv_label_set_text(label_count1, label_count1_str);
+ return LV_RES_OK;
+}
+
+void
+on_init()
+{
+ /* Initialize LittlevGL */
+ lv_init();
+
+ /* Initialize the HAL (display, input devices, tick) for LittlevGL */
+ hal_init();
+
+ hello_world_label = lv_label_create(lv_scr_act(), NULL);
+ lv_label_set_text(hello_world_label, "Hello world!");
+ lv_obj_align(hello_world_label, NULL, LV_ALIGN_IN_TOP_LEFT, 0, 0);
+
+ count_label = lv_label_create(lv_scr_act(), NULL);
+ lv_obj_align(count_label, NULL, LV_ALIGN_IN_TOP_MID, 0, 0);
+
+ btn1 = lv_btn_create(
+ lv_scr_act(),
+ NULL); /* Create a button on the currently loaded screen */
+ lv_btn_set_action(btn1, LV_BTN_ACTION_CLICK,
+ btn_rel_action); /* Set function to be called when the
+ button is released */
+ lv_obj_align(btn1, NULL, LV_ALIGN_CENTER, 0,
+ 20); /* Align below the label */
+
+ /* Create a label on the button */
+ lv_obj_t *btn_label = lv_label_create(btn1, NULL);
+ lv_label_set_text(btn_label, "Click ++");
+
+ label_count1 = lv_label_create(lv_scr_act(), NULL);
+ lv_label_set_text(label_count1, "0");
+ lv_obj_align(label_count1, NULL, LV_ALIGN_IN_BOTTOM_MID, 0, 0);
+
+ /* set up a timer */
+ user_timer_t timer;
+ timer = api_timer_create(10, true, false, timer1_update);
+ if (timer)
+ api_timer_restart(timer, 10);
+ else
+ printf("Fail to create timer.\n");
+}
+
+/**********************
+ * STATIC FUNCTIONS
+ **********************/
+
+/**
+ * Initialize the Hardware Abstraction Layer (HAL) for the Littlev graphics
+ * library
+ */
+void
+display_flush_wrapper(int32_t x1, int32_t y1, int32_t x2, int32_t y2,
+ const lv_color_t *color_p)
+{
+ display_flush(x1, y1, x2, y2, color_p);
+ lv_flush_ready();
+}
+
+void
+display_vdb_write_wrapper(uint8_t *buf, lv_coord_t buf_w, lv_coord_t x,
+ lv_coord_t y, lv_color_t color, lv_opa_t opa)
+{
+ display_vdb_write(buf, buf_w, x, y, &color, opa);
+}
+
+void
+display_fill_wrapper(int32_t x1, int32_t y1, int32_t x2, int32_t y2,
+ lv_color_t color)
+{
+ display_fill(x1, y1, x2, y2, &color);
+}
+
+static void
+hal_init(void)
+{
+ /* Add a display */
+ lv_disp_drv_t disp_drv;
+ lv_disp_drv_init(&disp_drv); /* Basic initialization */
+ disp_drv.disp_flush =
+ display_flush_wrapper; /* Used when `LV_VDB_SIZE != 0` in lv_conf.h
+ (buffered drawing) */
+ disp_drv.disp_fill =
+ display_fill_wrapper; /* Used when `LV_VDB_SIZE == 0` in lv_conf.h
+ (unbuffered drawing) */
+ disp_drv.disp_map = display_map; /* Used when `LV_VDB_SIZE == 0` in
+ lv_conf.h (unbuffered drawing) */
+#if LV_VDB_SIZE != 0
+ disp_drv.vdb_wr = display_vdb_write_wrapper;
+#endif
+ lv_disp_drv_register(&disp_drv);
+
+ /* Add the mouse as input device
+ * Use the 'mouse' driver which reads the PC's mouse */
+ // mouse_init();
+ lv_indev_drv_t indev_drv;
+ lv_indev_drv_init(&indev_drv); /* Basic initialization */
+ indev_drv.type = LV_INDEV_TYPE_POINTER;
+ indev_drv.read =
+ display_input_read; /* This function will be called periodically (by the
+ library) to get the mouse position and state */
+ lv_indev_t *mouse_indev = lv_indev_drv_register(&indev_drv);
+}
+
+/* Implement empry main function as wasi start function calls it */
+int
+main(int argc, char **argv)
+{
+ (void)argc;
+ (void)argv;
+ return 0;
+}
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/wasm-apps/src/system_header.h b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/wasm-apps/src/system_header.h
new file mode 100644
index 000000000..59fd59aeb
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/littlevgl/wasm-apps/src/system_header.h
@@ -0,0 +1,9 @@
+/*
+ * Copyright (C) 2019 Intel Corporation. All rights reserved.
+ * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+ */
+
+#include <stdio.h>
+
+uint32_t
+time_get_ms(void);