You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by ac...@apache.org on 2023/01/01 13:15:00 UTC
[nuttx-apps] branch master updated: graphics/lvgl: Upgrade to lvgl v8 version
This is an automated email from the ASF dual-hosted git repository.
acassis pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx-apps.git
The following commit(s) were added to refs/heads/master by this push:
new a610b633d graphics/lvgl: Upgrade to lvgl v8 version
a610b633d is described below
commit a610b633d297c806c74e9b6e56ee2fd121aec261
Author: pengyiqiang <pe...@xiaomi.com>
AuthorDate: Sat Oct 8 17:03:06 2022 +0800
graphics/lvgl: Upgrade to lvgl v8 version
Signed-off-by: pengyiqiang <pe...@xiaomi.com>
---
examples/lvgldemo/Kconfig | 94 +-
examples/lvgldemo/Makefile | 69 +-
examples/lvgldemo/fbdev.c | 469 --------
examples/lvgldemo/lcddev.c | 315 ------
examples/lvgldemo/lcddev.h | 46 -
examples/lvgldemo/lv_ex_conf.h | 72 --
examples/lvgldemo/lvgldemo.c | 211 ++--
examples/lvgldemo/tp.c | 279 -----
examples/lvgldemo/tp.h | 129 ---
examples/lvgldemo/tp_cal.c | 332 ------
graphics/lvgl/Kconfig | 556 +++-------
graphics/lvgl/Make.defs | 4 -
graphics/lvgl/Makefile | 65 +-
graphics/lvgl/lv_conf.h | 1052 ------------------
graphics/lvgl/lv_conf/Kconfig | 1115 ++++++++++++++++++++
graphics/lvgl/lv_fs_interface.c | 575 ----------
.../lvgl/{lv_fs_interface.h => port/lv_port.c} | 81 +-
.../lvgl/{lv_fs_interface.h => port/lv_port.h} | 25 +-
graphics/lvgl/port/lv_port_button.c | 238 +++++
.../{lv_fs_interface.h => port/lv_port_button.h} | 28 +-
graphics/lvgl/port/lv_port_encoder.c | 162 +++
.../{lv_fs_interface.h => port/lv_port_encoder.h} | 28 +-
graphics/lvgl/port/lv_port_fbdev.c | 673 ++++++++++++
.../{lv_fs_interface.h => port/lv_port_fbdev.h} | 28 +-
graphics/lvgl/port/lv_port_keypad.c | 251 +++++
.../{lv_fs_interface.h => port/lv_port_keypad.h} | 26 +-
graphics/lvgl/port/lv_port_lcddev.c | 302 ++++++
.../{lv_fs_interface.h => port/lv_port_lcddev.h} | 30 +-
graphics/lvgl/port/lv_port_mem.c | 173 +++
.../{lv_tick_interface.c => port/lv_port_mem.h} | 75 +-
.../fbdev.h => graphics/lvgl/port/lv_port_syslog.c | 39 +-
.../lvgl/port/lv_port_syslog.h | 48 +-
.../{lv_tick_interface.c => port/lv_port_tick.c} | 28 +-
.../{lv_tick_interface.h => port/lv_port_tick.h} | 11 +-
graphics/lvgl/port/lv_port_touchpad.c | 178 ++++
.../{lv_fs_interface.h => port/lv_port_touchpad.h} | 28 +-
36 files changed, 3699 insertions(+), 4136 deletions(-)
diff --git a/examples/lvgldemo/Kconfig b/examples/lvgldemo/Kconfig
index cbd642684..00f6b250f 100644
--- a/examples/lvgldemo/Kconfig
+++ b/examples/lvgldemo/Kconfig
@@ -12,104 +12,12 @@ menuconfig EXAMPLES_LVGLDEMO
if EXAMPLES_LVGLDEMO
-config EXAMPLES_LVGLDEMO_BUFF_SIZE
- int "Display buffer size (in line)"
- default 20
-
-config EXAMPLES_LVGLDEMO_DOUBLE_BUFFERING
- bool "Enable double buffering"
- default n
- ---help---
- When double buffering is enabled, LVGL expects the size of both
- buffers as:
- CONFIG_LV_HOR_RES * CONFIG_EXAMPLES_LVGLDEMO_BUFF_SIZE.
- True double buffering support is enabled if both buffers have the
- same dimensions as the display device resolution. Otherwise,
- LVGL will perform a number of partial refreshes according to the
- defined buffer size.
-
-config EXAMPLES_LVGLDEMO_ASYNC_FLUSH
- bool "Flush the display buffer asynchronously"
- default n
- ---help---
- Enable this option to perform an asynchronous write of the buffer
- contents to the display device.
-
-choice
- prompt "Select a demo application"
- default EXAMPLES_LVGLDEMO_WIDGETS
-
-config EXAMPLES_LVGLDEMO_BENCHMARK
- bool "Benchmark"
-
-config EXAMPLES_LVGLDEMO_PRINTER
- bool "Printer"
- ---help---
- This demo is optimized for 800 * 480 resolution
-
-config EXAMPLES_LVGLDEMO_STRESS
- bool "Stress"
-
-config EXAMPLES_LVGLDEMO_WIDGETS
- bool "Widgets"
-
-endchoice
-
-if EXAMPLES_LVGLDEMO_WIDGETS
-
-config EXAMPLES_LVGLDEMO_WIDGETS_SLIDESHOW
- bool "Enable Slideshow mode for Widgets example"
- default n
- ---help---
- Slideshow mode consists of a non-interactive demonstration of the
- Widgets example.
-
-endif # EXAMPLES_LVGLDEMO_WIDGETS
-
config EXAMPLES_LVGLDEMO_PRIORITY
- int "lvgl task priority"
+ int "lvgldemo task priority"
default 100
config EXAMPLES_LVGLDEMO_STACKSIZE
int "lvgldemo stack size"
default 16384
-comment "Input configuration options"
- depends on INPUT_TOUCHSCREEN || INPUT_MOUSE
-
-config EXAMPLES_LVGLDEMO_CALIBRATE
- bool "Calibrate touchscreen"
- default y
- depends on INPUT_TOUCHSCREEN || INPUT_MOUSE
- ---help---
- Calibrate touchscreen before demo start, but some touchscreen
- don't need it, like capacitive touchscreen.
-
-if INPUT_TOUCHSCREEN
-
-config EXAMPLES_LVGLDEMO_MINOR
- int "Touchscreen minor device number"
- default 0
- ---help---
- The minor device number. Minor=N corresponds to touchscreen device
- /dev/inputN. Note this value must with EXAMPLES_LVGLDEMO_DEVPATH.
- Default 0.
-
-config EXAMPLES_LVGLDEMO_DEVPATH
- string "Touchscreen device path"
- default "/dev/input0"
- ---help---
- The path to the touchscreen device. This must be consistent with
- EXAMPLES_LVGLDEMO_MINOR. Default: "/dev/input0"
-
-endif # INPUT_TOUCHSCREEN
-
-config EXAMPLES_LVGLDEMO_MOUSE
- bool "Mouse interface"
- default n
- depends on INPUT_MOUSE
- ---help---
- The LittleVGL demo can also be configured to work with a mouse
- driver by setting this option.
-
endif # EXAMPLES_LVGLDEMO
diff --git a/examples/lvgldemo/Makefile b/examples/lvgldemo/Makefile
index 9a903a468..65e0b5a95 100644
--- a/examples/lvgldemo/Makefile
+++ b/examples/lvgldemo/Makefile
@@ -20,80 +20,13 @@
include $(APPDIR)/Make.defs
-# LittleVGL demo built-in application info
-
-CONFIG_LV_EXAMPLES_URL ?= https://github.com/lvgl/lv_demos/archive
-
-LVGL_EXAMPLES_VERSION = $(patsubst "%",%,$(strip $(CONFIG_LVGL_VERSION)))
-LVGL_EXAMPLES_TARBALL = v$(LVGL_EXAMPLES_VERSION).zip
-
-LVGL_EXAMPLES_UNPACKNAME = lv_demos
-UNPACK ?= unzip -o
-
PROGNAME = lvgldemo
PRIORITY = $(CONFIG_EXAMPLES_LVGLDEMO_PRIORITY)
STACKSIZE = $(CONFIG_EXAMPLES_LVGLDEMO_STACKSIZE)
MODULE = $(CONFIG_EXAMPLES_LVGLDEMO)
-# LittleVGL demo Example
-
-CSRCS += fbdev.c lcddev.c
-
-ifneq ($(CONFIG_INPUT_TOUCHSCREEN)$(CONFIG_INPUT_MOUSE),)
-CSRCS += tp.c tp_cal.c
-endif
-
-# static common assets used in multiple examples
-
-LV_EXAMPLE_ASSETS = $(wildcard ./lv_demos/assets/*.c)
-CSRCS += $(notdir $(LV_EXAMPLE_ASSETS))
-VPATH += lv_demos/assets
-
-ifneq ($(CONFIG_EXAMPLES_LVGLDEMO_BENCHMARK),)
-CSRCS += lv_demo_benchmark.c
-VPATH += lv_demos/src/lv_demo_benchmark
-endif
-
-ifneq ($(CONFIG_EXAMPLES_LVGLDEMO_PRINTER),)
-LV_PRINTER_IMAGES = $(wildcard ./lv_demos/src/lv_demo_printer/images/*.c)
-CSRCS += lv_demo_printer.c lv_demo_printer_theme.c
-CSRCS += $(notdir $(LV_PRINTER_IMAGES))
-VPATH += lv_demos/src/lv_demo_printer
-VPATH += lv_demos/src/lv_demo_printer/images
-endif
-
-ifneq ($(CONFIG_EXAMPLES_LVGLDEMO_STRESS),)
-CSRCS += lv_demo_stress.c
-VPATH += lv_demos/src/lv_demo_stress
-endif
-
-ifneq ($(CONFIG_EXAMPLES_LVGLDEMO_WIDGETS),)
-CSRCS += lv_demo_widgets.c
-VPATH += lv_demos/src/lv_demo_widgets
-endif
+# LVGL demo Example
MAINSRC = lvgldemo.c
-CFLAGS += ${DEFINE_PREFIX}LV_LVGL_H_INCLUDE_SIMPLE -Wno-format
-CXXFLAGS += ${DEFINE_PREFIX}LV_LVGL_H_INCLUDE_SIMPLE -Wno-format
-
-$(LVGL_EXAMPLES_TARBALL):
- $(Q) echo "Downloading: $(LVGL_EXAMPLES_TARBALL)"
- $(Q) curl -O -L $(CONFIG_LV_EXAMPLES_URL)/$(LVGL_EXAMPLES_TARBALL)
-
-$(LVGL_EXAMPLES_UNPACKNAME): $(LVGL_EXAMPLES_TARBALL)
- $(Q) echo "Unpacking: $(LVGL_EXAMPLES_TARBALL) -> $(LVGL_EXAMPLES_UNPACKNAME)"
- $(Q) $(UNPACK) $(LVGL_EXAMPLES_TARBALL)
- $(Q) mv lv_demos-$(LVGL_EXAMPLES_VERSION) $(LVGL_EXAMPLES_UNPACKNAME)
- $(Q) touch $(LVGL_EXAMPLES_UNPACKNAME)
-
-# Download and unpack tarball if no git repo found
-ifeq ($(wildcard $(LVGL_EXAMPLES_UNPACKNAME)/.git),)
-context:: $(LVGL_EXAMPLES_UNPACKNAME)
-
-distclean::
- $(call DELDIR, $(LVGL_EXAMPLES_UNPACKNAME))
- $(call DELFILE, $(LVGL_EXAMPLES_TARBALL))
-endif
-
include $(APPDIR)/Application.mk
diff --git a/examples/lvgldemo/fbdev.c b/examples/lvgldemo/fbdev.c
deleted file mode 100644
index 811b821f7..000000000
--- a/examples/lvgldemo/fbdev.c
+++ /dev/null
@@ -1,469 +0,0 @@
-/****************************************************************************
- * apps/examples/lvgldemo/fbdev.c
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership. The
- * ASF licenses this file to you 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.
- *
- ****************************************************************************/
-
-/****************************************************************************
- * Included Files
- ****************************************************************************/
-
-#include "fbdev.h"
-
-#include <nuttx/compiler.h>
-#include <nuttx/config.h>
-
-#ifdef CONFIG_EXAMPLES_LVGLDEMO_ASYNC_FLUSH
-#include <pthread.h>
-#include <semaphore.h>
-#endif
-
-#include <sys/ioctl.h>
-#include <sys/mman.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <fcntl.h>
-#include <errno.h>
-#include <debug.h>
-
-#include <nuttx/video/fb.h>
-#include <nuttx/video/rgbcolors.h>
-
-/****************************************************************************
- * Pre-processor Definitions
- ****************************************************************************/
-
-#ifndef FBDEV_PATH
-# define FBDEV_PATH "/dev/fb0"
-#endif
-
-/****************************************************************************
- * Private Types
- ****************************************************************************/
-
-struct fb_state_s
-{
- int fd;
- struct fb_videoinfo_s vinfo;
- struct fb_planeinfo_s pinfo;
- FAR void *fbmem;
-};
-
-/****************************************************************************
- * Private Data
- ****************************************************************************/
-
-struct fb_state_s state;
-
-#ifdef CONFIG_EXAMPLES_LVGLDEMO_ASYNC_FLUSH
-static pthread_t fb_write_thread;
-static sem_t flush_sem;
-static sem_t wait_sem;
-
-static lv_area_t lv_area;
-static lv_color_t *lv_color_p;
-#endif
-
-/****************************************************************************
- * Private Functions
- ****************************************************************************/
-
-/****************************************************************************
- * Name: fbdev_wait
- *
- * Description:
- * Wait for the flushing operation conclusion to notify LVGL.
- *
- * Input Parameters:
- * disp_drv - LVGL driver interface
- *
- * Returned Value:
- * None
- *
- ****************************************************************************/
-
-#ifdef CONFIG_EXAMPLES_LVGLDEMO_ASYNC_FLUSH
-
-static void fbdev_wait(lv_disp_drv_t *disp_drv)
-{
- sem_wait(&wait_sem);
-
- /* Tell the flushing is ready */
-
- lv_disp_flush_ready(disp_drv);
-}
-
-#endif
-
-/****************************************************************************
- * Name: fbdev_flush_internal
- *
- * Description:
- * Write the buffer to Framebuffer interface.
- *
- * Input Parameters:
- * area - Area of the screen to be flushed
- * color_p - A n array of colors
- *
- * Returned Value:
- * None
- *
- ****************************************************************************/
-
-static int fbdev_flush_internal(const lv_area_t *area, lv_color_t *color_p)
-{
-#ifdef CONFIG_FB_UPDATE
- struct fb_area_s fb_area;
-#endif
- int32_t x1 = area->x1;
- int32_t y1 = area->y1;
- int32_t x2 = area->x2;
- int32_t y2 = area->y2;
- int32_t act_x1;
- int32_t act_y1;
- int32_t act_x2;
- int32_t act_y2;
- long int location = 0;
-
- if (state.fbmem == NULL)
- {
- return ERROR;
- }
-
- /* Return if the area is out the screen */
-
- if (x2 < 0)
- {
- return ERROR;
- }
-
- if (y2 < 0)
- {
- return ERROR;
- }
-
- if (x1 > state.vinfo.xres - 1)
- {
- return ERROR;
- }
-
- if (y1 > state.vinfo.yres - 1)
- {
- return ERROR;
- }
-
- /* Truncate the area to the screen */
-
- act_x1 = x1 < 0 ? 0 : x1;
- act_y1 = y1 < 0 ? 0 : y1;
- act_x2 = x2 > state.vinfo.xres - 1 ? state.vinfo.xres - 1 : x2;
- act_y2 = y2 > state.vinfo.yres - 1 ? state.vinfo.yres - 1 : y2;
-
- if (state.pinfo.bpp == 8)
- {
- uint8_t *fbp8 = (uint8_t *)state.fbmem;
- uint32_t x;
- uint32_t y;
-
- for (y = act_y1; y <= act_y2; y++)
- {
- for (x = act_x1; x <= act_x2; x++)
- {
- location = x + (y * state.vinfo.xres);
- fbp8[location] = color_p->full;
- color_p++;
- }
-
- color_p += x2 - act_x2;
- }
- }
-
- if (state.pinfo.bpp == 16)
- {
- uint16_t *fbp16 = (uint16_t *)state.fbmem;
- uint32_t x;
- uint32_t y;
-
- for (y = act_y1; y <= act_y2; y++)
- {
- for (x = act_x1; x <= act_x2; x++)
- {
- location = x + (y * state.vinfo.xres);
- fbp16[location] = color_p->full;
- color_p++;
- }
-
- color_p += x2 - act_x2;
- }
- }
-
- if (state.pinfo.bpp == 24 || state.pinfo.bpp == 32)
- {
- uint32_t *fbp32 = (uint32_t *)state.fbmem;
- uint32_t x;
- uint32_t y;
-
- for (y = act_y1; y <= act_y2; y++)
- {
- for (x = act_x1; x <= act_x2; x++)
- {
- location = x + (y * state.vinfo.xres);
- fbp32[location] = color_p->full;
- color_p++;
- }
-
- color_p += x2 - act_x2;
- }
- }
-
-#ifdef CONFIG_FB_UPDATE
- fb_area.x = act_x1;
- fb_area.y = act_y1;
- fb_area.w = act_x2 - act_x1 + 1;
- fb_area.h = act_y2 - act_y1 + 1;
- ioctl(state.fd, FBIO_UPDATE, (unsigned long)((uintptr_t)&fb_area));
-#endif
-
- return OK;
-}
-
-/****************************************************************************
- * Name: fbdev_async_flush
- *
- * Description:
- * Flush a buffer to the marked area asynchronously.
- *
- * Input Parameters:
- * disp_drv - LVGL driver interface
- * area - Area of the screen to be flushed
- * color_p - A n array of colors
- *
- * Returned Value:
- * None
- *
- ****************************************************************************/
-
-#ifdef CONFIG_EXAMPLES_LVGLDEMO_ASYNC_FLUSH
-
-static void fbdev_async_flush(lv_disp_drv_t *disp_drv, const lv_area_t *area,
- lv_color_t *color_p)
-{
- UNUSED(disp_drv);
-
- lv_area.y1 = area->y1;
- lv_area.y2 = area->y2;
- lv_area.x1 = area->x1;
- lv_area.x2 = area->x2;
-
- lv_color_p = color_p;
-
- sem_post(&flush_sem);
-}
-
-#endif
-
-/****************************************************************************
- * Name: fbdev_sync_flush
- *
- * Description:
- * Flush a buffer to the marked area synchronously.
- *
- * Input Parameters:
- * disp_drv - LVGL driver interface
- * area - Area of the screen to be flushed
- * color_p - A n array of colors
- *
- * Returned Value:
- * None
- *
- ****************************************************************************/
-
-#ifndef CONFIG_EXAMPLES_LVGLDEMO_ASYNC_FLUSH
-
-static void fbdev_sync_flush(lv_disp_drv_t *disp_drv, const lv_area_t *area,
- lv_color_t *color_p)
-{
- fbdev_flush_internal(area, color_p);
-
- /* Tell the flushing is ready */
-
- lv_disp_flush_ready(disp_drv);
-}
-
-#endif
-
-/****************************************************************************
- * Name: fbdev_write
- *
- * Description:
- * Thread for writing the buffer to Framebuffer interface.
- *
- * Input Parameters:
- * arg - Context data from the parent thread
- *
- * Returned Value:
- * Context data to the parent thread
- *
- ****************************************************************************/
-
-#ifdef CONFIG_EXAMPLES_LVGLDEMO_ASYNC_FLUSH
-
-static pthread_addr_t fbdev_write(pthread_addr_t arg)
-{
- int ret = OK;
-
- UNUSED(arg);
-
- while (ret == OK)
- {
- sem_wait(&flush_sem);
-
- ret = fbdev_flush_internal(&lv_area, lv_color_p);
-
- sem_post(&wait_sem);
- }
-
- gerr("Failed to write buffer contents to display device\n");
-
- return NULL;
-}
-
-#endif
-
-/****************************************************************************
- * Public Functions
- ****************************************************************************/
-
-/****************************************************************************
- * Name: fbdev_init
- *
- * Description:
- *
- * Input Parameters:
- * lv_drvr -- LVGL driver interface
- *
- * Returned Value:
- * None
- *
- ****************************************************************************/
-
-int fbdev_init(lv_disp_drv_t *lv_drvr)
-{
- FAR const char *fbdev = "/dev/fb0";
- int ret;
-
- /* Open the framebuffer driver */
-
- state.fd = open(fbdev, O_RDWR);
- if (state.fd < 0)
- {
- int errcode = errno;
- gerr("Failed to open %s: %d\n", fbdev, errcode);
- return EXIT_FAILURE;
- }
-
- /* Get the characteristics of the framebuffer */
-
- ret = ioctl(state.fd, FBIOGET_VIDEOINFO,
- (unsigned long)((uintptr_t)&state.vinfo));
- if (ret < 0)
- {
- int errcode = errno;
-
- gerr("ioctl(FBIOGET_VIDEOINFO) failed: %d\n", errcode);
- close(state.fd);
- state.fd = -1;
- return EXIT_FAILURE;
- }
-
- ginfo("VideoInfo:\n\tfmt: %u\n\txres: %u\n\tyres: %u\n\tnplanes: %u\n",
- state.vinfo.fmt, state.vinfo.xres, state.vinfo.yres,
- state.vinfo.nplanes);
-
- ret = ioctl(state.fd, FBIOGET_PLANEINFO,
- (unsigned long)((uintptr_t)&state.pinfo));
- if (ret < 0)
- {
- int errcode = errno;
- gerr("ioctl(FBIOGET_PLANEINFO) failed: %d\n", errcode);
- close(state.fd);
- state.fd = -1;
- return EXIT_FAILURE;
- }
-
- ginfo("PlaneInfo (plane 0):\n"
- "\tfbmem: %p\n\tfblen: %l\n\tstride: %u\n"
- "\tdisplay: %u\n\tbpp: %u\n\t",
- state.pinfo.fbmem, (unsigned long)state.pinfo.fblen,
- state.pinfo.stride, state.pinfo.display, state.pinfo.bpp);
-
- lv_drvr->hor_res = state.vinfo.xres;
- lv_drvr->ver_res = state.vinfo.yres;
-#ifndef CONFIG_EXAMPLES_LVGLDEMO_ASYNC_FLUSH
- lv_drvr->flush_cb = fbdev_sync_flush;
-#else
- lv_drvr->flush_cb = fbdev_async_flush;
- lv_drvr->wait_cb = fbdev_wait;
-
- /* Initialize the mutexes for buffer flushing synchronization */
-
- sem_init(&flush_sem, 0, 0);
- sem_init(&wait_sem, 0, 0);
-
- /* Initialize the buffer flushing thread */
-
- pthread_create(&fb_write_thread, NULL, fbdev_write, NULL);
-#endif
-
- /* Only these pixel depths are supported. viinfo.fmt is ignored, only
- * certain color formats are supported.
- */
-
- if (state.pinfo.bpp != 32 && state.pinfo.bpp != 16 &&
- state.pinfo.bpp != 8 && state.pinfo.bpp != 1)
- {
- gerr("bpp=%u not supported\n", state.pinfo.bpp);
- close(state.fd);
- state.fd = -1;
- return EXIT_FAILURE;
- }
-
- /* mmap() the framebuffer.
- *
- * NOTE: In the FLAT build the frame buffer address returned by the
- * FBIOGET_PLANEINFO IOCTL command will be the same as the framebuffer
- * address. mmap(), however, is the preferred way to get the framebuffer
- * address because in the KERNEL build, it will perform the necessary
- * address mapping to make the memory accessible to the application.
- */
-
- state.fbmem = mmap(NULL, state.pinfo.fblen, PROT_READ | PROT_WRITE,
- MAP_SHARED | MAP_FILE, state.fd, 0);
- if (state.fbmem == MAP_FAILED)
- {
- int errcode = errno;
- gerr("ioctl(FBIOGET_PLANEINFO) failed: %d\n", errcode);
- close(state.fd);
- state.fd = -1;
- return EXIT_FAILURE;
- }
-
- ginfo("Mapped FB: %p\n", state.fbmem);
-
- return EXIT_SUCCESS;
-}
diff --git a/examples/lvgldemo/lcddev.c b/examples/lvgldemo/lcddev.c
deleted file mode 100644
index 092410c09..000000000
--- a/examples/lvgldemo/lcddev.c
+++ /dev/null
@@ -1,315 +0,0 @@
-/****************************************************************************
- * apps/examples/lvgldemo/lcddev.c
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership. The
- * ASF licenses this file to you 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.
- *
- ****************************************************************************/
-
-/****************************************************************************
- * Included Files
- ****************************************************************************/
-
-#include "lcddev.h"
-
-#include <nuttx/compiler.h>
-#include <nuttx/config.h>
-#include <nuttx/lcd/lcd_dev.h>
-
-#ifdef CONFIG_EXAMPLES_LVGLDEMO_ASYNC_FLUSH
-#include <pthread.h>
-#include <semaphore.h>
-#endif
-
-#include <sys/ioctl.h>
-#include <sys/mman.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <fcntl.h>
-#include <errno.h>
-#include <debug.h>
-
-/****************************************************************************
- * Pre-processor Definitions
- ****************************************************************************/
-
-#ifndef LCDDEV_PATH
-# define LCDDEV_PATH "/dev/lcd0"
-#endif
-
-/****************************************************************************
- * Private Types
- ****************************************************************************/
-
-struct lcd_state_s
-{
- int fd;
- struct fb_videoinfo_s vinfo;
- struct lcd_planeinfo_s pinfo;
- bool rotated;
-};
-
-/****************************************************************************
- * Private Data
- ****************************************************************************/
-
-static struct lcd_state_s state;
-
-#ifdef CONFIG_EXAMPLES_LVGLDEMO_ASYNC_FLUSH
-static pthread_t lcd_write_thread;
-static sem_t flush_sem;
-static sem_t wait_sem;
-static struct lcddev_area_s lcd_area;
-#endif
-
-/****************************************************************************
- * Private Functions
- ****************************************************************************/
-
-/****************************************************************************
- * Name: lcddev_wait
- *
- * Description:
- * Wait for the flushing operation conclusion to notify LVGL.
- *
- * Input Parameters:
- * disp_drv - LVGL driver interface
- *
- * Returned Value:
- * None
- *
- ****************************************************************************/
-
-#ifdef CONFIG_EXAMPLES_LVGLDEMO_ASYNC_FLUSH
-
-static void lcddev_wait(lv_disp_drv_t *disp_drv)
-{
- sem_wait(&wait_sem);
-
- /* Tell the flushing is ready */
-
- lv_disp_flush_ready(disp_drv);
-}
-
-#endif
-
-/****************************************************************************
- * Name: lcddev_flush
- *
- * Description:
- * Flush a buffer to the marked area.
- *
- * Input Parameters:
- * disp_drv - LVGL driver interface
- * lv_area_t - Area of the screen to be flushed
- * color_p - A n array of colors
- *
- * Returned Value:
- * None
- *
- ****************************************************************************/
-
-#ifdef CONFIG_EXAMPLES_LVGLDEMO_ASYNC_FLUSH
-
-static void lcddev_async_flush(lv_disp_drv_t *disp_drv,
- const lv_area_t *area,
- lv_color_t *color_p)
-{
- UNUSED(disp_drv);
-
- lcd_area.row_start = area->y1;
- lcd_area.row_end = area->y2;
- lcd_area.col_start = area->x1;
- lcd_area.col_end = area->x2;
-
- lcd_area.data = (uint8_t *)color_p;
-
- sem_post(&flush_sem);
-}
-
-#else
-
-static void lcddev_sync_flush(lv_disp_drv_t *disp_drv, const lv_area_t *area,
- lv_color_t *color_p)
-{
- int ret;
- struct lcddev_area_s lcd_area;
-
- lcd_area.row_start = area->y1;
- lcd_area.row_end = area->y2;
- lcd_area.col_start = area->x1;
- lcd_area.col_end = area->x2;
-
- lcd_area.data = (uint8_t *)color_p;
-
- ret = ioctl(state.fd, LCDDEVIO_PUTAREA,
- (unsigned long)((uintptr_t)&lcd_area));
-
- if (ret < 0)
- {
- int errcode = errno;
-
- gerr("ioctl(LCDDEVIO_PUTAREA) failed: %d\n", errcode);
- close(state.fd);
- return;
- }
-
- /* Tell the flushing is ready */
-
- lv_disp_flush_ready(disp_drv);
-}
-
-#endif
-
-/****************************************************************************
- * Name: lcddev_write
- *
- * Description:
- * Write the buffer to LCD interface.
- *
- * Input Parameters:
- * None
- *
- * Returned Value:
- * None
- *
- ****************************************************************************/
-
-#ifdef CONFIG_EXAMPLES_LVGLDEMO_ASYNC_FLUSH
-
-static pthread_addr_t lcddev_write(pthread_addr_t addr)
-{
- int ret = OK;
- int errcode;
-
- while (ret == OK)
- {
- sem_wait(&flush_sem);
- ret = ioctl(state.fd, LCDDEVIO_PUTAREA, (unsigned long)&lcd_area);
- if (ret < 0)
- {
- errcode = errno;
- }
-
- sem_post(&wait_sem);
- }
-
- if (ret != OK)
- {
- gerr("ioctl(LCDDEVIO_PUTAREA) failed: %d\n", errcode);
- close(state.fd);
- state.fd = -1;
- }
-
- return NULL;
-}
-
-#endif
-
-/****************************************************************************
- * Public Functions
- ****************************************************************************/
-
-/****************************************************************************
- * Name: lcddev_init
- *
- * Description:
- * Initialize LCD device.
- *
- * Input Parameters:
- * lv_drvr -- LVGL driver interface
- *
- * Returned Value:
- * EXIT_SUCCESS on success; EXIT_FAILURE on failure.
- *
- ****************************************************************************/
-
-int lcddev_init(lv_disp_drv_t *lv_drvr)
-{
- FAR const char *lcddev = LCDDEV_PATH;
- int ret;
-
- /* Open the framebuffer driver */
-
- state.fd = open(lcddev, 0);
- if (state.fd < 0)
- {
- int errcode = errno;
- gerr("Failed to open %s: %d\n", state.fd, errcode);
- return EXIT_FAILURE;
- }
-
- /* Get the characteristics of the framebuffer */
-
- ret = ioctl(state.fd, LCDDEVIO_GETVIDEOINFO,
- (unsigned long)((uintptr_t)&state.vinfo));
- if (ret < 0)
- {
- int errcode = errno;
-
- gerr("ioctl(LCDDEVIO_GETVIDEOINFO) failed: %d\n", errcode);
- close(state.fd);
- state.fd = -1;
- return EXIT_FAILURE;
- }
-
- ginfo("VideoInfo:\n\tfmt: %u\n\txres: %u\n\tyres: %u\n\tnplanes: %u\n",
- state.vinfo.fmt, state.vinfo.xres, state.vinfo.yres,
- state.vinfo.nplanes);
-
- ret = ioctl(state.fd, LCDDEVIO_GETPLANEINFO,
- (unsigned long)((uintptr_t)&state.pinfo));
- if (ret < 0)
- {
- int errcode = errno;
- gerr("ioctl(LCDDEVIO_GETPLANEINFO) failed: %d\n", errcode);
- close(state.fd);
- state.fd = -1;
- return EXIT_FAILURE;
- }
-
- ginfo("PlaneInfo (plane 0):\n\tbpp: %u\n", state.pinfo.bpp);
-
- if (state.pinfo.bpp != CONFIG_LV_COLOR_DEPTH)
- {
- /* For the LCD driver we do not have a great way to translate this
- * so fail to initialize.
- */
-
- gerr("Display bpp (%u) did not match CONFIG_LV_COLOR_DEPTH (%u)\n",
- state.pinfo.bpp, CONFIG_LV_COLOR_DEPTH);
- }
-
- lv_drvr->hor_res = state.vinfo.xres;
- lv_drvr->ver_res = state.vinfo.yres;
-#ifndef CONFIG_EXAMPLES_LVGLDEMO_ASYNC_FLUSH
- lv_drvr->flush_cb = lcddev_sync_flush;
-#else
- lv_drvr->flush_cb = lcddev_async_flush;
- lv_drvr->wait_cb = lcddev_wait;
-
- /* Initialize the mutexes for buffer flushing synchronization */
-
- sem_init(&flush_sem, 0, 0);
- sem_init(&wait_sem, 0, 0);
-
- /* Initialize the buffer flushing thread */
-
- pthread_create(&lcd_write_thread, NULL, lcddev_write, NULL);
-#endif
-
- return EXIT_SUCCESS;
-}
diff --git a/examples/lvgldemo/lcddev.h b/examples/lvgldemo/lcddev.h
deleted file mode 100644
index 18d5b786e..000000000
--- a/examples/lvgldemo/lcddev.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/****************************************************************************
- * apps/examples/lvgldemo/lcddev.h
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership. The
- * ASF licenses this file to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the
- * License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations
- * under the License.
- *
- ****************************************************************************/
-
-#ifndef __APPS_EXAMPLES_LVGLDEMO_LCDDEV_H
-#define __APPS_EXAMPLES_LVGLDEMO_LCDDEV_H
-
-/****************************************************************************
- * Included Files
- ****************************************************************************/
-
-#include <stdint.h>
-#include <lvgl/lvgl.h>
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-/****************************************************************************
- * Public Function Prototypes
- ****************************************************************************/
-
-int lcddev_init(lv_disp_drv_t *lv_drvr);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __APPS_EXAMPLES_LVGLDEMO_LCDDEV_H */
diff --git a/examples/lvgldemo/lv_ex_conf.h b/examples/lvgldemo/lv_ex_conf.h
deleted file mode 100644
index 78cedf96a..000000000
--- a/examples/lvgldemo/lv_ex_conf.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/****************************************************************************
- * apps/examples/lvgldemo/lv_ex_conf.h
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership. The
- * ASF licenses this file to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the
- * License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations
- * under the License.
- *
- ****************************************************************************/
-
-#ifndef __APPS_EXAMPLES_LVGLDEMO_LV_EX_CONF_H
-#define __APPS_EXAMPLES_LVGLDEMO_LV_EX_CONF_H
-
-/****************************************************************************
- * Pre-processor Definitions
- ****************************************************************************/
-
-/* Enable printf-ing data in demoes and examples */
-
-#define LV_EX_PRINTF 1
-
-/* Add PC keyboard support to some examples
- * (`lv_drivers` repository is required)
- */
-
-#define LV_EX_KEYBOARD 0
-
-/* Add 'encoder' (mouse wheel) support to some examples
- * (`lv_drivers` repository is required)
- */
-
-#define LV_EX_MOUSEWHEEL 0
-
-/* Show some widget */
-
-#define LV_USE_DEMO_WIDGETS 1
-#if LV_USE_DEMO_WIDGETS
-#ifdef CONFIG_EXAMPLES_LVGLDEMO_WIDGETS_SLIDESHOW
-#define LV_DEMO_WIDGETS_SLIDESHOW CONFIG_EXAMPLES_LVGLDEMO_WIDGETS_SLIDESHOW
-#else
-#define LV_DEMO_WIDGETS_SLIDESHOW 0
-#endif
-#endif
-
-/* Printer demo, optimized for 800x480 */
-
-#define LV_USE_DEMO_PRINTER 1
-
-/* Demonstrate the usage of encoder and keyboard */
-
-#define LV_USE_DEMO_KEYPAD_AND_ENCODER 1
-
-/* Benchmark your system */
-
-#define LV_USE_DEMO_BENCHMARK 1
-
-/* Stress test for LVGL */
-
-#define LV_USE_DEMO_STRESS 1
-
-#endif /* __APPS_EXAMPLES_LVGLDEMO_LV_EX_CONF_H */
-
diff --git a/examples/lvgldemo/lvgldemo.c b/examples/lvgldemo/lvgldemo.c
index c9dd63a8f..63e26865d 100644
--- a/examples/lvgldemo/lvgldemo.c
+++ b/examples/lvgldemo/lvgldemo.c
@@ -28,18 +28,13 @@
#include <unistd.h>
#include <stddef.h>
#include <stdlib.h>
+#include <stdio.h>
#include <time.h>
#include <debug.h>
#include <lvgl/lvgl.h>
-
-#include "fbdev.h"
-#include "lcddev.h"
-
-#if defined(CONFIG_INPUT_TOUCHSCREEN) || defined(CONFIG_INPUT_MOUSE)
-#include "tp.h"
-#include "tp_cal.h"
-#endif
+#include <port/lv_port.h>
+#include <lvgl/demos/lv_demos.h>
/****************************************************************************
* Pre-processor Definitions
@@ -62,46 +57,99 @@
# define NEED_BOARDINIT 1
#endif
-#define DISPLAY_BUFFER_SIZE (CONFIG_LV_HOR_RES * \
- CONFIG_EXAMPLES_LVGLDEMO_BUFF_SIZE)
+/****************************************************************************
+ * Private Type Declarations
+ ****************************************************************************/
+
+typedef CODE void (*demo_create_func_t)(void);
+
+struct func_key_pair_s
+{
+ FAR const char *name;
+ demo_create_func_t func;
+};
/****************************************************************************
- * Public Functions Prototypes
+ * Private Data
****************************************************************************/
-void lv_demo_benchmark(void);
-void lv_demo_printer(void);
-void lv_demo_stress(void);
-void lv_demo_widgets(void);
+static const struct func_key_pair_s func_key_pair[] =
+{
+#ifdef CONFIG_LV_USE_DEMO_WIDGETS
+ { "widgets", lv_demo_widgets },
+#endif
+
+#ifdef CONFIG_LV_USE_DEMO_KEYPAD_AND_ENCODER
+ { "keypad_encoder", lv_demo_keypad_encoder },
+#endif
+
+#ifdef CONFIG_LV_USE_DEMO_BENCHMARK
+ { "benchmark", lv_demo_benchmark },
+#endif
+
+#ifdef CONFIG_LV_USE_DEMO_STRESS
+ { "stress", lv_demo_stress },
+#endif
+
+#ifdef CONFIG_LV_USE_DEMO_MUSIC
+ { "music", lv_demo_music },
+#endif
+ { "", NULL }
+};
/****************************************************************************
* Private Functions
****************************************************************************/
/****************************************************************************
- * Name: monitor_cb
- *
- * Description:
- * Monitoring callback from lvgl every time the screen is flushed.
- *
+ * Name: show_usage
****************************************************************************/
-static void monitor_cb(lv_disp_drv_t * disp_drv, uint32_t time, uint32_t px)
+static void show_usage(void)
{
- ginfo("%" PRIu32 " px refreshed in %" PRIu32 " ms\n", px, time);
+ int i;
+ const int len = sizeof(func_key_pair)
+ / sizeof(struct func_key_pair_s) - 1;
+
+ if (len == 0)
+ {
+ printf("lvgldemo: no demo available!\n");
+ exit(EXIT_FAILURE);
+ return;
+ }
+
+ printf("\nUsage: lvgldemo demo_name\n");
+ printf("\ndemo_name:\n");
+
+ for (i = 0; i < len; i++)
+ {
+ printf(" %s\n", func_key_pair[i].name);
+ }
+
+ exit(EXIT_FAILURE);
}
/****************************************************************************
- * Private Data
+ * Name: find_demo_create_func
****************************************************************************/
-static lv_color_t buffer1[DISPLAY_BUFFER_SIZE];
+static demo_create_func_t find_demo_create_func(FAR const char *name)
+{
+ int i;
+ const int len = sizeof(func_key_pair)
+ / sizeof(struct func_key_pair_s) - 1;
-#ifdef CONFIG_EXAMPLES_LVGLDEMO_DOUBLE_BUFFERING
-static lv_color_t buffer2[DISPLAY_BUFFER_SIZE];
-#else
-# define buffer2 NULL
-#endif
+ for (i = 0; i < len; i++)
+ {
+ if (strcmp(name, func_key_pair[i].name) == 0)
+ {
+ return func_key_pair[i].func;
+ }
+ }
+
+ printf("lvgldemo: '%s' not found.\n", name);
+ return NULL;
+}
/****************************************************************************
* Public Functions
@@ -122,34 +170,21 @@ static lv_color_t buffer2[DISPLAY_BUFFER_SIZE];
int main(int argc, FAR char *argv[])
{
- lv_disp_drv_t disp_drv;
- lv_disp_buf_t disp_buf;
-
-#if defined(CONFIG_INPUT_TOUCHSCREEN) || defined(CONFIG_INPUT_MOUSE)
-#ifndef CONFIG_EXAMPLES_LVGLDEMO_CALIBRATE
- lv_point_t p[4];
-
- /* top left */
-
- p[0].x = 0;
- p[0].y = 0;
-
- /* top right */
-
- p[1].x = LV_HOR_RES;
- p[1].y = 0;
-
- /* bottom left */
+ demo_create_func_t demo_create_func;
- p[2].x = 0;
- p[2].y = LV_VER_RES;
+ if (argc != 2)
+ {
+ show_usage();
+ return EXIT_FAILURE;
+ }
- /* bottom right */
+ demo_create_func = find_demo_create_func(argv[1]);
- p[3].x = LV_HOR_RES;
- p[3].y = LV_VER_RES;
-#endif
-#endif
+ if (demo_create_func == NULL)
+ {
+ show_usage();
+ return EXIT_FAILURE;
+ }
#ifdef NEED_BOARDINIT
/* Perform board-specific driver initialization */
@@ -167,71 +202,25 @@ int main(int argc, FAR char *argv[])
lv_init();
- /* Basic LVGL display driver initialization */
-
- lv_disp_buf_init(&disp_buf, buffer1, buffer2, DISPLAY_BUFFER_SIZE);
- lv_disp_drv_init(&disp_drv);
- disp_drv.buffer = &disp_buf;
- disp_drv.monitor_cb = monitor_cb;
+ /* LVGL port initialization */
- /* Display interface initialization */
+ lv_port_init();
- if (fbdev_init(&disp_drv) != EXIT_SUCCESS)
- {
- /* Failed to use framebuffer falling back to lcd driver */
+ /* LVGL demo creation */
- if (lcddev_init(&disp_drv) != EXIT_SUCCESS)
- {
- /* No possible drivers left, fail */
-
- return EXIT_FAILURE;
- }
- }
-
- lv_disp_drv_register(&disp_drv);
-
-#if defined(CONFIG_INPUT_TOUCHSCREEN) || defined(CONFIG_INPUT_MOUSE)
- /* Touchpad Initialization */
-
- tp_init();
- lv_indev_drv_t indev_drv;
- lv_indev_drv_init(&indev_drv);
- indev_drv.type = LV_INDEV_TYPE_POINTER;
-
- /* This function will be called periodically (by the library) to get the
- * mouse position and state.
- */
-
- indev_drv.read_cb = tp_read;
- lv_indev_drv_register(&indev_drv);
-#endif
-
-#if defined(CONFIG_EXAMPLES_LVGLDEMO_BENCHMARK)
- lv_demo_benchmark();
-#elif defined(CONFIG_EXAMPLES_LVGLDEMO_PRINTER)
- lv_demo_printer();
-#elif defined(CONFIG_EXAMPLES_LVGLDEMO_STRESS)
- lv_demo_stress();
-#elif defined(CONFIG_EXAMPLES_LVGLDEMO_WIDGETS)
- lv_demo_widgets();
-#endif
-
-#if defined(CONFIG_INPUT_TOUCHSCREEN) || defined(CONFIG_INPUT_MOUSE)
- /* Start TP calibration */
-
-#ifdef CONFIG_EXAMPLES_LVGLDEMO_CALIBRATE
- tp_cal_create();
-#else
- tp_set_cal_values(p, p + 1, p + 2, p + 3);
-#endif
-#endif
+ demo_create_func();
/* Handle LVGL tasks */
while (1)
{
- lv_task_handler();
- usleep(10000);
+ uint32_t idle;
+ idle = lv_timer_handler();
+
+ /* Minimum sleep of 1ms */
+
+ idle = idle ? idle : 1;
+ usleep(idle * 1000);
}
return EXIT_SUCCESS;
diff --git a/examples/lvgldemo/tp.c b/examples/lvgldemo/tp.c
deleted file mode 100644
index 4cc298eac..000000000
--- a/examples/lvgldemo/tp.c
+++ /dev/null
@@ -1,279 +0,0 @@
-/****************************************************************************
- * apps/examples/lvgldemo/tp.c
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership. The
- * ASF licenses this file to you 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.
- *
- ****************************************************************************/
-
-/****************************************************************************
- * Included Files
- ****************************************************************************/
-
-#include <nuttx/config.h>
-
-#include <sys/types.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <errno.h>
-#include <debug.h>
-
-#ifdef CONFIG_EXAMPLES_LVGLDEMO_MOUSE
-# include <nuttx/input/mouse.h>
-#endif
-
-#include <nuttx/input/touchscreen.h>
-
-#include "tp.h"
-
-/****************************************************************************
- * Private Data
- ****************************************************************************/
-
-static int fd;
-static bool calibrated = false;
-static int x_range;
-static int y_range;
-static int x_offset;
-static int y_offset;
-static bool xy_inv;
-static bool x_inv;
-static bool y_inv;
-
-/****************************************************************************
- * Public Functions
- ****************************************************************************/
-
-/****************************************************************************
- * Name: tp_init
- *
- * Description:
- * Initialize The Touch pad
- *
- * Input Parameters:
- * None
- *
- * Returned Value:
- * Zero (OK) on success; a positive error code on failure.
- *
- ****************************************************************************/
-
-int tp_init(void)
-{
- int errval = 0;
-
- /* Open the touchscreen device for reading */
-
- printf("tp_init: Opening %s\n", CONFIG_EXAMPLES_LVGLDEMO_DEVPATH);
- fd = open(CONFIG_EXAMPLES_LVGLDEMO_DEVPATH, O_RDONLY | O_NONBLOCK);
- if (fd < 0)
- {
- printf("tp_init: open %s failed: %d\n",
- CONFIG_EXAMPLES_LVGLDEMO_DEVPATH, errno);
- errval = 2;
- goto errout;
- }
-
- return OK;
-
-errout:
- printf("Terminating!\n");
- fflush(stdout);
- return errval;
-}
-
-/****************************************************************************
- * Name: tp_read
- *
- * Description:
- * Read a TP data and store in 'data' argument
- *
- * Input Parameters:
- * indev_drv - Input device handler
- * data - Store the x, y and state information here
- *
- * Returned Value:
- * false: no more data to read; true: there are more data to read.
- *
- ****************************************************************************/
-
-bool tp_read(struct _lv_indev_drv_t *indev_drv, lv_indev_data_t *data)
-{
- struct touch_sample_s sample;
- int nbytes;
- static int last_x = 0;
- static int last_y = 0;
- static lv_indev_state_t last_state = LV_INDEV_STATE_REL;
-
- /* Be sure at least the previous state is set */
-
- data->point.x = last_x;
- data->point.y = last_y;
- data->state = last_state;
-
- /* Read one sample */
-
- nbytes = read(fd, &sample, sizeof(struct touch_sample_s));
-
- /* Handle unexpected return values */
-
- if (nbytes < 0 || nbytes != sizeof(struct touch_sample_s))
- {
- return false;
- }
-
- if (sample.point[0].flags & TOUCH_DOWN
- || sample.point[0].flags & TOUCH_MOVE)
- {
- if (calibrated)
- {
- if (xy_inv)
- {
- last_x = sample.point[0].y;
- last_y = sample.point[0].x;
- }
- else
- {
- last_x = sample.point[0].x;
- last_y = sample.point[0].y;
- }
-
- /* Remove offset */
-
- last_x -= x_offset;
- last_y -= y_offset;
-
- last_x = (int)((int)last_x * LV_HOR_RES) / x_range;
- last_y = (int)((int)last_y * LV_VER_RES) / y_range;
-
- if (x_inv)
- {
- last_x = LV_HOR_RES - last_x;
- }
-
- if (y_inv)
- {
- last_y = LV_VER_RES - last_y;
- }
- }
- else
- {
- last_x = sample.point[0].x;
- last_y = sample.point[0].y;
- }
-
- last_state = LV_INDEV_STATE_PR;
- }
- else if (sample.point[0].flags & TOUCH_UP)
- {
- last_state = LV_INDEV_STATE_REL;
- }
- else if (sample.point[0].flags & TOUCH_UP)
- {
- last_state = LV_INDEV_STATE_REL;
- }
-
- /* Update touchpad data */
-
- data->point.x = last_x;
- data->point.y = last_y;
- data->state = last_state;
-
- fflush(stdout);
- return false;
-}
-
-/****************************************************************************
- * Name: tp_read
- *
- * Description:
- * Set calibration data
- *
- * Input Parameters:
- * ul - Upper left hand corner TP value
- * ur - Upper right hand corner TP value
- * lr - Lower right hand corner TP value
- * ll - Lower left hand corner TP value
- *
- * Returned Value:
- * None
- *
- ****************************************************************************/
-
-void tp_set_cal_values(FAR lv_point_t *ul, FAR lv_point_t *ur,
- FAR lv_point_t *lr, FAR lv_point_t *ll)
-{
- /* Is x/y inverted? */
-
- if (abs(ul->x - ur->x) < LV_HOR_RES / 2)
- {
- /* No real change in x horizontally */
-
- xy_inv = true;
- }
-
- if (xy_inv)
- {
- /* Is x inverted */
-
- if (ur->y < ul->y)
- {
- x_inv = true;
- }
-
- /* Is y inverted */
-
- if (ll->x < ul->x)
- {
- y_inv = true;
- }
-
- x_range = abs(ul->y - ur->y);
- y_range = abs(ul->x - ll->x);
- x_offset = x_inv ? ur->y : ul->y;
- y_offset = y_inv ? ll->x : ul->x;
- }
- else
- {
- /* Is x inverted */
-
- if (ur->x < ul->x)
- {
- x_inv = true;
- }
-
- /* Is y inverted */
-
- if (ll->y < ul->y)
- {
- y_inv = true;
- }
-
- x_range = abs(ul->x - ur->x);
- y_range = abs(ul->y - ll->y);
- x_offset = x_inv ? ur->x : ul->x;
- y_offset = y_inv ? ll->y : ul->y;
- }
-
- calibrated = true;
-
- printf("tp_cal result\n");
- printf("offset x:%d, y:%d\n", x_offset, y_offset);
- printf("range x:%d, y:%d\n", x_range, y_range);
- printf("invert x/y:%d, x:%d, y:%d\n\n", xy_inv, x_inv, y_inv);
-}
diff --git a/examples/lvgldemo/tp.h b/examples/lvgldemo/tp.h
deleted file mode 100644
index 1507cb663..000000000
--- a/examples/lvgldemo/tp.h
+++ /dev/null
@@ -1,129 +0,0 @@
-/****************************************************************************
- * apps/examples/lvgldemo/tp.h
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership. The
- * ASF licenses this file to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the
- * License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations
- * under the License.
- *
- ****************************************************************************/
-
-#ifndef __APPS_EXAMPLES_LVGLDEMO_TP_H
-#define __APPS_EXAMPLES_LVGLDEMO_TP_H
-
-/****************************************************************************
- * Included Files
- ****************************************************************************/
-
-#include <nuttx/config.h>
-#include <lvgl/lvgl.h>
-
-/****************************************************************************
- * Pre-processor Definitions
- ****************************************************************************/
-
-/* Configuration ************************************************************/
-
-/* CONFIG_EXAMPLES_LVGLDEMO_MINOR - The minor device number. Minor=N
- * corresponds to touchscreen device /dev/input0. Note this value must
- * with CONFIG_EXAMPLES_LVGLDEMO_DEVPATH. Default 0.
- * CONFIG_EXAMPLES_LVGLDEMO_DEVPATH - The path to the touchscreen
- * device. This must be consistent with CONFIG_EXAMPLES_LVGLDEMO_MINOR.
- * Default: "/dev/input0"
- * CONFIG_EXAMPLES_LVGLDEMO_MOUSE - The touchscreen test can also be
- * configured to work with a mouse driver by setting this option.
- */
-
-#if !defined(CONFIG_INPUT_TOUCHSCREEN) && !defined(CONFIG_INPUT_MOUSE)
-# error "Input device support is not enabled (CONFIG_INPUT_TOUCHSCREEN || CONFIG_INPUT_MOUSE)"
-#endif
-
-#ifndef CONFIG_EXAMPLES_LVGLDEMO_MINOR
-# undef CONFIG_EXAMPLES_LVGLDEMO_DEVPATH
-# define CONFIG_EXAMPLES_LVGLDEMO_MINOR 0
-# ifdef CONFIG_EXAMPLES_LVGLDEMO_MOUSE
-# define CONFIG_EXAMPLES_LVGLDEMO_DEVPATH "/dev/mouse0"
-# else
-# define CONFIG_EXAMPLES_LVGLDEMO_DEVPATH "/dev/input0"
-# endif
-#endif
-
-#ifndef CONFIG_EXAMPLES_LVGLDEMO_DEVPATH
-# undef CONFIG_EXAMPLES_LVGLDEMO_MINOR
-# define CONFIG_EXAMPLES_LVGLDEMO_MINOR 0
-# ifdef CONFIG_EXAMPLES_LVGLDEMO_MOUSE
-# define CONFIG_EXAMPLES_LVGLDEMO_DEVPATH "/dev/mouse0"
-# else
-# define CONFIG_EXAMPLES_LVGLDEMO_DEVPATH "/dev/input0"
-# endif
-#endif
-
-/****************************************************************************
- * Public Function Prototypes
- ****************************************************************************/
-
-/****************************************************************************
- * Name: tp_init
- *
- * Description:
- * Initialize The Touch pad
- *
- * Input Parameters:
- * None
- *
- * Returned Value:
- * Zero (OK) on success; a positive error code on failure.
- *
- ****************************************************************************/
-
-int tp_init(void);
-
-/****************************************************************************
- * Name: tp_read
- *
- * Description:
- * Read a TP data and store in 'data' argument
- *
- * Input Parameters:
- * indev_drv - Input device handler
- * data - Store the x, y and state information here
- *
- * Returned Value:
- * false: no more data to read; true: there are more data to read.
- *
- ****************************************************************************/
-
-bool tp_read(FAR struct _lv_indev_drv_t *indev_drv,
- FAR lv_indev_data_t *data);
-
-/****************************************************************************
- * Name: tp_read
- *
- * Description:
- * Set calibration data
- *
- * Input Parameters:
- * ul - Upper left hand corner TP value
- * ur - Upper right hand corner TP value
- * lr - Lower right hand corner TP value
- * ll - Lower left hand corner TP value
- *
- * Returned Value:
- * None
- *
- ****************************************************************************/
-
-void tp_set_cal_values(FAR lv_point_t *ul, FAR lv_point_t *ur,
- FAR lv_point_t *lr, FAR lv_point_t *ll);
-
-#endif /* __APPS_EXAMPLES_LVGLDEMO_TP_H */
diff --git a/examples/lvgldemo/tp_cal.c b/examples/lvgldemo/tp_cal.c
deleted file mode 100644
index ccb067a14..000000000
--- a/examples/lvgldemo/tp_cal.c
+++ /dev/null
@@ -1,332 +0,0 @@
-/****************************************************************************
- * apps/examples/lvgldemo/tp_cal.c
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership. The
- * ASF licenses this file to you 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.
- *
- ****************************************************************************/
-
-/****************************************************************************
- * Included Files
- ****************************************************************************/
-
-#include <stdio.h>
-
-#include <lvgl/lvgl.h>
-#include "tp.h"
-
-/****************************************************************************
- * Pre-processor Definitions
- ****************************************************************************/
-
-#define CIRCLE_SIZE 20
-#define TP_MAX_VALUE 5000
-
-/****************************************************************************
- * Private Type Definitions
- ****************************************************************************/
-
-enum tp_cal_state_e
-{
- TP_CAL_STATE_INIT,
- TP_CAL_STATE_WAIT_TOP_LEFT,
- TP_CAL_STATE_WAIT_TOP_RIGHT,
- TP_CAL_STATE_WAIT_BOTTOM_RIGHT,
- TP_CAL_STATE_WAIT_BOTTOM_LEFT,
- TP_CAL_STATE_WAIT_LEAVE,
- TP_CAL_STATE_READY,
-};
-
-/****************************************************************************
- * Private Function Prototypes
- ****************************************************************************/
-
-static void btn_click_action(FAR lv_obj_t *scr, lv_event_t event);
-
-/****************************************************************************
- * Private Data
- ****************************************************************************/
-
-static enum tp_cal_state_e state;
-static lv_point_t p[4];
-static lv_obj_t *prev_scr;
-static lv_obj_t *big_btn;
-static lv_obj_t *label_main;
-static lv_obj_t *circ_area;
-static lv_theme_t *prev_theme;
-
-/****************************************************************************
- * Public Functions
- ****************************************************************************/
-
-/****************************************************************************
- * Name: btn_click_action
- *
- * Description:
- *
- * Input Parameters:
- * scr
- * event
- *
- * Returned Value:
- * ?
- *
- ****************************************************************************/
-
-static void btn_click_action(FAR lv_obj_t *scr, lv_event_t event)
-{
- if (event == LV_EVENT_CLICKED)
- {
- if (state == TP_CAL_STATE_WAIT_TOP_LEFT)
- {
- lv_indev_t *indev = lv_indev_get_act();
- char buf[64];
-#if LV_USE_ANIMATION
- lv_anim_t a;
-#endif
-
- lv_indev_get_point(indev, &p[0]);
-
- sprintf(buf, "x: %d\ny: %d", p[0].x, p[0].y);
- lv_obj_t *label_coord = lv_label_create(lv_scr_act(), NULL);
- lv_label_set_text(label_coord, buf);
-
- lv_label_set_text(label_main, "Click the circle in\n"
- "upper right-hand corner");
-
- lv_obj_set_pos(label_main,
- (LV_HOR_RES - lv_obj_get_width(label_main)) / 2,
- (LV_VER_RES - lv_obj_get_height(label_main)) / 2);
-
-#if LV_USE_ANIMATION
- lv_anim_init(&a);
- lv_anim_set_var(&a, circ_area);
- lv_anim_set_exec_cb(&a, (lv_anim_exec_xcb_t)lv_obj_set_x);
- lv_anim_set_time(&a, 500);
- lv_anim_set_values(&a, 0, LV_HOR_RES - CIRCLE_SIZE);
- lv_anim_set_delay(&a, 200);
- lv_anim_start(&a);
-#else
- lv_obj_set_pos(circ_area, LV_HOR_RES - CIRCLE_SIZE, 0);
-#endif
-
- state = TP_CAL_STATE_WAIT_TOP_RIGHT;
- }
- else if (state == TP_CAL_STATE_WAIT_TOP_RIGHT)
- {
- lv_indev_t *indev = lv_indev_get_act();
- char buf[64];
-
-#if LV_USE_ANIMATION
- lv_anim_t a;
-#endif
-
- lv_indev_get_point(indev, &p[1]);
-
- sprintf(buf, "x: %d\ny: %d", p[1].x, p[1].y);
- lv_obj_t *label_coord = lv_label_create(lv_scr_act(), NULL);
- lv_label_set_text(label_coord, buf);
- lv_obj_set_pos(label_coord,
- LV_HOR_RES - lv_obj_get_width(label_coord),
- 0);
-
- lv_label_set_text(label_main, "Click the circle in\n"
- "lower right-hand corner");
-
- lv_obj_set_pos(label_main,
- (LV_HOR_RES - lv_obj_get_width(label_main)) / 2,
- (LV_VER_RES - lv_obj_get_height(label_main)) / 2);
-
-#if LV_USE_ANIMATION
- lv_anim_init(&a);
- lv_anim_set_var(&a, circ_area);
- lv_anim_set_exec_cb(&a, (lv_anim_exec_xcb_t)lv_obj_set_y);
- lv_anim_set_time(&a, 500);
- lv_anim_set_values(&a, 0, LV_VER_RES - CIRCLE_SIZE);
- lv_anim_set_delay(&a, 200);
- lv_anim_start(&a);
-#else
- lv_obj_set_pos(circ_area,
- LV_HOR_RES - CIRCLE_SIZE, LV_VER_RES - CIRCLE_SIZE);
-#endif
-
- state = TP_CAL_STATE_WAIT_BOTTOM_RIGHT;
- }
- else if (state == TP_CAL_STATE_WAIT_BOTTOM_RIGHT)
- {
- lv_indev_t *indev = lv_indev_get_act();
- char buf[64];
-#if LV_USE_ANIMATION
- lv_anim_t a;
-#endif
- lv_indev_get_point(indev, &p[2]);
-
- sprintf(buf, "x: %d\ny: %d", p[2].x, p[2].y);
- lv_obj_t *label_coord = lv_label_create(lv_scr_act(), NULL);
- lv_label_set_text(label_coord, buf);
- lv_obj_set_pos(label_coord,
- LV_HOR_RES - lv_obj_get_width(label_coord),
- LV_VER_RES - lv_obj_get_height(label_coord));
-
- lv_label_set_text(label_main, "Click the circle in\n"
- "lower left-hand corner");
-
- lv_obj_set_pos(label_main,
- (LV_HOR_RES - lv_obj_get_width(label_main)) / 2,
- (LV_VER_RES - lv_obj_get_height(label_main)) / 2);
-
-#if LV_USE_ANIMATION
- lv_anim_init(&a);
- lv_anim_set_var(&a, circ_area);
- lv_anim_set_exec_cb(&a, (lv_anim_exec_xcb_t)lv_obj_set_x);
- lv_anim_set_time(&a, 500);
- lv_anim_set_values(&a, LV_HOR_RES - CIRCLE_SIZE, 0);
- lv_anim_set_delay(&a, 200);
- lv_anim_start(&a);
-#else
- lv_obj_set_pos(circ_area, 0, LV_VER_RES - CIRCLE_SIZE);
-#endif
-
- state = TP_CAL_STATE_WAIT_BOTTOM_LEFT;
- }
- else if (state == TP_CAL_STATE_WAIT_BOTTOM_LEFT)
- {
- lv_indev_t *indev = lv_indev_get_act();
- char buf[64];
-
- lv_indev_get_point(indev, &p[3]);
-
- lv_label_set_text(label_main, "Click the screen\n"
- "to leave calibration");
-
- lv_obj_set_pos(label_main,
- (LV_HOR_RES - lv_obj_get_width(label_main)) / 2,
- (LV_VER_RES - lv_obj_get_height(label_main)) / 2);
-
- sprintf(buf, "x: %d\ny: %d", p[3].x, p[3].y);
- lv_obj_t *label_coord = lv_label_create(lv_scr_act(), NULL);
- lv_label_set_text(label_coord, buf);
- lv_obj_set_pos(label_coord, 0,
- LV_VER_RES - lv_obj_get_height(label_coord));
-
- lv_obj_del(circ_area);
-
- state = TP_CAL_STATE_WAIT_LEAVE;
- }
- else if (state == TP_CAL_STATE_WAIT_LEAVE)
- {
- lv_theme_set_act(prev_theme);
- lv_scr_load(prev_scr);
- tp_set_cal_values(&p[0], &p[1], &p[2], &p[3]);
- state = TP_CAL_STATE_READY;
- }
- else if (state == TP_CAL_STATE_READY)
- {
- }
- }
-}
-
-/****************************************************************************
- * Public Functions
- ****************************************************************************/
-
-/****************************************************************************
- * Name: tp_cal_create
- *
- * Description:
- * Create a touchpad calibration screen
- *
- * Input Parameters:
- * None
- *
- * Returned Value:
- * None
- *
- ****************************************************************************/
-
-void tp_cal_create(void)
-{
- static lv_style_t style_circ;
- static lv_style_t style_big_btn;
-#if LV_USE_ANIMATION
- lv_anim_t a;
-#endif
-
- state = TP_CAL_STATE_INIT;
-
- prev_scr = lv_scr_act();
-
- lv_theme_t *theme = LV_THEME_DEFAULT_INIT(LV_THEME_DEFAULT_COLOR_PRIMARY,
- LV_THEME_DEFAULT_COLOR_SECONDARY,
- LV_THEME_DEFAULT_FLAG,
- LV_THEME_DEFAULT_FONT_SMALL,
- LV_THEME_DEFAULT_FONT_NORMAL,
- LV_THEME_DEFAULT_FONT_SUBTITLE,
- LV_THEME_DEFAULT_FONT_TITLE);
-
- prev_theme = lv_theme_get_act();
- lv_theme_set_act(theme);
-
- lv_obj_t *scr = lv_obj_create(NULL, NULL);
- lv_obj_set_size(scr, TP_MAX_VALUE, TP_MAX_VALUE);
- lv_scr_load(scr);
-
- /* Create a big transparent button screen to receive clicks */
-
- big_btn = lv_btn_create(lv_scr_act(), NULL);
- lv_obj_set_size(big_btn, TP_MAX_VALUE, TP_MAX_VALUE);
-
- lv_style_init(&style_big_btn);
-
- lv_style_set_bg_opa(&style_big_btn, LV_STATE_DEFAULT | LV_STATE_PRESSED,
- LV_OPA_TRANSP);
- lv_obj_add_style(big_btn, LV_BTN_PART_MAIN, &style_big_btn);
-
- lv_obj_set_event_cb(big_btn, btn_click_action);
- lv_btn_set_layout(big_btn, LV_LAYOUT_OFF);
-
- label_main = lv_label_create(lv_scr_act(), NULL);
- lv_label_set_text(label_main, "Click the circle in\n"
- "upper left-hand corner");
- lv_label_set_align(label_main, LV_LABEL_ALIGN_CENTER);
-
- lv_obj_set_pos(label_main, (LV_HOR_RES - lv_obj_get_width(label_main)) / 2,
- (LV_VER_RES - lv_obj_get_height(label_main)) / 2);
-
- lv_style_init(&style_circ);
- lv_style_set_radius(&style_circ, LV_STATE_DEFAULT,
- LV_RADIUS_CIRCLE);
- lv_style_set_bg_color(&style_circ, LV_STATE_DEFAULT,
- LV_COLOR_BLUE);
- circ_area = lv_obj_create(lv_scr_act(), NULL);
- lv_obj_set_size(circ_area, CIRCLE_SIZE, CIRCLE_SIZE);
- lv_obj_add_style(circ_area, LV_OBJ_PART_MAIN, &style_circ);
- lv_obj_set_click(circ_area, false);
-
-#if LV_USE_ANIMATION
- lv_anim_init(&a);
- lv_anim_set_var(&a, circ_area);
- lv_anim_set_exec_cb(&a, (lv_anim_exec_xcb_t)lv_obj_set_x);
- lv_anim_set_time(&a, 200);
- lv_anim_set_values(&a, LV_HOR_RES / 2, 0);
- lv_anim_set_delay(&a, 200);
- lv_anim_start(&a);
-
- lv_anim_set_exec_cb(&a, (lv_anim_exec_xcb_t)lv_obj_set_y);
- lv_anim_set_values(&a, LV_VER_RES / 2, 0);
- lv_anim_start(&a);
-#endif
- state = TP_CAL_STATE_WAIT_TOP_LEFT;
-}
diff --git a/graphics/lvgl/Kconfig b/graphics/lvgl/Kconfig
index 3162c9c41..6046461eb 100644
--- a/graphics/lvgl/Kconfig
+++ b/graphics/lvgl/Kconfig
@@ -13,481 +13,215 @@ if GRAPHICS_LVGL
config LVGL_VERSION
string "LVGL Version"
- default "7.3.0"
+ default "8.3.3"
-config LV_MEM_SIZE
- int "Heap size of the graphics library"
- default 32768
- ---help---
- The size of a memory pool where the grapohisc library
- dynamically allocates data
-
-config LV_USE_USER_DATA
- bool "Use user data in driver and objects"
- default n
- ---help---
- Add a `user_data` to drivers and objects
+source "$APPSDIR/graphics/lvgl/lv_conf/Kconfig"
-config LV_USE_PERF_MONITOR
- bool "Show CPU usage and FPS count"
+config LV_PORT_USE_LCDDEV
+ bool "Enable LCD device port"
default n
- ---help---
- Show CPU usage and FPS count in the right bottom corner
-
-menu "Graphics settings"
-
-config LV_HOR_RES
- int "Horizontal resolution."
- default 320
- ---help---
- Number of pixels in horizontally.
-config LV_VER_RES
- int "Vertical resolution."
- default 240
- ---help---
- Number of pixels vertically. Double it if anti aliasing is used
+if LV_PORT_USE_LCDDEV
-config LV_DPI
- int "DPI (px/inch)"
- default 100
- ---help---
- Number of pixels in 1 inch
+config LV_PORT_LCDDEV_DEFAULT_DEVICEPATH
+ string "LCD default device path"
+ default "/dev/lcd0"
-config LV_ANTIALIAS
- bool "Anti aliasing of the screen"
+config LV_PORT_LCDDEV_FULL_SCREEN_BUFFER
+ bool "Use full screen buffer"
default n
-config LV_DISP_DEF_REFR_PERIOD
- int "Default refresh period in milliseconds"
- default 30
- ---help---
- The graphics library will check for invalid areas an refresh
- them with this period time
-
-config LV_INV_FIFO_SIZE
- int "Average number of object on the screen"
- default 32
- ---help---
- If too much area is invalidated (greater then this number) then
- the whole screen will be refreshed
-
-endmenu
+if !LV_PORT_LCDDEV_FULL_SCREEN_BUFFER
-menu "Input device settings"
+config LV_PORT_LCDDEV_LINE_BUFFER_DEFAULT
+ int "Default buffer size (in line)"
+ default 10
-config LV_INDEV_DEF_READ_PERIOD
- int "Input device default read period in milliseconds"
- default 30
+endif # LV_PORT_LCDDEV_FULL_SCREEN_BUFFER
-config LV_INDEV_POINT_MARKER
- int "Mark the pressed points on the screen"
- default 0
+config LV_PORT_LCDDEV_DOUBLE_BUFFER
+ bool "Use double buffer"
+ default n
-config LV_INDEV_DEF_DRAG_LIMIT
- int "Default drag limit in pixels"
- default 10
+endif # LV_PORT_USE_LCDDEV
-config LV_INDEV_DEF_DRAG_THROW
- int "Default slow down ration when throwing on object by drag [%]"
- default 20
+config LV_PORT_USE_FBDEV
+ bool "Enable framebuffer port"
+ default n
-config LV_INDEV_DEF_LONG_PRESS_TIME
- int "Default long press time [ms]"
- default 400
+config LV_PORT_FBDEV_DEFAULT_DEVICEPATH
+ string "Framebuffer default device path"
+ default "/dev/fb0"
+ depends on LV_PORT_USE_FBDEV
-config LV_INDEV_DEF_LONG_PRESS_REP_TIME
- int "Default repeated trigger period in long press [ms]"
- default 100
+config LV_PORT_USE_TOUCHPAD
+ bool "Enable touchpad port"
+ default n
-config LV_INDEV_DEF_GESTURE_LIMIT
- int "Gesture threshold in pixels"
- default 50
+config LV_PORT_TOUCHPAD_DEFAULT_DEVICEPATH
+ depends on LV_PORT_USE_TOUCHPAD
+ string "Touchpad default device path"
+ default "/dev/input0"
-config LV_INDEV_DEF_GESTURE_MIN_VELOCITY
- int "Gesture min velocity at release before swipe (pixels)"
- default 3
+config LV_USE_ENCODER
+ depends on INPUT_MOUSE_WHEEL
+ bool "Encoder interface"
+ default n
-endmenu
+menuconfig LV_PORT_USE_BUTTON
+ bool "Enable button port"
+ default n
-menu "Color settings"
+if LV_PORT_USE_BUTTON
-config LV_COLOR_DEPTH
- int "Color depth (8/16/32)"
- default 16
+config LV_PORT_BUTTON_DEFAULT_DEVICEPATH
+ string "Button default device path"
+ default "/dev/buttons"
-config LV_COLOR_16_SWAP
- bool "Swap the 2 bytes of RGB565 color"
- depends on LV_COLOR_DEPTH = 16
+config LV_PORT_BUTTON_BUTTON_0_MAP_X
+ int "Button 0 mapping coordinate x"
default 0
-config LV_COLOR_SCREEN_TRANSP
- bool "Enable screen transparency.(If disabled, 32-bit color depth fall to 24-bit)"
+config LV_PORT_BUTTON_BUTTON_0_MAP_Y
+ int "Button 0 mapping coordinate y"
default 0
-config LV_COLOR_TRANSP
- hex "Chroma key color (pixels with this color will be transparent on images)"
- default 0x00ff00
-
-endmenu
-
-menu "Text (font) settings"
-
-config LV_TXT_UTF8
- bool "Unicode support"
- default n
-
-config LV_TXT_BREAK_CHARS
- string "Characters where the words/line cab be wrapped"
- default " ,.;:-_"
-
-endmenu
-
-menu "Feature usage"
-config USE_LV_ANIMATION
- bool "Enable animations"
- default y
-
-config USE_LV_SHADOW
- bool "Enable shadows"
- default y
+config LV_PORT_BUTTON_BUTTON_1_MAP_X
+ int "Button 1 mapping coordinate x"
+ default 0
-config USE_LV_GROUP
- bool "Enable object groups (for keyboard)"
- default y
+config LV_PORT_BUTTON_BUTTON_1_MAP_Y
+ int "Button 1 mapping coordinate y"
+ default 0
-config USE_LV_GPU
- bool "Enable GPU (hardware acceleration) API"
- default y
+config LV_PORT_BUTTON_BUTTON_2_MAP_X
+ int "Button 2 mapping coordinate x"
+ default 0
-config USE_LV_REAL_DRAW
- bool "Enable function which draws directly to the frame buffer instead of VDB"
- default y
+config LV_PORT_BUTTON_BUTTON_2_MAP_Y
+ int "Button 2 mapping coordinate y"
+ default 0
-config USE_LV_FILESYSTEM
- bool "Enable filesystem (required for images, lv_img)"
- default y
+config LV_PORT_BUTTON_BUTTON_3_MAP_X
+ int "Button 3 mapping coordinate x"
+ default 0
-if USE_LV_FILESYSTEM
+config LV_PORT_BUTTON_BUTTON_3_MAP_Y
+ int "Button 3 mapping coordinate y"
+ default 0
-config LV_FILESYSTEM_MOUNTPOINT
- string "File system mount point"
- default "/data"
+config LV_PORT_BUTTON_BUTTON_4_MAP_X
+ int "Button 4 mapping coordinate x"
+ default 0
-endif
+config LV_PORT_BUTTON_BUTTON_4_MAP_Y
+ int "Button 4 mapping coordinate y"
+ default 0
-config USE_LV_MULTI_LANG
- int "Number of languages for labels to store (0 to disable)"
+config LV_PORT_BUTTON_BUTTON_5_MAP_X
+ int "Button 5 mapping coordinate x"
default 0
-endmenu
+config LV_PORT_BUTTON_BUTTON_5_MAP_Y
+ int "Button 5 mapping coordinate y"
+ default 0
-menu "Log usage"
+endif # LV_PORT_USE_BUTTON
-config LV_USE_LOG
- bool "Enable/disable the log module"
+menuconfig LV_PORT_USE_KEYPAD
+ bool "Enable keypad port"
default n
+ ---help---
+ button bit map < 0 is no binding, must >= 0 and < 31 to binding button device.
-choice
- prompt "Log level"
- depends on LV_USE_LOG
- default LV_LOG_LEVEL_WARN
+if LV_PORT_USE_KEYPAD
-config LV_LOG_LEVEL_TRACE
- bool "Trace"
+config LV_PORT_KEYPAD_DEFAULT_DEVICEPATH
+ string "Button default device path"
+ default "/dev/buttons"
-config LV_LOG_LEVEL_INFO
- bool "Info"
+config LV_PORT_KEYPAD_KEY_UP_MAP_BIT
+ int "LV_KEY_UP button bit map"
+ default -1
-config LV_LOG_LEVEL_WARN
- bool "Warn"
+config LV_PORT_KEYPAD_KEY_DOWN_MAP_BIT
+ int "LV_KEY_DOWN button bit map"
+ default -1
-config LV_LOG_LEVEL_ERROR
- bool "Error"
+config LV_PORT_KEYPAD_KEY_RIGHT_MAP_BIT
+ int "LV_KEY_RIGHT button bit map"
+ default -1
-endchoice
+config LV_PORT_KEYPAD_KEY_LEFT_MAP_BIT
+ int "LV_KEY_LEFT button bit map"
+ default -1
-config LV_LOG_PRINTF
- bool "Use printf() for logging"
- depends on LV_USE_LOG
- default y
+config LV_PORT_KEYPAD_KEY_ESC_MAP_BIT
+ int "LV_KEY_ESC button bit map"
+ default -1
-endmenu
+config LV_PORT_KEYPAD_KEY_DEL_MAP_BIT
+ int "LV_KEY_DEL button bit map"
+ default -1
-menu "Debug usage"
+config LV_PORT_KEYPAD_KEY_BACKSPACE_MAP_BIT
+ int "LV_KEY_BACKSPACE button bit map"
+ default -1
-config LV_USE_DEBUG
- bool "Enable/disable the debug module"
- default n
+config LV_PORT_KEYPAD_KEY_ENTER_MAP_BIT
+ int "LV_KEY_ENTER button bit map"
+ default -1
-config LV_USE_ASSERT_NULL
- bool "Check if the parameter is NULL"
- depends on LV_USE_DEBUG
- default n
+config LV_PORT_KEYPAD_KEY_NEXT_MAP_BIT
+ int "LV_KEY_NEXT button bit map"
+ default -1
-config LV_USE_ASSERT_MEM
- bool "Checks is the memory is successfully allocated or no"
- depends on LV_USE_DEBUG
- default n
+config LV_PORT_KEYPAD_KEY_PREV_MAP_BIT
+ int "LV_KEY_PREV button bit map"
+ default -1
-config LV_USE_ASSERT_STR
- bool "Check the strings"
- depends on LV_USE_DEBUG
- default n
+config LV_PORT_KEYPAD_KEY_HOME_MAP_BIT
+ int "LV_KEY_HOME button bit map"
+ default -1
-config LV_USE_ASSERT_OBJ
- bool "Check object's type and existence"
- depends on LV_USE_DEBUG
- default n
+config LV_PORT_KEYPAD_KEY_END_MAP_BIT
+ int "LV_KEY_END button bit map"
+ default -1
-config LV_USE_ASSERT_STYLE
- bool "Check if the styles are properly initialized"
- depends on LV_USE_DEBUG
- default n
+endif # LV_PORT_USE_KEYPAD
-endmenu
+if LV_PORT_USE_ENCODER
-menu "Theme usage"
+config LV_PORT_ENCODER_DEFAULT_DEVICEPATH
+ string "Encoder default device path"
+ default "/dev/input0"
-config LV_USE_THEME_TEMPL
- bool "Use Template theme: just for test"
- default n
+endif # LV_USE_ENCODER
-config LV_USE_THEME_MONO
- bool "Use Mono theme: mono color theme"
- default n
+menu "Memory configuration"
-config LV_USE_THEME_MATERIAL
- bool "Use Material theme: material theme with bold colors"
- default n
+config LV_PORT_MEM_ATTRIBUTE_FAST_MEM_SECTION_NAME
+ string "LV_ATTRIBUTE_FAST_MEM Section Name"
+ default ""
+ ---help---
+ Set this option to configure custom memory as LV_ATTRIBUTE_FAST_MEM
-endmenu
+if LV_MEM_CUSTOM
-menu "Base object settings"
-
-config LV_OBJ_REALIGN
- bool "Enable `lv_obj_realaign()` based on `lv_obj_align()` parameters"
- default y
-
-endmenu
+config LV_PORT_MEM_CUSTOM_SIZE
+ int "Size of the custom memory used by `lv_mem_alloc` in kilobytes (>= 2kB)"
+ default 0
-menu "Object type usage settings"
-
-config USE_LV_LABEL
- bool "Label usage"
- default y
-
-config LV_LABEL_SCROLL_SPEED
- int "Hor, or ver. scroll speed [px/sec] in 'LV_LABEL_LONG_SCROLL/ROLL' mode"
- depends on USE_LV_LABEL
- default 25
-
-config USE_LV_IMG
- bool "Image usage"
- default y
-
-config LV_IMG_CF_INDEXED
- bool "Enable indexed (palette) images"
- depends on USE_LV_IMG
- default y
-
-config LV_IMG_CF_ALPHA
- bool "Enable alpha indexed images"
- depends on USE_LV_IMG
- default y
-
-config USE_LV_LINE
- bool "Line usage"
- default y
-
-config USE_LV_ARC
- bool "Arc usage"
- default y
-
-config USE_LV_CONT
- bool "Container usage"
- default y
-
-config USE_LV_PAGE
- depends on USE_LV_CONT
- bool "Page usage"
- default y
-
-config USE_LV_WIN
- depends on USE_LV_PAGE && USE_LV_LABEL && USE_LV_IMG && USE_LV_BTN
- bool "Window usage"
- default y
-
-config USE_LV_TABVIEW
- depends on USE_LV_PAGE && USE_LV_BTNM
- bool "Tabview usage"
- default y
-
-config LV_TABVIEW_ANIM_TIME
- int "Time of slide animation [ms] (0: no animation)"
- depends on USE_LV_TABVIEW
- default 300
-
-config USE_LV_TILEVIEW
- depends on USE_LV_CONT && USE_LV_PAGE
- bool "Tileview usage"
- default y
-
-config LV_TILEVIEW_ANIM_TIME
- int "Time of slide animation [ms] (0: no animation)"
- depends on USE_LV_TILEVIEW
- default 300
-
-config USE_LV_BAR
- bool "Bar usage"
- default y
-
-config USE_LV_LMETER
- depends on USE_LV_BAR
- bool "Line meter usage"
- default y
-
-config USE_LV_GAUGE
- depends on USE_LV_BAR && USE_LV_LMETER
- bool "Gauge usage"
- default y
-
-config USE_LV_CHART
- bool "Chart usage"
- default y
-
-config LV_CHART_AXIS_TICK_LABEL_MAX_LEN
- depends on USE_LV_CHART
- int "Chart axis tick label max length"
- default 20
-
-config USE_LV_TABLE
- bool "Table usage"
- depends on USE_LV_LABEL
- default y
-
-config LV_TABLE_COL_MAX
- int "Maximum number of table columns"
- depends on USE_LV_TABLE
- default 12
-
-config USE_LV_LED
- bool "LED usage"
- default y
-
-config USE_LV_MBOX
- bool "Messagebox usage"
- depends on USE_LV_BTNM && USE_LV_LABEL
- default y
-
-config USE_LV_TA
- bool "Text area usage"
- depends on USE_LV_LABEL && USE_LV_PAGE
- default y
-
-config USE_LV_SPINBOX
- bool "Spinbox usage"
- depends on USE_LV_TA
- default y
-
-config USE_LV_CALENDAR
- bool "Calendar usage"
- default y
-
-config USE_LV_PRELOAD
- bool "Preload usage"
- depends on USE_LV_ARC
- default y
-
-config LV_PRELOAD_DEF_ARC_LENGTH
- int "Degrees of arc length (default)"
- range 0 360
- depends on USE_LV_PRELOAD
- default 60
-
-config LV_PRELOAD_DEF_SPIN_TIME
- int "Time (ms) preload spins (default)"
- depends on USE_LV_PRELOAD
- default 1000
-
-choice
- prompt "Default preload animation"
- depends on USE_LV_PRELOAD
- default LV_PRELOAD_DEF_ANIM_SPINNING_ARC
-
-config LV_PRELOAD_DEF_ANIM_SPINNING_ARC
- bool "Spinning Arc"
-
-config LV_PRELOAD_DEF_ANIM_FILLSPIN_ARC
- bool "Fillspin Arc"
-
-endchoice
-
-config USE_LV_CANVAS
- bool "Canvas usage"
- depends on USE_LV_IMG
- default n
+if LV_PORT_MEM_CUSTOM_SIZE != 0
-config USE_LV_BTN
- bool "Button usage"
- depends on USE_LV_CONT
- default y
+config LV_PORT_MEM_CUSTOM_NAME
+ string "Name of the custom HEAP memory"
+ default "lvgl"
-config LV_BTN_INK_EFFECT
- bool "Enable button-state animations"
- depends on USE_LV_BTN && USE_LV_ANIMATION
- default y
+endif # LV_PORT_MEM_CUSTOM_SIZE
-config USE_LV_IMGBTN
- depends on USE_LV_BTN
- bool "Image button usage"
- default y
+endif # LV_MEM_CUSTOM
-config LV_IMGBTN_TILED
- bool "Tiled image button"
- depends on USE_LV_IMGBTN
- ---help---
- The imgbtn requires left, mid and right parts and the width can be set freely
-
-config USE_LV_BTNM
- bool "Button matrix usage"
- default y
-
-config USE_LV_KB
- bool "Keyboard"
- depends on USE_LV_BTNM
- default y
-
-config USE_LV_CB
- bool "Chekbox usage"
- depends on USE_LV_BTN
- default y
-
-config USE_LV_SW
- bool "Switch usage"
- depends on USE_LV_BTN
- default y
-
-config USE_LV_LIST
- bool "List usage"
- depends on USE_LV_BTN && USE_LV_PAGE
- default y
-
-config USE_LV_DDLIST
- bool "Drop down list usage"
- depends on USE_LV_PAGE && USE_LV_LABEL
- default y
-
-config USE_LV_ROLLER
- bool "Roller usage"
- depends on USE_LV_DDLIST
- default y
-
-config USE_LV_SLIDER
- bool "Slider usage"
- depends on USE_LV_BAR
- default y
-
-endmenu
+endmenu # "Memory configuration"
endif # GRAPHICS_LVGL
diff --git a/graphics/lvgl/Make.defs b/graphics/lvgl/Make.defs
index 7fa5292ad..0caf681f3 100644
--- a/graphics/lvgl/Make.defs
+++ b/graphics/lvgl/Make.defs
@@ -26,8 +26,4 @@ CONFIGURED_APPS += $(APPDIR)/graphics/lvgl
CFLAGS += ${INCDIR_PREFIX}$(APPDIR)/graphics/lvgl
CXXFLAGS += ${INCDIR_PREFIX}$(APPDIR)/graphics/lvgl
-# It allows `<lvgl.h>` import.
-
-CFLAGS += ${INCDIR_PREFIX}$(APPDIR)/graphics/lvgl/lvgl
-CXXFLAGS += ${INCDIR_PREFIX}$(APPDIR)/graphics/lvgl/lvgl
endif
diff --git a/graphics/lvgl/Makefile b/graphics/lvgl/Makefile
index 5bfdd3c7d..9188e5d73 100644
--- a/graphics/lvgl/Makefile
+++ b/graphics/lvgl/Makefile
@@ -25,32 +25,67 @@ include $(APPDIR)/Make.defs
LVGL_DIR = .
LVGL_DIR_NAME = lvgl
-# Relax format check for LVGL to avoid errors on prinf() use
+# Relax LVGL's format checking and unused variable checking to avoid errors
-CFLAGS += -Wno-format
+CFLAGS += -Wno-format -Wno-unused-variable
-# LVGL Libraries
+-include ./lvgl/lvgl.mk
--include ./lvgl/src/lv_core/lv_core.mk
--include ./lvgl/src/lv_hal/lv_hal.mk
--include ./lvgl/src/lv_widgets/lv_widgets.mk
--include ./lvgl/src/lv_font/lv_font.mk
--include ./lvgl/src/lv_misc/lv_misc.mk
--include ./lvgl/src/lv_themes/lv_themes.mk
--include ./lvgl/src/lv_draw/lv_draw.mk
--include ./lvgl/src/lv_gpu/lv_gpu.mk
+CSRCS += port/lv_port.c
+CSRCS += port/lv_port_tick.c
-CSRCS += lv_tick_interface.c
-ifneq ($(CONFIG_USE_LV_FILESYSTEM),)
-CSRCS += lv_fs_interface.c
+ifeq ($(CONFIG_LV_PORT_USE_LCDDEV),y)
+CSRCS += port/lv_port_lcddev.c
+endif
+
+ifeq ($(CONFIG_LV_PORT_USE_FBDEV),y)
+CSRCS += port/lv_port_fbdev.c
+endif
+
+ifeq ($(CONFIG_LV_PORT_USE_TOUCHPAD),y)
+CSRCS += port/lv_port_touchpad.c
+endif
+
+ifeq ($(CONFIG_LV_PORT_USE_BUTTON),y)
+CSRCS += port/lv_port_button.c
+endif
+
+ifeq ($(CONFIG_LV_PORT_USE_KEYPAD),y)
+CSRCS += port/lv_port_keypad.c
+endif
+
+ifeq ($(CONFIG_LV_PORT_USE_ENCODER),y)
+CSRCS += port/lv_port_encoder.c
+endif
+
+ifeq ($(CONFIG_LV_USE_LOG),y)
+CSRCS += port/lv_port_syslog.c
+endif
+
+ifneq ($(CONFIG_LV_PORT_MEM_ATTRIBUTE_FAST_MEM_SECTION_NAME), "")
+CFLAGS += "-DLV_ATTRIBUTE_FAST_MEM=locate_data(CONFIG_LV_PORT_MEM_ATTRIBUTE_FAST_MEM_SECTION_NAME)"
+CXXFLAGS += "-DLV_ATTRIBUTE_FAST_MEM=locate_data(CONFIG_LV_PORT_MEM_ATTRIBUTE_FAST_MEM_SECTION_NAME)"
+endif
+
+ifeq ($(CONFIG_LV_MEM_CUSTOM),y)
+ifneq ($(CONFIG_LV_PORT_MEM_CUSTOM_SIZE), 0)
+CFLAGS += "-DLV_MEM_CUSTOM_ALLOC=lv_port_mem_alloc"
+CFLAGS += "-DLV_MEM_CUSTOM_FREE=lv_port_mem_free"
+CFLAGS += "-DLV_MEM_CUSTOM_REALLOC=lv_port_mem_realloc"
+CSRCS += port/lv_port_mem.c
+endif
+endif
+
+ifneq ($(CONFIG_LV_ASSERT_HANDLER_INCLUDE), "")
+CFLAGS += "-DLV_ASSERT_HANDLER=ASSERT(0);"
endif
# Set up build configuration and environment
WD := ${shell echo $(CURDIR) | sed -e 's/ /\\ /g'}
-CONFIG_GRAPH_LVGL_URL ?= "https://github.com/lvgl/lvgl/archive"
+CONFIG_GRAPH_LVGL_URL ?= "https://github.com/lvgl/lvgl/archive/refs/tags"
LVGL_VERSION = $(patsubst "%",%,$(strip $(CONFIG_LVGL_VERSION)))
LVGL_TARBALL = v$(LVGL_VERSION).zip
diff --git a/graphics/lvgl/lv_conf.h b/graphics/lvgl/lv_conf.h
deleted file mode 100644
index 53ac9959d..000000000
--- a/graphics/lvgl/lv_conf.h
+++ /dev/null
@@ -1,1052 +0,0 @@
-/****************************************************************************
- * apps/graphics/lvgl/lv_conf.h
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership. The
- * ASF licenses this file to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the
- * License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations
- * under the License.
- *
- ****************************************************************************/
-
-#ifndef __APPS_GRAPHICS_LVGL_LV_CONF_H
-#define __APPS_GRAPHICS_LVGL_LV_CONF_H
-
-/****************************************************************************
- * Included Files
- ****************************************************************************/
-
-#include <nuttx/config.h>
-
-#include <stdint.h>
-
-/* Type of coordinates. Should be `int16_t`
- * (or `int32_t` for extreme cases)
- */
-
-typedef int16_t lv_coord_t;
-
-/****************************************************************************
- * Pre-processor Definitions
- ****************************************************************************/
-
-/****************************************************************************
- * Graphical settings
- ****************************************************************************/
-
-/* Maximal horizontal and vertical resolution to support by the library. */
-
-#define LV_HOR_RES_MAX CONFIG_LV_HOR_RES
-#define LV_VER_RES_MAX CONFIG_LV_VER_RES
-
-/* Color depth:
- * - 1: 1 byte per pixel
- * - 8: RGB233
- * - 16: RGB565
- * - 32: ARGB8888
- */
-
-#define LV_COLOR_DEPTH CONFIG_LV_COLOR_DEPTH
-
-/* Swap the 2 bytes of RGB565 color.
- * Useful if the display has a 8 bit interface (e.g. SPI)
- */
-
-#ifdef CONFIG_LV_COLOR_16_SWAP
-#define LV_COLOR_16_SWAP CONFIG_LV_COLOR_16_SWAP
-#else
-#define LV_COLOR_16_SWAP 0
-#endif
-
-/* 1: Enable screen transparency.
- * Useful for OSD or other overlapping GUIs.
- * Requires `LV_COLOR_DEPTH = 32` colors and the screen's style
- * should be modified: `style.body.opa = ...`
- */
-
-#ifdef CONFIG_LV_COLOR_SCREEN_TRANSP
-#define LV_COLOR_SCREEN_TRANSP CONFIG_LV_COLOR_SCREEN_TRANSP
-#else
-#define LV_COLOR_SCREEN_TRANSP 0
-#endif
-
-/* Images pixels with this color will not be drawn (with chroma keying) */
-
-/* LV_COLOR_LIME: pure green */
-
-#define LV_COLOR_TRANSP ((lv_color_t){.full = (CONFIG_LV_COLOR_TRANSP)})
-
-/* Enable chroma keying for indexed images. */
-
-#define LV_INDEXED_CHROMA 1
-
-/* Enable anti-aliasing (lines, and radiuses will be smoothed) */
-
-#ifdef CONFIG_LV_ANTIALIAS
-#define LV_ANTIALIAS CONFIG_LV_ANTIALIAS
-#else
-#define LV_ANTIALIAS 0
-#endif
-
-/* Default display refresh period.
- * Can be changed in the display driver (`lv_disp_drv_t`).
- */
-
-#define LV_DISP_DEF_REFR_PERIOD CONFIG_LV_DISP_DEF_REFR_PERIOD /* [ms] */
-
-/* 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 CONFIG_LV_DPI /* [px] */
-
-/* The the real width of the display changes some default values:
- * default object sizes, layout of examples, etc.
- * According to the width of the display (hor. res. / dpi)
- * the displays fall in 4 categories.
- * The 4th is extra large which has no upper limit so not listed here
- * The upper limit of the categories are set below in 0.1 inch unit.
- */
-
-#define LV_DISP_SMALL_LIMIT 30
-#define LV_DISP_MEDIUM_LIMIT 50
-#define LV_DISP_LARGE_LIMIT 70
-
-/****************************************************************************
- * Memory manager settings
- ****************************************************************************/
-
-/* LittelvGL's internal memory manager's settings.
- * The graphical objects and other related data are stored here.
- */
-
-/* 1: use custom malloc/free, 0: use the built-in
- * `lv_mem_alloc` and `lv_mem_free`
- */
-
-#define LV_MEM_CUSTOM 1
-#if LV_MEM_CUSTOM == 0
-
-/* Size of the memory used by `lv_mem_alloc` in bytes (>= 2kB) */
-
-# define LV_MEM_SIZE CONFIG_LV_MEM_SIZE
-
-/* Compiler prefix for a big array declaration */
-
-# define LV_MEM_ATTR
-
-/* Set an address for the memory pool instead of allocating it as an array.
- * Can be in external SRAM too.
- */
-
-# define LV_MEM_ADR 0
-
-/* Automatically defrag. on free. Defrag. means
- * joining the adjacent free cells.
- */
-
-# define LV_MEM_AUTO_DEFRAG 1
-#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 level language and the memory is
- * managed by that language
- */
-
-#define LV_ENABLE_GC 0
-#if LV_ENABLE_GC != 0
-# define LV_GC_INCLUDE "gc.h" /* Include Garbage Collector related things */
-# 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 */
-#endif /* LV_ENABLE_GC */
-
-/****************************************************************************
- * Input device settings
- ****************************************************************************/
-
-/* Input device default settings.
- * Can be changed in the Input device driver (`lv_indev_drv_t`)
- */
-
-/* Input device read period in milliseconds */
-
-#define LV_INDEV_DEF_READ_PERIOD CONFIG_LV_INDEV_DEF_READ_PERIOD
-
-/* Drag threshold in pixels */
-
-#define LV_INDEV_DEF_DRAG_LIMIT CONFIG_LV_INDEV_DEF_DRAG_LIMIT
-
-/* Drag throw slow-down in [%]. Greater value -> faster slow-down */
-
-#define LV_INDEV_DEF_DRAG_THROW CONFIG_LV_INDEV_DEF_DRAG_THROW
-
-/* Long press time in milliseconds.
- * Time to send `LV_EVENT_LONG_PRESSSED`)
- */
-
-#define LV_INDEV_DEF_LONG_PRESS_TIME CONFIG_LV_INDEV_DEF_LONG_PRESS_TIME
-
-/* Repeated trigger period in long press [ms]
- * Time between `LV_EVENT_LONG_PRESSED_REPEAT
- */
-
-#define LV_INDEV_DEF_LONG_PRESS_REP_TIME \
- CONFIG_LV_INDEV_DEF_LONG_PRESS_REP_TIME
-
-/* Gesture threshold in pixels */
-
-#define LV_INDEV_DEF_GESTURE_LIMIT CONFIG_LV_INDEV_DEF_GESTURE_LIMIT
-
-/* Gesture min velocity at release before swipe (pixels) */
-
-#define LV_INDEV_DEF_GESTURE_MIN_VELOCITY \
- CONFIG_LV_INDEV_DEF_GESTURE_MIN_VELOCITY
-
-/****************************************************************************
- * Feature usage
- ****************************************************************************/
-
-/* 1: Enable the Animations */
-
-#ifdef CONFIG_USE_LV_ANIMATION
-#define LV_USE_ANIMATION CONFIG_USE_LV_ANIMATION
-#else
-#define LV_USE_ANIMATION 0
-#endif
-
-#if LV_USE_ANIMATION
-
-/* Declare the type of the user data of animations
- * (can be e.g. `void *`, `int`, `struct`)
- */
-
-typedef void * lv_anim_user_data_t;
-
-#endif
-
-/* 1: Enable shadow drawing */
-
-#ifdef CONFIG_USE_LV_SHADOW
-#define LV_USE_SHADOW CONFIG_USE_LV_SHADOW
-#else
-#define LV_USE_SHADOW 0
-#endif
-
-#if LV_USE_SHADOW
-/* Allow buffering some shadow calculation
- * LV_SHADOW_CACHE_SIZE is the max. shadow size to buffer,
- * where shadow size is `shadow_width + radius`
- * Caching has LV_SHADOW_CACHE_SIZE^2 RAM cost
- */
-
-# define LV_SHADOW_CACHE_SIZE 0
-#endif
-
-/* 1: Use other blend modes than normal (`LV_BLEND_MODE_...`) */
-
-#define LV_USE_BLEND_MODES 1
-
-/* 1: Use the `opa_scale` style property to set the opacity
- * of an object and its children at once
- */
-
-#define LV_USE_OPA_SCALE 1
-
-/* 1: Use image zoom and rotation */
-
-#define LV_USE_IMG_TRANSFORM 1
-
-/* 1: Enable object groups (for keyboard/encoder navigation) */
-
-#ifdef CONFIG_USE_LV_GROUP
-#define LV_USE_GROUP CONFIG_USE_LV_GROUP
-#else
-#define LV_USE_GROUP 0
-#endif
-#if LV_USE_GROUP
-typedef void * lv_group_user_data_t;
-#endif /* LV_USE_GROUP */
-
-/* 1: Enable GPU interface */
-
-#ifdef CONFIG_USE_LV_GPU
-#define LV_USE_GPU CONFIG_USE_LV_GPU
-#else
-#define LV_USE_GPU 0
-#endif
-
-/* 1: Enable file system (might be required for images */
-
-#ifdef CONFIG_USE_LV_FILESYSTEM
-#define LV_USE_FILESYSTEM CONFIG_USE_LV_FILESYSTEM
-#else
-#define LV_USE_FILESYSTEM 0
-#endif
-
-#if LV_USE_FILESYSTEM
-/* Declare the type of the user data of file system drivers
- * (can be e.g. `void *`, `int`, `struct`)
- */
-
-typedef void * lv_fs_drv_user_data_t;
-#endif
-
-/* 1: Add a `user_data` to drivers and objects */
-
-#ifdef CONFIG_LV_USE_USER_DATA
-#define LV_USE_USER_DATA CONFIG_LV_USE_USER_DATA
-#else
-#define LV_USE_USER_DATA 0
-#endif
-
-/* 1: Show CPU usage and FPS count in the right bottom corner */
-
-#ifdef CONFIG_LV_USE_PERF_MONITOR
-#define LV_USE_PERF_MONITOR CONFIG_LV_USE_PERF_MONITOR
-#else
-#define LV_USE_PERF_MONITOR 0
-#endif
-
-/* 1: Use the functions and types from the older API if possible */
-
-#define LV_USE_API_EXTENSION_V6 1
-
-/****************************************************************************
- * Image decoder and cache
- ****************************************************************************/
-
-/* 1: Enable indexed (palette) images */
-
-#ifdef CONFIG_LV_IMG_CF_INDEXED
-#define LV_IMG_CF_INDEXED CONFIG_LV_IMG_CF_INDEXED
-#else
-#define LV_IMG_CF_INDEXED 0
-#endif
-
-/* 1: Enable alpha indexed images */
-
-#ifdef CONFIG_LV_IMG_CF_ALPHA
-#define LV_IMG_CF_ALPHA CONFIG_LV_IMG_CF_ALPHA
-#else
-#define LV_IMG_CF_ALPHA 0
-#endif
-
-/* Default image cache size. Image caching keeps the images opened.
- * If only the built-in image formats are used there is
- * no real advantage of caching.
- * (I.e. no new image decoder is added)
- * With complex image decoders (e.g. PNG or JPG) caching can
- * save the continuous open/decode of images.
- * However the opened images might consume additional RAM.
- * LV_IMG_CACHE_DEF_SIZE must be >= 1
- */
-
-#define LV_IMG_CACHE_DEF_SIZE 1
-
-/* Declare the type of the user data of image decoder
- * (can be e.g. `void *`, `int`, `struct`)
- */
-
-typedef void * lv_img_decoder_user_data_t;
-
-/****************************************************************************
- * Compiler settings
- ****************************************************************************/
-
-/* Define a custom attribute to `lv_tick_inc` function */
-
-#define LV_ATTRIBUTE_TICK_INC
-
-/* Define a custom attribute to `lv_task_handler` function */
-
-#define LV_ATTRIBUTE_TASK_HANDLER
-
-/* With size optimization (-Os) the compiler might not align data to
- * 4 or 8 byte boundary. This alignment will be explicitly applied
- * where needed.
- * E.g. __attribute__((aligned(4)))
- */
-
-#define LV_ATTRIBUTE_MEM_ALIGN
-
-/* Attribute to mark large constant arrays for example
- * font's bitmaps
- */
-
-#define LV_ATTRIBUTE_LARGE_CONST
-
-/* Prefix performance critical functions to place them into a
- * faster memory (e.g RAM). Uses 15-20 kB extra memory
- */
-
-#define LV_ATTRIBUTE_FAST_MEM
-
-/* Export integer constant to binding.
- * This macro is used with constants in the form of LV_<CONST> that
- * should also appear on lvgl binding API such as Micropython
- *
- * The default value just prevents a GCC warning.
- */
-
-#define LV_EXPORT_CONST_INT(int_value) struct _silence_gcc_warning
-
-/****************************************************************************
- * HAL settings
- ****************************************************************************/
-
-/* 1: use a custom tick source.
- * It removes the need to manually update the tick with `lv_tick_inc`)
- */
-
-#define LV_TICK_CUSTOM 1
-#if LV_TICK_CUSTOM == 1
-#define LV_TICK_CUSTOM_INCLUDE "lv_tick_interface.h" /* Header for the sys time function */
-#define LV_TICK_CUSTOM_SYS_TIME_EXPR (lv_tick_interface()) /* Expression evaluating to current systime in ms */
-#endif /* LV_TICK_CUSTOM */
-
-typedef void * lv_disp_drv_user_data_t; /* Type of user data in the display driver */
-typedef void * lv_indev_drv_user_data_t; /* Type of user data in the input device driver */
-
-/****************************************************************************
- * Log settings
- ****************************************************************************/
-
-/* 1: Enable the log module */
-
-#ifdef CONFIG_LV_USE_LOG
-#define LV_USE_LOG CONFIG_LV_USE_LOG
-#else
-#define LV_USE_LOG 0
-#endif
-
-#if LV_USE_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 happened but didn't cause a crash
- * LV_LOG_LEVEL_ERROR - Only critical issue, when the system may fail
- * LV_LOG_LEVEL_NONE - Do not log anything
- */
-
-#ifdef CONFIG_LV_LOG_LEVEL_TRACE
-# define LV_LOG_LEVEL LV_LOG_LEVEL_TRACE
-#endif
-
-#ifdef CONFIG_LV_LOG_LEVEL_INFO
-# define LV_LOG_LEVEL LV_LOG_LEVEL_INFO
-#endif
-
-#ifdef CONFIG_LV_LOG_LEVEL_WARN
-# define LV_LOG_LEVEL LV_LOG_LEVEL_WARN
-#endif
-
-#ifdef CONFIG_LV_LOG_LEVEL_ERROR
-# define LV_LOG_LEVEL LV_LOG_LEVEL_ERROR
-#endif
-
-#ifdef CONFIG_LV_LOG_LEVEL_NONE
-# define LV_LOG_LEVEL LV_LOG_LEVEL_NONE
-#endif
-
-/* 1: Print the log with 'printf';
- * 0: user need to register a callback with `lv_log_register_print_cb`
- */
-
-#ifdef CONFIG_LV_LOG_PRINTF
-# define LV_LOG_PRINTF CONFIG_LV_LOG_PRINTF
-#else
-# define LV_LOG_PRINTF 0
-#endif
-#endif /* LV_USE_LOG */
-
-/****************************************************************************
- * Debug settings
- ****************************************************************************/
-
-/* If Debug is enabled LittelvGL validates the parameters of the functions.
- * If an invalid parameter is found an error log message is printed and
- * the MCU halts at the error. (`LV_USE_LOG` should be enabled)
- * If you are debugging the MCU you can pause
- * the debugger to see exactly where the issue is.
- *
- * The behavior of asserts can be overwritten by redefining them here.
- * E.g. #define LV_ASSERT_MEM(p) <my_assert_code>
- */
-
-#ifndef CONFIG_LV_USE_DEBUG
-#define CONFIG_LV_USE_DEBUG 0
-#endif
-
-#define LV_USE_DEBUG CONFIG_LV_USE_DEBUG
-
-/* Check if the parameter is NULL. (Quite fast) */
-
-#ifdef CONFIG_LV_USE_ASSERT_NULL
-#define LV_USE_ASSERT_NULL CONFIG_LV_USE_ASSERT_NULL
-#else
-#define LV_USE_ASSERT_NULL 0
-#endif
-
-/* Checks is the memory is successfully allocated or no. (Quite fast) */
-
-#ifdef CONFIG_LV_USE_ASSERT_MEM
-#define LV_USE_ASSERT_MEM CONFIG_LV_USE_ASSERT_MEM
-#else
-#define LV_USE_ASSERT_MEM 0
-#endif
-
-/* Check the integrity of `lv_mem` after critical operations. (Slow) */
-
-#define LV_USE_ASSERT_MEM_INTEGRITY 0
-
-/* Check the strings.
- * Search for NULL, very long strings, invalid characters,
- * and unnatural repetitions. (Slow)
- * If disabled `LV_USE_ASSERT_NULL` will be performed instead
- * (if it's enabled)
- */
-#ifdef CONFIG_LV_USE_ASSERT_STR
-#define LV_USE_ASSERT_STR CONFIG_LV_USE_ASSERT_STR
-#else
-#define LV_USE_ASSERT_STR 0
-#endif
-
-/* Check NULL, the object's type and existence
- * (e.g. not deleted). (Quite slow)
- * If disabled `LV_USE_ASSERT_NULL` will be
- * performed instead (if it's enabled)
- */
-
-#ifdef CONFIG_LV_USE_ASSERT_OBJ
-#define LV_USE_ASSERT_OBJ CONFIG_LV_USE_ASSERT_OBJ
-#else
-#define LV_USE_ASSERT_OBJ 0
-#endif
-
-/* Check if the styles are properly initialized. (Fast) */
-
-#ifdef CONFIG_LV_USE_ASSERT_STYLE
-#define LV_USE_ASSERT_STYLE CONFIG_LV_USE_ASSERT_STYLE
-#else
-#define LV_USE_ASSERT_STYLE 0
-#endif
-
-/****************************************************************************
- * THEME USAGE
- ****************************************************************************/
-
-/* Always enable at least on theme */
-
-/* No theme, you can apply your styles as you need
- * No flags. Set LV_THEME_DEFAULT_FLAG 0
- */
-
-#define LV_USE_THEME_EMPTY 1
-
-/* Simple to the create your theme based on it
- * No flags. Set LV_THEME_DEFAULT_FLAG 0
- */
-
-#define LV_USE_THEME_TEMPLATE 1
-
-/* A fast and impressive theme.
- * Flags:
- * LV_THEME_MATERIAL_FLAG_LIGHT: light theme
- * LV_THEME_MATERIAL_FLAG_DARK: dark theme
- */
-
-#define LV_USE_THEME_MATERIAL 1
-
-/* Mono-color theme for monochrome displays.
- * If LV_THEME_DEFAULT_COLOR_PRIMARY is LV_COLOR_BLACK the
- * texts and borders will be black and the background will be
- * white. Else the colors are inverted.
- * No flags. Set LV_THEME_DEFAULT_FLAG 0
- */
-
-#define LV_USE_THEME_MONO 1
-
-#define LV_THEME_DEFAULT_INCLUDE <stdint.h> /* Include a header for the init. function */
-#define LV_THEME_DEFAULT_INIT lv_theme_material_init
-#define LV_THEME_DEFAULT_COLOR_PRIMARY LV_COLOR_RED
-#define LV_THEME_DEFAULT_COLOR_SECONDARY LV_COLOR_BLUE
-#define LV_THEME_DEFAULT_FLAG LV_THEME_MATERIAL_FLAG_LIGHT
-#define LV_THEME_DEFAULT_FONT_SMALL &lv_font_montserrat_16
-#define LV_THEME_DEFAULT_FONT_NORMAL &lv_font_montserrat_16
-#define LV_THEME_DEFAULT_FONT_SUBTITLE &lv_font_montserrat_16
-#define LV_THEME_DEFAULT_FONT_TITLE &lv_font_montserrat_16
-
-/****************************************************************************
- * FONT USAGE
- ****************************************************************************/
-
-/* The built-in fonts contains the ASCII range and some Symbols
- * with 4 bit-per-pixel.
- * The symbols are available via `LV_SYMBOL_...` defines
- * More info about fonts: https://docs.lvgl.io/v7/en/html/overview/font.html
- * To create a new font go to: https://lvgl.com/ttf-font-to-c-array
- */
-
-/* Montserrat fonts with bpp = 4
- * https://fonts.google.com/specimen/Montserrat
- */
-
-/* They only take up storage space after being used,
- * so we can enable them all by default
- */
-
-#define LV_FONT_MONTSERRAT_12 1
-#define LV_FONT_MONTSERRAT_14 1
-#define LV_FONT_MONTSERRAT_16 1
-#define LV_FONT_MONTSERRAT_18 1
-#define LV_FONT_MONTSERRAT_20 1
-#define LV_FONT_MONTSERRAT_22 1
-#define LV_FONT_MONTSERRAT_24 1
-#define LV_FONT_MONTSERRAT_26 1
-#define LV_FONT_MONTSERRAT_28 1
-#define LV_FONT_MONTSERRAT_30 1
-#define LV_FONT_MONTSERRAT_32 1
-#define LV_FONT_MONTSERRAT_34 1
-#define LV_FONT_MONTSERRAT_36 1
-#define LV_FONT_MONTSERRAT_38 1
-#define LV_FONT_MONTSERRAT_40 1
-#define LV_FONT_MONTSERRAT_42 1
-#define LV_FONT_MONTSERRAT_44 1
-#define LV_FONT_MONTSERRAT_46 1
-#define LV_FONT_MONTSERRAT_48 1
-
-/* Demonstrate special features */
-#define LV_FONT_MONTSERRAT_12_SUBPX 0
-#define LV_FONT_MONTSERRAT_28_COMPRESSED 0 /* bpp = 3 */
-#define LV_FONT_DEJAVU_16_PERSIAN_HEBREW 0 /* Hebrew, Arabic, PErisan letters and all their forms */
-#define LV_FONT_SIMSUN_16_CJK 0 /* 1000 most common CJK radicals */
-
-/* Pixel perfect monospace font
- * http://pelulamu.net/unscii/
- */
-
-#ifdef CONFIG_USE_LV_FONT_UNSCII_8
-#define LV_FONT_UNSCII_8 CONFIG_USE_LV_FONT_UNSCII_8
-#else
-#define LV_FONT_UNSCII_8 0
-#endif
-
-/* 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
-
-/* Enable it if you have fonts with a lot of characters.
- * The limit depends on the font size, font face and bpp
- * but with > 10,000 characters if you see issues probably you need
- * to enable it.
- */
-
-#define LV_FONT_FMT_TXT_LARGE 0
-
-/* Set the pixel order of the display.
- * Important only if "subpx fonts" are used.
- * With "normal" font it doesn't matter.
- */
-
-#define LV_FONT_SUBPX_BGR 0
-
-/* Declare the type of the user data of fonts
- * (can be e.g. `void *`, `int`, `struct`)
- */
-
-typedef void * lv_font_user_data_t;
-
-/****************************************************************************
- * Text settings
- ****************************************************************************/
-
-/* Select a character encoding for strings.
- * Your IDE or editor should have the same character encoding
- * - LV_TXT_ENC_UTF8
- * - LV_TXT_ENC_ASCII
- */
-
-#define LV_TXT_ENC LV_TXT_ENC_UTF8
-
-/* Can break (wrap) texts on these chars */
-
-#define LV_TXT_BREAK_CHARS CONFIG_LV_TXT_BREAK_CHARS
-
-/* If a word is at least this long, will break wherever "prettiest"
- * To disable, set to a value <= 0
- */
-
-#define LV_TXT_LINE_BREAK_LONG_LEN 0
-
-/* Minimum number of characters in a long word to put
- * on a line before a break.
- * Depends on LV_TXT_LINE_BREAK_LONG_LEN.
- */
-
-#define LV_TXT_LINE_BREAK_LONG_PRE_MIN_LEN 3
-
-/* Minimum number of characters in a long word to put on a
- * line after a break.
- * Depends on LV_TXT_LINE_BREAK_LONG_LEN.
- */
-
-#define LV_TXT_LINE_BREAK_LONG_POST_MIN_LEN 3
-
-/* The control character to use for signalling text recoloring. */
-
-#define LV_TXT_COLOR_CMD "#"
-
-/* Support bidirectional texts.
- * Allows mixing Left-to-Right and Right-to-Left texts.
- * The direction will be processed according to the
- * Unicode Bidirectioanl Algorithm:
- * https://www.w3.org/International/articles/inline-bidi-markup/uba-basics
- */
-
-#define LV_USE_BIDI 0
-#if LV_USE_BIDI
-/* Set the default direction. Supported values:
- * `LV_BIDI_DIR_LTR` Left-to-Right
- * `LV_BIDI_DIR_RTL` Right-to-Left
- * `LV_BIDI_DIR_AUTO` detect texts base direction
- */
-
-#define LV_BIDI_BASE_DIR_DEF LV_BIDI_DIR_AUTO
-#endif
-
-/* Enable Arabic/Persian processing
- * In these languages characters should be replaced with
- * an other form based on their position in the text
- */
-
-#define LV_USE_ARABIC_PERSIAN_CHARS 0
-
-/* Change the built in (v)snprintf functions */
-
-#define LV_SPRINTF_CUSTOM 1
-#if LV_SPRINTF_CUSTOM
-# define LV_SPRINTF_INCLUDE <stdio.h>
-# define lv_snprintf snprintf
-# define lv_vsnprintf vsnprintf
-#endif /* LV_SPRINTF_CUSTOM */
-
-/****************************************************************************
- * LV_OBJ SETTINGS
- ****************************************************************************/
-
-/* Declare the type of the user data of object
- * (can be e.g. `void *`, `int`, `struct`)
- */
-
-typedef void * lv_obj_user_data_t;
-
-/* 1: enable `lv_obj_realaign()` based on `lv_obj_align()` parameters */
-
-#ifdef CONFIG_LV_OBJ_REALIGN
-#define LV_USE_OBJ_REALIGN CONFIG_LV_OBJ_REALIGN
-#else
-#define LV_USE_OBJ_REALIGN 0
-#endif
-
-/* Enable to make the object clickable on a larger area.
- * LV_EXT_CLICK_AREA_OFF or 0: Disable this feature
- * LV_EXT_CLICK_AREA_TINY: The extra area can be adjusted
- * horizontally and vertically (0..255 px)
- * LV_EXT_CLICK_AREA_FULL: The extra area can be adjusted
- * in all 4 directions (-32k..+32k px)
- */
-
-#define LV_USE_EXT_CLICK_AREA LV_EXT_CLICK_AREA_TINY
-
-/****************************************************************************
- * LV OBJ X USAGE
- ****************************************************************************/
-
-/* Documentation of the object types:
- * https://docs.littlevgl.com/#Object-types
- */
-
-/* Arc (dependencies: -) */
-
-#ifdef CONFIG_USE_LV_ARC
-#define LV_USE_ARC CONFIG_USE_LV_ARC
-#else
-#define LV_USE_ARC 0
-#endif
-
-/* Bar (dependencies: -) */
-
-#ifdef CONFIG_USE_LV_BAR
-#define LV_USE_BAR CONFIG_USE_LV_BAR
-#else
-#define LV_USE_BAR 0
-#endif
-
-/* Button (dependencies: lv_cont) */
-
-#ifdef CONFIG_USE_LV_BTN
-#define LV_USE_BTN CONFIG_USE_LV_BTN
-#else
-#define LV_USE_BTN 0
-#endif
-
-#if LV_USE_BTN != 0
-
-/* Enable button-state animations - draw a
- * circle on click (dependencies: LV_USE_ANIMATION)
- */
-
-#ifdef CONFIG_LV_BTN_INK_EFFECT
-#define LV_BTN_INK_EFFECT CONFIG_LV_BTN_INK_EFFECT
-#else
-#define LV_BTN_INK_EFFECT 0
-#endif
-
-#endif
-
-/* Button matrix (dependencies: -) */
-
-#ifdef CONFIG_USE_LV_BTNM
-#define LV_USE_BTNM CONFIG_USE_LV_BTNM
-#else
-#define LV_USE_BTNM 0
-#endif
-
-/* Calendar (dependencies: -) */
-
-#ifdef CONFIG_USE_LV_CALENDAR
-#define LV_USE_CALENDAR CONFIG_USE_LV_CALENDAR
-#else
-#define LV_USE_CALENDAR 0
-#endif
-
-/* Canvas (dependencies: lv_img) */
-
-#ifdef CONFIG_USE_LV_CANVAS
-#define LV_USE_CANVAS CONFIG_USE_LV_CANVAS
-#else
-#define LV_USE_CANVAS 0
-#endif
-
-/* Check box (dependencies: lv_btn, lv_label) */
-
-#ifdef CONFIG_USE_LV_CB
-#define LV_USE_CB CONFIG_USE_LV_CB
-#else
-#define LV_USE_CB 0
-#endif
-
-/* Chart (dependencies: -) */
-
-#ifdef CONFIG_USE_LV_CHART
-#define LV_USE_CHART CONFIG_USE_LV_CHART
-#else
-#define LV_USE_CHART 0
-#endif
-
-#if LV_USE_CHART
-# define LV_CHART_AXIS_TICK_LABEL_MAX_LEN CONFIG_LV_CHART_AXIS_TICK_LABEL_MAX_LEN
-#endif
-
-/* Container (dependencies: -) */
-
-#define LV_USE_CONT 1
-
-/* Color picker (dependencies: -) */
-
-#define LV_USE_CPICKER 1
-
-/* Drop down list (dependencies: lv_page, lv_label, lv_symbol_def.h) */
-
-#define LV_USE_DDLIST 1
-#if LV_USE_DDLIST != 0
-/* Open and close default animation time [ms] (0: no animation) */
-
-# define LV_DDLIST_DEF_ANIM_TIME 200
-#endif
-
-/* Gauge (dependencies:lv_bar, lv_lmeter) */
-
-#define LV_USE_GAUGE 1
-
-/* Image (dependencies: lv_label) */
-
-#define LV_USE_IMG 1
-
-/* Image Button (dependencies: lv_btn) */
-
-#define LV_USE_IMGBTN 1
-#if LV_USE_IMGBTN
-/* 1: The imgbtn requires left, mid and right
- * parts and the width can be set freely
- */
-
-# define LV_IMGBTN_TILED 0
-#endif
-
-/* Keyboard (dependencies: lv_btnm) */
-
-#define LV_USE_KB 1
-
-/* Label (dependencies: -) */
-
-#define LV_USE_LABEL 1
-#if LV_USE_LABEL != 0
-/* Hor, or ver. scroll speed [px/sec] in
- * 'LV_LABEL_LONG_ROLL/ROLL_CIRC' mode
- */
-
-# define LV_LABEL_DEF_SCROLL_SPEED 25
-
-/* Waiting period at beginning/end of animation cycle */
-
-# define LV_LABEL_WAIT_CHAR_COUNT 3
-
-/* Enable selecting text of the label */
-
-# define LV_LABEL_TEXT_SEL 0
-
-/* Store extra some info in labels (12 bytes)
- * to speed up drawing of very long texts
- */
-
-# define LV_LABEL_LONG_TXT_HINT 0
-#endif
-
-/* LED (dependencies: -) */
-
-#define LV_USE_LED 1
-
-/* Line (dependencies: -) */
-
-#define LV_USE_LINE 1
-
-/* List (dependencies: lv_page, lv_btn, lv_label,
- * (lv_img optionally for icons))
- */
-
-#define LV_USE_LIST 1
-#if LV_USE_LIST != 0
-/* Default animation time of focusing to a
- * list element [ms] (0: no animation)
- */
-
-# define LV_LIST_DEF_ANIM_TIME 100
-#endif
-
-/* Line meter (dependencies: *) */
-
-#define LV_USE_LMETER 1
-
-/* Message box (dependencies: lv_rect, lv_btnm, lv_label) */
-
-#define LV_USE_MBOX 1
-
-/* Page (dependencies: lv_cont) */
-
-#define LV_USE_PAGE 1
-#if LV_USE_PAGE != 0
-/* Focus default animation time [ms] (0: no animation) */
-
-# define LV_PAGE_DEF_ANIM_TIME 400
-#endif
-
-/* Preload (dependencies: lv_arc, lv_anim) */
-
-#define LV_USE_PRELOAD 1
-#if LV_USE_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
-
-/* Roller (dependencies: lv_ddlist) */
-
-#define LV_USE_ROLLER 1
-#if LV_USE_ROLLER != 0
-/* Focus animation time [ms] (0: no animation) */
-
-# define LV_ROLLER_DEF_ANIM_TIME 200
-
-/* Number of extra "pages" when the roller is infinite */
-
-# define LV_ROLLER_INF_PAGES 7
-#endif
-
-/* Slider (dependencies: lv_bar) */
-
-#define LV_USE_SLIDER 1
-
-/* Spinbox (dependencies: lv_ta) */
-
-#define LV_USE_SPINBOX 1
-
-/* Switch (dependencies: lv_slider) */
-
-#define LV_USE_SW 1
-
-/* Text area (dependencies: lv_label, lv_page) */
-
-#define LV_USE_TA 1
-#if LV_USE_TA != 0
-# define LV_TA_DEF_CURSOR_BLINK_TIME 400 /* ms */
-# define LV_TA_DEF_PWD_SHOW_TIME 1500 /* ms */
-#endif
-
-/* Table (dependencies: lv_label) */
-
-#define LV_USE_TABLE 1
-#if LV_USE_TABLE
-# define LV_TABLE_COL_MAX 12
-#endif
-
-/* Tab (dependencies: lv_page, lv_btnm) */
-
-#define LV_USE_TABVIEW 1
-# if LV_USE_TABVIEW != 0
-/* Time of slide animation [ms] (0: no animation) */
-
-# define LV_TABVIEW_DEF_ANIM_TIME 300
-#endif
-
-/* Tileview (dependencies: lv_page) */
-
-#define LV_USE_TILEVIEW 1
-#if LV_USE_TILEVIEW
-/* Time of slide animation [ms] (0: no animation) */
-
-# define LV_TILEVIEW_DEF_ANIM_TIME 300
-#endif
-
-/* Window (dependencies: lv_cont, lv_btn, lv_label, lv_img, lv_page) */
-
-#define LV_USE_WIN 1
-
-/****************************************************************************
- * Non-user section
- ****************************************************************************/
-
-#if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_WARNINGS) /* Disable warnings for Visual Studio*/
-# define _CRT_SECURE_NO_WARNINGS
-#endif
-
-#endif /* __APPS_GRAPHICS_LVGL_LV_CONF_H */
diff --git a/graphics/lvgl/lv_conf/Kconfig b/graphics/lvgl/lv_conf/Kconfig
new file mode 100644
index 000000000..65f02eda3
--- /dev/null
+++ b/graphics/lvgl/lv_conf/Kconfig
@@ -0,0 +1,1115 @@
+#
+# For a description of the syntax of this configuration file,
+# see the file kconfig-language.txt in the NuttX tools repository.
+#
+
+# Kconfig file for LVGL v8.0
+
+menu "LVGL configuration"
+
+ # Define CONFIG_LV_CONF_SKIP so we can use LVGL
+ # without lv_conf.h file, the lv_conf_internal.h and
+ # lv_conf_kconfig.h files are used instead.
+ config LV_CONF_SKIP
+ bool "Uncheck this to use custom lv_conf.h"
+ default y
+
+ config LV_CONF_MINIMAL
+ bool "LVGL minimal configuration."
+
+ menu "Color settings"
+ choice LV_COLOR_DEPTH
+ prompt "Color depth."
+ default LV_COLOR_DEPTH_16
+ help
+ Color depth to be used.
+
+ config LV_COLOR_DEPTH_32
+ bool "32: ARGB8888"
+ config LV_COLOR_DEPTH_16
+ bool "16: RGB565"
+ config LV_COLOR_DEPTH_8
+ bool "8: RGB232"
+ config LV_COLOR_DEPTH_1
+ bool "1: 1 byte per pixel"
+ endchoice
+
+ config LV_COLOR_DEPTH
+ int
+ default 1 if LV_COLOR_DEPTH_1
+ default 8 if LV_COLOR_DEPTH_8
+ default 16 if LV_COLOR_DEPTH_16
+ default 32 if LV_COLOR_DEPTH_32
+
+ config LV_COLOR_16_SWAP
+ bool "Swap the 2 bytes of RGB565 color. Useful if the display has an 8-bit interface (e.g. SPI)."
+ depends on LV_COLOR_DEPTH_16
+
+ config LV_COLOR_SCREEN_TRANSP
+ bool "Enable more complex drawing routines to manage screens transparency."
+ help
+ Can be used if the UI is above another layer, e.g. an OSD menu or video player.
+ The screen's `bg_opa` should be set to non LV_OPA_COVER value
+
+ config LV_COLOR_MIX_ROUND_OFS
+ int "Adjust color mix functions rounding"
+ default 128 if !LV_COLOR_DEPTH_32
+ default 0 if LV_COLOR_DEPTH_32
+ range 0 254
+ help
+ 0: no adjustment, get the integer part of the result (round down)
+ 64: round up from x.75
+ 128: round up from half
+ 192: round up from x.25
+ 254: round up
+
+ config LV_COLOR_CHROMA_KEY_HEX
+ hex "Images pixels with this color will not be drawn (if they are chroma keyed)."
+ range 0x000000 0xFFFFFF
+ default 0x00FF00
+ help
+ See misc/lv_color.h for some color values examples.
+ endmenu
+
+ menu "Memory settings"
+ config LV_MEM_CUSTOM
+ bool "If true use custom malloc/free, otherwise use the built-in `lv_mem_alloc()` and `lv_mem_free()`"
+
+ config LV_MEM_SIZE_KILOBYTES
+ int "Size of the memory used by `lv_mem_alloc` in kilobytes (>= 2kB)"
+ range 2 128
+ default 32
+ depends on !LV_MEM_CUSTOM
+
+ config LV_MEM_ADDR
+ hex "Address for the memory pool instead of allocating it as a normal array"
+ default 0x0
+ depends on !LV_MEM_CUSTOM
+
+ config LV_MEM_CUSTOM_INCLUDE
+ string "Header to include for the custom memory function"
+ default "stdlib.h"
+ depends on LV_MEM_CUSTOM
+
+ config LV_MEM_BUF_MAX_NUM
+ int "Number of the memory buffer"
+ default 16
+ help
+ Number of the intermediate memory buffer used during rendering and other
+ internal processing mechanisms. You will see an error log message if
+ there wasn't enough buffers.
+
+ config LV_MEMCPY_MEMSET_STD
+ bool "Use the standard memcpy and memset instead of LVGL's own functions"
+ endmenu
+
+ menu "HAL Settings"
+ config LV_DISP_DEF_REFR_PERIOD
+ int "Default display refresh period (ms)."
+ default 30
+ help
+ Can be changed in the display driver (`lv_disp_drv_t`).
+
+ config LV_INDEV_DEF_READ_PERIOD
+ int "Input device read period [ms]."
+ default 30
+
+ config LV_TICK_CUSTOM
+ bool "Use a custom tick source"
+
+ config LV_TICK_CUSTOM_INCLUDE
+ string "Header for the system time function"
+ default "Arduino.h"
+ depends on LV_TICK_CUSTOM
+
+ config LV_DPI_DEF
+ int "Default Dots Per Inch (in px)."
+ default 130
+ help
+ Used to initialize default sizes such as widgets sized, style paddings.
+ (Not so important, you can adjust it to modify default sizes and spaces)
+ endmenu
+
+ menu "Feature configuration"
+
+ menu "Drawing"
+ config LV_DRAW_COMPLEX
+ bool "Enable complex draw engine"
+ default y
+ help
+ Required to draw shadow, gradient, rounded corners, circles, arc, skew lines,
+ image transformations or any masks.
+
+ config LV_SHADOW_CACHE_SIZE
+ int "Allow buffering some shadow calculation"
+ depends on LV_DRAW_COMPLEX
+ default 0
+ help
+ LV_SHADOW_CACHE_SIZE is the max shadow size to buffer, where
+ shadow size is `shadow_width + radius`.
+ Caching has LV_SHADOW_CACHE_SIZE^2 RAM cost.
+
+ config LV_CIRCLE_CACHE_SIZE
+ int "Set number of maximally cached circle data"
+ depends on LV_DRAW_COMPLEX
+ default 4
+ help
+ The circumference of 1/4 circle are saved for anti-aliasing
+ radius * 4 bytes are used per circle (the most often used
+ radiuses are saved).
+ Set to 0 to disable caching.
+
+ config LV_LAYER_SIMPLE_BUF_SIZE
+ int "Optimal size to buffer the widget with opacity"
+ default 24576
+ help
+ "Simple layers" are used when a widget has `style_opa < 255`
+ to buffer the widget into a layer and blend it as an image
+ with the given opacity. Note that `bg_opa`, `text_opa` etc
+ don't require buffering into layer.
+
+ config LV_IMG_CACHE_DEF_SIZE
+ int "Default image cache size. 0 to disable caching."
+ default 0
+ help
+ If only the built-in image formats are used there is no real advantage of caching.
+ (I.e. no new image decoder is added).
+
+ With complex image decoders (e.g. PNG or JPG) caching can
+ save the continuous open/decode of images.
+ However the opened images might consume additional RAM.
+
+ config LV_GRADIENT_MAX_STOPS
+ int "Number of stops allowed per gradient."
+ default 2
+ help
+ Increase this to allow more stops.
+ This adds (sizeof(lv_color_t) + 1) bytes per additional stop
+
+ config LV_GRAD_CACHE_DEF_SIZE
+ int "Default gradient buffer size."
+ default 0
+ help
+ When LVGL calculates the gradient "maps" it can save them into a cache to avoid calculating them again.
+ LV_GRAD_CACHE_DEF_SIZE sets the size of this cache in bytes.
+ If the cache is too small the map will be allocated only while it's required for the drawing.
+ 0 mean no caching.
+
+ config LV_DITHER_GRADIENT
+ bool "Allow dithering the gradients"
+ help
+ Allow dithering the gradients (to achieve visual smooth color gradients on limited color depth display)
+ LV_DITHER_GRADIENT implies allocating one or two more lines of the object's rendering surface
+ The increase in memory consumption is (32 bits * object width) plus 24 bits * object width if using error diffusion
+
+ config LV_DITHER_ERROR_DIFFUSION
+ bool "Add support for error diffusion dithering"
+ depends on LV_DITHER_GRADIENT
+ help
+ Error diffusion dithering gets a much better visual result, but implies more CPU consumption and memory when drawing.
+ The increase in memory consumption is (24 bits * object's width)
+
+ config LV_DISP_ROT_MAX_BUF
+ int "Maximum buffer size to allocate for rotation"
+ default 10240
+ help
+ Only used if software rotation is enabled in the display driver.
+ endmenu
+
+ menu "GPU"
+ config LV_USE_GPU_ARM2D
+ bool "Enable Arm's 2D image processing library (Arm-2D) for all Cortex-M processors."
+ default n
+ help
+ Must deploy arm-2d library to your project and add include PATH for "arm_2d.h".
+
+ config LV_USE_GPU_STM32_DMA2D
+ bool "Enable STM32 DMA2D (aka Chrom Art) GPU."
+ config LV_GPU_DMA2D_CMSIS_INCLUDE
+ string "include path of CMSIS header of target processor"
+ depends on LV_USE_GPU_STM32_DMA2D
+ default ""
+ help
+ Must be defined to include path of CMSIS header of target processor
+ e.g. "stm32f769xx.h" or "stm32f429xx.h"
+
+ config LV_USE_GPU_SWM341_DMA2D
+ bool "Enable SWM341 DMA2D GPU."
+ config LV_GPU_SWM341_DMA2D_INCLUDE
+ string "include path of CMSIS header of target processor"
+ depends on LV_USE_GPU_SWM341_DMA2D
+ default "SWM341.h"
+ help
+ Must be defined to include path of CMSIS header of target processor
+ e.g. "SWM341.h"
+
+ config LV_USE_GPU_NXP_PXP
+ bool "Use NXP's PXP GPU iMX RTxxx platforms."
+ config LV_USE_GPU_NXP_PXP_AUTO_INIT
+ bool "Call lv_gpu_nxp_pxp_init() automatically or manually."
+ depends on LV_USE_GPU_NXP_PXP
+ help
+ 1: Add default bare metal and FreeRTOS interrupt handling
+ routines for PXP (lv_gpu_nxp_pxp_osa.c) and call
+ lv_gpu_nxp_pxp_init() automatically during lv_init().
+ Note that symbol SDK_OS_FREE_RTOS has to be defined in order
+ to use FreeRTOS OSA, otherwise bare-metal implementation is
+ selected.
+ 0: lv_gpu_nxp_pxp_init() has to be called manually before
+ lv_init().
+
+ config LV_USE_GPU_NXP_VG_LITE
+ bool "Use NXP's VG-Lite GPU iMX RTxxx platforms."
+
+ config LV_USE_GPU_SDL
+ bool "Use SDL renderer API"
+ default n
+ config LV_GPU_SDL_INCLUDE_PATH
+ string "include path of SDL header"
+ depends on LV_USE_GPU_SDL
+ default "SDL2/SDL.h"
+ config LV_GPU_SDL_LRU_SIZE
+ int "Maximum buffer size to allocate for rotation"
+ depends on LV_USE_GPU_SDL
+ default 8388608
+ help
+ Texture cache size, 8MB by default.
+ endmenu
+
+ menu "Logging"
+ config LV_USE_LOG
+ bool "Enable the log module"
+
+ choice
+ bool "Default log verbosity" if LV_USE_LOG
+ default LV_LOG_LEVEL_WARN
+ help
+ Specify how important log should be added.
+
+ config LV_LOG_LEVEL_TRACE
+ bool "A lot of logs to give detailed information"
+ config LV_LOG_LEVEL_INFO
+ bool "Log important events"
+ config LV_LOG_LEVEL_WARN
+ bool "Log if something unwanted happened but didn't cause a problem"
+ config LV_LOG_LEVEL_ERROR
+ bool "Only critical issues, when the system may fail"
+ config LV_LOG_LEVEL_USER
+ bool "Only logs added by the user"
+ config LV_LOG_LEVEL_NONE
+ bool "Do not log anything"
+ endchoice
+
+ config LV_LOG_LEVEL
+ int
+ default 0 if LV_LOG_LEVEL_TRACE
+ default 1 if LV_LOG_LEVEL_INFO
+ default 2 if LV_LOG_LEVEL_WARN
+ default 3 if LV_LOG_LEVEL_ERROR
+ default 4 if LV_LOG_LEVEL_USER
+ default 5 if LV_LOG_LEVEL_NONE
+
+ config LV_LOG_PRINTF
+ bool "Print the log with 'printf'" if LV_USE_LOG
+ help
+ Use printf for log output.
+ If not set the user needs to register a callback with `lv_log_register_print_cb`.
+
+ config LV_LOG_TRACE_MEM
+ bool "Enable/Disable LV_LOG_TRACE in mem module"
+ default y
+ depends on LV_USE_LOG
+
+ config LV_LOG_TRACE_TIMER
+ bool "Enable/Disable LV_LOG_TRACE in timer module"
+ default y
+ depends on LV_USE_LOG
+
+ config LV_LOG_TRACE_INDEV
+ bool "Enable/Disable LV_LOG_TRACE in indev module"
+ default y
+ depends on LV_USE_LOG
+
+ config LV_LOG_TRACE_DISP_REFR
+ bool "Enable/Disable LV_LOG_TRACE in disp refr module"
+ default y
+ depends on LV_USE_LOG
+
+ config LV_LOG_TRACE_EVENT
+ bool "Enable/Disable LV_LOG_TRACE in event module"
+ default y
+ depends on LV_USE_LOG
+
+ config LV_LOG_TRACE_OBJ_CREATE
+ bool "Enable/Disable LV_LOG_TRACE in obj create module"
+ default y
+ depends on LV_USE_LOG
+
+ config LV_LOG_TRACE_LAYOUT
+ bool "Enable/Disable LV_LOG_TRACE in layout module"
+ default y
+ depends on LV_USE_LOG
+
+ config LV_LOG_TRACE_ANIM
+ bool "Enable/Disable LV_LOG_TRACE in anim module"
+ default y
+ depends on LV_USE_LOG
+ endmenu
+
+ menu "Asserts"
+ config LV_USE_ASSERT_NULL
+ bool "Check if the parameter is NULL. (Very fast, recommended)"
+ default y if !LV_CONF_MINIMAL
+
+ config LV_USE_ASSERT_MALLOC
+ bool "Checks if the memory is successfully allocated or no. (Very fast, recommended)"
+ default y if !LV_CONF_MINIMAL
+
+ config LV_USE_ASSERT_STYLE
+ bool "Check if the styles are properly initialized. (Very fast, recommended)"
+
+ config LV_USE_ASSERT_MEM_INTEGRITY
+ bool "Check the integrity of `lv_mem` after critical operations. (Slow)"
+
+ config LV_USE_ASSERT_OBJ
+ bool "Check NULL, the object's type and existence (e.g. not deleted). (Slow)."
+
+ config LV_ASSERT_HANDLER_INCLUDE
+ string "Header to include for the custom assert function"
+ default "assert.h"
+ endmenu
+
+ menu "Others"
+ config LV_USE_PERF_MONITOR
+ bool "Show CPU usage and FPS count."
+
+ choice
+ prompt "Performance monitor position."
+ depends on LV_USE_PERF_MONITOR
+ default LV_PERF_MONITOR_ALIGN_BOTTOM_RIGHT
+
+ config LV_PERF_MONITOR_ALIGN_TOP_LEFT
+ bool "Top left"
+ config LV_PERF_MONITOR_ALIGN_TOP_MID
+ bool "Top middle"
+ config LV_PERF_MONITOR_ALIGN_TOP_RIGHT
+ bool "Top right"
+ config LV_PERF_MONITOR_ALIGN_BOTTOM_LEFT
+ bool "Bottom left"
+ config LV_PERF_MONITOR_ALIGN_BOTTOM_MID
+ bool "Bottom middle"
+ config LV_PERF_MONITOR_ALIGN_BOTTOM_RIGHT
+ bool "Bottom right"
+ config LV_PERF_MONITOR_ALIGN_LEFT_MID
+ bool "Left middle"
+ config LV_PERF_MONITOR_ALIGN_RIGHT_MID
+ bool "Right middle"
+ config LV_PERF_MONITOR_ALIGN_CENTER
+ bool "Center"
+ endchoice
+
+ config LV_USE_MEM_MONITOR
+ bool "Show the used memory and the memory fragmentation."
+ depends on !LV_MEM_CUSTOM
+
+ choice
+ prompt "Memory monitor position."
+ depends on LV_USE_MEM_MONITOR
+ default LV_MEM_MONITOR_ALIGN_BOTTOM_LEFT
+
+ config LV_MEM_MONITOR_ALIGN_TOP_LEFT
+ bool "Top left"
+ config LV_MEM_MONITOR_ALIGN_TOP_MID
+ bool "Top middle"
+ config LV_MEM_MONITOR_ALIGN_TOP_RIGHT
+ bool "Top right"
+ config LV_MEM_MONITOR_ALIGN_BOTTOM_LEFT
+ bool "Bottom left"
+ config LV_MEM_MONITOR_ALIGN_BOTTOM_MID
+ bool "Bottom middle"
+ config LV_MEM_MONITOR_ALIGN_BOTTOM_RIGHT
+ bool "Bottom right"
+ config LV_MEM_MONITOR_ALIGN_LEFT_MID
+ bool "Left middle"
+ config LV_MEM_MONITOR_ALIGN_RIGHT_MID
+ bool "Right middle"
+ config LV_MEM_MONITOR_ALIGN_CENTER
+ bool "Center"
+ endchoice
+
+ config LV_USE_REFR_DEBUG
+ bool "Draw random colored rectangles over the redrawn areas."
+
+ config LV_SPRINTF_CUSTOM
+ bool "Change the built-in (v)snprintf functions"
+
+ config LV_SPRINTF_INCLUDE
+ string "Header to include for the custom sprintf function"
+ depends on LV_SPRINTF_CUSTOM
+ default "stdio.h"
+
+ config LV_SPRINTF_USE_FLOAT
+ bool "Enable float in built-in (v)snprintf functions"
+ depends on !LV_SPRINTF_CUSTOM
+
+ config LV_USE_USER_DATA
+ bool "Add a 'user_data' to drivers and objects."
+ default y
+
+ config LV_ENABLE_GC
+ bool "Enable garbage collector"
+
+ config LV_GC_INCLUDE
+ string "Header to include for the garbage collector related things"
+ depends on LV_ENABLE_GC
+ default "gc.h"
+ endmenu
+
+ menu "Compiler settings"
+ config LV_BIG_ENDIAN_SYSTEM
+ bool "For big endian systems set to 1"
+
+ config LV_ATTRIBUTE_MEM_ALIGN_SIZE
+ int "Required alignment size for buffers"
+ default 1
+
+ config LV_ATTRIBUTE_FAST_MEM_USE_IRAM
+ bool "Set IRAM as LV_ATTRIBUTE_FAST_MEM"
+ help
+ Set this option to configure IRAM as LV_ATTRIBUTE_FAST_MEM
+
+ config LV_USE_LARGE_COORD
+ bool "Extend the default -32k..32k coordinate range to -4M..4M by using int32_t for coordinates instead of int16_t"
+ endmenu
+ endmenu
+
+ menu "Font usage"
+ menu "Enable built-in fonts"
+ config LV_FONT_MONTSERRAT_8
+ bool "Enable Montserrat 8"
+ config LV_FONT_MONTSERRAT_10
+ bool "Enable Montserrat 10"
+ config LV_FONT_MONTSERRAT_12
+ bool "Enable Montserrat 12"
+ config LV_FONT_MONTSERRAT_14
+ bool "Enable Montserrat 14"
+ default y if !LV_CONF_MINIMAL
+ config LV_FONT_MONTSERRAT_16
+ bool "Enable Montserrat 16"
+ config LV_FONT_MONTSERRAT_18
+ bool "Enable Montserrat 18"
+ config LV_FONT_MONTSERRAT_20
+ bool "Enable Montserrat 20"
+ config LV_FONT_MONTSERRAT_22
+ bool "Enable Montserrat 22"
+ config LV_FONT_MONTSERRAT_24
+ bool "Enable Montserrat 24"
+ config LV_FONT_MONTSERRAT_26
+ bool "Enable Montserrat 26"
+ config LV_FONT_MONTSERRAT_28
+ bool "Enable Montserrat 28"
+ config LV_FONT_MONTSERRAT_30
+ bool "Enable Montserrat 30"
+ config LV_FONT_MONTSERRAT_32
+ bool "Enable Montserrat 32"
+ config LV_FONT_MONTSERRAT_34
+ bool "Enable Montserrat 34"
+ config LV_FONT_MONTSERRAT_36
+ bool "Enable Montserrat 36"
+ config LV_FONT_MONTSERRAT_38
+ bool "Enable Montserrat 38"
+ config LV_FONT_MONTSERRAT_40
+ bool "Enable Montserrat 40"
+ config LV_FONT_MONTSERRAT_42
+ bool "Enable Montserrat 42"
+ config LV_FONT_MONTSERRAT_44
+ bool "Enable Montserrat 44"
+ config LV_FONT_MONTSERRAT_46
+ bool "Enable Montserrat 46"
+ config LV_FONT_MONTSERRAT_48
+ bool "Enable Montserrat 48"
+
+ config LV_FONT_MONTSERRAT_12_SUBPX
+ bool "Enable Montserrat 12 sub-pixel"
+ config LV_FONT_MONTSERRAT_28_COMPRESSED
+ bool "Enable Montserrat 28 compressed"
+ config LV_FONT_DEJAVU_16_PERSIAN_HEBREW
+ bool "Enable Dejavu 16 Persian, Hebrew, Arabic letters"
+ config LV_FONT_SIMSUN_16_CJK
+ bool "Enable Simsun 16 CJK"
+
+ config LV_FONT_UNSCII_8
+ bool "Enable UNSCII 8 (Perfect monospace font)"
+ default y if LV_CONF_MINIMAL
+ config LV_FONT_UNSCII_16
+ bool "Enable UNSCII 16 (Perfect monospace font)"
+
+ config LV_FONT_CUSTOM
+ bool "Enable the custom font"
+ config LV_FONT_CUSTOM_DECLARE
+ string "Header to include for the custom font"
+ depends on LV_FONT_CUSTOM
+ endmenu
+
+ choice LV_FONT_DEFAULT
+ prompt "Select theme default title font"
+ default LV_FONT_DEFAULT_MONTSERRAT_14 if !LV_CONF_MINIMAL
+ default LV_FONT_DEFAULT_UNSCII_8 if LV_CONF_MINIMAL
+ help
+ Select theme default title font
+
+ config LV_FONT_DEFAULT_MONTSERRAT_8
+ bool "Montserrat 8"
+ select LV_FONT_MONTSERRAT_8
+ config LV_FONT_DEFAULT_MONTSERRAT_12
+ bool "Montserrat 12"
+ select LV_FONT_MONTSERRAT_12
+ config LV_FONT_DEFAULT_MONTSERRAT_14
+ bool "Montserrat 14"
+ select LV_FONT_MONTSERRAT_14
+ config LV_FONT_DEFAULT_MONTSERRAT_16
+ bool "Montserrat 16"
+ select LV_FONT_MONTSERRAT_16
+ config LV_FONT_DEFAULT_MONTSERRAT_18
+ bool "Montserrat 18"
+ select LV_FONT_MONTSERRAT_18
+ config LV_FONT_DEFAULT_MONTSERRAT_20
+ bool "Montserrat 20"
+ select LV_FONT_MONTSERRAT_20
+ config LV_FONT_DEFAULT_MONTSERRAT_22
+ bool "Montserrat 22"
+ select LV_FONT_MONTSERRAT_22
+ config LV_FONT_DEFAULT_MONTSERRAT_24
+ bool "Montserrat 24"
+ select LV_FONT_MONTSERRAT_24
+ config LV_FONT_DEFAULT_MONTSERRAT_26
+ bool "Montserrat 26"
+ select LV_FONT_MONTSERRAT_26
+ config LV_FONT_DEFAULT_MONTSERRAT_28
+ bool "Montserrat 28"
+ select LV_FONT_MONTSERRAT_28
+ config LV_FONT_DEFAULT_MONTSERRAT_30
+ bool "Montserrat 30"
+ select LV_FONT_MONTSERRAT_30
+ config LV_FONT_DEFAULT_MONTSERRAT_32
+ bool "Montserrat 32"
+ select LV_FONT_MONTSERRAT_32
+ config LV_FONT_DEFAULT_MONTSERRAT_34
+ bool "Montserrat 34"
+ select LV_FONT_MONTSERRAT_34
+ config LV_FONT_DEFAULT_MONTSERRAT_36
+ bool "Montserrat 36"
+ select LV_FONT_MONTSERRAT_36
+ config LV_FONT_DEFAULT_MONTSERRAT_38
+ bool "Montserrat 38"
+ select LV_FONT_MONTSERRAT_38
+ config LV_FONT_DEFAULT_MONTSERRAT_40
+ bool "Montserrat 40"
+ select LV_FONT_MONTSERRAT_40
+ config LV_FONT_DEFAULT_MONTSERRAT_42
+ bool "Montserrat 42"
+ select LV_FONT_MONTSERRAT_42
+ config LV_FONT_DEFAULT_MONTSERRAT_44
+ bool "Montserrat 44"
+ select LV_FONT_MONTSERRAT_44
+ config LV_FONT_DEFAULT_MONTSERRAT_46
+ bool "Montserrat 46"
+ select LV_FONT_MONTSERRAT_46
+ config LV_FONT_DEFAULT_MONTSERRAT_48
+ bool "Montserrat 48"
+ select LV_FONT_MONTSERRAT_48
+ config LV_FONT_DEFAULT_MONTSERRAT_12_SUBPX
+ bool "Montserrat 12 sub-pixel"
+ select LV_FONT_MONTSERRAT_12_SUBPX
+ config LV_FONT_DEFAULT_MONTSERRAT_28_COMPRESSED
+ bool "Montserrat 28 compressed"
+ select LV_FONT_MONTSERRAT_28_COMPRESSED
+ config LV_FONT_DEFAULT_DEJAVU_16_PERSIAN_HEBREW
+ bool "Dejavu 16 Persian, Hebrew, Arabic letters"
+ select LV_FONT_DEJAVU_16_PERSIAN_HEBREW
+ config LV_FONT_DEFAULT_SIMSUN_16_CJK
+ bool "Simsun 16 CJK"
+ select LV_FONT_SIMSUN_16_CJK
+ config LV_FONT_DEFAULT_UNSCII_8
+ bool "UNSCII 8 (Perfect monospace font)"
+ select LV_FONT_UNSCII_8
+ config LV_FONT_DEFAULT_UNSCII_16
+ bool "UNSCII 16 (Perfect monospace font)"
+ select LV_FONT_UNSCII_16
+ endchoice
+
+ config LV_FONT_FMT_TXT_LARGE
+ bool "Enable it if you have fonts with a lot of characters."
+ help
+ The limit depends on the font size, font face and bpp
+ but with > 10,000 characters if you see issues probably you
+ need to enable it.
+
+ config LV_USE_FONT_COMPRESSED
+ bool "Sets support for compressed fonts."
+
+ config LV_USE_FONT_SUBPX
+ bool "Enable subpixel rendering."
+
+ config LV_FONT_SUBPX_BGR
+ bool "Use BGR instead RGB for sub-pixel rendering."
+ depends on LV_USE_FONT_SUBPX
+ help
+ Set the pixel order of the display.
+ Important only if "subpx fonts" are used.
+ With "normal" font it doesn't matter.
+
+ config LV_USE_FONT_PLACEHOLDER
+ bool "Enable drawing placeholders when glyph dsc is not found."
+ default y
+ endmenu
+
+ menu "Text Settings"
+ choice LV_TXT_ENC
+ prompt "Select a character encoding for strings"
+ help
+ Select a character encoding for strings. Your IDE or editor should have the same character encoding.
+ default LV_TXT_ENC_UTF8 if !LV_CONF_MINIMAL
+ default LV_TXT_ENC_ASCII if LV_CONF_MINIMAL
+
+ config LV_TXT_ENC_UTF8
+ bool "UTF8"
+ config LV_TXT_ENC_ASCII
+ bool "ASCII"
+ endchoice
+
+ config LV_TXT_BREAK_CHARS
+ string "Can break (wrap) texts on these chars"
+ default " ,.;:-_"
+
+ config LV_TXT_LINE_BREAK_LONG_LEN
+ int "Line break long length"
+ default 0
+ help
+ If a word is at least this long, will break wherever 'prettiest'.
+ To disable, set to a value <= 0.
+
+ config LV_TXT_LINE_BREAK_LONG_PRE_MIN_LEN
+ int "Min num chars before break"
+ default 3
+ depends on LV_TXT_LINE_BREAK_LONG_LEN > 0
+ help
+ Minimum number of characters in a long word to put on a line before a break.
+
+ config LV_TXT_LINE_BREAK_LONG_POST_MIN_LEN
+ int "Min num chars after break"
+ default 3
+ depends on LV_TXT_LINE_BREAK_LONG_LEN > 0
+ help
+ Minimum number of characters in a long word to put on a line after a break.
+
+ config LV_TXT_COLOR_CMD
+ string "The control character to use for signalling text recoloring"
+ default "#"
+
+ config LV_USE_BIDI
+ bool "Support bidirectional texts"
+ help
+ Allows mixing Left-to-Right and Right-to-Left texts.
+ The direction will be processed according to the Unicode Bidirectional Algorithm:
+ https://www.w3.org/International/articles/inline-bidi-markup/uba-basics
+
+ choice
+ prompt "Set the default BIDI direction"
+ default LV_BIDI_DIR_AUTO
+ depends on LV_USE_BIDI
+
+ config LV_BIDI_DIR_LTR
+ bool "Left-to-Right"
+ config LV_BIDI_DIR_RTL
+ bool "Right-to-Left"
+ config LV_BIDI_DIR_AUTO
+ bool "Detect texts base direction"
+ endchoice
+
+ config LV_USE_ARABIC_PERSIAN_CHARS
+ bool "Enable Arabic/Persian processing"
+ help
+ In these languages characters should be replaced with
+ an other form based on their position in the text.
+ endmenu
+
+ menu "Widget usage"
+ config LV_USE_ARC
+ bool "Arc."
+ default y if !LV_CONF_MINIMAL
+ config LV_USE_BAR
+ bool "Bar."
+ default y if !LV_CONF_MINIMAL
+ config LV_USE_BTN
+ bool "Button."
+ default y if !LV_CONF_MINIMAL
+ config LV_USE_BTNMATRIX
+ bool "Button matrix."
+ default y if !LV_CONF_MINIMAL
+ config LV_USE_CANVAS
+ bool "Canvas. Dependencies: lv_img."
+ select LV_USE_IMG
+ default y if !LV_CONF_MINIMAL
+ config LV_USE_CHECKBOX
+ bool "Check Box"
+ default y if !LV_CONF_MINIMAL
+ config LV_USE_DROPDOWN
+ bool "Drop down list. Requires: lv_label."
+ select LV_USE_LABEL
+ default y if !LV_CONF_MINIMAL
+ config LV_USE_IMG
+ bool "Image. Requires: lv_label."
+ select LV_USE_LABEL
+ default y if !LV_CONF_MINIMAL
+ config LV_USE_LABEL
+ bool "Label."
+ default y if !LV_CONF_MINIMAL
+ config LV_LABEL_TEXT_SELECTION
+ bool "Enable selecting text of the label."
+ depends on LV_USE_LABEL
+ default y
+ config LV_LABEL_LONG_TXT_HINT
+ bool "Store extra some info in labels (12 bytes) to speed up drawing of very long texts."
+ depends on LV_USE_LABEL
+ default y
+ config LV_USE_LINE
+ bool "Line."
+ default y if !LV_CONF_MINIMAL
+ config LV_USE_ROLLER
+ bool "Roller. Requires: lv_label."
+ select LV_USE_LABEL
+ default y if !LV_CONF_MINIMAL
+ config LV_ROLLER_INF_PAGES
+ int "Number of extra 'pages' when the controller is infinite."
+ default 7
+ depends on LV_USE_ROLLER
+ config LV_USE_SLIDER
+ bool "Slider. Requires: lv_bar."
+ select LV_USE_BAR
+ default y if !LV_CONF_MINIMAL
+ config LV_USE_SWITCH
+ bool "Switch."
+ default y if !LV_CONF_MINIMAL
+ config LV_USE_TEXTAREA
+ bool "Text area. Requires: lv_label."
+ select LV_USE_LABEL
+ default y if !LV_CONF_MINIMAL
+ config LV_TEXTAREA_DEF_PWD_SHOW_TIME
+ int "Text area def. pwd show time [ms]."
+ default 1500
+ depends on LV_USE_TEXTAREA
+ config LV_USE_TABLE
+ bool "Table."
+ default y if !LV_CONF_MINIMAL
+ endmenu
+
+ menu "Extra Widgets"
+ config LV_USE_ANIMIMG
+ bool "Anim image."
+ default y if !LV_CONF_MINIMAL
+ config LV_USE_CALENDAR
+ bool "Calendar."
+ default y if !LV_CONF_MINIMAL
+ config LV_CALENDAR_WEEK_STARTS_MONDAY
+ bool "Calendar week starts monday."
+ depends on LV_USE_CALENDAR
+ config LV_USE_CALENDAR_HEADER_ARROW
+ bool "Use calendar header arrow"
+ depends on LV_USE_CALENDAR
+ default y
+ config LV_USE_CALENDAR_HEADER_DROPDOWN
+ bool "Use calendar header dropdown"
+ depends on LV_USE_CALENDAR
+ default y
+ config LV_USE_CHART
+ bool "Chart."
+ default y if !LV_CONF_MINIMAL
+ config LV_USE_COLORWHEEL
+ bool "Colorwheel."
+ default y if !LV_CONF_MINIMAL
+ config LV_USE_IMGBTN
+ bool "Imgbtn."
+ default y if !LV_CONF_MINIMAL
+ config LV_USE_KEYBOARD
+ bool "Keyboard."
+ default y if !LV_CONF_MINIMAL
+ config LV_USE_LED
+ bool "LED."
+ default y if !LV_CONF_MINIMAL
+ config LV_USE_LIST
+ bool "List."
+ default y if !LV_CONF_MINIMAL
+ config LV_USE_MENU
+ bool "Menu."
+ default y if !LV_CONF_MINIMAL
+ config LV_USE_METER
+ bool "Meter."
+ default y if !LV_CONF_MINIMAL
+ config LV_USE_MSGBOX
+ bool "Msgbox."
+ default y if !LV_CONF_MINIMAL
+ config LV_USE_SPAN
+ bool "span"
+ default y if !LV_CONF_MINIMAL
+ config LV_SPAN_SNIPPET_STACK_SIZE
+ int "Maximum number of span descriptor"
+ default 64
+ depends on LV_USE_SPAN
+ config LV_USE_SPINBOX
+ bool "Spinbox."
+ default y if !LV_CONF_MINIMAL
+ config LV_USE_SPINNER
+ bool "Spinner."
+ default y if !LV_CONF_MINIMAL
+ config LV_USE_TABVIEW
+ bool "Tabview."
+ default y if !LV_CONF_MINIMAL
+ config LV_USE_TILEVIEW
+ bool "Tileview"
+ default y if !LV_CONF_MINIMAL
+ config LV_USE_WIN
+ bool "Win"
+ default y if !LV_CONF_MINIMAL
+ endmenu
+
+ menu "Themes"
+ config LV_USE_THEME_DEFAULT
+ bool "A simple, impressive and very complete theme"
+ default y if !LV_COLOR_DEPTH_1 && !LV_CONF_MINIMAL
+ config LV_THEME_DEFAULT_DARK
+ bool "Yes to set dark mode, No to set light mode"
+ depends on LV_USE_THEME_DEFAULT
+ config LV_THEME_DEFAULT_GROW
+ bool "Enable grow on press"
+ default y
+ depends on LV_USE_THEME_DEFAULT
+ config LV_THEME_DEFAULT_TRANSITION_TIME
+ int "Default transition time in [ms]"
+ default 80
+ depends on LV_USE_THEME_DEFAULT
+ config LV_USE_THEME_BASIC
+ bool "A very simple theme that is a good starting point for a custom theme"
+ default y if !LV_COLOR_DEPTH_1 && !LV_CONF_MINIMAL
+ config LV_USE_THEME_MONO
+ bool "Monochrome theme, suitable for some E-paper & dot matrix displays"
+ default y if LV_COLOR_DEPTH_1 && !LV_CONF_MINIMAL
+ endmenu
+
+ menu "Layouts"
+ config LV_USE_FLEX
+ bool "A layout similar to Flexbox in CSS."
+ default y if !LV_CONF_MINIMAL
+ config LV_USE_GRID
+ bool "A layout similar to Grid in CSS."
+ default y if !LV_CONF_MINIMAL
+ endmenu
+
+ menu "3rd Party Libraries"
+ config LV_USE_FS_STDIO
+ bool "File system on top of stdio API"
+ config LV_FS_STDIO_LETTER
+ int "Set an upper cased letter on which the drive will accessible (e.g. 'A' i.e. 65 )"
+ default 0
+ depends on LV_USE_FS_STDIO
+ config LV_FS_STDIO_PATH
+ string "Set the working directory"
+ depends on LV_USE_FS_STDIO
+ config LV_FS_STDIO_CACHE_SIZE
+ string ">0 to cache this number of bytes in lv_fs_read()"
+ depends on LV_USE_FS_STDIO
+
+ config LV_USE_FS_POSIX
+ bool "File system on top of posix API"
+ config LV_FS_POSIX_LETTER
+ int "Set an upper cased letter on which the drive will accessible (e.g. 'A' i.e. 65)"
+ default 0
+ depends on LV_USE_FS_POSIX
+ config LV_FS_POSIX_PATH
+ string "Set the working directory"
+ depends on LV_USE_FS_POSIX
+ config LV_FS_POSIX_CACHE_SIZE
+ int ">0 to cache this number of bytes in lv_fs_read()"
+ default 0
+ depends on LV_USE_FS_POSIX
+
+ config LV_USE_FS_WIN32
+ bool "File system on top of Win32 API"
+ config LV_FS_WIN32_LETTER
+ int "Set an upper cased letter on which the drive will accessible (e.g. 'A' i.e. 65)"
+ default 0
+ depends on LV_USE_FS_WIN32
+ config LV_FS_WIN32_PATH
+ string "Set the working directory"
+ depends on LV_USE_FS_WIN32
+ config LV_FS_WIN32_CACHE_SIZE
+ int ">0 to cache this number of bytes in lv_fs_read()"
+ default 0
+ depends on LV_USE_FS_WIN32
+
+ config LV_USE_FS_FATFS
+ bool "File system on top of FatFS"
+ config LV_FS_FATFS_LETTER
+ int "Set an upper cased letter on which the drive will accessible (e.g. 'A' i.e. 65)"
+ default 0
+ depends on LV_USE_FS_FATFS
+ config LV_FS_FATFS_CACHE_SIZE
+ int ">0 to cache this number of bytes in lv_fs_read()"
+ default 0
+ depends on LV_USE_FS_FATFS
+
+ config LV_USE_PNG
+ bool "PNG decoder library"
+
+ config LV_USE_BMP
+ bool "BMP decoder library"
+
+ config LV_USE_SJPG
+ bool "JPG + split JPG decoder library"
+
+ config LV_USE_GIF
+ bool "GIF decoder library"
+
+ config LV_USE_QRCODE
+ bool "QR code library"
+
+ config LV_USE_FREETYPE
+ bool "FreeType library"
+ if LV_USE_FREETYPE
+ menu "FreeType cache config"
+ config LV_FREETYPE_CACHE_SIZE
+ int "Memory used by FreeType to cache characters [bytes] (-1: no caching)"
+ default 16384
+ if LV_FREETYPE_CACHE_SIZE >= 0
+ config LV_FREETYPE_SBIT_CACHE
+ bool "enable sbit cache"
+ default n
+ config LV_FREETYPE_CACHE_FT_FACES
+ int "The maximum number of FT_Face(0: use defaults)"
+ default 0
+ config LV_FREETYPE_CACHE_FT_SIZES
+ int "The maximum number of FT_Size(0: use defaults)"
+ default 0
+ endif
+ endmenu
+ endif
+
+ config LV_USE_RLOTTIE
+ bool "Lottie library"
+
+ config LV_USE_FFMPEG
+ bool "FFmpeg library"
+ config LV_FFMPEG_DUMP_FORMAT
+ bool "Dump format"
+ depends on LV_USE_FFMPEG
+ default n
+ endmenu
+
+ menu "Others"
+ config LV_USE_SNAPSHOT
+ bool "Enable API to take snapshot"
+ default y if !LV_CONF_MINIMAL
+
+ config LV_USE_MONKEY
+ bool "Enable Monkey test"
+ default n
+
+ config LV_USE_GRIDNAV
+ bool "Enable grid navigation"
+ default n
+
+ config LV_USE_FRAGMENT
+ bool "Enable lv_obj fragment"
+ default n
+
+ config LV_USE_IMGFONT
+ bool "draw img in label or span obj"
+ default n
+
+ config LV_USE_MSG
+ bool "Enable a published subscriber based messaging system"
+ default n
+
+ config LV_USE_IME_PINYIN
+ bool "Enable Pinyin input method"
+ default n
+ config LV_IME_PINYIN_USE_K9_MODE
+ bool "Enable Pinyin input method 9 key input mode"
+ depends on LV_USE_IME_PINYIN
+ default n
+ config LV_IME_PINYIN_K9_CAND_TEXT_NUM
+ int "Maximum number of candidate panels for 9-key input mode"
+ depends on LV_IME_PINYIN_USE_K9_MODE
+ default 3
+ config LV_IME_PINYIN_USE_DEFAULT_DICT
+ bool "Use built-in Thesaurus"
+ depends on LV_USE_IME_PINYIN
+ default y
+ help
+ If you do not use the default thesaurus, be sure to use lv_ime_pinyin after setting the thesauruss
+ config LV_IME_PINYIN_CAND_TEXT_NUM
+ int "Maximum number of candidate panels"
+ depends on LV_USE_IME_PINYIN
+ default 6
+ help
+ Set the maximum number of candidate panels that can be displayed.
+ This needs to be adjusted according to the size of the screen.
+ endmenu
+
+ menu "Examples"
+ config LV_BUILD_EXAMPLES
+ bool "Enable the examples to be built"
+ default y if !LV_CONF_MINIMAL
+ endmenu
+
+ menu "Demos"
+ config LV_USE_DEMO_WIDGETS
+ bool "Show some widget"
+ default n
+ config LV_DEMO_WIDGETS_SLIDESHOW
+ bool "Enable slide show"
+ depends on LV_USE_DEMO_WIDGETS
+ default n
+
+ config LV_USE_DEMO_KEYPAD_AND_ENCODER
+ bool "Demonstrate the usage of encoder and keyboard"
+ default n
+
+ config LV_USE_DEMO_BENCHMARK
+ bool "Benchmark your system"
+ default n
+ config LV_DEMO_BENCHMARK_RGB565A8
+ bool "Use RGB565A8 images with 16 bit color depth instead of ARGB8565"
+ depends on LV_USE_DEMO_BENCHMARK
+ default n
+
+ config LV_USE_DEMO_STRESS
+ bool "Stress test for LVGL"
+ default n
+
+ config LV_USE_DEMO_MUSIC
+ bool "Music player demo"
+ default n
+ config LV_DEMO_MUSIC_SQUARE
+ bool "Enable Square"
+ depends on LV_USE_DEMO_MUSIC
+ default n
+ config LV_DEMO_MUSIC_LANDSCAPE
+ bool "Enable Landscape"
+ depends on LV_USE_DEMO_MUSIC
+ default n
+ config LV_DEMO_MUSIC_ROUND
+ bool "Enable Round"
+ depends on LV_USE_DEMO_MUSIC
+ default n
+ config LV_DEMO_MUSIC_LARGE
+ bool "Enable Large"
+ depends on LV_USE_DEMO_MUSIC
+ default n
+ config LV_DEMO_MUSIC_AUTO_PLAY
+ bool "Enable Auto play"
+ depends on LV_USE_DEMO_MUSIC
+ default n
+ endmenu
+
+endmenu
diff --git a/graphics/lvgl/lv_fs_interface.c b/graphics/lvgl/lv_fs_interface.c
deleted file mode 100644
index b75c2bf0d..000000000
--- a/graphics/lvgl/lv_fs_interface.c
+++ /dev/null
@@ -1,575 +0,0 @@
-/****************************************************************************
- * apps/graphics/lvgl/lv_fs_interface.c
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership. The
- * ASF licenses this file to you 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.
- *
- ****************************************************************************/
-
-/****************************************************************************
- * Included Files
- ****************************************************************************/
-
-#include <fcntl.h>
-#include <errno.h>
-#include <dirent.h>
-#include <unistd.h>
-#include <stdio.h>
-#include <sys/statfs.h>
-#include "lv_fs_interface.h"
-
-/****************************************************************************
- * Pre-processor Definitions
- ****************************************************************************/
-
-#define LV_FS_LETTER '/'
-
-/****************************************************************************
- * Private Type Declarations
- ****************************************************************************/
-
-/* Create a type to store the required data about your file. */
-
-typedef int file_t;
-
-/* Similarly to `file_t` create a type for directory reading too */
-
-typedef DIR *dir_t;
-
-/****************************************************************************
- * Private Function Prototypes
- ****************************************************************************/
-
-static lv_fs_res_t fs_open(lv_fs_drv_t *drv, void *file_p,
- const char *path, lv_fs_mode_t mode);
-static lv_fs_res_t fs_close(lv_fs_drv_t *drv, void *file_p);
-static lv_fs_res_t fs_read(lv_fs_drv_t *drv, void *file_p,
- void *buf, uint32_t btr, uint32_t *br);
-static lv_fs_res_t fs_write(lv_fs_drv_t *drv, void *file_p,
- const void *buf, uint32_t btw, uint32_t *bw);
-static lv_fs_res_t fs_seek(lv_fs_drv_t *drv, void *file_p,
- uint32_t pos);
-static lv_fs_res_t fs_size(lv_fs_drv_t *drv, void *file_p,
- uint32_t *size_p);
-static lv_fs_res_t fs_tell(lv_fs_drv_t *drv, void *file_p,
- uint32_t *pos_p);
-static lv_fs_res_t fs_remove(lv_fs_drv_t *drv, const char *path);
-static lv_fs_res_t fs_trunc(lv_fs_drv_t *drv, void *file_p);
-static lv_fs_res_t fs_rename(lv_fs_drv_t *drv, const char *oldname,
- const char *newname);
-static lv_fs_res_t fs_free(lv_fs_drv_t *drv, uint32_t *total_p,
- uint32_t *free_p);
-static lv_fs_res_t fs_dir_open(lv_fs_drv_t *drv, void *dir_p,
- const char *path);
-static lv_fs_res_t fs_dir_read(lv_fs_drv_t *drv, void *dir_p, char *fn);
-static lv_fs_res_t fs_dir_close(lv_fs_drv_t *drv, void *dir_p);
-
-/****************************************************************************
- * Private Functions
- ****************************************************************************/
-
-/****************************************************************************
- * Name: fs_open
- *
- * Description:
- * Open a file.
- *
- * Input Parameters:
- * drv - pointer to a driver where this function belongs.
- * file_p - pointer to a file_t variable.
- * path - path to the file beginning with the driver letter.
- * (e.g. /folder/file.txt)
- * mode - read: FS_MODE_RD, write: FS_MODE_WR,
- * both: FS_MODE_RD | FS_MODE_WR
- *
- * Returned Value:
- * LV_FS_RES_OK or any error from lv_fs_res_t enum.
- *
- ****************************************************************************/
-
-static lv_fs_res_t fs_open(lv_fs_drv_t *drv, void *file_p,
- const char *path, lv_fs_mode_t mode)
-{
- uint32_t flags = 0;
- if (mode == LV_FS_MODE_WR)
- {
- flags = O_WRONLY | O_CREAT;
- }
- else if (mode == LV_FS_MODE_RD)
- {
- flags = O_RDONLY;
- }
- else if (mode == (LV_FS_MODE_WR | LV_FS_MODE_RD))
- {
- flags = O_RDWR | O_CREAT;
- }
- else
- {
- return LV_FS_RES_UNKNOWN;
- }
-
- file_t f = open(--path, flags);
- if (f < 0)
- {
- return LV_FS_RES_FS_ERR;
- }
-
- /* 'file_p' is pointer to a file descriptor and
- * we need to store our file descriptor here
- */
-
- file_t *fp = file_p; /* Just avoid the confusing casings */
- *fp = f;
-
- return LV_FS_RES_OK;
-}
-
-/****************************************************************************
- * Name: fs_close
- *
- * Description:
- * Close an opened file.
- *
- * Input Parameters:
- * drv - pointer to a driver where this function belongs.
- * file_p - pointer to a file_t variable.
- *
- * Returned Value:
- * LV_FS_RES_OK: no error, the file is read
- * any error from lv_fs_res_t enum.
- *
- ****************************************************************************/
-
-static lv_fs_res_t fs_close(lv_fs_drv_t *drv, void *file_p)
-{
- /* Just avoid the confusing casings */
-
- file_t *fp = file_p;
-
- return close(*fp) < 0 ? LV_FS_RES_FS_ERR : LV_FS_RES_OK;
-}
-
-/****************************************************************************
- * Name: fs_read
- *
- * Description:
- * Read data from an opened file.
- *
- * Input Parameters:
- * drv - pointer to a driver where this function belongs.
- * file_p - pointer to a file_t variable.
- * buf - pointer to a memory block where to store the read data.
- * btr - number of Bytes To Read.
- * br - the real number of read bytes (Byte Read).
- *
- * Returned Value:
- * LV_FS_RES_OK: no error, the file is read
- * any error from lv_fs_res_t enum.
- *
- ****************************************************************************/
-
-static lv_fs_res_t fs_read(lv_fs_drv_t *drv, void *file_p,
- void *buf, uint32_t btr, uint32_t *br)
-{
- /* Just avoid the confusing casings */
-
- file_t *fp = file_p;
-
- *br = read(*fp, buf, btr);
-
- return (int32_t)*br < 0 ? LV_FS_RES_FS_ERR : LV_FS_RES_OK;
-}
-
-/****************************************************************************
- * Name: fs_write
- *
- * Description:
- * Write into a file.
- *
- * Input Parameters:
- * drv - pointer to a driver where this function belongs.
- * file_p - pointer to a file_t variable.
- * buf - pointer to a buffer with the bytes to write.
- * btw - Bytes To Write.
- * bw - the number of real written bytes (Bytes Written).
- * NULL if unused.
- *
- * Returned Value:
- * LV_FS_RES_OK or any error from lv_fs_res_t enum.
- *
- ****************************************************************************/
-
-static lv_fs_res_t fs_write(lv_fs_drv_t *drv, void *file_p,
- const void *buf, uint32_t btw, uint32_t *bw)
-{
- /* Just avoid the confusing casings */
-
- file_t *fp = file_p;
-
- *bw = write(*fp, buf, btw);
-
- return (int32_t)*bw < 0 ? LV_FS_RES_FS_ERR : LV_FS_RES_OK;
-}
-
-/****************************************************************************
- * Name: fs_seek
- *
- * Description:
- * Set the read write pointer. Also expand the file size if necessary.
- *
- * Input Parameters:
- * drv - pointer to a driver where this function belongs.
- * file_p - pointer to a file_t variable.
- * pos - the new position of read write pointer.
- *
- * Returned Value:
- * LV_FS_RES_OK: no error, the file is read
- * any error from lv_fs_res_t enum.
- *
- ****************************************************************************/
-
-static lv_fs_res_t fs_seek(lv_fs_drv_t *drv, void *file_p, uint32_t pos)
-{
- /* Just avoid the confusing casings */
-
- file_t *fp = file_p;
-
- off_t offset = lseek(*fp, pos, SEEK_SET);
-
- return offset < 0 ? LV_FS_RES_FS_ERR : LV_FS_RES_OK;
-}
-
-/****************************************************************************
- * Name: fs_size
- *
- * Description:
- * Give the size of a file bytes.
- *
- * Input Parameters:
- * drv - pointer to a driver where this function belongs.
- * file_p - pointer to a file_t variable.
- * size - pointer to a variable to store the size.
- *
- * Returned Value:
- * LV_FS_RES_OK or any error from lv_fs_res_t enum.
- *
- ****************************************************************************/
-
-static lv_fs_res_t fs_size(lv_fs_drv_t *drv, void *file_p,
- uint32_t *size_p)
-{
- /* Just avoid the confusing casings */
-
- file_t *fp = file_p;
-
- off_t cur = lseek(*fp, 0, SEEK_CUR);
-
- *size_p = lseek(*fp, 0L, SEEK_END);
-
- /* Restore file pointer */
-
- lseek(*fp, cur, SEEK_SET);
-
- return (int32_t)*size_p < 0 ? LV_FS_RES_FS_ERR : LV_FS_RES_OK;
-}
-
-/****************************************************************************
- * Name: fs_tell
- *
- * Description:
- * Give the position of the read write pointer.
- *
- * Input Parameters:
- * drv - pointer to a driver where this function belongs.
- * file_p - pointer to a file_t variable.
- * pos_p - pointer to to store the result.
- *
- * Returned Value:
- * LV_FS_RES_OK: no error, the file is read
- * any error from lv_fs_res_t enum.
- *
- ****************************************************************************/
-
-static lv_fs_res_t fs_tell(lv_fs_drv_t *drv, void *file_p,
- uint32_t *pos_p)
-{
- /* Just avoid the confusing casings */
-
- file_t *fp = file_p;
-
- *pos_p = lseek(*fp, 0, SEEK_CUR);
-
- return (int32_t)*pos_p < 0 ? LV_FS_RES_FS_ERR : LV_FS_RES_OK;
-}
-
-/****************************************************************************
- * Name: fs_remove
- *
- * Description:
- * Delete a file.
- *
- * Input Parameters:
- * drv - pointer to a driver where this function belongs.
- * path - path of the file to delete.
- *
- * Returned Value:
- * LV_FS_RES_OK or any error from lv_fs_res_t enum.
- *
- ****************************************************************************/
-
-static lv_fs_res_t fs_remove(lv_fs_drv_t *drv, const char *path)
-{
- return remove(--path) < 0 ? LV_FS_RES_FS_ERR : LV_FS_RES_OK;
-}
-
-/****************************************************************************
- * Name: fs_trunc
- *
- * Description:
- * Truncate the file size to the current position of
- * the read write pointer.
- *
- * Input Parameters:
- * drv - pointer to a driver where this function belongs.
- * file_p - pointer to a file_t variable.
- *
- * Returned Value:
- * LV_FS_RES_OK or any error from lv_fs_res_t enum.
- *
- ****************************************************************************/
-
-static lv_fs_res_t fs_trunc(lv_fs_drv_t *drv, void *file_p)
-{
- /* Just avoid the confusing casings */
-
- file_t *fp = file_p;
-
- off_t p = lseek(*fp, 0, SEEK_CUR);
-
- return ftruncate(*fp, p) < 0 ? LV_FS_RES_FS_ERR : LV_FS_RES_OK;
-}
-
-/****************************************************************************
- * Name: fs_rename
- *
- * Description:
- * Rename a file.
- *
- * Input Parameters:
- * drv - pointer to a driver where this function belongs.
- * oldname - path to the file.
- * newname - path with the new name
- *
- * Returned Value:
- * LV_FS_RES_OK or any error from lv_fs_res_t enum.
- *
- ****************************************************************************/
-
-static lv_fs_res_t fs_rename(lv_fs_drv_t *drv, const char *oldname,
- const char *newname)
-{
- return rename(--oldname, --newname) < 0 ? LV_FS_RES_FS_ERR : LV_FS_RES_OK;
-}
-
-/****************************************************************************
- * Name: fs_free
- *
- * Description:
- * Get the free and total size of a driver in kB.
- *
- * Input Parameters:
- * drv - pointer to a driver where this function belongs.
- * total_p - pointer to store the total size [kB].
- * free_p - pointer to store the free size [kB]
- *
- * Returned Value:
- * LV_FS_RES_OK or any error from lv_fs_res_t enum.
- *
- ****************************************************************************/
-
-static lv_fs_res_t fs_free(lv_fs_drv_t *drv, uint32_t *total_p,
- uint32_t *free_p)
-{
- struct statfs sfs;
-
- if (statfs(CONFIG_LV_FILESYSTEM_MOUNTPOINT, &sfs) < 0)
- {
- return LV_FS_RES_FS_ERR;
- }
- else
- {
- *total_p = sfs.f_blocks * sfs.f_bsize / 1024;
- *free_p = sfs.f_bfree * sfs.f_bsize / 1024;
- return LV_FS_RES_OK;
- }
-}
-
-/****************************************************************************
- * Name: fs_dir_open
- *
- * Description:
- * Initialize a 'fs_read_dir_t' variable for directory reading.
- *
- * Input Parameters:
- * drv - pointer to a driver where this function belongs.
- * dir_p - pointer to a 'fs_read_dir_t' variable.
- * path - path to a directory.
- *
- * Returned Value:
- * LV_FS_RES_OK or any error from lv_fs_res_t enum.
- *
- ****************************************************************************/
-
-static lv_fs_res_t fs_dir_open(lv_fs_drv_t *drv, void *dir_p,
- const char *path)
-{
- dir_t d;
-
- /* Make the path relative to the current directory
- * (the projects root folder)
- */
-
- if ((d = opendir(--path)) == NULL)
- {
- return LV_FS_RES_FS_ERR;
- }
- else
- {
- /* 'dir_p' is pointer to a file descriptor and
- * we need to store our file descriptor here
- */
-
- /* Just avoid the confusing casings */
-
- dir_t *dp = dir_p;
- *dp = d;
- }
-
- return LV_FS_RES_OK;
-}
-
-/****************************************************************************
- * Name: fs_dir_read
- *
- * Description:
- * Read the next filename form a directory.
- * The name of the directories will begin with '/'.
- *
- * Input Parameters:
- * drv - pointer to a driver where this function belongs.
- * dir_p - pointer to an initialized 'fs_read_dir_t' variable.
- * fn - pointer to a buffer to store the filename.
- *
- * Returned Value:
- * LV_FS_RES_OK or any error from lv_fs_res_t enum.
- *
- ****************************************************************************/
-
-static lv_fs_res_t fs_dir_read(lv_fs_drv_t *drv, void *dir_p, char *fn)
-{
- /* Just avoid the confusing casings */
-
- dir_t *dp = dir_p;
-
- do
- {
- struct dirent *entry = readdir(*dp);
-
- if (entry)
- {
- if (entry->d_type == DT_DIR)
- {
- sprintf(fn, "/%s", entry->d_name);
- }
- else
- {
- strcpy(fn, entry->d_name);
- }
- }
- else
- {
- strcpy(fn, "");
- }
- }
- while (strcmp(fn, "/.") == 0 || strcmp(fn, "/..") == 0);
-
- return LV_FS_RES_OK;
-}
-
-/****************************************************************************
- * Name: fs_dir_read
- *
- * Description:
- * Close the directory reading.
- *
- * Input Parameters:
- * drv - pointer to a driver where this function belongs.
- * dir_p - pointer to an initialized 'fs_read_dir_t' variable.
- *
- * Returned Value:
- * LV_FS_RES_OK or any error from lv_fs_res_t enum.
- *
- ****************************************************************************/
-
-static lv_fs_res_t fs_dir_close(lv_fs_drv_t *drv, void *dir_p)
-{
- dir_t *dp = dir_p;
-
- return closedir(*dp) < 0 ? LV_FS_RES_FS_ERR : LV_FS_RES_OK;
-}
-
-/****************************************************************************
- * Public Functions
- ****************************************************************************/
-
-/****************************************************************************
- * Name: lv_fs_interface_init
- *
- * Description:
- * Register a driver for the File system interface.
- *
- ****************************************************************************/
-
-void lv_fs_interface_init(void)
-{
- /* Add a simple drive to open images */
-
- lv_fs_drv_t fs_drv; /* A driver descriptor */
-
- lv_fs_drv_init(&fs_drv);
-
- /* Set up fields... */
-
- fs_drv.file_size = sizeof(file_t);
- fs_drv.letter = LV_FS_LETTER;
- fs_drv.open_cb = fs_open;
- fs_drv.close_cb = fs_close;
- fs_drv.read_cb = fs_read;
- fs_drv.write_cb = fs_write;
- fs_drv.seek_cb = fs_seek;
- fs_drv.tell_cb = fs_tell;
- fs_drv.free_space_cb = fs_free;
- fs_drv.size_cb = fs_size;
- fs_drv.remove_cb = fs_remove;
- fs_drv.rename_cb = fs_rename;
- fs_drv.trunc_cb = fs_trunc;
-
- fs_drv.rddir_size = sizeof(dir_t);
- fs_drv.dir_close_cb = fs_dir_close;
- fs_drv.dir_open_cb = fs_dir_open;
- fs_drv.dir_read_cb = fs_dir_read;
-
- lv_fs_drv_register(&fs_drv);
-}
diff --git a/graphics/lvgl/lv_fs_interface.h b/graphics/lvgl/port/lv_port.c
similarity index 56%
copy from graphics/lvgl/lv_fs_interface.h
copy to graphics/lvgl/port/lv_port.c
index a02558ef7..c5056d927 100644
--- a/graphics/lvgl/lv_fs_interface.h
+++ b/graphics/lvgl/port/lv_port.c
@@ -1,5 +1,5 @@
/****************************************************************************
- * apps/graphics/lvgl/lv_fs_interface.h
+ * apps/graphics/lvgl/port/lv_port.c
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
@@ -18,49 +18,74 @@
*
****************************************************************************/
-#ifndef __APPS_GRAPHICS_LVGL_LV_FS_INTERFACE_H
-#define __APPS_GRAPHICS_LVGL_LV_FS_INTERFACE_H
-
/****************************************************************************
* Included Files
****************************************************************************/
-#include <nuttx/config.h>
-#include <lvgl/lvgl.h>
+#include "lv_port.h"
+#include "lv_port_button.h"
+#include "lv_port_encoder.h"
+#include "lv_port_fbdev.h"
+#include "lv_port_lcddev.h"
+#include "lv_port_mem.h"
+#include "lv_port_keypad.h"
+#include "lv_port_syslog.h"
+#include "lv_port_touchpad.h"
/****************************************************************************
- * Pre-processor Definitions
+ * Public Functions
****************************************************************************/
-#if LV_USE_FILESYSTEM
-
/****************************************************************************
- * Type Definitions
- ****************************************************************************/
-
-/****************************************************************************
- * Public Data
+ * Name: lv_port_init
+ *
+ * Description:
+ * Initialize all porting.
+ *
****************************************************************************/
-#ifdef __cplusplus
-#define EXTERN extern "C"
-extern "C"
+void lv_port_init(void)
{
-#else
-#define EXTERN extern
+#if defined(CONFIG_LV_USE_LOG)
+ lv_port_syslog_init();
#endif
-/****************************************************************************
- * Public Function Prototypes
- ****************************************************************************/
+#if defined(CONFIG_LV_PORT_USE_LCDDEV)
+ lv_port_lcddev_init(NULL, 0);
+#endif
-void lv_fs_interface_init(void);
+#if defined(CONFIG_LV_PORT_USE_FBDEV)
+ lv_port_fbdev_init(NULL);
+#endif
-#undef EXTERN
-#ifdef __cplusplus
-}
+#if defined(CONFIG_LV_PORT_USE_BUTTON)
+ lv_port_button_init(NULL);
+
+#if defined(CONFIG_UINPUT_BUTTON)
+ lv_port_button_init("/dev/ubutton");
#endif
-#endif /* LV_USE_FILESYSTEM */
+#endif
+
+#if defined(CONFIG_LV_PORT_USE_KEYPAD)
+ lv_port_keypad_init(NULL);
+
+#if defined(CONFIG_UINPUT_BUTTON)
+ lv_port_keypad_init("/dev/ubutton");
+#endif
+
+#endif
+
+#if defined(CONFIG_LV_PORT_USE_TOUCHPAD)
+ lv_port_touchpad_init(NULL);
-#endif /* __APPS_GRAPHICS_LVGL_LV_FS_INTERFACE_H */
+#if defined(CONFIG_UINPUT_TOUCH)
+ lv_port_touchpad_init("/dev/utouch");
+#endif
+
+#endif
+
+#if defined(CONFIG_LV_PORT_USE_ENCODER)
+ lv_port_encoder_init(NULL);
+#endif
+}
diff --git a/graphics/lvgl/lv_fs_interface.h b/graphics/lvgl/port/lv_port.h
similarity index 82%
copy from graphics/lvgl/lv_fs_interface.h
copy to graphics/lvgl/port/lv_port.h
index a02558ef7..3b48525b5 100644
--- a/graphics/lvgl/lv_fs_interface.h
+++ b/graphics/lvgl/port/lv_port.h
@@ -1,5 +1,5 @@
/****************************************************************************
- * apps/graphics/lvgl/lv_fs_interface.h
+ * apps/graphics/lvgl/port/lv_port.h
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
@@ -18,22 +18,17 @@
*
****************************************************************************/
-#ifndef __APPS_GRAPHICS_LVGL_LV_FS_INTERFACE_H
-#define __APPS_GRAPHICS_LVGL_LV_FS_INTERFACE_H
+#ifndef __APPS_GRAPHICS_LVGL_PORT_LV_PORT_H
+#define __APPS_GRAPHICS_LVGL_PORT_LV_PORT_H
/****************************************************************************
* Included Files
****************************************************************************/
-#include <nuttx/config.h>
-#include <lvgl/lvgl.h>
-
/****************************************************************************
* Pre-processor Definitions
****************************************************************************/
-#if LV_USE_FILESYSTEM
-
/****************************************************************************
* Type Definitions
****************************************************************************/
@@ -54,13 +49,19 @@ extern "C"
* Public Function Prototypes
****************************************************************************/
-void lv_fs_interface_init(void);
+/****************************************************************************
+ * Name: lv_port_init
+ *
+ * Description:
+ * Initialize all porting.
+ *
+ ****************************************************************************/
+
+void lv_port_init(void);
#undef EXTERN
#ifdef __cplusplus
}
#endif
-#endif /* LV_USE_FILESYSTEM */
-
-#endif /* __APPS_GRAPHICS_LVGL_LV_FS_INTERFACE_H */
+#endif /* __APPS_GRAPHICS_LVGL_PORT_LV_PORT_H */
diff --git a/graphics/lvgl/port/lv_port_button.c b/graphics/lvgl/port/lv_port_button.c
new file mode 100644
index 000000000..7bf215009
--- /dev/null
+++ b/graphics/lvgl/port/lv_port_button.c
@@ -0,0 +1,238 @@
+/****************************************************************************
+ * apps/graphics/lvgl/port/lv_port_button.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership. The
+ * ASF licenses this file to you 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.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <nuttx/input/buttons.h>
+#include "lv_port_button.h"
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+#define BUTTON_0_MAP_X CONFIG_LV_PORT_BUTTON_BUTTON_0_MAP_X
+#define BUTTON_0_MAP_Y CONFIG_LV_PORT_BUTTON_BUTTON_0_MAP_Y
+#define BUTTON_1_MAP_X CONFIG_LV_PORT_BUTTON_BUTTON_1_MAP_X
+#define BUTTON_1_MAP_Y CONFIG_LV_PORT_BUTTON_BUTTON_1_MAP_Y
+#define BUTTON_2_MAP_X CONFIG_LV_PORT_BUTTON_BUTTON_2_MAP_X
+#define BUTTON_2_MAP_Y CONFIG_LV_PORT_BUTTON_BUTTON_2_MAP_Y
+#define BUTTON_3_MAP_X CONFIG_LV_PORT_BUTTON_BUTTON_3_MAP_X
+#define BUTTON_3_MAP_Y CONFIG_LV_PORT_BUTTON_BUTTON_3_MAP_Y
+#define BUTTON_4_MAP_X CONFIG_LV_PORT_BUTTON_BUTTON_4_MAP_X
+#define BUTTON_4_MAP_Y CONFIG_LV_PORT_BUTTON_BUTTON_4_MAP_Y
+#define BUTTON_5_MAP_X CONFIG_LV_PORT_BUTTON_BUTTON_5_MAP_X
+#define BUTTON_5_MAP_Y CONFIG_LV_PORT_BUTTON_BUTTON_5_MAP_Y
+
+/****************************************************************************
+ * Private Type Declarations
+ ****************************************************************************/
+
+struct button_obj_s
+{
+ int fd;
+ uint8_t last_btn;
+ lv_indev_drv_t indev_drv;
+};
+
+/****************************************************************************
+ * Private Function Prototypes
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+/* Assign buttons to points on the screen */
+
+static const lv_point_t g_button_points_map[6] =
+{
+ {BUTTON_0_MAP_X, BUTTON_0_MAP_Y},
+ {BUTTON_1_MAP_X, BUTTON_1_MAP_Y},
+ {BUTTON_2_MAP_X, BUTTON_2_MAP_Y},
+ {BUTTON_3_MAP_X, BUTTON_3_MAP_Y},
+ {BUTTON_4_MAP_X, BUTTON_4_MAP_Y},
+ {BUTTON_5_MAP_X, BUTTON_5_MAP_Y}
+};
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: button_get_pressed_id
+ ****************************************************************************/
+
+static int button_get_pressed_id(int fd)
+{
+ int btn_act = -1;
+ btn_buttonset_t buttonset;
+ const int buttonset_bits = sizeof(btn_buttonset_t) * 8;
+ int bit;
+
+ int ret = read(fd, &buttonset, sizeof(btn_buttonset_t));
+ if (ret < 0)
+ {
+ return -1;
+ }
+
+ for (bit = 0; bit < buttonset_bits; bit++)
+ {
+ btn_buttonset_t mask = (btn_buttonset_t)(1 << bit);
+
+ if ((buttonset & mask) != 0)
+ {
+ btn_act = bit;
+ break;
+ }
+ }
+
+ return btn_act;
+}
+
+/****************************************************************************
+ * Name: button_read
+ ****************************************************************************/
+
+static void button_read(FAR lv_indev_drv_t *drv, FAR lv_indev_data_t *data)
+{
+ FAR struct button_obj_s *button_obj = drv->user_data;
+
+ /* Get the pressed button's ID */
+
+ int btn_act = button_get_pressed_id(button_obj->fd);
+
+ if (btn_act >= 0)
+ {
+ data->state = LV_INDEV_STATE_PR;
+ button_obj->last_btn = btn_act;
+ }
+ else
+ {
+ data->state = LV_INDEV_STATE_REL;
+ }
+
+ /* Save the last pressed button's ID */
+
+ data->btn_id = button_obj->last_btn;
+}
+
+/****************************************************************************
+ * Name: button_init
+ ****************************************************************************/
+
+static FAR lv_indev_t *button_init(int fd)
+{
+ FAR struct button_obj_s *button_obj;
+ FAR lv_indev_t *indev_button;
+
+ button_obj = malloc(sizeof(struct button_obj_s));
+
+ if (button_obj == NULL)
+ {
+ LV_LOG_ERROR("button_obj_s malloc failed");
+ return NULL;
+ }
+
+ button_obj->fd = fd;
+ button_obj->last_btn = 0;
+
+ lv_indev_drv_init(&(button_obj->indev_drv));
+ button_obj->indev_drv.type = LV_INDEV_TYPE_BUTTON;
+ button_obj->indev_drv.read_cb = button_read;
+#if ( LV_USE_USER_DATA != 0 )
+ button_obj->indev_drv.user_data = button_obj;
+#else
+#error LV_USE_USER_DATA must be enabled
+#endif
+ indev_button = lv_indev_drv_register(&(button_obj->indev_drv));
+ lv_indev_set_button_points(indev_button, g_button_points_map);
+
+ return indev_button;
+}
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: lv_port_button_init
+ *
+ * Description:
+ * Button interface initialization.
+ *
+ * Input Parameters:
+ * dev_path - input device path, set to NULL to use the default path
+ *
+ * Returned Value:
+ * lv_indev object address on success; NULL on failure.
+ *
+ ****************************************************************************/
+
+FAR lv_indev_t *lv_port_button_init(FAR const char *dev_path)
+{
+ FAR const char *device_path = dev_path;
+ FAR lv_indev_t *indev;
+ int fd;
+ btn_buttonset_t supported;
+ int ret;
+
+ if (device_path == NULL)
+ {
+ device_path = CONFIG_LV_PORT_BUTTON_DEFAULT_DEVICEPATH;
+ }
+
+ LV_LOG_INFO("button %s opening", device_path);
+ fd = open(device_path, O_RDONLY | O_NONBLOCK);
+ if (fd < 0)
+ {
+ LV_LOG_ERROR("button %s open failed: %d", device_path, errno);
+ return NULL;
+ }
+
+ /* Get the set of BUTTONs supported */
+
+ ret = ioctl(fd, BTNIOC_SUPPORTED,
+ (unsigned long)((uintptr_t)&supported));
+ if (ret < 0)
+ {
+ LV_LOG_ERROR("button ioctl(BTNIOC_SUPPORTED) failed: %d", errno);
+ return NULL;
+ }
+
+ LV_LOG_INFO("button supported BUTTONs 0x%08x", (unsigned int)supported);
+
+ indev = button_init(fd);
+
+ if (indev == NULL)
+ {
+ close(fd);
+ }
+
+ return indev;
+}
diff --git a/graphics/lvgl/lv_fs_interface.h b/graphics/lvgl/port/lv_port_button.h
similarity index 72%
copy from graphics/lvgl/lv_fs_interface.h
copy to graphics/lvgl/port/lv_port_button.h
index a02558ef7..12bf133e3 100644
--- a/graphics/lvgl/lv_fs_interface.h
+++ b/graphics/lvgl/port/lv_port_button.h
@@ -1,5 +1,5 @@
/****************************************************************************
- * apps/graphics/lvgl/lv_fs_interface.h
+ * apps/graphics/lvgl/port/lv_port_button.h
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
@@ -18,8 +18,8 @@
*
****************************************************************************/
-#ifndef __APPS_GRAPHICS_LVGL_LV_FS_INTERFACE_H
-#define __APPS_GRAPHICS_LVGL_LV_FS_INTERFACE_H
+#ifndef __APPS_GRAPHICS_LVGL_PORT_LV_PORT_BUTTON_H
+#define __APPS_GRAPHICS_LVGL_PORT_LV_PORT_BUTTON_H
/****************************************************************************
* Included Files
@@ -32,7 +32,7 @@
* Pre-processor Definitions
****************************************************************************/
-#if LV_USE_FILESYSTEM
+#if defined(CONFIG_LV_PORT_USE_BUTTON)
/****************************************************************************
* Type Definitions
@@ -54,13 +54,27 @@ extern "C"
* Public Function Prototypes
****************************************************************************/
-void lv_fs_interface_init(void);
+/****************************************************************************
+ * Name: lv_port_button_init
+ *
+ * Description:
+ * Button interface initialization.
+ *
+ * Input Parameters:
+ * dev_path - input device path, set to NULL to use the default path
+ *
+ * Returned Value:
+ * lv_indev object address on success; NULL on failure.
+ *
+ ****************************************************************************/
+
+FAR lv_indev_t *lv_port_button_init(FAR const char *dev_path);
#undef EXTERN
#ifdef __cplusplus
}
#endif
-#endif /* LV_USE_FILESYSTEM */
+#endif /* CONFIG_LV_PORT_USE_BUTTON */
-#endif /* __APPS_GRAPHICS_LVGL_LV_FS_INTERFACE_H */
+#endif /* __APPS_GRAPHICS_LVGL_PORT_LV_PORT_BUTTON_H */
diff --git a/graphics/lvgl/port/lv_port_encoder.c b/graphics/lvgl/port/lv_port_encoder.c
new file mode 100644
index 000000000..d079b886f
--- /dev/null
+++ b/graphics/lvgl/port/lv_port_encoder.c
@@ -0,0 +1,162 @@
+/****************************************************************************
+ * apps/graphics/lvgl/port/lv_port_encoder.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership. The
+ * ASF licenses this file to you 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.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+#include <sys/types.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <debug.h>
+#include <nuttx/input/mouse.h>
+#include "lv_port_encoder.h"
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Type Declarations
+ ****************************************************************************/
+
+struct encoder_obj_s
+{
+ int fd;
+ lv_indev_state_t last_state;
+ lv_indev_drv_t indev_drv;
+};
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: encoder_read
+ ****************************************************************************/
+
+static void encoder_read(FAR lv_indev_drv_t *drv, FAR lv_indev_data_t *data)
+{
+ FAR struct encoder_obj_s *encoder_obj = drv->user_data;
+
+ /* Read one sample */
+
+ struct mouse_report_s sample;
+ int16_t wheel = 0;
+
+ int nbytes = read(encoder_obj->fd, &sample,
+ sizeof(struct mouse_report_s));
+
+ /* Handle unexpected return values */
+
+ if (nbytes == sizeof(struct mouse_report_s))
+ {
+ wheel = sample.wheel;
+ encoder_obj->last_state = (sample.buttons & MOUSE_BUTTON_3) ?
+ LV_INDEV_STATE_PRESSED : LV_INDEV_STATE_RELEASED;
+ }
+
+ /* Update encoder data */
+
+ data->enc_diff = wheel;
+ data->state = encoder_obj->last_state;
+}
+
+/****************************************************************************
+ * Name: encoder_init
+ ****************************************************************************/
+
+static FAR lv_indev_t *encoder_init(int fd)
+{
+ FAR struct encoder_obj_s *encoder_obj;
+ encoder_obj = malloc(sizeof(struct encoder_obj_s));
+
+ if (encoder_obj == NULL)
+ {
+ LV_LOG_ERROR("encoder_obj_s malloc failed");
+ return NULL;
+ }
+
+ encoder_obj->fd = fd;
+ encoder_obj->last_state = LV_INDEV_STATE_RELEASED;
+
+ lv_indev_drv_init(&(encoder_obj->indev_drv));
+ encoder_obj->indev_drv.type = LV_INDEV_TYPE_ENCODER;
+ encoder_obj->indev_drv.read_cb = encoder_read;
+#if ( LV_USE_USER_DATA != 0 )
+ encoder_obj->indev_drv.user_data = encoder_obj;
+#else
+#error LV_USE_USER_DATA must be enabled
+#endif
+ return lv_indev_drv_register(&(encoder_obj->indev_drv));
+}
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: lv_port_encoder_init
+ *
+ * Description:
+ * Encoder interface initialization.
+ *
+ * Input Parameters:
+ * dev_path - input device path, set to NULL to use the default path.
+ *
+ * Returned Value:
+ * lv_indev object address on success; NULL on failure.
+ *
+ ****************************************************************************/
+
+FAR lv_indev_t *lv_port_encoder_init(FAR const char *dev_path)
+{
+ FAR const char *device_path = dev_path;
+ FAR lv_indev_t *indev;
+ int fd;
+
+ if (device_path == NULL)
+ {
+ device_path = CONFIG_LV_PORT_ENCODER_DEFAULT_DEVICEPATH;
+ }
+
+ LV_LOG_INFO("encoder %s opening", device_path);
+ fd = open(device_path, O_RDONLY | O_NONBLOCK);
+ if (fd < 0)
+ {
+ LV_LOG_ERROR("encoder %s open failed: %d", device_path, errno);
+ return NULL;
+ }
+
+ LV_LOG_INFO("encoder %s open success", device_path);
+
+ indev = encoder_init(fd);
+
+ if (indev == NULL)
+ {
+ close(fd);
+ }
+
+ return indev;
+}
diff --git a/graphics/lvgl/lv_fs_interface.h b/graphics/lvgl/port/lv_port_encoder.h
similarity index 72%
copy from graphics/lvgl/lv_fs_interface.h
copy to graphics/lvgl/port/lv_port_encoder.h
index a02558ef7..89465298f 100644
--- a/graphics/lvgl/lv_fs_interface.h
+++ b/graphics/lvgl/port/lv_port_encoder.h
@@ -1,5 +1,5 @@
/****************************************************************************
- * apps/graphics/lvgl/lv_fs_interface.h
+ * apps/graphics/lvgl/port/lv_port_encoder.h
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
@@ -18,8 +18,8 @@
*
****************************************************************************/
-#ifndef __APPS_GRAPHICS_LVGL_LV_FS_INTERFACE_H
-#define __APPS_GRAPHICS_LVGL_LV_FS_INTERFACE_H
+#ifndef __APPS_GRAPHICS_LVGL_PORT_LV_PORT_ENCODER_H
+#define __APPS_GRAPHICS_LVGL_PORT_LV_PORT_ENCODER_H
/****************************************************************************
* Included Files
@@ -32,7 +32,7 @@
* Pre-processor Definitions
****************************************************************************/
-#if LV_USE_FILESYSTEM
+#if defined(CONFIG_LV_PORT_USE_ENCODER)
/****************************************************************************
* Type Definitions
@@ -54,13 +54,27 @@ extern "C"
* Public Function Prototypes
****************************************************************************/
-void lv_fs_interface_init(void);
+/****************************************************************************
+ * Name: lv_port_encoder_init
+ *
+ * Description:
+ * Encoder interface initialization.
+ *
+ * Input Parameters:
+ * dev_path - input device path, set to NULL to use the default path.
+ *
+ * Returned Value:
+ * lv_indev object address on success; NULL on failure.
+ *
+ ****************************************************************************/
+
+FAR lv_indev_t *lv_port_encoder_init(FAR const char *dev_path);
#undef EXTERN
#ifdef __cplusplus
}
#endif
-#endif /* LV_USE_FILESYSTEM */
+#endif /* CONFIG_LV_PORT_USE_ENCODER */
-#endif /* __APPS_GRAPHICS_LVGL_LV_FS_INTERFACE_H */
+#endif /* __APPS_GRAPHICS_LVGL_PORT_LV_PORT_ENCODER_H */
diff --git a/graphics/lvgl/port/lv_port_fbdev.c b/graphics/lvgl/port/lv_port_fbdev.c
new file mode 100644
index 000000000..3200535b6
--- /dev/null
+++ b/graphics/lvgl/port/lv_port_fbdev.c
@@ -0,0 +1,673 @@
+/****************************************************************************
+ * apps/graphics/lvgl/port/lv_port_fbdev.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership. The
+ * ASF licenses this file to you 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.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+#include <nuttx/video/fb.h>
+#include <nuttx/video/rgbcolors.h>
+#include <sys/ioctl.h>
+#include <sys/mman.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <errno.h>
+#include "lv_port_fbdev.h"
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+#if defined(CONFIG_FB_UPDATE)
+# define FBDEV_UPDATE_AREA(obj, area) fbdev_update_area(obj, area)
+#else
+# define FBDEV_UPDATE_AREA(obj, area)
+#endif
+
+/****************************************************************************
+ * Private Type Declarations
+ ****************************************************************************/
+
+struct fbdev_obj_s
+{
+ lv_disp_draw_buf_t disp_draw_buf;
+ lv_disp_drv_t disp_drv;
+ FAR lv_disp_t *disp;
+ FAR void *last_buffer;
+ FAR void *act_buffer;
+ lv_area_t inv_areas[LV_INV_BUF_SIZE];
+ uint16_t inv_areas_len;
+ lv_area_t final_area;
+
+ int fd;
+ FAR void *fbmem;
+ uint32_t fbmem2_yoffset;
+ struct fb_videoinfo_s vinfo;
+ struct fb_planeinfo_s pinfo;
+
+ bool double_buffer;
+};
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Data
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: buf_rotate_copy
+ ****************************************************************************/
+
+#if defined(CONFIG_FB_UPDATE)
+static void fbdev_update_area(FAR struct fbdev_obj_s *fbdev_obj,
+ FAR const lv_area_t *area_p)
+{
+ struct fb_area_s fb_area;
+
+ fb_area.x = area_p->x1;
+ fb_area.y = area_p->y1;
+ fb_area.w = area_p->x2 - area_p->x1 + 1;
+ fb_area.h = area_p->y2 - area_p->y1 + 1;
+
+ LV_LOG_TRACE("area: (%d, %d) %d x %d",
+ fb_area.x, fb_area.y, fb_area.w, fb_area.h);
+
+ ioctl(fbdev_obj->fd, FBIO_UPDATE,
+ (unsigned long)((uintptr_t)&fb_area));
+
+ LV_LOG_TRACE("finished");
+}
+#endif
+
+/****************************************************************************
+ * Name: fbdev_copy_areas
+ ****************************************************************************/
+
+static void fbdev_copy_areas(FAR lv_color_t *fb_dest,
+ FAR const lv_color_t *fb_src,
+ FAR const lv_area_t *areas,
+ uint16_t len,
+ int fb_width)
+{
+ int i;
+ LV_LOG_TRACE("%p -> %p, len = %d", fb_src, fb_dest, len);
+
+ for (i = 0; i < len; i++)
+ {
+ int y;
+ FAR const lv_area_t *area = &(areas[i]);
+ int width = lv_area_get_width(area);
+ int height = lv_area_get_height(area);
+ FAR lv_color_t *dest_pos =
+ fb_dest + area->y1 * fb_width + area->x1;
+ FAR const lv_color_t *src_pos =
+ fb_src + area->y1 * fb_width + area->x1;
+ size_t hor_size = width * sizeof(lv_color_t);
+
+ LV_LOG_TRACE("area[%d]: (%d, %d) %d x %d",
+ i, area->x1, area->y1, width, height);
+
+ for (y = 0; y < height; y++)
+ {
+ lv_memcpy(dest_pos, src_pos, hor_size);
+ dest_pos += fb_width;
+ src_pos += fb_width;
+ }
+ }
+}
+
+/****************************************************************************
+ * Name: fbdev_switch_buffer
+ ****************************************************************************/
+
+static void fbdev_switch_buffer(FAR struct fbdev_obj_s *fbdev_obj)
+{
+ FAR lv_disp_t *disp_refr = fbdev_obj->disp;
+ uint16_t inv_index;
+
+ /* check inv_areas_len, it must == 0 */
+
+ if (fbdev_obj->inv_areas_len != 0)
+ {
+ LV_LOG_ERROR("Repeated flush action detected! "
+ "inv_areas_len(%d) != 0",
+ fbdev_obj->inv_areas_len);
+ fbdev_obj->inv_areas_len = 0;
+ }
+
+ /* Save dirty area table for next synchronizationn */
+
+ for (inv_index = 0; inv_index < disp_refr->inv_p; inv_index++)
+ {
+ if (disp_refr->inv_area_joined[inv_index] == 0)
+ {
+ fbdev_obj->inv_areas[fbdev_obj->inv_areas_len] =
+ disp_refr->inv_areas[inv_index];
+ fbdev_obj->inv_areas_len++;
+ }
+ }
+
+ /* Save the buffer address for the next synchronization */
+
+ fbdev_obj->last_buffer = fbdev_obj->act_buffer;
+
+ LV_LOG_TRACE("Commit buffer = %p, yoffset = %" PRIu32,
+ fbdev_obj->act_buffer,
+ fbdev_obj->pinfo.yoffset);
+
+ if (fbdev_obj->act_buffer == fbdev_obj->fbmem)
+ {
+ fbdev_obj->pinfo.yoffset = 0;
+ fbdev_obj->act_buffer = fbdev_obj->fbmem
+ + fbdev_obj->fbmem2_yoffset * fbdev_obj->pinfo.stride;
+ }
+ else
+ {
+ fbdev_obj->pinfo.yoffset = fbdev_obj->fbmem2_yoffset;
+ fbdev_obj->act_buffer = fbdev_obj->fbmem;
+ }
+
+ /* Commit buffer to fb driver */
+
+ ioctl(fbdev_obj->fd, FBIOPAN_DISPLAY,
+ (unsigned long)((uintptr_t)&(fbdev_obj->pinfo)));
+
+ LV_LOG_TRACE("finished");
+}
+
+#if defined(CONFIG_FB_SYNC)
+
+/****************************************************************************
+ * Name: fbdev_disp_vsync_refr
+ ****************************************************************************/
+
+static void fbdev_disp_vsync_refr(FAR lv_timer_t *timer)
+{
+ int ret;
+ FAR struct fbdev_obj_s *fbdev_obj = timer->user_data;
+
+ LV_LOG_TRACE("Check vsync...");
+
+ ret = ioctl(fbdev_obj->fd, FBIO_WAITFORVSYNC, NULL);
+ if (ret != OK)
+ {
+ LV_LOG_TRACE("No vsync signal detect");
+ return;
+ }
+
+ LV_LOG_TRACE("Refresh start");
+
+ _lv_disp_refr_timer(NULL);
+}
+
+#endif /* CONFIG_FB_SYNC */
+
+/****************************************************************************
+ * Name: fbdev_render_start
+ ****************************************************************************/
+
+static void fbdev_render_start(FAR lv_disp_drv_t *disp_drv)
+{
+ FAR struct fbdev_obj_s *fbdev_obj = disp_drv->user_data;
+ FAR lv_disp_t *disp_refr;
+ lv_coord_t hor_res;
+ lv_coord_t ver_res;
+ int i;
+
+ /* No need sync buffer when inv_areas_len == 0 */
+
+ if (fbdev_obj->inv_areas_len == 0)
+ {
+ return;
+ }
+
+ disp_refr = _lv_refr_get_disp_refreshing();
+ hor_res = disp_drv->hor_res;
+ ver_res = disp_drv->ver_res;
+
+ for (i = 0; i < disp_refr->inv_p; i++)
+ {
+ if (disp_refr->inv_area_joined[i] == 0)
+ {
+ FAR const lv_area_t *area_p = &disp_refr->inv_areas[i];
+
+ /* If a full screen redraw is detected, skip dirty areas sync */
+
+ if (lv_area_get_width(area_p) == hor_res
+ && lv_area_get_height(area_p) == ver_res)
+ {
+ LV_LOG_TRACE("Full screen redraw, skip dirty areas sync");
+ fbdev_obj->inv_areas_len = 0;
+ return;
+ }
+ }
+ }
+
+ /* Sync the dirty area of the previous frame */
+
+ fbdev_copy_areas(fbdev_obj->act_buffer, fbdev_obj->last_buffer,
+ fbdev_obj->inv_areas, fbdev_obj->inv_areas_len,
+ fbdev_obj->vinfo.xres);
+
+ fbdev_obj->inv_areas_len = 0;
+}
+
+/****************************************************************************
+ * Name: fbdev_flush_direct
+ ****************************************************************************/
+
+static void fbdev_flush_direct(FAR lv_disp_drv_t *disp_drv,
+ FAR const lv_area_t *area_p,
+ FAR lv_color_t *color_p)
+{
+ FAR struct fbdev_obj_s *fbdev_obj = disp_drv->user_data;
+
+ /* Commit the buffer after the last flush */
+
+ if (!lv_disp_flush_is_last(disp_drv))
+ {
+ lv_disp_flush_ready(disp_drv);
+ return;
+ }
+
+ fbdev_switch_buffer(fbdev_obj);
+
+ FBDEV_UPDATE_AREA(fbdev_obj, area_p);
+
+ /* Tell the flushing is ready */
+
+ lv_disp_flush_ready(disp_drv);
+}
+
+/****************************************************************************
+ * Name: fbdev_update_part
+ ****************************************************************************/
+
+static void fbdev_update_part(FAR struct fbdev_obj_s *fbdev_obj,
+ FAR lv_disp_drv_t *disp_drv,
+ FAR const lv_area_t *area_p)
+{
+ FAR lv_area_t *final_area = &fbdev_obj->final_area;
+
+ if (final_area->x1 < 0)
+ {
+ *final_area = *area_p;
+ }
+ else
+ {
+ _lv_area_join(final_area, final_area, area_p);
+ }
+
+ if (!lv_disp_flush_is_last(disp_drv))
+ {
+ lv_disp_flush_ready(disp_drv);
+ return;
+ }
+
+ if (fbdev_obj->double_buffer)
+ {
+ fbdev_switch_buffer(fbdev_obj);
+ }
+
+ FBDEV_UPDATE_AREA(fbdev_obj, final_area);
+
+ /* Mark it is invalid */
+
+ final_area->x1 = -1;
+
+ /* Tell the flushing is ready */
+
+ lv_disp_flush_ready(disp_drv);
+}
+
+/****************************************************************************
+ * Name: fbdev_flush_normal
+ ****************************************************************************/
+
+static void fbdev_flush_normal(FAR lv_disp_drv_t *disp_drv,
+ FAR const lv_area_t *area_p,
+ FAR lv_color_t *color_p)
+{
+ FAR struct fbdev_obj_s *fbdev_obj = disp_drv->user_data;
+
+ int x1 = area_p->x1;
+ int y1 = area_p->y1;
+ int y2 = area_p->y2;
+ int y;
+ int w = lv_area_get_width(area_p);
+
+ FAR lv_color_t *fbp = fbdev_obj->act_buffer;
+ fb_coord_t fb_xres = fbdev_obj->vinfo.xres;
+ int hor_size = w * sizeof(lv_color_t);
+ FAR lv_color_t *cur_pos = fbp + y1 * fb_xres + x1;
+
+ LV_LOG_TRACE("start copy");
+
+ for (y = y1; y <= y2; y++)
+ {
+ lv_memcpy(cur_pos, color_p, hor_size);
+ cur_pos += fb_xres;
+ color_p += w;
+ }
+
+ LV_LOG_TRACE("end copy");
+
+ fbdev_update_part(fbdev_obj, disp_drv, area_p);
+}
+
+/****************************************************************************
+ * Name: fbdev_get_pinfo
+ ****************************************************************************/
+
+static int fbdev_get_pinfo(int fd, FAR struct fb_planeinfo_s *pinfo)
+{
+ int ret = ioctl(fd, FBIOGET_PLANEINFO,
+ (unsigned long)((uintptr_t)pinfo));
+ if (ret < 0)
+ {
+ LV_LOG_ERROR("ERROR: ioctl(FBIOGET_PLANEINFO) failed: %d", errno);
+ return ret;
+ }
+
+ LV_LOG_INFO("PlaneInfo (plane %d):", pinfo->display);
+ LV_LOG_INFO(" fbmem: %p", pinfo->fbmem);
+ LV_LOG_INFO(" fblen: %lu", (unsigned long)pinfo->fblen);
+ LV_LOG_INFO(" stride: %u", pinfo->stride);
+ LV_LOG_INFO(" display: %u", pinfo->display);
+ LV_LOG_INFO(" bpp: %u", pinfo->bpp);
+
+ /* Only these pixel depths are supported. viinfo.fmt is ignored, only
+ * certain color formats are supported.
+ */
+
+ if (pinfo->bpp != 32 && pinfo->bpp != 16 &&
+ pinfo->bpp != 8 && pinfo->bpp != 1)
+ {
+ LV_LOG_ERROR("bpp = %u not supported", pinfo->bpp);
+ return -1;
+ }
+
+ return 0;
+}
+
+/****************************************************************************
+ * Name: fbdev_try_init_fbmem2
+ ****************************************************************************/
+
+static int fbdev_try_init_fbmem2(FAR struct fbdev_obj_s *state)
+{
+ uintptr_t buf_offset;
+ struct fb_planeinfo_s pinfo;
+
+ memset(&pinfo, 0, sizeof(pinfo));
+
+ /* Get display[1] planeinfo */
+
+ pinfo.display = state->pinfo.display + 1;
+
+ if (fbdev_get_pinfo(state->fd, &pinfo) < 0)
+ {
+ return -1;
+ }
+
+ /* check display and match bpp */
+
+ if (!(pinfo.display != state->pinfo.display
+ && pinfo.bpp == state->pinfo.bpp))
+ {
+ LV_LOG_INFO("fbmem2 is incorrect");
+ return -1;
+ }
+
+ /* Check the buffer address offset,
+ * It needs to be divisible by pinfo.stride
+ */
+
+ buf_offset = pinfo.fbmem - state->fbmem;
+
+ if ((buf_offset % state->pinfo.stride) != 0)
+ {
+ LV_LOG_ERROR("The buf_offset(%" PRIuPTR ") is incorrect,"
+ " it needs to be divisible"
+ " by pinfo.stride(%d)",
+ buf_offset, state->pinfo.stride);
+ return -1;
+ }
+
+ /* Enable double buffer mode */
+
+ state->double_buffer = true;
+ state->fbmem2_yoffset = buf_offset / state->pinfo.stride;
+
+ LV_LOG_INFO("Use non-consecutive fbmem2 = %p, yoffset = %" PRIu32,
+ pinfo.fbmem, state->fbmem2_yoffset);
+
+ return 0;
+}
+
+/****************************************************************************
+ * Name: fbdev_init
+ ****************************************************************************/
+
+static FAR lv_disp_t *fbdev_init(FAR struct fbdev_obj_s *state)
+{
+ FAR struct fbdev_obj_s *fbdev_obj = malloc(sizeof(struct fbdev_obj_s));
+ FAR lv_disp_drv_t *disp_drv;
+ int fb_xres = state->vinfo.xres;
+ int fb_yres = state->vinfo.yres;
+ size_t fb_size = fb_xres * fb_yres;
+ FAR lv_color_t *buf1 = NULL;
+ FAR lv_color_t *buf2 = NULL;
+
+ if (fbdev_obj == NULL)
+ {
+ LV_LOG_ERROR("fbdev_obj_s malloc failed");
+ return NULL;
+ }
+
+ *fbdev_obj = *state;
+ disp_drv = &(fbdev_obj->disp_drv);
+
+ lv_disp_drv_init(disp_drv);
+ disp_drv->draw_buf = &(fbdev_obj->disp_draw_buf);
+ disp_drv->screen_transp = false;
+ disp_drv->user_data = fbdev_obj;
+ disp_drv->hor_res = fb_xres;
+ disp_drv->ver_res = fb_yres;
+
+ if (fbdev_obj->double_buffer)
+ {
+ LV_LOG_INFO("Double buffer mode");
+
+ buf1 = fbdev_obj->fbmem;
+ buf2 = fbdev_obj->fbmem
+ + fbdev_obj->fbmem2_yoffset * fbdev_obj->pinfo.stride;
+
+ disp_drv->direct_mode = true;
+ disp_drv->flush_cb = fbdev_flush_direct;
+ disp_drv->render_start_cb = fbdev_render_start;
+ }
+ else
+ {
+ LV_LOG_INFO("Single buffer mode");
+
+ buf1 = malloc(fb_size * sizeof(lv_color_t));
+ LV_ASSERT_MALLOC(buf1);
+
+ if (!buf1)
+ {
+ LV_LOG_ERROR("failed to malloc draw buffer");
+ goto failed;
+ }
+
+ disp_drv->flush_cb = fbdev_flush_normal;
+ }
+
+ lv_disp_draw_buf_init(&(fbdev_obj->disp_draw_buf), buf1, buf2, fb_size);
+ fbdev_obj->act_buffer = fbdev_obj->fbmem;
+ fbdev_obj->disp = lv_disp_drv_register(&(fbdev_obj->disp_drv));
+
+#if defined(CONFIG_FB_SYNC)
+ /* If double buffer and vsync is supported, use active refresh method */
+
+ if (fbdev_obj->disp_drv.direct_mode)
+ {
+ FAR lv_timer_t *refr_timer = _lv_disp_get_refr_timer(fbdev_obj->disp);
+ lv_timer_del(refr_timer);
+ fbdev_obj->disp->refr_timer = NULL;
+ lv_timer_create(fbdev_disp_vsync_refr, 1, fbdev_obj);
+ }
+#endif
+
+ return fbdev_obj->disp;
+
+failed:
+ free(fbdev_obj);
+ return NULL;
+}
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: lv_port_fbdev_init
+ *
+ * Description:
+ * Framebuffer device interface initialization.
+ *
+ * Input Parameters:
+ * dev_path - Framebuffer device path, set to NULL to use the default path.
+ *
+ * Returned Value:
+ * lv_disp object address on success; NULL on failure.
+ *
+ ****************************************************************************/
+
+FAR lv_disp_t *lv_port_fbdev_init(FAR const char *dev_path)
+{
+ FAR const char *device_path = dev_path;
+ struct fbdev_obj_s state;
+ int ret;
+ FAR lv_disp_t *disp;
+
+ memset(&state, 0, sizeof(state));
+
+ if (device_path == NULL)
+ {
+ device_path = CONFIG_LV_PORT_FBDEV_DEFAULT_DEVICEPATH;
+ }
+
+ LV_LOG_INFO("fbdev %s opening", device_path);
+
+ state.fd = open(device_path, O_RDWR);
+ if (state.fd < 0)
+ {
+ LV_LOG_ERROR("fbdev %s open failed: %d", device_path, errno);
+ return NULL;
+ }
+
+ /* Get the characteristics of the framebuffer */
+
+ ret = ioctl(state.fd, FBIOGET_VIDEOINFO,
+ (unsigned long)((uintptr_t)&state.vinfo));
+ if (ret < 0)
+ {
+ LV_LOG_ERROR("ioctl(FBIOGET_VIDEOINFO) failed: %d", errno);
+ close(state.fd);
+ return NULL;
+ }
+
+ LV_LOG_INFO("VideoInfo:");
+ LV_LOG_INFO(" fmt: %u", state.vinfo.fmt);
+ LV_LOG_INFO(" xres: %u", state.vinfo.xres);
+ LV_LOG_INFO(" yres: %u", state.vinfo.yres);
+ LV_LOG_INFO(" nplanes: %u", state.vinfo.nplanes);
+
+ ret = fbdev_get_pinfo(state.fd, &state.pinfo);
+
+ if (ret < 0)
+ {
+ close(state.fd);
+ return NULL;
+ }
+
+ /* Check color depth */
+
+ if (!(state.pinfo.bpp == LV_COLOR_DEPTH ||
+ (state.pinfo.bpp == 24 && LV_COLOR_DEPTH == 32)))
+ {
+ LV_LOG_ERROR("fbdev bpp = %d, LV_COLOR_DEPTH = %d, "
+ "color depth does not match.",
+ state.pinfo.bpp, LV_COLOR_DEPTH);
+ close(state.fd);
+ return NULL;
+ }
+
+ state.double_buffer = (state.pinfo.yres_virtual == (state.vinfo.yres * 2));
+
+ /* mmap() the framebuffer.
+ *
+ * NOTE: In the FLAT build the frame buffer address returned by the
+ * FBIOGET_PLANEINFO IOCTL command will be the same as the framebuffer
+ * address. mmap(), however, is the preferred way to get the framebuffer
+ * address because in the KERNEL build, it will perform the necessary
+ * address mapping to make the memory accessible to the application.
+ */
+
+ state.fbmem = mmap(NULL, state.pinfo.fblen, PROT_READ | PROT_WRITE,
+ MAP_SHARED | MAP_FILE, state.fd, 0);
+ if (state.fbmem == MAP_FAILED)
+ {
+ LV_LOG_ERROR("ioctl(FBIOGET_PLANEINFO) failed: %d", errno);
+ close(state.fd);
+ return NULL;
+ }
+
+ LV_LOG_INFO("Mapped FB: %p", state.fbmem);
+
+ if (state.double_buffer)
+ {
+ state.fbmem2_yoffset = state.vinfo.yres;
+ }
+ else
+ {
+ fbdev_try_init_fbmem2(&state);
+ }
+
+ disp = fbdev_init(&state);
+
+ if (!disp)
+ {
+ munmap(state.fbmem, state.pinfo.fblen);
+ close(state.fd);
+ return NULL;
+ }
+
+ return disp;
+}
diff --git a/graphics/lvgl/lv_fs_interface.h b/graphics/lvgl/port/lv_port_fbdev.h
similarity index 72%
copy from graphics/lvgl/lv_fs_interface.h
copy to graphics/lvgl/port/lv_port_fbdev.h
index a02558ef7..8bb47c353 100644
--- a/graphics/lvgl/lv_fs_interface.h
+++ b/graphics/lvgl/port/lv_port_fbdev.h
@@ -1,5 +1,5 @@
/****************************************************************************
- * apps/graphics/lvgl/lv_fs_interface.h
+ * apps/graphics/lvgl/port/lv_port_fbdev.h
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
@@ -18,8 +18,8 @@
*
****************************************************************************/
-#ifndef __APPS_GRAPHICS_LVGL_LV_FS_INTERFACE_H
-#define __APPS_GRAPHICS_LVGL_LV_FS_INTERFACE_H
+#ifndef __APPS_GRAPHICS_LVGL_PORT_LV_PORT_FBDEV_H
+#define __APPS_GRAPHICS_LVGL_PORT_LV_PORT_FBDEV_H
/****************************************************************************
* Included Files
@@ -32,7 +32,7 @@
* Pre-processor Definitions
****************************************************************************/
-#if LV_USE_FILESYSTEM
+#if defined(CONFIG_LV_PORT_USE_FBDEV)
/****************************************************************************
* Type Definitions
@@ -54,13 +54,27 @@ extern "C"
* Public Function Prototypes
****************************************************************************/
-void lv_fs_interface_init(void);
+/****************************************************************************
+ * Name: lv_port_fbdev_init
+ *
+ * Description:
+ * Framebuffer device interface initialization.
+ *
+ * Input Parameters:
+ * dev_path - Framebuffer device path, set to NULL to use the default path.
+ *
+ * Returned Value:
+ * lv_disp object address on success; NULL on failure.
+ *
+ ****************************************************************************/
+
+FAR lv_disp_t *lv_port_fbdev_init(FAR const char *dev_path);
#undef EXTERN
#ifdef __cplusplus
}
#endif
-#endif /* LV_USE_FILESYSTEM */
+#endif /* CONFIG_LV_PORT_USE_FBDEV */
-#endif /* __APPS_GRAPHICS_LVGL_LV_FS_INTERFACE_H */
+#endif /* __APPS_GRAPHICS_LVGL_PORT_LV_PORT_FBDEV_H */
diff --git a/graphics/lvgl/port/lv_port_keypad.c b/graphics/lvgl/port/lv_port_keypad.c
new file mode 100644
index 000000000..f45099ca5
--- /dev/null
+++ b/graphics/lvgl/port/lv_port_keypad.c
@@ -0,0 +1,251 @@
+/****************************************************************************
+ * apps/graphics/lvgl/port/lv_port_keypad.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership. The
+ * ASF licenses this file to you 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.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <debug.h>
+#include <nuttx/input/buttons.h>
+#include "lv_port_keypad.h"
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+#define LV_KEY_UP_MAP_BIT CONFIG_LV_PORT_KEYPAD_KEY_UP_MAP_BIT
+#define LV_KEY_DOWN_MAP_BIT CONFIG_LV_PORT_KEYPAD_KEY_DOWN_MAP_BIT
+#define LV_KEY_RIGHT_MAP_BIT CONFIG_LV_PORT_KEYPAD_KEY_RIGHT_MAP_BIT
+#define LV_KEY_LEFT_MAP_BIT CONFIG_LV_PORT_KEYPAD_KEY_LEFT_MAP_BIT
+
+#define LV_KEY_ESC_MAP_BIT CONFIG_LV_PORT_KEYPAD_KEY_ESC_MAP_BIT
+#define LV_KEY_DEL_MAP_BIT CONFIG_LV_PORT_KEYPAD_KEY_DEL_MAP_BIT
+#define LV_KEY_BACKSPACE_MAP_BIT CONFIG_LV_PORT_KEYPAD_KEY_BACKSPACE_MAP_BIT
+#define LV_KEY_ENTER_MAP_BIT CONFIG_LV_PORT_KEYPAD_KEY_ENTER_MAP_BIT
+
+#define LV_KEY_NEXT_MAP_BIT CONFIG_LV_PORT_KEYPAD_KEY_NEXT_MAP_BIT
+#define LV_KEY_PREV_MAP_BIT CONFIG_LV_PORT_KEYPAD_KEY_PREV_MAP_BIT
+#define LV_KEY_HOME_MAP_BIT CONFIG_LV_PORT_KEYPAD_KEY_HOME_MAP_BIT
+#define LV_KEY_END_MAP_BIT CONFIG_LV_PORT_KEYPAD_KEY_END_MAP_BIT
+
+/****************************************************************************
+ * Private Type Declarations
+ ****************************************************************************/
+
+struct keypad_map_s
+{
+ const lv_key_t key;
+ int bit;
+};
+
+struct keypad_obj_s
+{
+ int fd;
+ uint32_t last_key;
+ lv_indev_drv_t indev_drv;
+};
+
+/****************************************************************************
+ * Private Function Prototypes
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+static const struct keypad_map_s g_keypad_map[] =
+{
+ {LV_KEY_UP, LV_KEY_UP_MAP_BIT},
+ {LV_KEY_DOWN, LV_KEY_DOWN_MAP_BIT},
+ {LV_KEY_RIGHT, LV_KEY_RIGHT_MAP_BIT},
+ {LV_KEY_LEFT, LV_KEY_LEFT_MAP_BIT},
+ {LV_KEY_ESC, LV_KEY_ESC_MAP_BIT},
+ {LV_KEY_DEL, LV_KEY_DEL_MAP_BIT},
+ {LV_KEY_BACKSPACE, LV_KEY_BACKSPACE_MAP_BIT},
+ {LV_KEY_ENTER, LV_KEY_ENTER_MAP_BIT},
+ {LV_KEY_NEXT, LV_KEY_NEXT_MAP_BIT},
+ {LV_KEY_PREV, LV_KEY_PREV_MAP_BIT},
+ {LV_KEY_HOME, LV_KEY_HOME_MAP_BIT},
+ {LV_KEY_END, LV_KEY_END_MAP_BIT}
+};
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: keypad_get_key
+ ****************************************************************************/
+
+static uint32_t keypad_get_key(int fd)
+{
+ uint32_t act_key = 0;
+ btn_buttonset_t buttonset;
+ const int buttonset_bits = sizeof(btn_buttonset_t) * 8;
+ int i;
+
+ int ret = read(fd, &buttonset, sizeof(btn_buttonset_t));
+ if (ret < 0)
+ {
+ return 0;
+ }
+
+ for (i = 0; i < sizeof(g_keypad_map) / sizeof(struct keypad_map_s); i++)
+ {
+ int bit = g_keypad_map[i].bit;
+
+ if (bit >= 0 && bit < buttonset_bits)
+ {
+ btn_buttonset_t mask = (btn_buttonset_t)(1 << bit);
+ if ((buttonset & mask) != 0)
+ {
+ act_key = g_keypad_map[i].key;
+ break;
+ }
+ }
+ }
+
+ return act_key;
+}
+
+/****************************************************************************
+ * Name: keypad_read
+ ****************************************************************************/
+
+static void keypad_read(FAR lv_indev_drv_t *drv, FAR lv_indev_data_t *data)
+{
+ FAR struct keypad_obj_s *keypad_obj = drv->user_data;
+
+ /* Get whether the a key is pressed and save the pressed key */
+
+ uint32_t act_key = keypad_get_key(keypad_obj->fd);
+
+ if (act_key != 0)
+ {
+ data->state = LV_INDEV_STATE_PR;
+ keypad_obj->last_key = act_key;
+ }
+ else
+ {
+ data->state = LV_INDEV_STATE_REL;
+ }
+
+ data->key = keypad_obj->last_key;
+}
+
+/****************************************************************************
+ * Name: keypad_init
+ ****************************************************************************/
+
+static FAR lv_indev_t *keypad_init(int fd)
+{
+ FAR struct keypad_obj_s *keypad_obj;
+ keypad_obj = malloc(sizeof(struct keypad_obj_s));
+
+ if (keypad_obj == NULL)
+ {
+ LV_LOG_ERROR("keypad_obj_s malloc failed");
+ return NULL;
+ }
+
+ keypad_obj->fd = fd;
+ keypad_obj->last_key = 0;
+
+ /* Register a keypad input device */
+
+ lv_indev_drv_init(&(keypad_obj->indev_drv));
+ keypad_obj->indev_drv.type = LV_INDEV_TYPE_KEYPAD;
+ keypad_obj->indev_drv.read_cb = keypad_read;
+#if ( LV_USE_USER_DATA != 0 )
+ keypad_obj->indev_drv.user_data = keypad_obj;
+#else
+#error LV_USE_USER_DATA must be enabled
+#endif
+ return lv_indev_drv_register(&(keypad_obj->indev_drv));
+}
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: lv_port_keypad_init
+ *
+ * Description:
+ * Keypad interface initialization.
+ *
+ * Input Parameters:
+ * dev_path - input device path, set to NULL to use the default path
+ *
+ * Returned Value:
+ * lv_indev object address on success; NULL on failure.
+ *
+ ****************************************************************************/
+
+FAR lv_indev_t *lv_port_keypad_init(FAR const char *dev_path)
+{
+ FAR const char *device_path = dev_path;
+ FAR lv_indev_t *indev;
+ int fd;
+ int ret;
+ btn_buttonset_t supported;
+
+ if (device_path == NULL)
+ {
+ device_path = CONFIG_LV_PORT_KEYPAD_DEFAULT_DEVICEPATH;
+ }
+
+ LV_LOG_INFO("keypad %s opening", device_path);
+ fd = open(device_path, O_RDONLY | O_NONBLOCK);
+ if (fd < 0)
+ {
+ LV_LOG_ERROR("keypad %s open failed: %d", device_path, errno);
+ return NULL;
+ }
+
+ /* Get the set of BUTTONs supported */
+
+ ret = ioctl(fd, BTNIOC_SUPPORTED,
+ (unsigned long)((uintptr_t)&supported));
+ if (ret < 0)
+ {
+ LV_LOG_ERROR("button ioctl(BTNIOC_SUPPORTED) failed: %d",
+ errno);
+ return NULL;
+ }
+
+ LV_LOG_INFO("button supported BUTTONs 0x%08x", (unsigned int)supported);
+
+ indev = keypad_init(fd);
+
+ if (indev == NULL)
+ {
+ close(fd);
+ }
+
+ return indev;
+}
diff --git a/graphics/lvgl/lv_fs_interface.h b/graphics/lvgl/port/lv_port_keypad.h
similarity index 76%
copy from graphics/lvgl/lv_fs_interface.h
copy to graphics/lvgl/port/lv_port_keypad.h
index a02558ef7..d7be5158a 100644
--- a/graphics/lvgl/lv_fs_interface.h
+++ b/graphics/lvgl/port/lv_port_keypad.h
@@ -1,5 +1,5 @@
/****************************************************************************
- * apps/graphics/lvgl/lv_fs_interface.h
+ * apps/graphics/lvgl/port/lv_port_keypad.h
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
@@ -18,8 +18,8 @@
*
****************************************************************************/
-#ifndef __APPS_GRAPHICS_LVGL_LV_FS_INTERFACE_H
-#define __APPS_GRAPHICS_LVGL_LV_FS_INTERFACE_H
+#ifndef __APPS_GRAPHICS_LVGL_PORT_LV_PORT_KEYPAD_H
+#define __APPS_GRAPHICS_LVGL_PORT_LV_PORT_KEYPAD_H
/****************************************************************************
* Included Files
@@ -32,7 +32,7 @@
* Pre-processor Definitions
****************************************************************************/
-#if LV_USE_FILESYSTEM
+#if defined(CONFIG_LV_PORT_USE_KEYPAD)
/****************************************************************************
* Type Definitions
@@ -51,16 +51,26 @@ extern "C"
#endif
/****************************************************************************
- * Public Function Prototypes
+ * Name: lv_port_keypad_init
+ *
+ * Description:
+ * Keypad interface initialization.
+ *
+ * Input Parameters:
+ * dev_path - input device path, set to NULL to use the default path
+ *
+ * Returned Value:
+ * lv_indev object address on success; NULL on failure.
+ *
****************************************************************************/
-void lv_fs_interface_init(void);
+FAR lv_indev_t *lv_port_keypad_init(FAR const char *dev_path);
#undef EXTERN
#ifdef __cplusplus
}
#endif
-#endif /* LV_USE_FILESYSTEM */
+#endif /* CONFIG_LV_PORT_USE_KEYPAD */
-#endif /* __APPS_GRAPHICS_LVGL_LV_FS_INTERFACE_H */
+#endif /* __APPS_GRAPHICS_LVGL_PORT_LV_PORT_KEYPAD_H */
diff --git a/graphics/lvgl/port/lv_port_lcddev.c b/graphics/lvgl/port/lv_port_lcddev.c
new file mode 100644
index 000000000..689a5d200
--- /dev/null
+++ b/graphics/lvgl/port/lv_port_lcddev.c
@@ -0,0 +1,302 @@
+/****************************************************************************
+ * apps/graphics/lvgl/port/lv_port_lcddev.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership. The
+ * ASF licenses this file to you 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.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+#include <nuttx/lcd/lcd_dev.h>
+#include <sys/ioctl.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <pthread.h>
+#include <semaphore.h>
+#include "lv_port_lcddev.h"
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Type Declarations
+ ****************************************************************************/
+
+struct lcddev_obj_s
+{
+ int fd;
+ lv_disp_draw_buf_t disp_draw_buf;
+ lv_disp_drv_t disp_drv;
+ struct lcddev_area_s area;
+
+ pthread_t write_thread;
+ sem_t flush_sem;
+ sem_t wait_sem;
+};
+
+/****************************************************************************
+ * Public Data
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: lcddev_wait
+ ****************************************************************************/
+
+static void lcddev_wait(FAR lv_disp_drv_t *disp_drv)
+{
+ FAR struct lcddev_obj_s *lcddev_obj = disp_drv->user_data;
+
+ sem_wait(&(lcddev_obj->wait_sem));
+
+ /* Tell the flushing is ready */
+
+ lv_disp_flush_ready(disp_drv);
+}
+
+/****************************************************************************
+ * Name: lcddev_update_thread
+ ****************************************************************************/
+
+static FAR void *lcddev_update_thread(FAR void *arg)
+{
+ int ret = OK;
+ int errcode = 0;
+ FAR struct lcddev_obj_s *lcddev_obj = arg;
+
+ while (ret == OK)
+ {
+ sem_wait(&lcddev_obj->flush_sem);
+
+ ret = ioctl(lcddev_obj->fd, LCDDEVIO_PUTAREA,
+ (unsigned long)&(lcddev_obj->area));
+ if (ret < 0)
+ {
+ errcode = errno;
+ }
+
+ sem_post(&lcddev_obj->wait_sem);
+ }
+
+ LV_LOG_ERROR("ioctl(LCDDEVIO_PUTAREA) failed: %d", errcode);
+ close(lcddev_obj->fd);
+ lcddev_obj->fd = -1;
+
+ return NULL;
+}
+
+/****************************************************************************
+ * Name: lcddev_flush
+ ****************************************************************************/
+
+static void lcddev_flush(FAR lv_disp_drv_t *disp_drv,
+ FAR const lv_area_t *area_p,
+ FAR lv_color_t *color_p)
+{
+ FAR struct lcddev_obj_s *lcddev_obj = disp_drv->user_data;
+
+ lcddev_obj->area.row_start = area_p->y1;
+ lcddev_obj->area.row_end = area_p->y2;
+ lcddev_obj->area.col_start = area_p->x1;
+ lcddev_obj->area.col_end = area_p->x2;
+ lcddev_obj->area.data = (FAR uint8_t *)color_p;
+
+ sem_post(&lcddev_obj->flush_sem);
+}
+
+/****************************************************************************
+ * Name: lcddev_init
+ ****************************************************************************/
+
+static FAR lv_disp_t *lcddev_init(int fd,
+ int hor_res,
+ int ver_res,
+ int line_buf)
+{
+ FAR lv_color_t *buf1 = NULL;
+ FAR lv_color_t *buf2 = NULL;
+ FAR struct lcddev_obj_s *lcddev_obj;
+ const size_t buf_size = hor_res * line_buf * sizeof(lv_color_t);
+ lcddev_obj = malloc(sizeof(struct lcddev_obj_s));
+
+ if (lcddev_obj == NULL)
+ {
+ LV_LOG_ERROR("lcddev_obj_s malloc failed");
+ return NULL;
+ }
+
+ buf1 = malloc(buf_size);
+ if (buf1 == NULL)
+ {
+ LV_LOG_ERROR("display buf1 malloc failed");
+ free(lcddev_obj);
+ return NULL;
+ }
+
+#ifdef CONFIG_LV_PORT_LCDDEV_DOUBLE_BUFFER
+ buf2 = malloc(buf_size);
+ if (buf2 == NULL)
+ {
+ LV_LOG_ERROR("display buf2 malloc failed");
+ free(lcddev_obj);
+ free(buf1);
+ return NULL;
+ }
+#endif
+
+ LV_LOG_INFO("display buffer malloc success, buf size = %lu", buf_size);
+
+ lcddev_obj->fd = fd;
+
+ lv_disp_draw_buf_init(&(lcddev_obj->disp_draw_buf), buf1, buf2,
+ hor_res * line_buf);
+
+ lv_disp_drv_init(&(lcddev_obj->disp_drv));
+ lcddev_obj->disp_drv.flush_cb = lcddev_flush;
+ lcddev_obj->disp_drv.draw_buf = &(lcddev_obj->disp_draw_buf);
+ lcddev_obj->disp_drv.hor_res = hor_res;
+ lcddev_obj->disp_drv.ver_res = ver_res;
+ lcddev_obj->disp_drv.screen_transp = false;
+#if ( LV_USE_USER_DATA != 0 )
+ lcddev_obj->disp_drv.user_data = lcddev_obj;
+#else
+#error LV_USE_USER_DATA must be enabled
+#endif
+ lcddev_obj->disp_drv.wait_cb = lcddev_wait;
+
+ /* Initialize the mutexes for buffer flushing synchronization */
+
+ sem_init(&lcddev_obj->flush_sem, 0, 0);
+ sem_init(&lcddev_obj->wait_sem, 0, 0);
+
+ /* Initialize the buffer flushing thread */
+
+ pthread_create(&(lcddev_obj->write_thread), NULL,
+ lcddev_update_thread, lcddev_obj);
+
+ return lv_disp_drv_register(&(lcddev_obj->disp_drv));
+}
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: lv_port_lcddev_init
+ *
+ * Description:
+ * Lcd interface initialization.
+ *
+ * Input Parameters:
+ * dev_path - lcd device path, set to NULL to use the default path
+ * line_buf - Number of line buffers,
+ * set to 0 to use the default line buffer
+ *
+ * Returned Value:
+ * lv_disp object address on success; NULL on failure.
+ *
+ ****************************************************************************/
+
+FAR lv_disp_t *lv_port_lcddev_init(FAR const char *dev_path, int line_buf)
+{
+ FAR const char *device_path = dev_path;
+ int line_buffer = line_buf;
+ int fd;
+ int ret;
+ FAR lv_disp_t *disp;
+
+ struct fb_videoinfo_s vinfo;
+ struct lcd_planeinfo_s pinfo;
+
+ if (device_path == NULL)
+ {
+ device_path = CONFIG_LV_PORT_LCDDEV_DEFAULT_DEVICEPATH;
+ }
+
+ LV_LOG_INFO("lcddev %s opening", device_path);
+ fd = open(device_path, 0);
+ if (fd < 0)
+ {
+ LV_LOG_ERROR("lcddev open failed: %d", errno);
+ return NULL;
+ }
+
+ LV_LOG_INFO("lcddev %s open success", device_path);
+
+ ret = ioctl(fd, LCDDEVIO_GETVIDEOINFO,
+ (unsigned long)((uintptr_t)&vinfo));
+ if (ret < 0)
+ {
+ LV_LOG_ERROR("ioctl(LCDDEVIO_GETVIDEOINFO) failed: %d", errno);
+ close(fd);
+ return NULL;
+ }
+
+ LV_LOG_INFO("VideoInfo:");
+ LV_LOG_INFO(" fmt: %u", vinfo.fmt);
+ LV_LOG_INFO(" xres: %u", vinfo.xres);
+ LV_LOG_INFO(" yres: %u", vinfo.yres);
+ LV_LOG_INFO(" nplanes: %u", vinfo.nplanes);
+
+ ret = ioctl(fd, LCDDEVIO_GETPLANEINFO,
+ (unsigned long)((uintptr_t)&pinfo));
+ if (ret < 0)
+ {
+ LV_LOG_ERROR("ERROR: ioctl(LCDDEVIO_GETPLANEINFO) failed: %d",
+ errno);
+ close(fd);
+ return NULL;
+ }
+
+ LV_LOG_INFO("PlaneInfo:");
+ LV_LOG_INFO(" bpp: %u", pinfo.bpp);
+
+ if (pinfo.bpp != LV_COLOR_DEPTH)
+ {
+ LV_LOG_ERROR("lcddev bpp = %d, LV_COLOR_DEPTH = %d,"
+ " color depth does not match", pinfo.bpp, LV_COLOR_DEPTH);
+ close(fd);
+ return NULL;
+ }
+
+#ifdef CONFIG_LV_PORT_LCDDEV_FULL_SCREEN_BUFFER
+ line_buffer = vinfo.yres;
+#else
+ if (line_buffer <= 0)
+ {
+ line_buffer = CONFIG_LV_PORT_LCDDEV_LINE_BUFFER_DEFAULT;
+ }
+#endif
+
+ disp = lcddev_init(fd, vinfo.xres, vinfo.yres,
+ line_buffer);
+ if (disp == NULL)
+ {
+ close(fd);
+ }
+
+ return disp;
+}
diff --git a/graphics/lvgl/lv_fs_interface.h b/graphics/lvgl/port/lv_port_lcddev.h
similarity index 70%
copy from graphics/lvgl/lv_fs_interface.h
copy to graphics/lvgl/port/lv_port_lcddev.h
index a02558ef7..82efa6c65 100644
--- a/graphics/lvgl/lv_fs_interface.h
+++ b/graphics/lvgl/port/lv_port_lcddev.h
@@ -1,5 +1,5 @@
/****************************************************************************
- * apps/graphics/lvgl/lv_fs_interface.h
+ * apps/graphics/lvgl/port/lv_port_lcddev.h
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
@@ -18,8 +18,8 @@
*
****************************************************************************/
-#ifndef __APPS_GRAPHICS_LVGL_LV_FS_INTERFACE_H
-#define __APPS_GRAPHICS_LVGL_LV_FS_INTERFACE_H
+#ifndef __APPS_GRAPHICS_LVGL_PORT_LV_PORT_LCDDEV_H
+#define __APPS_GRAPHICS_LVGL_PORT_LV_PORT_LCDDEV_H
/****************************************************************************
* Included Files
@@ -32,7 +32,7 @@
* Pre-processor Definitions
****************************************************************************/
-#if LV_USE_FILESYSTEM
+#if defined(CONFIG_LV_PORT_USE_LCDDEV)
/****************************************************************************
* Type Definitions
@@ -54,13 +54,29 @@ extern "C"
* Public Function Prototypes
****************************************************************************/
-void lv_fs_interface_init(void);
+/****************************************************************************
+ * Name: lv_port_lcddev_init
+ *
+ * Description:
+ * lcddev interface initialization.
+ *
+ * Input Parameters:
+ * dev_path - lcd device path, set to NULL to use the default path
+ * line_buf - Number of line buffers,
+ * set to 0 to use the default line buffer
+ *
+ * Returned Value:
+ * lv_disp object address on success; NULL on failure.
+ *
+ ****************************************************************************/
+
+FAR lv_disp_t *lv_port_lcddev_init(FAR const char *dev_path, int line_buf);
#undef EXTERN
#ifdef __cplusplus
}
#endif
-#endif /* LV_USE_FILESYSTEM */
+#endif /* CONFIG_LV_PORT_USE_LCDDEV */
-#endif /* __APPS_GRAPHICS_LVGL_LV_FS_INTERFACE_H */
+#endif /* __APPS_GRAPHICS_LVGL_PORT_LV_PORT_LCDDEV_H */
diff --git a/graphics/lvgl/port/lv_port_mem.c b/graphics/lvgl/port/lv_port_mem.c
new file mode 100644
index 000000000..73308a1fb
--- /dev/null
+++ b/graphics/lvgl/port/lv_port_mem.c
@@ -0,0 +1,173 @@
+/****************************************************************************
+ * apps/graphics/lvgl/port/lv_port_mem.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership. The
+ * ASF licenses this file to you 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.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/mm/mm.h>
+#include "lv_port_mem.h"
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Type Declarations
+ ****************************************************************************/
+
+typedef CODE void *(*malloc_func_t)(FAR struct mm_heap_s *heap, size_t size);
+typedef CODE void *(*realloc_func_t)(FAR struct mm_heap_s *heap,
+ FAR void *oldmem, size_t size);
+typedef CODE void *(*memalign_func_t)(FAR struct mm_heap_s *heap,
+ size_t alignment, size_t size);
+
+/****************************************************************************
+ * Private Function Prototypes
+ ****************************************************************************/
+
+static FAR void *malloc_first(FAR struct mm_heap_s *heap, size_t size);
+static FAR void *realloc_first(FAR struct mm_heap_s *heap,
+ FAR void *oldmem, size_t size);
+static FAR void *memalign_first(FAR struct mm_heap_s *heap,
+ size_t alignment, size_t size);
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+static FAR struct mm_heap_s *g_lv_heap = NULL;
+static malloc_func_t g_malloc_func = malloc_first;
+static realloc_func_t g_realloc_func = realloc_first;
+static memalign_func_t g_memalign_func = memalign_first;
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: lv_port_mem_init
+ *
+ * Description:
+ * Memory interface initialization.
+ *
+ ****************************************************************************/
+
+static void lv_port_mem_init(void)
+{
+ static uint32_t heap_buf[CONFIG_LV_PORT_MEM_CUSTOM_SIZE
+ * 1024 / sizeof(uint32_t)];
+ g_lv_heap = mm_initialize(CONFIG_LV_PORT_MEM_CUSTOM_NAME,
+ heap_buf, sizeof(heap_buf));
+ LV_ASSERT_NULL(g_lv_heap);
+ if (g_lv_heap == NULL)
+ {
+ LV_LOG_ERROR("NO memory for "
+ CONFIG_LV_PORT_MEM_CUSTOM_NAME
+ " heap");
+ }
+}
+
+/****************************************************************************
+ * Name: malloc_first
+ ****************************************************************************/
+
+static FAR void *malloc_first(FAR struct mm_heap_s *heap, size_t size)
+{
+ if (g_lv_heap == NULL)
+ {
+ lv_port_mem_init();
+ }
+
+ g_malloc_func = mm_malloc;
+ return g_malloc_func(g_lv_heap, size);
+}
+
+/****************************************************************************
+ * Name: realloc_first
+ ****************************************************************************/
+
+static FAR void *realloc_first(FAR struct mm_heap_s *heap,
+ FAR void *oldmem, size_t size)
+{
+ if (g_lv_heap == NULL)
+ {
+ lv_port_mem_init();
+ }
+
+ g_realloc_func = mm_realloc;
+ return g_realloc_func(g_lv_heap, oldmem, size);
+}
+
+/****************************************************************************
+ * Name: memalign_first
+ ****************************************************************************/
+
+static FAR void *memalign_first(FAR struct mm_heap_s *heap,
+ size_t alignment, size_t size)
+{
+ if (g_lv_heap == NULL)
+ {
+ lv_port_mem_init();
+ }
+
+ g_memalign_func = mm_memalign;
+ return g_memalign_func(g_lv_heap, alignment, size);
+}
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: lv_port_mem_alloc
+ ****************************************************************************/
+
+FAR void *lv_port_mem_alloc(size_t size)
+{
+ return g_malloc_func(g_lv_heap, size);
+}
+
+/****************************************************************************
+ * Name: lv_port_mem_free
+ ****************************************************************************/
+
+void lv_port_mem_free(FAR void *mem)
+{
+ mm_free(g_lv_heap, mem);
+}
+
+/****************************************************************************
+ * Name: lv_port_mem_realloc
+ ****************************************************************************/
+
+FAR void *lv_port_mem_realloc(FAR void *oldmem, size_t size)
+{
+ return g_realloc_func(g_lv_heap, oldmem, size);
+}
+
+/****************************************************************************
+ * Name: lv_mem_custom_memalign
+ ****************************************************************************/
+
+FAR void *lv_mem_custom_memalign(size_t alignment, size_t size)
+{
+ return g_memalign_func(g_lv_heap, alignment, size);
+}
diff --git a/graphics/lvgl/lv_tick_interface.c b/graphics/lvgl/port/lv_port_mem.h
similarity index 63%
copy from graphics/lvgl/lv_tick_interface.c
copy to graphics/lvgl/port/lv_port_mem.h
index d0757d4db..d6f25fbbd 100644
--- a/graphics/lvgl/lv_tick_interface.c
+++ b/graphics/lvgl/port/lv_port_mem.h
@@ -1,5 +1,5 @@
/****************************************************************************
- * apps/graphics/lvgl/lv_tick_interface.c
+ * apps/graphics/lvgl/port/lv_port_mem.h
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
@@ -18,56 +18,75 @@
*
****************************************************************************/
+#ifndef __APPS_GRAPHICS_LVGL_PORT_LV_PORT_MEM_H
+#define __APPS_GRAPHICS_LVGL_PORT_LV_PORT_MEM_H
+
/****************************************************************************
* Included Files
****************************************************************************/
#include <nuttx/config.h>
-#include <stdio.h>
-#include "lv_tick_interface.h"
+#include <lvgl/lvgl.h>
/****************************************************************************
* Pre-processor Definitions
****************************************************************************/
+#ifndef CONFIG_LV_PORT_MEM_CUSTOM_SIZE
+# define CONFIG_LV_PORT_MEM_CUSTOM_SIZE 0
+#endif
+
+#if CONFIG_LV_PORT_MEM_CUSTOM_SIZE
+
/****************************************************************************
- * Private Type Declarations
+ * Type Definitions
****************************************************************************/
/****************************************************************************
- * Private Function Prototypes
+ * Public Data
****************************************************************************/
+#ifdef __cplusplus
+#define EXTERN extern "C"
+extern "C"
+{
+#else
+#define EXTERN extern
+#endif
+
/****************************************************************************
- * Private Data
+ * Public Function Prototypes
****************************************************************************/
/****************************************************************************
- * Private Functions
+ * Name: lv_port_mem_alloc
****************************************************************************/
+FAR void *lv_port_mem_alloc(size_t size);
+
/****************************************************************************
- * Public Functions
+ * Name: lv_port_mem_free
****************************************************************************/
-uint32_t lv_tick_interface(void)
-{
- static bool first_time = true;
- static struct timeval t0;
-
- if (first_time)
- {
- gettimeofday(&t0, NULL);
- first_time = false;
- return 0;
- }
- else
- {
- struct timeval t;
- struct timeval delta;
-
- gettimeofday(&t, NULL);
- timersub(&t, &t0, &delta);
- return delta.tv_sec * 1000 + delta.tv_usec / 1000;
- }
+void lv_port_mem_free(FAR void *mem);
+
+/****************************************************************************
+ * Name: lv_port_mem_realloc
+ ****************************************************************************/
+
+FAR void *lv_port_mem_realloc(FAR void *oldmem, size_t size);
+
+/****************************************************************************
+ * Name: lv_port_mem_memalign
+ ****************************************************************************/
+
+FAR void *lv_port_mem_memalign(size_t alignment, size_t size);
+
+#undef EXTERN
+#ifdef __cplusplus
}
+#endif
+
+#endif /* CONFIG_LV_PORT_MEM_CUSTOM_SIZE */
+
+#endif /* __APPS_GRAPHICS_LVGL_PORT_LV_PORT_MEM_H */
diff --git a/examples/lvgldemo/fbdev.h b/graphics/lvgl/port/lv_port_syslog.c
similarity index 59%
rename from examples/lvgldemo/fbdev.h
rename to graphics/lvgl/port/lv_port_syslog.c
index d5d8ef7fe..c7a1ca999 100644
--- a/examples/lvgldemo/fbdev.h
+++ b/graphics/lvgl/port/lv_port_syslog.c
@@ -1,5 +1,5 @@
/****************************************************************************
- * apps/examples/lvgldemo/fbdev.h
+ * apps/graphics/lvgl/port/lv_port_syslog.c
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
@@ -18,29 +18,40 @@
*
****************************************************************************/
-#ifndef __APPS_EXAMPLES_LVGLDEMO_FBDEV_H
-#define __APPS_EXAMPLES_LVGLDEMO_FBDEV_H
-
/****************************************************************************
* Included Files
****************************************************************************/
-#include <stdint.h>
#include <lvgl/lvgl.h>
+#include <syslog.h>
+#include "lv_port_syslog.h"
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: syslog_print_cb
+ ****************************************************************************/
-#ifdef __cplusplus
-extern "C"
+static void syslog_print_cb(FAR const char *buf)
{
-#endif
+ syslog(LOG_INFO, "[LVGL] %s", buf);
+}
/****************************************************************************
- * Public Function Prototypes
+ * Public Functions
****************************************************************************/
-int fbdev_init(lv_disp_drv_t *lv_drvr);
+/****************************************************************************
+ * Name: lv_port_syslog_init
+ *
+ * Description:
+ * Syslog interface initialization.
+ *
+ ****************************************************************************/
-#ifdef __cplusplus
+void lv_port_syslog_init(void)
+{
+ lv_log_register_print_cb(syslog_print_cb);
}
-#endif
-
-#endif /* __APPS_EXAMPLES_LVGLDEMO_FBDEV_H */
diff --git a/examples/lvgldemo/tp_cal.h b/graphics/lvgl/port/lv_port_syslog.h
similarity index 54%
rename from examples/lvgldemo/tp_cal.h
rename to graphics/lvgl/port/lv_port_syslog.h
index 409f63223..c4f21a222 100644
--- a/examples/lvgldemo/tp_cal.h
+++ b/graphics/lvgl/port/lv_port_syslog.h
@@ -1,5 +1,5 @@
/****************************************************************************
- * apps/examples/lvgldemo/tp_cal.h
+ * apps/graphics/lvgl/port/lv_port_syslog.h
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
@@ -18,36 +18,56 @@
*
****************************************************************************/
-#ifndef __APPS_EXAMPLES_LVGLDEMO_TP_CAL_H
-#define __APPS_EXAMPLES_LVGLDEMO_TP_CAL_H
+#ifndef __APPS_GRAPHICS_LVGL_PORT_LV_PORT_SYSLOG_H
+#define __APPS_GRAPHICS_LVGL_PORT_LV_PORT_SYSLOG_H
/****************************************************************************
- * Public Function Prototypes
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+#if defined(CONFIG_LV_USE_LOG)
+
+/****************************************************************************
+ * Type Definitions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Data
****************************************************************************/
#ifdef __cplusplus
+#define EXTERN extern "C"
extern "C"
{
+#else
+#define EXTERN extern
#endif
/****************************************************************************
- * Name: tp_cal_create
+ * Public Function Prototypes
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: lv_port_syslog_init
*
* Description:
- * Create a touchpad calibration screen
- *
- * Input Parameters:
- * None
- *
- * Returned Value:
- * None
+ * Syslog interface initialization.
*
****************************************************************************/
-void tp_cal_create(void);
+void lv_port_syslog_init(void);
+#undef EXTERN
#ifdef __cplusplus
}
#endif
-#endif /* __APPS_EXAMPLES_LVGLDEMO_TP_CAL_H */
+#endif /* CONFIG_LV_USE_LOG */
+
+#endif /* __APPS_GRAPHICS_LVGL_PORT_LV_PORT_SYSLOG_H */
diff --git a/graphics/lvgl/lv_tick_interface.c b/graphics/lvgl/port/lv_port_tick.c
similarity index 82%
rename from graphics/lvgl/lv_tick_interface.c
rename to graphics/lvgl/port/lv_port_tick.c
index d0757d4db..659e7c74f 100644
--- a/graphics/lvgl/lv_tick_interface.c
+++ b/graphics/lvgl/port/lv_port_tick.c
@@ -1,5 +1,5 @@
/****************************************************************************
- * apps/graphics/lvgl/lv_tick_interface.c
+ * apps/graphics/lvgl/port/lv_port_tick.c
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
@@ -23,8 +23,8 @@
****************************************************************************/
#include <nuttx/config.h>
-#include <stdio.h>
-#include "lv_tick_interface.h"
+#include <time.h>
+#include "lv_port_tick.h"
/****************************************************************************
* Pre-processor Definitions
@@ -50,24 +50,12 @@
* Public Functions
****************************************************************************/
-uint32_t lv_tick_interface(void)
+uint32_t millis(void)
{
- static bool first_time = true;
- static struct timeval t0;
+ struct timespec ts;
- if (first_time)
- {
- gettimeofday(&t0, NULL);
- first_time = false;
- return 0;
- }
- else
- {
- struct timeval t;
- struct timeval delta;
+ clock_gettime(CLOCK_MONOTONIC, &ts);
+ uint32_t tick = ts.tv_sec * 1000 + ts.tv_nsec / 1000000;
- gettimeofday(&t, NULL);
- timersub(&t, &t0, &delta);
- return delta.tv_sec * 1000 + delta.tv_usec / 1000;
- }
+ return tick;
}
diff --git a/graphics/lvgl/lv_tick_interface.h b/graphics/lvgl/port/lv_port_tick.h
similarity index 89%
rename from graphics/lvgl/lv_tick_interface.h
rename to graphics/lvgl/port/lv_port_tick.h
index 2a9546553..d662481f7 100644
--- a/graphics/lvgl/lv_tick_interface.h
+++ b/graphics/lvgl/port/lv_port_tick.h
@@ -1,5 +1,5 @@
/****************************************************************************
- * apps/graphics/lvgl/lv_tick_interface.h
+ * apps/graphics/lvgl/port/lv_port_tick.h
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
@@ -18,15 +18,14 @@
*
****************************************************************************/
-#ifndef __APPS_GRAPHICS_LV_TICK_INTERFACE_H
-#define __APPS_GRAPHICS_LV_TICK_INTERFACE_H
+#ifndef __APPS_GRAPHICS_LVGL_PORT_LV_PORT_TICK_H
+#define __APPS_GRAPHICS_LVGL_PORT_LV_PORT_TICK_H
/****************************************************************************
* Included Files
****************************************************************************/
#include <nuttx/config.h>
-#include <sys/time.h>
/****************************************************************************
* Pre-processor Definitions
@@ -52,11 +51,11 @@ extern "C"
* Public Function Prototypes
****************************************************************************/
-uint32_t lv_tick_interface(void);
+uint32_t millis(void);
#undef EXTERN
#ifdef __cplusplus
}
#endif
-#endif // __APPS_GRAPHICS_LV_TICK_INTERFACE_H
+#endif /* __APPS_GRAPHICS_LVGL_PORT_LV_PORT_TICK_H */
diff --git a/graphics/lvgl/port/lv_port_touchpad.c b/graphics/lvgl/port/lv_port_touchpad.c
new file mode 100644
index 000000000..c54763f9f
--- /dev/null
+++ b/graphics/lvgl/port/lv_port_touchpad.c
@@ -0,0 +1,178 @@
+/****************************************************************************
+ * apps/graphics/lvgl/port/lv_port_touchpad.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership. The
+ * ASF licenses this file to you 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.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+#include <sys/types.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <debug.h>
+#include <nuttx/input/touchscreen.h>
+#include "lv_port_touchpad.h"
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Type Declarations
+ ****************************************************************************/
+
+struct touchpad_obj_s
+{
+ int fd;
+ lv_coord_t last_x;
+ lv_coord_t last_y;
+ lv_indev_state_t last_state;
+ lv_indev_drv_t indev_drv;
+};
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: touchpad_read
+ ****************************************************************************/
+
+static void touchpad_read(FAR lv_indev_drv_t *drv, FAR lv_indev_data_t *data)
+{
+ FAR struct touchpad_obj_s *touchpad_obj = drv->user_data;
+ struct touch_sample_s sample;
+
+ /* Read one sample */
+
+ int nbytes = read(touchpad_obj->fd, &sample,
+ sizeof(struct touch_sample_s));
+
+ /* Handle unexpected return values */
+
+ if (nbytes == sizeof(struct touch_sample_s))
+ {
+ uint8_t touch_flags = sample.point[0].flags;
+
+ if (touch_flags & TOUCH_DOWN || touch_flags & TOUCH_MOVE)
+ {
+ const FAR lv_disp_drv_t *disp_drv = drv->disp->driver;
+ lv_coord_t ver_max = disp_drv->ver_res - 1;
+ lv_coord_t hor_max = disp_drv->hor_res - 1;
+
+ touchpad_obj->last_x = LV_CLAMP(0, sample.point[0].x, hor_max);
+ touchpad_obj->last_y = LV_CLAMP(0, sample.point[0].y, ver_max);
+ touchpad_obj->last_state = LV_INDEV_STATE_PR;
+ }
+ else if (touch_flags & TOUCH_UP)
+ {
+ touchpad_obj->last_state = LV_INDEV_STATE_REL;
+ }
+ }
+
+ /* Update touchpad data */
+
+ data->point.x = touchpad_obj->last_x;
+ data->point.y = touchpad_obj->last_y;
+ data->state = touchpad_obj->last_state;
+}
+
+/****************************************************************************
+ * Name: touchpad_init
+ ****************************************************************************/
+
+static FAR lv_indev_t *touchpad_init(int fd)
+{
+ FAR struct touchpad_obj_s *touchpad_obj;
+ touchpad_obj = malloc(sizeof(struct touchpad_obj_s));
+
+ if (touchpad_obj == NULL)
+ {
+ LV_LOG_ERROR("touchpad_obj_s malloc failed");
+ return NULL;
+ }
+
+ touchpad_obj->fd = fd;
+ touchpad_obj->last_x = 0;
+ touchpad_obj->last_y = 0;
+ touchpad_obj->last_state = LV_INDEV_STATE_REL;
+
+ lv_indev_drv_init(&(touchpad_obj->indev_drv));
+ touchpad_obj->indev_drv.type = LV_INDEV_TYPE_POINTER;
+ touchpad_obj->indev_drv.read_cb = touchpad_read;
+#if ( LV_USE_USER_DATA != 0 )
+ touchpad_obj->indev_drv.user_data = touchpad_obj;
+#else
+#error LV_USE_USER_DATA must be enabled
+#endif
+ return lv_indev_drv_register(&(touchpad_obj->indev_drv));
+}
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: lv_port_touchpad_init
+ *
+ * Description:
+ * Touchpad interface initialization.
+ *
+ * Input Parameters:
+ * dev_path - input device path, set to NULL to use the default path
+ *
+ * Returned Value:
+ * lv_indev object address on success; NULL on failure.
+ *
+ ****************************************************************************/
+
+FAR lv_indev_t *lv_port_touchpad_init(FAR const char *dev_path)
+{
+ FAR const char *device_path = dev_path;
+ FAR lv_indev_t *indev;
+ int fd;
+
+ if (device_path == NULL)
+ {
+ device_path = CONFIG_LV_PORT_TOUCHPAD_DEFAULT_DEVICEPATH;
+ }
+
+ LV_LOG_INFO("touchpad %s opening", device_path);
+ fd = open(device_path, O_RDONLY | O_NONBLOCK);
+ if (fd < 0)
+ {
+ LV_LOG_ERROR("touchpad %s open failed: %d", device_path, errno);
+ return NULL;
+ }
+
+ LV_LOG_INFO("touchpad %s open success", device_path);
+
+ indev = touchpad_init(fd);
+
+ if (indev == NULL)
+ {
+ close(fd);
+ }
+
+ return indev;
+}
diff --git a/graphics/lvgl/lv_fs_interface.h b/graphics/lvgl/port/lv_port_touchpad.h
similarity index 72%
rename from graphics/lvgl/lv_fs_interface.h
rename to graphics/lvgl/port/lv_port_touchpad.h
index a02558ef7..cbcce2ea8 100644
--- a/graphics/lvgl/lv_fs_interface.h
+++ b/graphics/lvgl/port/lv_port_touchpad.h
@@ -1,5 +1,5 @@
/****************************************************************************
- * apps/graphics/lvgl/lv_fs_interface.h
+ * apps/graphics/lvgl/port/lv_port_touchpad.h
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
@@ -18,8 +18,8 @@
*
****************************************************************************/
-#ifndef __APPS_GRAPHICS_LVGL_LV_FS_INTERFACE_H
-#define __APPS_GRAPHICS_LVGL_LV_FS_INTERFACE_H
+#ifndef __APPS_GRAPHICS_LVGL_PORT_LV_PORT_TOUCHPAD_H
+#define __APPS_GRAPHICS_LVGL_PORT_LV_PORT_TOUCHPAD_H
/****************************************************************************
* Included Files
@@ -32,7 +32,7 @@
* Pre-processor Definitions
****************************************************************************/
-#if LV_USE_FILESYSTEM
+#if defined(CONFIG_LV_PORT_USE_TOUCHPAD)
/****************************************************************************
* Type Definitions
@@ -54,13 +54,27 @@ extern "C"
* Public Function Prototypes
****************************************************************************/
-void lv_fs_interface_init(void);
+/****************************************************************************
+ * Name: lv_port_touchpad_init
+ *
+ * Description:
+ * Touchpad interface initialization.
+ *
+ * Input Parameters:
+ * dev_path - input device path, set to NULL to use the default path
+ *
+ * Returned Value:
+ * lv_indev object address on success; NULL on failure.
+ *
+ ****************************************************************************/
+
+FAR lv_indev_t *lv_port_touchpad_init(FAR const char *dev_path);
#undef EXTERN
#ifdef __cplusplus
}
#endif
-#endif /* LV_USE_FILESYSTEM */
+#endif /* CONFIG_LV_PORT_USE_TOUCHPAD */
-#endif /* __APPS_GRAPHICS_LVGL_LV_FS_INTERFACE_H */
+#endif /* __APPS_GRAPHICS_LVGL_PORT_LV_PORT_TOUCHPAD_H */