That is what I got working, feature-phone app via wasm and device
Sure, I understand, the RISC-V stuff is the future
Maybe I manage to get a PineTabV in the next batch, although no blog news in over two months, so I wasnt sure they had even shipped it yet (and store still shows 'late May').
Anyway I have plenty to explore now you got the pinephone working. Amazing that you got it booting into a interactive UI in under a second! again, good work
[edit]
here are a few of the tweeks I needed to get it to build:
1) there was an unused variable: static x x++
2) build: I needed to link in libc via -lc \
3) custom panic handlers required a third parameter adding: , ret_addr: ?usize
4) in memset I had to change d.* = c2; to: d[0] = c2; (maybe in two places)
5) changed lines like this:
Code:
@cInclude("../../../../../../nuttx/include/limits.h");
@cInclude("../../../../../../nuttx/config.h");
to:
Code:
@cInclude("nuttx/include/limits.h");
@cInclude("nuttx/config.h");
6) feature-phone needed these:
Code:
pub export fn __stack_chk_fail() void {}
pub export fn __stack_chk_guard() void {}
Possibly I have a slightly different Zig version? mine reports 0.10.1
Sorry my notes are not clear, I didnt use git and vscode seems to ignore some subfolders still when I look for changes.
Updated build.sh
Code:
#!/usr/bin/env bash
# Build LVGL App (in Zig) and LVGL Library (in C) for PinePhone and WebAssembly
set -e # Exit when any command fails
set -x # Echo commands
export PRJ_HOME=/home/peter/prj/zig/examples/lvgl/pinephone-lvgl-zig
export OBJ_HOME=/home/peter/software/nuttx/apps/graphics/lvgl/lvgl/demos/widgets
export NUTTX_HOME=/home/peter/software/nuttx
export APPS_HOME=$NUTTX_HOME/apps
export LVGL_HOME=$NUTTX_HOME/apps/graphics/lvgl
export LVGL_SRC=$LVGL_HOME/lvgl/src
## Build the LVGL App (in Zig) and LVGL Library (in C) for PinePhone and WebAssembly
function build_zig {
## Check that NuttX Build has completed and `lv_demo_widgets.*.o` exists
if [ ! -f $OBJ_HOME/lv_demo_widgets.*.o ]
then
echo "*** Error: Build NuttX first before building Zig app"
exit 1
fi
## Compile our LVGL Display Driver from C to WebAssembly with Zig Compiler
compile_lvgl $PRJ_HOME/display.c $PRJ_HOME/display.o
## Compile LVGL Library from C to WebAssembly with Zig Compiler
compile_lvgl $LVGL_SRC/font/lv_font_montserrat_14.c $PRJ_HOME/lv_font_montserrat_14.o
compile_lvgl $LVGL_SRC/font/lv_font_montserrat_20.c $PRJ_HOME/lv_font_montserrat_20.o
compile_lvgl $LVGL_SRC/widgets/lv_label.c $PRJ_HOME/lv_label.o
compile_lvgl $LVGL_SRC/core/lv_obj.c $PRJ_HOME/lv_obj.o
compile_lvgl $LVGL_SRC/misc/lv_mem.c $PRJ_HOME/lv_mem.o
compile_lvgl $LVGL_SRC/core/lv_event.c $PRJ_HOME/lv_event.o
compile_lvgl $LVGL_SRC/core/lv_obj_style.c $PRJ_HOME/lv_obj_style.o
compile_lvgl $LVGL_SRC/core/lv_obj_pos.c $PRJ_HOME/lv_obj_pos.o
compile_lvgl $LVGL_SRC/misc/lv_txt.c $PRJ_HOME/lv_txt.o
compile_lvgl $LVGL_SRC/draw/lv_draw_label.c $PRJ_HOME/lv_draw_label.o
compile_lvgl $LVGL_SRC/core/lv_obj_draw.c $PRJ_HOME/lv_obj_draw.o
compile_lvgl $LVGL_SRC/misc/lv_area.c $PRJ_HOME/lv_area.o
compile_lvgl $LVGL_SRC/core/lv_obj_scroll.c $PRJ_HOME/lv_obj_scroll.o
compile_lvgl $LVGL_SRC/font/lv_font.c $PRJ_HOME/lv_font.o
compile_lvgl $LVGL_SRC/core/lv_obj_class.c $PRJ_HOME/lv_obj_class.o
compile_lvgl $LVGL_SRC/core/lv_obj_tree.c $PRJ_HOME/lv_obj_tree.o
compile_lvgl $LVGL_SRC/hal/lv_hal_disp.c $PRJ_HOME/lv_hal_disp.o
compile_lvgl $LVGL_SRC/misc/lv_anim.c $PRJ_HOME/lv_anim.o
compile_lvgl $LVGL_SRC/misc/lv_tlsf.c $PRJ_HOME/lv_tlsf.o
compile_lvgl $LVGL_SRC/core/lv_group.c $PRJ_HOME/lv_group.o
compile_lvgl $LVGL_SRC/core/lv_indev.c $PRJ_HOME/lv_indev.o
compile_lvgl $LVGL_SRC/draw/lv_draw_rect.c $PRJ_HOME/lv_draw_rect.o
compile_lvgl $LVGL_SRC/draw/lv_draw_mask.c $PRJ_HOME/lv_draw_mask.o
compile_lvgl $LVGL_SRC/misc/lv_style.c $PRJ_HOME/lv_style.o
compile_lvgl $LVGL_SRC/misc/lv_ll.c $PRJ_HOME/lv_ll.o
compile_lvgl $LVGL_SRC/core/lv_obj_style_gen.c $PRJ_HOME/lv_obj_style_gen.o
compile_lvgl $LVGL_SRC/misc/lv_timer.c $PRJ_HOME/lv_timer.o
compile_lvgl $LVGL_SRC/core/lv_disp.c $PRJ_HOME/lv_disp.o
compile_lvgl $LVGL_SRC/core/lv_refr.c $PRJ_HOME/lv_refr.o
compile_lvgl $LVGL_SRC/misc/lv_color.c $PRJ_HOME/lv_color.o
compile_lvgl $LVGL_SRC/draw/lv_draw_line.c $PRJ_HOME/lv_draw_line.o
compile_lvgl $LVGL_SRC/draw/lv_draw_img.c $PRJ_HOME/lv_draw_img.o
compile_lvgl $LVGL_SRC/misc/lv_math.c $PRJ_HOME/lv_math.o
compile_lvgl $LVGL_SRC/hal/lv_hal_indev.c $PRJ_HOME/lv_hal_indev.o
compile_lvgl $LVGL_SRC/core/lv_theme.c $PRJ_HOME/lv_theme.o
compile_lvgl $LVGL_SRC/hal/lv_hal_tick.c $PRJ_HOME/lv_hal_tick.o
compile_lvgl $LVGL_SRC/misc/lv_log.c $PRJ_HOME/lv_log.o
compile_lvgl $LVGL_SRC/misc/lv_printf.c $PRJ_HOME/lv_printf.o
compile_lvgl $LVGL_SRC/misc/lv_fs.c $PRJ_HOME/lv_fs.o
compile_lvgl $LVGL_SRC/draw/lv_draw.c $PRJ_HOME/lv_draw.o
compile_lvgl $LVGL_SRC/draw/lv_img_decoder.c $PRJ_HOME/lv_img_decoder.o
compile_lvgl $LVGL_SRC/extra/lv_extra.c $PRJ_HOME/lv_extra.o
compile_lvgl $LVGL_SRC/extra/layouts/flex/lv_flex.c $PRJ_HOME/lv_flex.o
compile_lvgl $LVGL_SRC/extra/layouts/grid/lv_grid.c $PRJ_HOME/lv_grid.o
compile_lvgl $LVGL_SRC/draw/sw/lv_draw_sw.c $PRJ_HOME/lv_draw_sw.o
compile_lvgl $LVGL_SRC/draw/sw/lv_draw_sw_rect.c $PRJ_HOME/lv_draw_sw_rect.o
compile_lvgl $LVGL_SRC/draw/lv_img_cache.c $PRJ_HOME/lv_img_cache.o
compile_lvgl $LVGL_SRC/draw/lv_img_buf.c $PRJ_HOME/lv_img_buf.o
compile_lvgl $LVGL_SRC/draw/sw/lv_draw_sw_arc.c $PRJ_HOME/lv_draw_sw_arc.o
compile_lvgl $LVGL_SRC/draw/sw/lv_draw_sw_letter.c $PRJ_HOME/lv_draw_sw_letter.o
compile_lvgl $LVGL_SRC/draw/sw/lv_draw_sw_blend.c $PRJ_HOME/lv_draw_sw_blend.o
compile_lvgl $LVGL_SRC/draw/sw/lv_draw_sw_layer.c $PRJ_HOME/lv_draw_sw_layer.o
compile_lvgl $LVGL_SRC/draw/sw/lv_draw_sw_transform.c $PRJ_HOME/lv_draw_sw_transform.o
compile_lvgl $LVGL_SRC/draw/sw/lv_draw_sw_polygon.c $PRJ_HOME/lv_draw_sw_polygon.o
compile_lvgl $LVGL_SRC/draw/sw/lv_draw_sw_line.c $PRJ_HOME/lv_draw_sw_line.o
compile_lvgl $LVGL_SRC/draw/sw/lv_draw_sw_img.c $PRJ_HOME/lv_draw_sw_img.o
compile_lvgl $LVGL_SRC/draw/sw/lv_draw_sw_gradient.c $PRJ_HOME/lv_draw_sw_gradient.o
compile_lvgl $LVGL_SRC/draw/lv_draw_transform.c $PRJ_HOME/lv_draw_transform.o
compile_lvgl $LVGL_SRC/extra/themes/default/lv_theme_default.c $PRJ_HOME/lv_theme_default.o
compile_lvgl $LVGL_SRC/font/lv_font_fmt_txt.c $PRJ_HOME/lv_font_fmt_txt.o
compile_lvgl $LVGL_SRC/draw/lv_draw_layer.c $PRJ_HOME/lv_draw_layer.o
compile_lvgl $LVGL_SRC/misc/lv_style_gen.c $PRJ_HOME/lv_style_gen.o
compile_lvgl $LVGL_SRC/misc/lv_gc.c $PRJ_HOME/lv_gc.o
compile_lvgl $LVGL_SRC/misc/lv_utils.c $PRJ_HOME/lv_utils.o
compile_lvgl $LVGL_SRC/widgets/lv_btn.c $PRJ_HOME/lv_btn.o
compile_lvgl $LVGL_SRC/core/lv_indev_scroll.c $PRJ_HOME/lv_indev_scroll.o
## Compile the Zig LVGL App for WebAssembly
zig build-lib \
--verbose-cimport \
-target wasm32-freestanding \
-dynamic \
-rdynamic \
-lc \
-DFAR= \
-DLV_MEM_CUSTOM=1 \
-DLV_FONT_MONTSERRAT_14=1 \
-DLV_FONT_MONTSERRAT_20=1 \
-DLV_FONT_DEFAULT_MONTSERRAT_20=1 \
-DLV_USE_FONT_PLACEHOLDER=1 \
-DLV_USE_LOG=1 \
-DLV_LOG_LEVEL=LV_LOG_LEVEL_TRACE \
-DLV_LOG_TRACE_OBJ_CREATE=1 \
"-DLV_ASSERT_HANDLER={void lv_assert_handler(void); lv_assert_handler();}" \
-I . \
\
-isystem "$NUTTX_HOME/nuttx/include" \
-I "$NUTTX_HOME" \
-I "$APPS_HOME/include" \
-I "$LVGL_HOME" \
-I "$LVGL_SRC/core" \
-I "$LVGL_SRC/draw" \
-I "$LVGL_SRC/draw/arm2d" \
-I "$LVGL_SRC/draw/nxp" \
-I "$LVGL_SRC/draw/nxp/pxp" \
-I "$LVGL_SRC/draw/nxp/vglite" \
-I "$LVGL_SRC/draw/sdl" \
-I "$LVGL_SRC/draw/stm32_dma2d" \
-I "$LVGL_SRC/draw/sw" \
-I "$LVGL_SRC/draw/swm341_dma2d" \
-I "$LVGL_SRC/font" \
-I "$LVGL_SRC/hal" \
-I "$LVGL_SRC/misc" \
-I "$LVGL_SRC/widgets" \
\
lvglwasm.zig \
display.o \
lv_font_montserrat_14.o \
lv_font_montserrat_20.o \
lv_label.o \
lv_mem.o \
lv_obj.o \
lv_event.o \
lv_obj_style.o \
lv_obj_pos.o \
lv_txt.o \
lv_draw_label.o \
lv_obj_draw.o \
lv_area.o \
lv_obj_scroll.o \
lv_font.o \
lv_obj_class.o \
lv_obj_tree.o \
lv_hal_disp.o \
lv_anim.o \
lv_tlsf.o \
lv_group.o \
lv_indev.o \
lv_draw_rect.o \
lv_draw_mask.o \
lv_style.o \
lv_ll.o \
lv_obj_style_gen.o \
lv_timer.o \
lv_disp.o \
lv_refr.o \
lv_color.o \
lv_draw_line.o \
lv_draw_img.o \
lv_math.o \
lv_hal_indev.o \
lv_theme.o \
lv_hal_tick.o \
lv_log.o \
lv_printf.o \
lv_fs.o \
lv_draw.o \
lv_img_decoder.o \
lv_extra.o \
lv_flex.o \
lv_grid.o \
lv_draw_sw.o \
lv_draw_sw_rect.o \
lv_img_cache.o \
lv_img_buf.o \
lv_draw_sw_arc.o \
lv_draw_sw_letter.o \
lv_draw_sw_blend.o \
lv_draw_sw_layer.o \
lv_draw_sw_transform.o \
lv_draw_sw_polygon.o \
lv_draw_sw_line.o \
lv_draw_sw_img.o \
lv_draw_sw_gradient.o \
lv_draw_transform.o \
lv_theme_default.o \
lv_font_fmt_txt.o \
lv_draw_layer.o \
lv_style_gen.o \
lv_gc.o \
lv_utils.o \
lv_btn.o \
lv_indev_scroll.o \
## Compile the Zig LVGL App for PinePhone
## (armv8-a with cortex-a53)
zig build-obj \
-lc \
--verbose-cimport \
-target aarch64-freestanding-none \
-mcpu cortex_a53 \
\
-isystem "$NUTTX_HOME/nuttx/include" \
-I . \
-I "$NUTTX_HOME" \
-I "$APPS_HOME/include" \
-I "$LVGL_HOME" \
-I "$LVGL_SRC/core" \
-I "$LVGL_SRC/draw" \
-I "$LVGL_SRC/draw/arm2d" \
-I "$LVGL_SRC/draw/nxp" \
-I "$LVGL_SRC/draw/nxp/pxp" \
-I "$LVGL_SRC/draw/nxp/vglite" \
-I "$LVGL_SRC/draw/sdl" \
-I "$LVGL_SRC/draw/stm32_dma2d" \
-I "$LVGL_SRC/draw/sw" \
-I "$LVGL_SRC/draw/swm341_dma2d" \
-I "$LVGL_SRC/font" \
-I "$LVGL_SRC/hal" \
-I "$LVGL_SRC/misc" \
-I "$LVGL_SRC/widgets" \
lvgltest.zig
## Copy the compiled Zig LVGL App to NuttX and overwrite `lv_demo_widgets.*.o`
cp lvgltest.o $OBJ_HOME/lv_demo_widgets.*.o
}
## Compile LVGL Library from C to WebAssembly with Zig Compiler
function compile_lvgl {
local source_file=$1 ## Input Source File (LVGL in C)
local object_file=$2 ## Output Object File (WebAssembly)
zig cc \
-target wasm32-freestanding \
-dynamic \
-rdynamic \
-lc \
-DFAR= \
-DLV_MEM_CUSTOM=1 \
-DLV_FONT_MONTSERRAT_14=1 \
-DLV_FONT_MONTSERRAT_20=1 \
-DLV_FONT_DEFAULT_MONTSERRAT_20=1 \
-DLV_USE_FONT_PLACEHOLDER=1 \
-DLV_USE_LOG=1 \
-DLV_LOG_LEVEL=LV_LOG_LEVEL_TRACE \
-DLV_LOG_TRACE_OBJ_CREATE=1 \
"-DLV_ASSERT_HANDLER={void lv_assert_handler(void); lv_assert_handler();}" \
\
-c \
-fno-common \
-Wall \
-Wstrict-prototypes \
-Wshadow \
-Wundef \
-Werror \
-Os \
-fno-strict-aliasing \
-fomit-frame-pointer \
-ffunction-sections \
-fdata-sections \
-g \
-isystem $NUTTX_HOME/nuttx/include \
-D__NuttX__ \
-pipe \
-I $LVGL_HOME \
-I "$APPS_HOME/include" \
-Wno-format \
-Wno-format-security \
-Wno-unused-variable \
"-I./lvgl/src/core" \
"-I./lvgl/src/draw" \
"-I./lvgl/src/draw/arm2d" \
"-I./lvgl/src/draw/nxp" \
"-I./lvgl/src/draw/nxp/pxp" \
"-I./lvgl/src/draw/nxp/vglite" \
"-I./lvgl/src/draw/sdl" \
"-I./lvgl/src/draw/stm32_dma2d" \
"-I./lvgl/src/draw/sw" \
"-I./lvgl/src/draw/swm341_dma2d" \
"-I./lvgl/src/font" \
"-I./lvgl/src/hal" \
"-I./lvgl/src/misc" \
"-I./lvgl/src/widgets" \
$source_file \
-o $object_file
}
## Build the Feature Phone Zig LVGL App for WebAssembly
function build_feature_phone_wasm {
zig build-lib \
-lc \
--verbose-cimport \
-target wasm32-freestanding \
-dynamic \
-rdynamic \
-DFAR= \
-DLV_MEM_CUSTOM=1 \
-DLV_FONT_MONTSERRAT_14=1 \
-DLV_FONT_MONTSERRAT_20=1 \
-DLV_FONT_DEFAULT_MONTSERRAT_20=1 \
-DLV_USE_FONT_PLACEHOLDER=1 \
-DLV_USE_LOG=1 \
-DLV_LOG_LEVEL=LV_LOG_LEVEL_TRACE \
-DLV_LOG_TRACE_OBJ_CREATE=1 \
"-DLV_ASSERT_HANDLER={void lv_assert_handler(void); lv_assert_handler();}" \
-I . \
\
-isystem "$NUTTX_HOME/nuttx/include" \
-I "$NUTTX_HOME" \
-I "$APPS_HOME/include" \
-I "$LVGL_HOME" \
-I "$LVGL_SRC/core" \
-I "$LVGL_SRC/draw" \
-I "$LVGL_SRC/draw/arm2d" \
-I "$LVGL_SRC/draw/nxp" \
-I "$LVGL_SRC/draw/nxp/pxp" \
-I "$LVGL_SRC/draw/nxp/vglite" \
-I "$LVGL_SRC/draw/sdl" \
-I "$LVGL_SRC/draw/stm32_dma2d" \
-I "$LVGL_SRC/draw/sw" \
-I "$LVGL_SRC/draw/swm341_dma2d" \
-I "$LVGL_SRC/font" \
-I "$LVGL_SRC/hal" \
-I "$LVGL_SRC/misc" \
-I "$LVGL_SRC/widgets" \
\
feature-phone.zig \
display.o \
lv_font_montserrat_14.o \
lv_font_montserrat_20.o \
lv_label.o \
lv_mem.o \
lv_obj.o \
lv_event.o \
lv_obj_style.o \
lv_obj_pos.o \
lv_txt.o \
lv_draw_label.o \
lv_obj_draw.o \
lv_area.o \
lv_obj_scroll.o \
lv_font.o \
lv_obj_class.o \
lv_obj_tree.o \
lv_hal_disp.o \
lv_anim.o \
lv_tlsf.o \
lv_group.o \
lv_indev.o \
lv_draw_rect.o \
lv_draw_mask.o \
lv_style.o \
lv_ll.o \
lv_obj_style_gen.o \
lv_timer.o \
lv_disp.o \
lv_refr.o \
lv_color.o \
lv_draw_line.o \
lv_draw_img.o \
lv_math.o \
lv_hal_indev.o \
lv_theme.o \
lv_hal_tick.o \
lv_log.o \
lv_printf.o \
lv_fs.o \
lv_draw.o \
lv_img_decoder.o \
lv_extra.o \
lv_flex.o \
lv_grid.o \
lv_draw_sw.o \
lv_draw_sw_rect.o \
lv_img_cache.o \
lv_img_buf.o \
lv_draw_sw_arc.o \
lv_draw_sw_letter.o \
lv_draw_sw_blend.o \
lv_draw_sw_layer.o \
lv_draw_sw_transform.o \
lv_draw_sw_polygon.o \
lv_draw_sw_line.o \
lv_draw_sw_img.o \
lv_draw_sw_gradient.o \
lv_draw_transform.o \
lv_theme_default.o \
lv_font_fmt_txt.o \
lv_draw_layer.o \
lv_style_gen.o \
lv_gc.o \
lv_utils.o \
lv_btn.o \
lv_indev_scroll.o \
}
## Compile the Feature Phone Zig LVGL App for Apache NuttX RTOS
function build_feature_phone_nuttx {
## Compile the Zig LVGL App for PinePhone
## (armv8-a with cortex-a53)
zig build-obj \
-lc \
--verbose-cimport \
-target aarch64-freestanding-none \
-mcpu cortex_a53 \
\
-isystem "$NUTTX_HOME/nuttx/include" \
-I . \
-I "$NUTTX_HOME" \
-I "$APPS_HOME/include" \
-I "$LVGL_HOME" \
-I "$LVGL_SRC/core" \
-I "$LVGL_SRC/draw" \
-I "$LVGL_SRC/draw/arm2d" \
-I "$LVGL_SRC/draw/nxp" \
-I "$LVGL_SRC/draw/nxp/pxp" \
-I "$LVGL_SRC/draw/nxp/vglite" \
-I "$LVGL_SRC/draw/sdl" \
-I "$LVGL_SRC/draw/stm32_dma2d" \
-I "$LVGL_SRC/draw/sw" \
-I "$LVGL_SRC/draw/swm341_dma2d" \
-I "$LVGL_SRC/font" \
-I "$LVGL_SRC/hal" \
-I "$LVGL_SRC/misc" \
-I "$LVGL_SRC/widgets" \
feature-phone.zig
## Copy the compiled Zig LVGL App to NuttX and overwrite `lv_demo_widgets.*.o`
cp feature-phone.o $OBJ_HOME/lv_demo_widgets.*.o
}
## Build the LVGL App (in Zig) and LVGL Library (in C) for PinePhone and WebAssembly
build_zig
## Compile the Feature Phone Zig LVGL App for WebAssembly
build_feature_phone_wasm
## Compile the Feature Phone Zig LVGL App for Apache NuttX RTOS
build_feature_phone_nuttx