Article: NuttX RTOS for PinePhone: Feature Phone UI in LVGL, Zig and WebAssembly
#4
That is what I got working, feature-phone app via wasm and device Smile

Sure, I understand, the RISC-V stuff is the future Smile  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 Smile

[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
  Reply


Messages In This Thread
RE: Article: NuttX RTOS for PinePhone: Feature Phone UI in LVGL, Zig and WebAssembly - by WhiteHexagon - 06-17-2023, 02:10 AM

Possibly Related Threads…
Thread Author Replies Views Last Post
  Using Signal on PinePhone in mid-2023? dante404 47 14,695 05-03-2024, 02:19 AM
Last Post: dragonhospital
  Slarm64 on PinePhone [Unofficial Slackware ARM - 64 bit] acid andy 38 25,827 04-23-2024, 10:29 AM
Last Post: donchurch
  PinePhone app development WhiteHexagon 15 4,360 04-23-2024, 05:19 AM
Last Post: Jonnyc
Wink PINEPHONE not booting Touchwood 2 573 02-23-2024, 07:27 AM
Last Post: Touchwood
  Slack on PinePhone Adam Seline 5 5,565 12-20-2023, 07:20 AM
Last Post: nickolas
  Struggle to install LibreOffice on the PinePhone Peter Gamma 48 25,190 11-24-2023, 07:02 AM
Last Post: Peter Gamma
  Which word processor to choose for the Pinephone? Peter Gamma 8 2,244 11-23-2023, 01:06 AM
Last Post: Peter Gamma
  openSUSE for Pinephone Alefnode 75 103,669 11-17-2023, 08:37 AM
Last Post: Uturn
  Genode- Sculpt OS for the PinePhone (non Linux) Surehand53 1 1,097 11-04-2023, 07:23 PM
Last Post: tllim
  Abiword as a office mobile word processor for the Pinephone? Peter Gamma 11 2,566 10-24-2023, 08:57 AM
Last Post: Peter Gamma

Forum Jump:


Users browsing this thread: 1 Guest(s)