From b64b1d3468ec020b1a0ec31dd93490196cedaf1d Mon Sep 17 00:00:00 2001
From: guowenxue <guowenxue@gmail.com>
Date: Fri, 27 Sep 2024 14:47:14 +0800
Subject: [PATCH] Add LVGL apps
---
apps/lvgl/makefile | 46 +++++
apps/lvgl/libs_lvgl/build.sh | 72 ++++++++
apps/lvgl/lvgl_demo.c | 91 ++++++++++
apps/lvgl/libs_lvgl/patches/lv_demos-8.0.1-imx6ull.patch | 49 +++++
apps/lvgl/libs_lvgl/patches/lv_drivers-8.0.1-imx6ull.patch | 103 +++++++++++
apps/lvgl/libs_lvgl/patches/lvgl-8.0.2-imx6ull.patch | 92 ++++++++++
apps/lvgl/libs_lvgl/patches/gen_patch.sh | 55 ++++++
7 files changed, 508 insertions(+), 0 deletions(-)
diff --git a/apps/lvgl/libs_lvgl/build.sh b/apps/lvgl/libs_lvgl/build.sh
new file mode 100755
index 0000000..20f4d93
--- /dev/null
+++ b/apps/lvgl/libs_lvgl/build.sh
@@ -0,0 +1,72 @@
+#!/bin/bash
+
+PRJ_PATH=`pwd`
+BOARD=imx6ull
+
+LYFTP_SRC=http://master.weike-iot.com:2211/src/
+
+LIB_LVGL=lvgl-8.0.2
+LIB_LVGL_DRV=lv_drivers-8.0.1
+LIB_LVGL_DEMO=lv_demos-8.0.1
+
+LIBS_DIR="lvgl lv_drivers lv_demos"
+
+CROSS_COMPILE=/opt/gcc-aarch32-10.3-2021.07/bin/arm-none-linux-gnueabihf-
+if [ $# == 1 ] ; then
+ CROSS_COMPILE=$1
+fi
+
+set -e
+
+function prepare_lib()
+{
+ PACK_SUFIX=tar.gz
+ PACK_NAME=$1
+ DIR_NAME=$2
+
+ if [ ! -d ${DIR_NAME} ] ; then
+ if [ ! -s ${PACK_NAME}.${PACK_SUFIX} ] ; then
+ wget ${LYFTP_SRC}/${PACK_NAME}.${PACK_SUFIX}
+ fi
+
+ tar -xzf ${PACK_NAME}.${PACK_SUFIX}
+ patch -p0 < patches/${PACK_NAME}-${BOARD}.patch
+ mv ${PACK_NAME} ${DIR_NAME}
+
+ cd ${DIR_NAME}
+ sed -i -e "s|.*CMAKE_C_COMPILER.*|set(CMAKE_C_COMPILER \"${CROSS_COMPILE}gcc\")|g" CMakeLists.txt
+ temp_file=`ls *_template.h`
+ conf_file=`echo ${temp_file/_template/}`
+ cp ${temp_file} ../${conf_file}
+ cd ${PRJ_PATH}
+ fi
+}
+
+if [[ $# == 1 && $1 == clean ]] ; then
+ rm -rf lv*
+ rm -rf libs
+ exit;
+fi
+
+prepare_lib ${LIB_LVGL} lvgl
+prepare_lib ${LIB_LVGL_DRV} lv_drivers
+prepare_lib ${LIB_LVGL_DEMO} lv_demos
+
+
+mkdir -p ${PRJ_PATH}/libs
+
+for lib in ${LIBS_DIR}
+do
+ if [ -f ${PRJ_PATH}/libs/lib${lib}.a ] ; then
+ continue;
+ fi
+
+ mkdir -p ${lib}/build
+ cd ${lib}/build/
+ rm -rf * && cmake .. && make
+
+ cp lib*.a ${PRJ_PATH}/libs/lib${lib}.a
+ cd ${PRJ_PATH}
+done
+
+
diff --git a/apps/lvgl/libs_lvgl/patches/gen_patch.sh b/apps/lvgl/libs_lvgl/patches/gen_patch.sh
new file mode 100755
index 0000000..acf88f1
--- /dev/null
+++ b/apps/lvgl/libs_lvgl/patches/gen_patch.sh
@@ -0,0 +1,55 @@
+#!/bin/bash
+# Description: This shell script used to generate patch file
+# Author: guowenxue <guowenxue@gmail.com>
+# Version: 1.0.0
+
+PROJ_PATH=`pwd`
+
+PATCH_PATH=${PROJ_PATH}/patches
+
+BOARD=imx6ull
+PATCH_SUFFIX=${BOARD}.patch
+
+set -e
+
+
+if [ $# != 1 ] ; then
+ echo "Usage: $0 [src_path]"
+ printf "\nExample: \n"
+ echo "$0 lvgl-8.0.2"
+
+ exit ;
+fi
+
+
+SRC=`basename $1`
+
+if [ ! -d ${SRC} ] ; then
+ printf "\nERROR: ${SRC} source code not exist, exit now\n\n"
+ exit
+fi
+
+if [ ! -f ${SRC}.tar.gz ] ; then
+ printf "\nERROR: ${SRC}.tar.gz packet not exist, exit now\n\n"
+ exit
+fi
+
+rm -rf ${SRC}/build
+
+# rename new source code
+mv ${SRC} ${SRC}-${BOARD}
+
+# decompress orignal soruce code packet
+tar -xzf ${SRC}.tar.gz
+
+set +e
+
+# generate patch file
+diff -Nuar ${SRC} ${SRC}-${BOARD} > ${SRC}-${PATCH_SUFFIX}
+
+# remove orignal soruce code
+rm -rf ${SRC}
+
+# recover new source code
+mv ${SRC}-${BOARD} ${SRC}
+
diff --git a/apps/lvgl/libs_lvgl/patches/lv_demos-8.0.1-imx6ull.patch b/apps/lvgl/libs_lvgl/patches/lv_demos-8.0.1-imx6ull.patch
new file mode 100644
index 0000000..b07ea04
--- /dev/null
+++ b/apps/lvgl/libs_lvgl/patches/lv_demos-8.0.1-imx6ull.patch
@@ -0,0 +1,49 @@
+diff -Nuar lv_demos-8.0.1/CMakeLists.txt lv_demos-8.0.1-imx6ull/CMakeLists.txt
+--- lv_demos-8.0.1/CMakeLists.txt 2021-06-14 20:00:00.000000000 +0800
++++ lv_demos-8.0.1-imx6ull/CMakeLists.txt 2021-09-27 21:26:45.823935469 +0800
+@@ -1,2 +1,5 @@
++set(CMAKE_C_COMPILER "/opt/buildroot/cortex-a7/bin/arm-linux-gcc")
++include_directories(..)
++
+ file(GLOB_RECURSE SOURCES src/*.c)
+ add_library(lv_examples STATIC ${SOURCES})
+diff -Nuar lv_demos-8.0.1/lv_demo_conf_template.h lv_demos-8.0.1-imx6ull/lv_demo_conf_template.h
+--- lv_demos-8.0.1/lv_demo_conf_template.h 2021-06-14 20:00:00.000000000 +0800
++++ lv_demos-8.0.1-imx6ull/lv_demo_conf_template.h 2021-09-27 20:57:35.667901897 +0800
+@@ -7,7 +7,7 @@
+ * COPY THIS FILE AS lv_demo_conf.h
+ */
+
+-#if 0 /*Set it to "1" to enable the content*/
++#if 1 /*Set it to "1" to enable the content*/
+
+ #ifndef LV_EX_CONF_H
+ #define LV_EX_CONF_H
+@@ -25,22 +25,22 @@
+ *********************/
+
+ /*Show some widget*/
+-#define LV_USE_DEMO_WIDGETS 0
++#define LV_USE_DEMO_WIDGETS 1
+ #if LV_USE_DEMO_WIDGETS
+ #define LV_DEMO_WIDGETS_SLIDESHOW 0
+ #endif
+
+ /*Printer demo, optimized for 800x480*/
+-#define LV_USE_DEMO_PRINTER 0
++#define LV_USE_DEMO_PRINTER 1
+
+ /*Demonstrate the usage of encoder and keyboard*/
+-#define LV_USE_DEMO_KEYPAD_AND_ENCODER 0
++#define LV_USE_DEMO_KEYPAD_AND_ENCODER 1
+
+ /*Benchmark your system*/
+-#define LV_USE_DEMO_BENCHMARK 0
++#define LV_USE_DEMO_BENCHMARK 1
+
+ /*Stress test for LVGL*/
+-#define LV_USE_DEMO_STRESS 0
++#define LV_USE_DEMO_STRESS 1
+
+ /*Music player demo*/
+ #define LV_USE_DEMO_MUSIC 1
diff --git a/apps/lvgl/libs_lvgl/patches/lv_drivers-8.0.1-imx6ull.patch b/apps/lvgl/libs_lvgl/patches/lv_drivers-8.0.1-imx6ull.patch
new file mode 100644
index 0000000..fddbfea
--- /dev/null
+++ b/apps/lvgl/libs_lvgl/patches/lv_drivers-8.0.1-imx6ull.patch
@@ -0,0 +1,103 @@
+diff -Nuar lv_drivers-8.0.1/CMakeLists.txt lv_drivers-8.0.1-imx6ull/CMakeLists.txt
+--- lv_drivers-8.0.1/CMakeLists.txt 2021-06-14 19:54:20.000000000 +0800
++++ lv_drivers-8.0.1-imx6ull/CMakeLists.txt 2021-09-27 22:20:38.179997474 +0800
+@@ -1,2 +1,5 @@
++set(CMAKE_C_COMPILER "/opt/buildroot/cortex-a7/bin/arm-linux-gcc")
++include_directories(..)
++
+ file(GLOB_RECURSE SOURCES ./*.c)
+ add_library(lv_drivers STATIC ${SOURCES})
+diff -Nuar lv_drivers-8.0.1/indev/evdev.c lv_drivers-8.0.1-imx6ull/indev/evdev.c
+--- lv_drivers-8.0.1/indev/evdev.c 2021-06-14 19:54:20.000000000 +0800
++++ lv_drivers-8.0.1-imx6ull/indev/evdev.c 2021-09-27 22:25:04.172002576 +0800
+@@ -115,7 +115,7 @@
+ * @param data store the evdev data here
+ * @return false: because the points are not buffered, so no more data to be read
+ */
+-bool evdev_read(lv_indev_drv_t * drv, lv_indev_data_t * data)
++void evdev_read(lv_indev_drv_t * drv, lv_indev_data_t * data)
+ {
+ struct input_event in;
+
+@@ -196,7 +196,7 @@
+ }
+ evdev_key_val = data->key;
+ evdev_button = data->state;
+- return false;
++ return;
+ }
+ }
+ }
+@@ -205,10 +205,10 @@
+ /* No data retrieved */
+ data->key = evdev_key_val;
+ data->state = evdev_button;
+- return false;
++ return;
+ }
+ if(drv->type != LV_INDEV_TYPE_POINTER)
+- return false;
++ return;
+ /*Store the collected data*/
+
+ #if EVDEV_CALIBRATE
+@@ -225,12 +225,12 @@
+ data->point.x = 0;
+ if(data->point.y < 0)
+ data->point.y = 0;
+- if(data->point.x >= drv->disp->driver.hor_res)
+- data->point.x = drv->disp->driver.hor_res - 1;
+- if(data->point.y >= drv->disp->driver.ver_res)
+- data->point.y = drv->disp->driver.ver_res - 1;
++ if(data->point.x >= drv->disp->driver->hor_res)
++ data->point.x = drv->disp->driver->hor_res - 1;
++ if(data->point.y >= drv->disp->driver->ver_res)
++ data->point.y = drv->disp->driver->ver_res - 1;
+
+- return false;
++ return;
+ }
+
+ /**********************
+diff -Nuar lv_drivers-8.0.1/indev/evdev.h lv_drivers-8.0.1-imx6ull/indev/evdev.h
+--- lv_drivers-8.0.1/indev/evdev.h 2021-06-14 19:54:20.000000000 +0800
++++ lv_drivers-8.0.1-imx6ull/indev/evdev.h 2021-09-27 22:25:33.424003137 +0800
+@@ -57,7 +57,7 @@
+ * @param data store the evdev data here
+ * @return false: because the points are not buffered, so no more data to be read
+ */
+-bool evdev_read(lv_indev_drv_t * drv, lv_indev_data_t * data);
++void evdev_read(lv_indev_drv_t * drv, lv_indev_data_t * data);
+
+
+ /**********************
+diff -Nuar lv_drivers-8.0.1/lv_drv_conf_template.h lv_drivers-8.0.1-imx6ull/lv_drv_conf_template.h
+--- lv_drivers-8.0.1/lv_drv_conf_template.h 2021-06-14 19:54:20.000000000 +0800
++++ lv_drivers-8.0.1-imx6ull/lv_drv_conf_template.h 2021-09-27 22:20:38.183997474 +0800
+@@ -7,7 +7,7 @@
+ * COPY THIS FILE AS lv_drv_conf.h
+ */
+
+-#if 0 /*Set it to "1" to enable the content*/
++#if 1 /*Set it to "1" to enable the content*/
+
+ #ifndef LV_DRV_CONF_H
+ #define LV_DRV_CONF_H
+@@ -272,7 +272,7 @@
+ * Linux frame buffer device (/dev/fbx)
+ *-----------------------------------------*/
+ #ifndef USE_FBDEV
+-# define USE_FBDEV 0
++# define USE_FBDEV 1
+ #endif
+
+ #if USE_FBDEV
+@@ -386,7 +386,7 @@
+ * Mouse or touchpad as evdev interface (for Linux based systems)
+ *------------------------------------------------*/
+ #ifndef USE_EVDEV
+-# define USE_EVDEV 0
++# define USE_EVDEV 1
+ #endif
+
+ #ifndef USE_BSD_EVDEV
diff --git a/apps/lvgl/libs_lvgl/patches/lvgl-8.0.2-imx6ull.patch b/apps/lvgl/libs_lvgl/patches/lvgl-8.0.2-imx6ull.patch
new file mode 100644
index 0000000..5ae5a78
--- /dev/null
+++ b/apps/lvgl/libs_lvgl/patches/lvgl-8.0.2-imx6ull.patch
@@ -0,0 +1,92 @@
+diff -Nuar lvgl-8.0.2/CMakeLists.txt lvgl-8.0.2-imx6ull/CMakeLists.txt
+--- lvgl-8.0.2/CMakeLists.txt 2021-07-16 23:40:51.000000000 +0800
++++ lvgl-8.0.2-imx6ull/CMakeLists.txt 2021-09-27 22:30:20.360008641 +0800
+@@ -1,3 +1,7 @@
++
++set(CMAKE_C_COMPILER "/opt/buildroot/cortex-a7/bin/arm-linux-gcc")
++include_directories(..)
++
+ if(ESP_PLATFORM)
+
+ file(GLOB_RECURSE SOURCES src/*.c)
+diff -Nuar lvgl-8.0.2/lv_conf_template.h lvgl-8.0.2-imx6ull/lv_conf_template.h
+--- lvgl-8.0.2/lv_conf_template.h 2021-07-16 23:40:51.000000000 +0800
++++ lvgl-8.0.2-imx6ull/lv_conf_template.h 2021-09-27 22:33:47.448012614 +0800
+@@ -7,7 +7,7 @@
+ * COPY THIS FILE AS `lv_conf.h` NEXT TO the `lvgl` FOLDER
+ */
+
+-#if 0 /*Set it to "1" to enable content*/
++#if 1 /*Set it to "1" to enable content*/
+
+ #ifndef LV_CONF_H
+ #define LV_CONF_H
+@@ -21,7 +21,7 @@
+ *====================*/
+
+ /*Color depth: 1 (1 byte per pixel), 8 (RGB332), 16 (RGB565), 32 (ARGB8888)*/
+-#define LV_COLOR_DEPTH 32
++#define LV_COLOR_DEPTH 16
+
+ /*Swap the 2 bytes of RGB565 color. Useful if the display has a 8 bit interface (e.g. SPI)*/
+ #define LV_COLOR_16_SWAP 0
+@@ -42,7 +42,7 @@
+ #define LV_MEM_CUSTOM 0
+ #if LV_MEM_CUSTOM == 0
+ /*Size of the memory available for `lv_mem_alloc()` in bytes (>= 2kB)*/
+-# define LV_MEM_SIZE (32U * 1024U) /*[bytes]*/
++# define LV_MEM_SIZE (128U * 1024U) /*[bytes]*/
+
+ /*Set an address for the memory pool instead of allocating it as a normal array. Can be in external SRAM too.*/
+ # define LV_MEM_ADR 0 /*0: unused*/
+@@ -68,9 +68,10 @@
+
+ /*Use a custom tick source that tells the elapsed time in milliseconds.
+ *It removes the need to manually update the tick with `lv_tick_inc()`)*/
+-#define LV_TICK_CUSTOM 0
++#define LV_TICK_CUSTOM 1
+ #if LV_TICK_CUSTOM
+-#define LV_TICK_CUSTOM_INCLUDE "Arduino.h" /*Header for the system time function*/
++extern uint32_t millis(void);
++#define LV_TICK_CUSTOM_INCLUDE <stdint.h> /*Header for the system time function*/
+ #define LV_TICK_CUSTOM_SYS_TIME_EXPR (millis()) /*Expression evaluating to current system time in ms*/
+ #endif /*LV_TICK_CUSTOM*/
+
+@@ -137,7 +138,7 @@
+ *-----------*/
+
+ /*Enable the log module*/
+-#define LV_USE_LOG 0
++#define LV_USE_LOG 1
+ #if LV_USE_LOG
+
+ /*How important log should be added:
+@@ -151,7 +152,7 @@
+
+ /*1: Print the log with 'printf';
+ *0: User need to register a callback with `lv_log_register_print_cb()`*/
+-# define LV_LOG_PRINTF 0
++# define LV_LOG_PRINTF 1
+
+ /*Enable/disable LV_LOG_TRACE in modules that produces a huge number of logs*/
+ # define LV_LOG_TRACE_MEM 1
+@@ -262,13 +263,13 @@
+
+ /*Montserrat fonts with ASCII range and some symbols using bpp = 4
+ *https://fonts.google.com/specimen/Montserrat*/
+-#define LV_FONT_MONTSERRAT_8 0
+-#define LV_FONT_MONTSERRAT_10 0
+-#define LV_FONT_MONTSERRAT_12 0
++#define LV_FONT_MONTSERRAT_8 1
++#define LV_FONT_MONTSERRAT_10 1
++#define LV_FONT_MONTSERRAT_12 1
+ #define LV_FONT_MONTSERRAT_14 1
+-#define LV_FONT_MONTSERRAT_16 0
+-#define LV_FONT_MONTSERRAT_18 0
+-#define LV_FONT_MONTSERRAT_20 0
++#define LV_FONT_MONTSERRAT_16 1
++#define LV_FONT_MONTSERRAT_18 1
++#define LV_FONT_MONTSERRAT_20 1
+ #define LV_FONT_MONTSERRAT_22 0
+ #define LV_FONT_MONTSERRAT_24 0
+ #define LV_FONT_MONTSERRAT_26 0
diff --git a/apps/lvgl/lvgl_demo.c b/apps/lvgl/lvgl_demo.c
new file mode 100644
index 0000000..f7eeb5c
--- /dev/null
+++ b/apps/lvgl/lvgl_demo.c
@@ -0,0 +1,91 @@
+/*********************************************************************************
+ * Copyright: (C) 2021 LingYun IoT System Studio
+ * All rights reserved.
+ *
+ * Filename: lvgl_demo.c
+ * Description: This file is LVGL demo program.
+ *
+ * Version: 1.0.0(2021年09月27日)
+ * Author: Guo Wenxue <guowenxue@gmail.com>
+ * ChangeLog: 1, Release initial version on "2021年09月27日 22时16分52秒"
+ *
+ ********************************************************************************/
+
+#include <stdio.h>
+#include <unistd.h>
+#include <pthread.h>
+#include <time.h>
+#include <sys/time.h>
+
+#include "lvgl/lvgl.h"
+#include "lv_drivers/display/fbdev.h"
+#include "lv_drivers/indev/evdev.h"
+#include "lv_demos/lv_demo.h"
+
+#define DISP_BUF_SIZE (128 * 1024)
+
+
+int main(void)
+{
+ lv_disp_drv_t disp_drv;
+ lv_indev_drv_t indev_drv;
+ static lv_color_t buf[DISP_BUF_SIZE]; /* buffer for LVGL to draw the screen's content */
+ static lv_disp_draw_buf_t disp_buf; /* Initialize a descriptor for the buffer */
+
+ /* LVGL context init */
+ lv_init();
+
+ /* Linux frame buffer device init */
+ fbdev_init();
+
+ /* linux touchscreen device init */
+ lv_indev_drv_init(&indev_drv);
+ indev_drv.type =LV_INDEV_TYPE_POINTER;
+ indev_drv.read_cb =evdev_read;
+ lv_indev_drv_register(&indev_drv);
+
+ /* Initialize and register a display driver */
+ lv_disp_draw_buf_init(&disp_buf, buf, NULL, DISP_BUF_SIZE);
+ lv_disp_drv_init(&disp_drv);
+ disp_drv.draw_buf = &disp_buf;
+ disp_drv.flush_cb = fbdev_flush;
+ disp_drv.hor_res = 800;
+ disp_drv.ver_res = 480;
+ lv_disp_drv_register(&disp_drv);
+
+ /* Create a Demo */
+ //lv_demo_widgets();
+ lv_demo_music();
+ //lv_demo_keypad_encoder();
+ //lv_demo_stress();
+
+ /* Handle LitlevGL tasks (tickless mode) */
+ while(1) {
+ lv_task_handler();
+ usleep(5000);
+ }
+
+ return 0;
+}
+
+/* Set in lv_conf.h as LV_TICK_CUSTOM_SYS_TIME_EXPR */
+uint32_t millis(void)
+{
+ static uint64_t start_ms = 0;
+ struct timeval tv_start;
+ struct timeval tv_now;
+ uint64_t now_ms;
+ uint32_t time_ms;
+
+ if(start_ms == 0)
+ {
+ gettimeofday(&tv_start, NULL);
+ start_ms = (tv_start.tv_sec * 1000000 + tv_start.tv_usec) / 1000;
+ }
+
+ gettimeofday(&tv_now, NULL);
+ now_ms = (tv_now.tv_sec * 1000000 + tv_now.tv_usec) / 1000;
+
+ time_ms = now_ms - start_ms;
+ return time_ms;
+}
diff --git a/apps/lvgl/makefile b/apps/lvgl/makefile
new file mode 100644
index 0000000..0540f67
--- /dev/null
+++ b/apps/lvgl/makefile
@@ -0,0 +1,46 @@
+
+CROSS_COMPILE=/opt/gcc-aarch32-10.3-2021.07/bin/arm-none-linux-gnueabihf-
+CC = ${CROSS_COMPILE}gcc
+
+CFLAGS = -Wall -Wshadow -Wundef -Wmaybe-uninitialized
+CFLAGS += -O3 -g3 -I./ -I ./libs_lvgl/
+
+LDFLAGS+=-L ./libs_lvgl/libs/ -llv_demos -llv_drivers -llvgl
+
+BIN = lvgl_demo
+
+MAINSRC = lvgl_demo.c
+
+VPATH =
+OBJEXT ?= .o
+
+AOBJS = $(ASRCS:.S=$(OBJEXT))
+COBJS = $(CSRCS:.c=$(OBJEXT))
+
+MAINOBJ = $(MAINSRC:.c=$(OBJEXT))
+
+SRCS = $(ASRCS) $(CSRCS) $(MAINSRC)
+OBJS = $(AOBJS) $(COBJS)
+
+## MAINOBJ -> OBJFILES
+
+all: libs clean default
+ cp ${BIN} /tftp
+
+libs:
+ cd libs_lvgl && ./build.sh ${CROSS_COMPILE}
+
+%.o: %.c
+ @$(CC) $(CFLAGS) -c $< -o $@
+ @echo "CC $<"
+
+default: $(AOBJS) $(COBJS) $(MAINOBJ)
+ $(CC) -o $(BIN) $(MAINOBJ) $(AOBJS) $(COBJS) $(LDFLAGS)
+
+clean:
+ rm -f $(BIN) $(AOBJS) $(COBJS) $(MAINOBJ)
+
+distclean: clean
+ rm -rf cscope* tags
+ cd libs_lvgl && ./build.sh clean
+
--
Gitblit v1.9.1