You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by GitBox <gi...@apache.org> on 2022/10/08 09:27:17 UTC

[GitHub] [incubator-nuttx-apps] FASTSHIFT opened a new pull request, #1341: LVGL v8 upgrade

FASTSHIFT opened a new pull request, #1341:
URL: https://github.com/apache/incubator-nuttx-apps/pull/1341

   ## Summary
   
   Related discussion: https://github.com/apache/incubator-nuttx-apps/issues/1322
   
   ## Impact
   
   Apps based on LVGL v7 will not work.
   
   ## Testing
   
   Daily test.
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@nuttx.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [incubator-nuttx-apps] xiaoxiang781216 commented on a diff in pull request #1341: LVGL v8 upgrade

Posted by GitBox <gi...@apache.org>.
xiaoxiang781216 commented on code in PR #1341:
URL: https://github.com/apache/incubator-nuttx-apps/pull/1341#discussion_r992631794


##########
graphics/lvgl/lv_conf/Kconfig:
##########
@@ -0,0 +1,1110 @@
+# Kconfig file for LVGL v8.0
+
+menu "LVGL configuration"

Review Comment:
   @FASTSHIFT let's change space to tab and upstream to lvgl.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@nuttx.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [incubator-nuttx-apps] xiaoxiang781216 commented on a diff in pull request #1341: LVGL v8 upgrade

Posted by GitBox <gi...@apache.org>.
xiaoxiang781216 commented on code in PR #1341:
URL: https://github.com/apache/incubator-nuttx-apps/pull/1341#discussion_r990637458


##########
graphics/lvgl/Make.defs:
##########
@@ -30,7 +30,4 @@ CXXFLAGS += ${shell $(INCDIR) $(INCDIROPT) "$(CC)" $(APPDIR)/graphics/lvgl}
 
 CFLAGS += ${shell $(INCDIR) $(INCDIROPT) "$(CC)" $(APPDIR)/graphics/lvgl/lvgl}

Review Comment:
   let's remove <lvgl.h> style



##########
examples/lvgldemo/Kconfig:
##########
@@ -12,62 +12,8 @@ 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

Review Comment:
   remove the unused option e.g. EXAMPLES_LVGLDEMO_CALIBRATE



##########
examples/lvgldemo/lvgldemo.c:
##########
@@ -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 interface initialization */
 
-  /* Display interface initialization */
+  lv_porting_init();

Review Comment:
   lv_port_init?



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@nuttx.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [incubator-nuttx-apps] pkarashchenko commented on a diff in pull request #1341: LVGL v8 upgrade

Posted by GitBox <gi...@apache.org>.
pkarashchenko commented on code in PR #1341:
URL: https://github.com/apache/incubator-nuttx-apps/pull/1341#discussion_r992691070


##########
graphics/lvgl/port/lv_port_button.c:
##########
@@ -0,0 +1,237 @@
+/****************************************************************************
+ * 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 = 1 << bit;
+
+      if (buttonset & mask)

Review Comment:
   ```suggestion
         if (buttonset & mask != 0)
   ```



##########
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
+ifneq ($(CONFIG_LV_PORT_USE_LCDDEV),)

Review Comment:
   why not `ifeq ($(CONFIG_LV_PORT_USE_LCDDEV),y)`?
   and the same for other similar places here



##########
graphics/lvgl/port/lv_port_button.c:
##########
@@ -0,0 +1,237 @@
+/****************************************************************************
+ * 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 = 1 << bit;
+
+      if (buttonset & mask)
+        {
+          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)
+{
+  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;
+  button_obj = malloc(sizeof(struct button_obj_s));
+  FAR lv_indev_t *indev_button;

Review Comment:
   ```suggestion
     FAR struct button_obj_s *button_obj;
     FAR lv_indev_t *indev_button;
     
       button_obj = malloc(sizeof(struct button_obj_s));
   ```



##########
graphics/lvgl/port/lv_port_fbdev.c:
##########
@@ -0,0 +1,755 @@
+/****************************************************************************
+ * 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)

Review Comment:
   ```suggestion
   #  define FBDEV_UPDATE_AREA(obj, area) fbdev_update_area(obj, area)
   ```



##########
graphics/lvgl/port/lv_port_mem.h:
##########
@@ -0,0 +1,92 @@
+/****************************************************************************
+ * 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
+ * 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_PORT_LV_PORT_MEM_H
+#define __APPS_GRAPHICS_LVGL_PORT_LV_PORT_MEM_H
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+#include <lvgl/lvgl.h>
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+#ifndef CONFIG_LV_PORT_MEM_CUSTOM_SIZE
+#define CONFIG_LV_PORT_MEM_CUSTOM_SIZE 0

Review Comment:
   ```suggestion
   #  define CONFIG_LV_PORT_MEM_CUSTOM_SIZE 0
   ```



##########
graphics/lvgl/port/lv_port_button.c:
##########
@@ -0,0 +1,237 @@
+/****************************************************************************
+ * 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 = 1 << bit;

Review Comment:
   ```suggestion
         btn_buttonset_t mask = (btn_buttonset_t)1 << bit;
   ```



##########
graphics/lvgl/port/lv_port_keypad.c:
##########
@@ -0,0 +1,250 @@
+/****************************************************************************
+ * 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[] =
+{
+  {.key = LV_KEY_UP,        .bit = LV_KEY_UP_MAP_BIT},

Review Comment:
   let not use designated initializer here



##########
graphics/lvgl/port/lv_port_keypad.c:
##########
@@ -0,0 +1,250 @@
+/****************************************************************************
+ * 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[] =
+{
+  {.key = LV_KEY_UP,        .bit = LV_KEY_UP_MAP_BIT},
+  {.key = LV_KEY_DOWN,      .bit = LV_KEY_DOWN_MAP_BIT},
+  {.key = LV_KEY_RIGHT,     .bit = LV_KEY_RIGHT_MAP_BIT},
+  {.key = LV_KEY_LEFT,      .bit = LV_KEY_LEFT_MAP_BIT},
+  {.key = LV_KEY_ESC,       .bit = LV_KEY_ESC_MAP_BIT},
+  {.key = LV_KEY_DEL,       .bit = LV_KEY_DEL_MAP_BIT},
+  {.key = LV_KEY_BACKSPACE, .bit = LV_KEY_BACKSPACE_MAP_BIT},
+  {.key = LV_KEY_ENTER,     .bit = LV_KEY_ENTER_MAP_BIT},
+  {.key = LV_KEY_NEXT,      .bit = LV_KEY_NEXT_MAP_BIT},
+  {.key = LV_KEY_PREV,      .bit = LV_KEY_PREV_MAP_BIT},
+  {.key = LV_KEY_HOME,      .bit = LV_KEY_HOME_MAP_BIT},
+  {.key = LV_KEY_END,       .bit = 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 = 1 << bit;
+          if (buttonset & mask)

Review Comment:
   ```suggestion
             btn_buttonset_t mask = (btn_buttonset_t)1 << bit;
             if (buttonset & mask != 0)
   ```



##########
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)
+{
+  const char *device_path = dev_path;
+  lv_indev_t *indev;

Review Comment:
   ```suggestion
     FAR const char *device_path = dev_path;
     FAR lv_indev_t *indev;
   ```



##########
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)
+{
+  struct lcddev_obj_s *lcddev_obj = disp_drv->user_data;

Review Comment:
   ```suggestion
     FAR struct lcddev_obj_s *lcddev_obj = disp_drv->user_data;
   ```



##########
graphics/lvgl/port/lv_port_keypad.c:
##########
@@ -0,0 +1,250 @@
+/****************************************************************************
+ * 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[] =
+{
+  {.key = LV_KEY_UP,        .bit = LV_KEY_UP_MAP_BIT},
+  {.key = LV_KEY_DOWN,      .bit = LV_KEY_DOWN_MAP_BIT},
+  {.key = LV_KEY_RIGHT,     .bit = LV_KEY_RIGHT_MAP_BIT},
+  {.key = LV_KEY_LEFT,      .bit = LV_KEY_LEFT_MAP_BIT},
+  {.key = LV_KEY_ESC,       .bit = LV_KEY_ESC_MAP_BIT},
+  {.key = LV_KEY_DEL,       .bit = LV_KEY_DEL_MAP_BIT},
+  {.key = LV_KEY_BACKSPACE, .bit = LV_KEY_BACKSPACE_MAP_BIT},
+  {.key = LV_KEY_ENTER,     .bit = LV_KEY_ENTER_MAP_BIT},
+  {.key = LV_KEY_NEXT,      .bit = LV_KEY_NEXT_MAP_BIT},
+  {.key = LV_KEY_PREV,      .bit = LV_KEY_PREV_MAP_BIT},
+  {.key = LV_KEY_HOME,      .bit = LV_KEY_HOME_MAP_BIT},
+  {.key = LV_KEY_END,       .bit = 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 = 1 << bit;
+          if (buttonset & mask)
+            {
+              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)
+{
+  struct keypad_obj_s *keypad_obj = drv->user_data;

Review Comment:
   ```suggestion
     FAR struct keypad_obj_s *keypad_obj = drv->user_data;
   ```



##########
graphics/lvgl/port/lv_port_fbdev.c:
##########
@@ -0,0 +1,755 @@
+/****************************************************************************
+ * 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)

Review Comment:
   ```suggestion
   #  define FBDEV_UPDATE_AREA(obj, area)
   ```



##########
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)
+{
+  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 = (uint8_t *)color_p;
+
+  sem_post(&(lcddev_obj->flush_sem));

Review Comment:
   ```suggestion
     sem_post(&lcddev_obj->flush_sem);
   ```



##########
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
+ifneq ($(CONFIG_LV_PORT_USE_LCDDEV),)
+CSRCS += port/lv_port_lcddev.c
+endif
+
+ifneq ($(CONFIG_LV_PORT_USE_FBDEV),)
+CSRCS += port/lv_port_fbdev.c
+endif
+
+ifneq ($(CONFIG_LV_PORT_USE_TOUCHPAD),)
+CSRCS += port/lv_port_touchpad.c
+endif
+
+ifneq ($(CONFIG_LV_PORT_USE_BUTTON),)
+CSRCS += port/lv_port_button.c
+endif
+
+ifneq ($(CONFIG_LV_PORT_USE_KEYPAD),)
+CSRCS += port/lv_port_keypad.c
+endif
+
+ifneq ($(CONFIG_LV_PORT_USE_ENCODER),)
+CSRCS += port/lv_port_encoder.c
+endif
+
+ifneq ($(CONFIG_LV_PORT_USE_SYSLOG),)
+CSRCS += port/lv_port_syslog.c
+endif
+
+ifneq ($(CONFIG_LV_PORT_MEM_ATTRIBUTE_FAST_MEM_SECTION_NAME), "")
+CFLAGS   += "-DLV_ATTRIBUTE_FAST_MEM=__attribute__((section(CONFIG_LV_PORT_MEM_ATTRIBUTE_FAST_MEM_SECTION_NAME)))"
+CXXFLAGS += "-DLV_ATTRIBUTE_FAST_MEM=__attribute__((section(CONFIG_LV_PORT_MEM_ATTRIBUTE_FAST_MEM_SECTION_NAME)))"

Review Comment:
   ```suggestion
   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)"
   ```
   but most probably code will need to include `nuttx/compiler.h` so I'm not sure if this comment is applicable



##########
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)
+{
+  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 = (uint8_t *)color_p;

Review Comment:
   ```suggestion
     lcddev_obj->area.data = (FAR uint8_t *)color_p;
   ```



##########
graphics/lvgl/port/lv_port_button.c:
##########
@@ -0,0 +1,237 @@
+/****************************************************************************
+ * 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 = 1 << bit;
+
+      if (buttonset & mask)
+        {
+          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)
+{
+  struct button_obj_s *button_obj = drv->user_data;

Review Comment:
   ```suggestion
     FAR struct button_obj_s *button_obj = drv->user_data;
   ```



##########
graphics/lvgl/port/lv_port_keypad.c:
##########
@@ -0,0 +1,250 @@
+/****************************************************************************
+ * 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[] =
+{
+  {.key = LV_KEY_UP,        .bit = LV_KEY_UP_MAP_BIT},
+  {.key = LV_KEY_DOWN,      .bit = LV_KEY_DOWN_MAP_BIT},
+  {.key = LV_KEY_RIGHT,     .bit = LV_KEY_RIGHT_MAP_BIT},
+  {.key = LV_KEY_LEFT,      .bit = LV_KEY_LEFT_MAP_BIT},
+  {.key = LV_KEY_ESC,       .bit = LV_KEY_ESC_MAP_BIT},
+  {.key = LV_KEY_DEL,       .bit = LV_KEY_DEL_MAP_BIT},
+  {.key = LV_KEY_BACKSPACE, .bit = LV_KEY_BACKSPACE_MAP_BIT},
+  {.key = LV_KEY_ENTER,     .bit = LV_KEY_ENTER_MAP_BIT},
+  {.key = LV_KEY_NEXT,      .bit = LV_KEY_NEXT_MAP_BIT},
+  {.key = LV_KEY_PREV,      .bit = LV_KEY_PREV_MAP_BIT},
+  {.key = LV_KEY_HOME,      .bit = LV_KEY_HOME_MAP_BIT},
+  {.key = LV_KEY_END,       .bit = 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 = 1 << bit;
+          if (buttonset & mask)
+            {
+              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)
+{
+  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)

Review Comment:
   ```suggestion
     uint32_t act_key = keypad_get_key(keypad_obj->fd);
   
     if (act_key != 0)
   ```



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@nuttx.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [incubator-nuttx-apps] gustavonihei commented on a diff in pull request #1341: LVGL v8 upgrade

Posted by GitBox <gi...@apache.org>.
gustavonihei commented on code in PR #1341:
URL: https://github.com/apache/incubator-nuttx-apps/pull/1341#discussion_r992235246


##########
graphics/lvgl/lv_conf/Kconfig:
##########
@@ -0,0 +1,1110 @@
+# 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

Review Comment:
   It is indeed referenced in several places:
   ```
   ./graphics/lvgl/lvgl/lv_conf_template.h:#define LV_DEMO_WIDGETS_SLIDESHOW 0
   ./graphics/lvgl/lvgl/demos/widgets/lv_demo_widgets.py:LV_DEMO_WIDGETS_SLIDESHOW = 0
   ./graphics/lvgl/lvgl/demos/widgets/lv_demo_widgets.py:    if LV_DEMO_WIDGETS_SLIDESHOW == 0:
   ./graphics/lvgl/lvgl/demos/widgets/lv_demo_widgets.py:#    if LV_DEMO_WIDGETS_SLIDESHOW:
   ./graphics/lvgl/lvgl/demos/README.md:#define LV_DEMO_WIDGETS_SLIDESHOW  0
   ./graphics/lvgl/lvgl/src/lv_conf_internal.h:#ifndef LV_DEMO_WIDGETS_SLIDESHOW
   ./graphics/lvgl/lvgl/src/lv_conf_internal.h:    #ifdef CONFIG_LV_DEMO_WIDGETS_SLIDESHOW
   ./graphics/lvgl/lvgl/src/lv_conf_internal.h:        #define LV_DEMO_WIDGETS_SLIDESHOW CONFIG_LV_DEMO_WIDGETS_SLIDESHOW
   ./graphics/lvgl/lvgl/src/lv_conf_internal.h:        #define LV_DEMO_WIDGETS_SLIDESHOW 0
   ./graphics/lvgl/lv_conf/Kconfig:        config LV_DEMO_WIDGETS_SLIDESHOW
   ./examples/lvgldemo/lv_demos/src/lv_demo_widgets/lv_demo_widgets.c:#if LV_DEMO_WIDGETS_SLIDESHOW
   ./examples/lvgldemo/lv_demos/src/lv_demo_widgets/lv_demo_widgets.c:#if LV_DEMO_WIDGETS_SLIDESHOW
   ./examples/lvgldemo/lv_demos/src/lv_demo_widgets/lv_demo_widgets.c:#if LV_DEMO_WIDGETS_SLIDESHOW == 0
   ./examples/lvgldemo/lv_demos/src/lv_demo_widgets/lv_demo_widgets.c:#if LV_DEMO_WIDGETS_SLIDESHOW
   ./examples/lvgldemo/lv_demos/src/lv_demo_widgets/lv_demo_widgets.c:#if LV_DEMO_WIDGETS_SLIDESHOW
   ./examples/lvgldemo/lv_demos/lv_ex_conf_templ.h:#define LV_DEMO_WIDGETS_SLIDESHOW  0
   ```



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@nuttx.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [incubator-nuttx-apps] gustavonihei commented on a diff in pull request #1341: LVGL v8 upgrade

Posted by GitBox <gi...@apache.org>.
gustavonihei commented on code in PR #1341:
URL: https://github.com/apache/incubator-nuttx-apps/pull/1341#discussion_r992243438


##########
graphics/lvgl/lv_conf/Kconfig:
##########
@@ -0,0 +1,1110 @@
+# Kconfig file for LVGL v8.0
+
+menu "LVGL configuration"

Review Comment:
   I am not sure if this is a valid argument.
   
   As an example, most of the Kconfig options from the ESP32 family of chips are similar to ESP-IDF's, which also use whitespaces for indentation instead of tabs. Yet, the Kconfig files follow the NuttX style.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@nuttx.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [incubator-nuttx-apps] gustavonihei commented on a diff in pull request #1341: LVGL v8 upgrade

Posted by GitBox <gi...@apache.org>.
gustavonihei commented on code in PR #1341:
URL: https://github.com/apache/incubator-nuttx-apps/pull/1341#discussion_r992247970


##########
graphics/lvgl/lv_conf/Kconfig:
##########
@@ -0,0 +1,1110 @@
+# Kconfig file for LVGL v8.0
+
+menu "LVGL configuration"

Review Comment:
   Taking it to an extreme scenario, suppose that for every third-party project to be included in `apps` that also uses Kconfig, each one follows a different formatting style.
   Can you imagine the mess that the nuttx-apps repository would become?
   
   So I am in favor of creating no exceptions to this.
   Copying the options is already a huge benefit. Adapting to NuttX formatting is a small price to pay for consistency.
   



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@nuttx.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [nuttx-apps] lupyuen commented on pull request #1341: LVGL v8 upgrade

Posted by GitBox <gi...@apache.org>.
lupyuen commented on PR #1341:
URL: https://github.com/apache/nuttx-apps/pull/1341#issuecomment-1374987956

   Hi @FASTSHIFT thanks for adding LVGL 8 support! I have a question: Should we insert `lv_tick_inc()` into the LVGL Task Loop, like this?
   
   From [lvgldemo.c](https://github.com/apache/nuttx-apps/blob/master/examples/lvgldemo/lvgldemo.c#L213-L227):
   
   ```c
     /* Handle LVGL tasks */
     while (1)
       {
         uint32_t idle;
         idle = lv_timer_handler();
   
         /* Minimum sleep of 1ms */
         idle = idle ? idle : 1;
         usleep(idle * 1000);
   
         // Inserted this: Increment LVGL Tick Count by 1 millisecond
         lv_tick_inc(1);
       }
   ```
   
   __Before Adding `lv_tick_inc()`__: When we run `lvgldemo` on PINE64 PinePhone, the app doesn't read touch input from `/dev/input0`.
   
   Also the LVGL Log shows: `It seems lv_tick_inc() is not called`
   
   __After Adding `lv_tick_inc()`__: `lvgldemo` on PinePhone correctly handles the touch input.  [(See this)](https://www.youtube.com/shorts/xE9U5IQPmlg)
   
   I'm not sure if my parameter to `lv_tick_inc()` is correct. Maybe we need to compute the actual elapsed milliseconds using the System Timer? This might help to reduce the lag that we see in the [demo video](https://www.youtube.com/shorts/xE9U5IQPmlg).
   
   Thanks for looking into this :-)
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@nuttx.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [incubator-nuttx-apps] gustavonihei commented on a diff in pull request #1341: LVGL v8 upgrade

Posted by GitBox <gi...@apache.org>.
gustavonihei commented on code in PR #1341:
URL: https://github.com/apache/incubator-nuttx-apps/pull/1341#discussion_r991568049


##########
graphics/lvgl/Kconfig:
##########
@@ -13,481 +13,220 @@ 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
+source "$APPSDIR/graphics/lvgl/lv_conf/Kconfig"
 
-config LV_USE_USER_DATA
-	bool "Use user data in driver and objects"
+config LV_PORT_USE_LCDDEV
+	bool "Enabel LCD device port"

Review Comment:
   ```suggestion
   	bool "Enable LCD device port"
   ```



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@nuttx.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [incubator-nuttx-apps] gustavonihei commented on a diff in pull request #1341: LVGL v8 upgrade

Posted by GitBox <gi...@apache.org>.
gustavonihei commented on code in PR #1341:
URL: https://github.com/apache/incubator-nuttx-apps/pull/1341#discussion_r991568586


##########
graphics/lvgl/lv_conf/Kconfig:
##########
@@ -0,0 +1,1110 @@
+# 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

Review Comment:
   Somehow the slideshow option is not working for the Widgets demo, could you please confirm if this also happens on your side?



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@nuttx.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [incubator-nuttx-apps] FASTSHIFT commented on a diff in pull request #1341: LVGL v8 upgrade

Posted by GitBox <gi...@apache.org>.
FASTSHIFT commented on code in PR #1341:
URL: https://github.com/apache/incubator-nuttx-apps/pull/1341#discussion_r991912457


##########
graphics/lvgl/lv_conf/Kconfig:
##########
@@ -0,0 +1,1110 @@
+# Kconfig file for LVGL v8.0
+
+menu "LVGL configuration"

Review Comment:
   This Kconfig is copied from lvgl: https://github.com/lvgl/lvgl/blob/release/v8.3/Kconfig.
   Prevent failure when executing `tools/configure.sh`. If the user needs to modify the lvgl version, keeping the original format is conducive to file comparison.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@nuttx.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [nuttx-apps] tmedicci commented on a diff in pull request #1341: LVGL v8 upgrade

Posted by GitBox <gi...@apache.org>.
tmedicci commented on code in PR #1341:
URL: https://github.com/apache/nuttx-apps/pull/1341#discussion_r999530953


##########
graphics/lvgl/port/lv_port_fbdev.c:
##########
@@ -0,0 +1,755 @@
+/****************************************************************************
+ * 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 color_match;
+  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_flush_convert
+ ****************************************************************************/
+
+static void fbdev_flush_convert(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 x2 = area_p->x2;
+  int y2 = area_p->y2;
+
+  const uint8_t bpp = fbdev_obj->pinfo.bpp;
+  const fb_coord_t xres = fbdev_obj->vinfo.xres;
+  int x;
+  int y;
+
+  LV_LOG_TRACE("start copy");
+
+  switch (bpp)
+    {
+      case 32:
+      case 24:
+        {
+          FAR uint32_t *fbp = fbdev_obj->act_buffer;
+          for (y = y1; y <= y2; y++)
+            {
+              FAR uint32_t *cur_pos = fbp + (y * xres) + x1;
+              for (x = x1; x <= x2; x++)
+                {
+                  *cur_pos = lv_color_to32(*color_p);
+                  cur_pos++;
+                  color_p++;
+                }
+            }
+        }
+        break;
+      case 16:
+        {
+          FAR uint16_t *fbp = fbdev_obj->act_buffer;
+          for (y = y1; y <= y2; y++)
+            {
+              FAR uint16_t *cur_pos = fbp + (y * xres) + x1;
+              for (x = x1; x <= x2; x++)
+                {
+                  *cur_pos = lv_color_to16(*color_p);
+                  cur_pos++;
+                  color_p++;
+                }
+            }
+        }
+        break;
+      case 8:
+        {
+          FAR uint8_t *fbp = fbdev_obj->act_buffer;
+          for (y = y1; y <= y2; y++)
+            {
+              FAR uint8_t *cur_pos = fbp + (y * xres) + x1;
+              for (x = x1; x <= x2; x++)
+                {
+                  *cur_pos = lv_color_to8(*color_p);
+                  cur_pos++;
+                  color_p++;
+                }
+            }
+        }
+        break;
+      default:
+        break;
+    }
+
+  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 displey and match bpp */

Review Comment:
   typo: `display`



##########
graphics/lvgl/port/lv_port_fbdev.c:
##########
@@ -0,0 +1,755 @@
+/****************************************************************************
+ * 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 color_match;
+  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_flush_convert
+ ****************************************************************************/
+
+static void fbdev_flush_convert(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 x2 = area_p->x2;
+  int y2 = area_p->y2;
+
+  const uint8_t bpp = fbdev_obj->pinfo.bpp;
+  const fb_coord_t xres = fbdev_obj->vinfo.xres;
+  int x;
+  int y;
+
+  LV_LOG_TRACE("start copy");
+
+  switch (bpp)
+    {
+      case 32:
+      case 24:
+        {
+          FAR uint32_t *fbp = fbdev_obj->act_buffer;
+          for (y = y1; y <= y2; y++)
+            {
+              FAR uint32_t *cur_pos = fbp + (y * xres) + x1;
+              for (x = x1; x <= x2; x++)
+                {
+                  *cur_pos = lv_color_to32(*color_p);
+                  cur_pos++;
+                  color_p++;
+                }
+            }
+        }
+        break;
+      case 16:
+        {
+          FAR uint16_t *fbp = fbdev_obj->act_buffer;
+          for (y = y1; y <= y2; y++)
+            {
+              FAR uint16_t *cur_pos = fbp + (y * xres) + x1;
+              for (x = x1; x <= x2; x++)
+                {
+                  *cur_pos = lv_color_to16(*color_p);
+                  cur_pos++;
+                  color_p++;
+                }
+            }
+        }
+        break;
+      case 8:
+        {
+          FAR uint8_t *fbp = fbdev_obj->act_buffer;
+          for (y = y1; y <= y2; y++)
+            {
+              FAR uint8_t *cur_pos = fbp + (y * xres) + x1;
+              for (x = x1; x <= x2; x++)
+                {
+                  *cur_pos = lv_color_to8(*color_p);
+                  cur_pos++;
+                  color_p++;
+                }
+            }
+        }
+        break;
+      default:
+        break;
+    }
+
+  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 displey and match bpp */
+
+  if (!(pinfo.display != state->pinfo.display
+     && pinfo.bpp == state->pinfo.bpp))
+    {
+      LV_LOG_WARN("fbmem2 is incorrect");

Review Comment:
   Actually, the `ttgo_t_display_esp32:lvgl_fb` shows exactly this warning. I couldn't understand this implementation of the double buffer functionality. Do you check if there is a second "virtual" framebuffer device to use as a second buffer for the actual display? I don't recall any application that registers two framebuffers on such scheme... Could you please double-check this implementation? 



##########
graphics/lvgl/port/lv_port_fbdev.c:
##########
@@ -0,0 +1,755 @@
+/****************************************************************************
+ * 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 color_match;
+  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_flush_convert
+ ****************************************************************************/
+
+static void fbdev_flush_convert(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 x2 = area_p->x2;
+  int y2 = area_p->y2;
+
+  const uint8_t bpp = fbdev_obj->pinfo.bpp;
+  const fb_coord_t xres = fbdev_obj->vinfo.xres;
+  int x;
+  int y;
+
+  LV_LOG_TRACE("start copy");
+
+  switch (bpp)
+    {
+      case 32:
+      case 24:
+        {
+          FAR uint32_t *fbp = fbdev_obj->act_buffer;
+          for (y = y1; y <= y2; y++)
+            {
+              FAR uint32_t *cur_pos = fbp + (y * xres) + x1;
+              for (x = x1; x <= x2; x++)
+                {
+                  *cur_pos = lv_color_to32(*color_p);
+                  cur_pos++;
+                  color_p++;
+                }
+            }
+        }
+        break;
+      case 16:
+        {
+          FAR uint16_t *fbp = fbdev_obj->act_buffer;
+          for (y = y1; y <= y2; y++)
+            {
+              FAR uint16_t *cur_pos = fbp + (y * xres) + x1;
+              for (x = x1; x <= x2; x++)
+                {
+                  *cur_pos = lv_color_to16(*color_p);
+                  cur_pos++;
+                  color_p++;
+                }
+            }
+        }
+        break;
+      case 8:
+        {
+          FAR uint8_t *fbp = fbdev_obj->act_buffer;
+          for (y = y1; y <= y2; y++)
+            {
+              FAR uint8_t *cur_pos = fbp + (y * xres) + x1;
+              for (x = x1; x <= x2; x++)
+                {
+                  *cur_pos = lv_color_to8(*color_p);
+                  cur_pos++;
+                  color_p++;
+                }
+            }
+        }
+        break;
+      default:
+        break;
+    }
+
+  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 displey and match bpp */
+
+  if (!(pinfo.display != state->pinfo.display
+     && pinfo.bpp == state->pinfo.bpp))
+    {
+      LV_LOG_WARN("fbmem2 is incorrect");

Review Comment:
   I'm still getting this warning using the `ttgo_t_display_esp32:lvgl_fb`. I couldn't figure out the implementation, but I'd say to double-check the examples that use framebuffer.
   
   ```
   [LVGL] [Warn]   (18.030, +18030)         fbdev_try_init_fbmem2: fbmem2 is incorrect     (in lv_port_fbdev.c line #522)
   ```
   



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@nuttx.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [nuttx-apps] acassis commented on pull request #1341: LVGL v8 upgrade

Posted by GitBox <gi...@apache.org>.
acassis commented on PR #1341:
URL: https://github.com/apache/nuttx-apps/pull/1341#issuecomment-1368442483

   Let's merge and fix possible regressions!


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@nuttx.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [nuttx-apps] lupyuen commented on pull request #1341: LVGL v8 upgrade

Posted by GitBox <gi...@apache.org>.
lupyuen commented on PR #1341:
URL: https://github.com/apache/nuttx-apps/pull/1341#issuecomment-1376697973

   @FASTSHIFT thank you so much! LVGL on PinePhone works great now, it feels very responsive: [Demo on YouTube](https://www.youtube.com/shorts/APge9bTt-ho)
   
   [(Compare with the previous laggy demo)](https://www.youtube.com/shorts/xE9U5IQPmlg)
   
   I have documented the settings here: ["LVGL Calls Our Driver"](https://lupyuen.github.io/articles/touch2#lvgl-calls-our-driver)
   
   Thanks again! :-)


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@nuttx.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [nuttx-apps] FASTSHIFT commented on a diff in pull request #1341: LVGL v8 upgrade

Posted by GitBox <gi...@apache.org>.
FASTSHIFT commented on code in PR #1341:
URL: https://github.com/apache/nuttx-apps/pull/1341#discussion_r1033558724


##########
graphics/lvgl/port/lv_port_fbdev.c:
##########
@@ -0,0 +1,755 @@
+/****************************************************************************
+ * 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 color_match;
+  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_flush_convert
+ ****************************************************************************/
+
+static void fbdev_flush_convert(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 x2 = area_p->x2;
+  int y2 = area_p->y2;
+
+  const uint8_t bpp = fbdev_obj->pinfo.bpp;
+  const fb_coord_t xres = fbdev_obj->vinfo.xres;
+  int x;
+  int y;
+
+  LV_LOG_TRACE("start copy");
+
+  switch (bpp)
+    {
+      case 32:
+      case 24:
+        {
+          FAR uint32_t *fbp = fbdev_obj->act_buffer;
+          for (y = y1; y <= y2; y++)
+            {
+              FAR uint32_t *cur_pos = fbp + (y * xres) + x1;
+              for (x = x1; x <= x2; x++)
+                {
+                  *cur_pos = lv_color_to32(*color_p);
+                  cur_pos++;
+                  color_p++;
+                }
+            }
+        }
+        break;
+      case 16:
+        {
+          FAR uint16_t *fbp = fbdev_obj->act_buffer;
+          for (y = y1; y <= y2; y++)
+            {
+              FAR uint16_t *cur_pos = fbp + (y * xres) + x1;
+              for (x = x1; x <= x2; x++)
+                {
+                  *cur_pos = lv_color_to16(*color_p);
+                  cur_pos++;
+                  color_p++;
+                }
+            }
+        }
+        break;
+      case 8:
+        {
+          FAR uint8_t *fbp = fbdev_obj->act_buffer;
+          for (y = y1; y <= y2; y++)
+            {
+              FAR uint8_t *cur_pos = fbp + (y * xres) + x1;
+              for (x = x1; x <= x2; x++)
+                {
+                  *cur_pos = lv_color_to8(*color_p);
+                  cur_pos++;
+                  color_p++;
+                }
+            }
+        }
+        break;
+      default:
+        break;
+    }
+
+  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 displey and match bpp */
+
+  if (!(pinfo.display != state->pinfo.display
+     && pinfo.bpp == state->pinfo.bpp))
+    {
+      LV_LOG_WARN("fbmem2 is incorrect");

Review Comment:
   > I'm still getting this warning using the `ttgo_t_display_esp32:lvgl_fb`. I couldn't figure out the implementation, but I'd say to double-check the examples that use framebuffer.
   > 
   > ```
   > [LVGL] [Warn]   (18.030, +18030)         fbdev_try_init_fbmem2: fbmem2 is incorrect     (in lv_port_fbdev.c line #522)
   > ```
   
   I have lowered this LOG level to INFO level and can ignore this warning. lv_port_fbdev will continue to use the traditional single frame framebuffer logic.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@nuttx.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [incubator-nuttx-apps] gustavonihei commented on a diff in pull request #1341: LVGL v8 upgrade

Posted by GitBox <gi...@apache.org>.
gustavonihei commented on code in PR #1341:
URL: https://github.com/apache/incubator-nuttx-apps/pull/1341#discussion_r992264960


##########
graphics/lvgl/lv_conf/Kconfig:
##########
@@ -0,0 +1,1110 @@
+# 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

Review Comment:
   You're right, for some reason there was a leftover files from the `v7.3.0` lv_demos on my tree.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@nuttx.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [incubator-nuttx-apps] xiaoxiang781216 commented on a diff in pull request #1341: LVGL v8 upgrade

Posted by GitBox <gi...@apache.org>.
xiaoxiang781216 commented on code in PR #1341:
URL: https://github.com/apache/incubator-nuttx-apps/pull/1341#discussion_r990636957


##########
graphics/lvgl/lv_porting/lv_touchpad_interface.h:
##########
@@ -0,0 +1,80 @@
+/****************************************************************************
+ * apps/graphics/lvgl/lv_porting/lv_touchpad_interface.h

Review Comment:
   let's change lv_porting to port and remove the _interface suffix.
   



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@nuttx.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [incubator-nuttx-apps] pkarashchenko commented on a diff in pull request #1341: LVGL v8 upgrade

Posted by GitBox <gi...@apache.org>.
pkarashchenko commented on code in PR #1341:
URL: https://github.com/apache/incubator-nuttx-apps/pull/1341#discussion_r990695403


##########
examples/lvgldemo/lvgldemo.c:
##########
@@ -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 void (*demo_create_func_t)(void);

Review Comment:
   ```suggestion
   typedef CODE void (*demo_create_func_t)(void);
   ```



##########
graphics/lvgl/lv_porting/lv_fbdev_interface.h:
##########
@@ -0,0 +1,81 @@
+/****************************************************************************
+ * apps/graphics/lvgl/lv_porting/lv_fbdev_interface.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 __LV_FBDEV_INTERFACE_H__
+#define __LV_FBDEV_INTERFACE_H__
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+#include <lvgl/lvgl.h>
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+#if defined(CONFIG_LV_USE_FBDEV_INTERFACE)
+
+/****************************************************************************
+ * Type Definitions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Data
+ ****************************************************************************/
+
+#ifdef __cplusplus
+#define EXTERN extern "C"
+extern "C"
+{
+#else
+#define EXTERN extern
+#endif
+
+/****************************************************************************
+ * Public Function Prototypes
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: lv_fbdev_interface_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_fbdev_interface_init(FAR const char *dev_path,
+                                       int line_buf);
+
+#undef EXTERN
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* CONFIG_LV_USE_FBDEV_INTERFACE */
+
+#endif /* __LV_FBDEV_INTERFACE_H__ */

Review Comment:
   ```suggestion
   #endif /* __APPS_GRAPHICS_LVGL_LV_PORTING_LV_FBDEV_INTERFACE_H */
   ```



##########
graphics/lvgl/lv_porting/lv_lcddev_interface.h:
##########
@@ -0,0 +1,82 @@
+/****************************************************************************
+ * apps/graphics/lvgl/lv_porting/lv_lcddev_interface.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 __LV_LCDDEV_INTERFACE_H__
+#define __LV_LCDDEV_INTERFACE_H__
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+#include <lvgl/lvgl.h>
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+#if defined(CONFIG_LV_USE_LCDDEV_INTERFACE)
+
+/****************************************************************************
+ * Type Definitions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Data
+ ****************************************************************************/
+
+#ifdef __cplusplus
+#define EXTERN extern "C"
+extern "C"
+{
+#else
+#define EXTERN extern
+#endif
+
+/****************************************************************************
+ * Public Function Prototypes
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: lv_lcddev_interface_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.
+ *
+ ****************************************************************************/
+
+lv_disp_t *lv_lcddev_interface_init(const char *dev_path, int line_buf);
+
+#undef EXTERN
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* CONFIG_LV_USE_LCDDEV_INTERFACE */
+
+#endif /* __LV_LCDDEV_INTERFACE_H__ */

Review Comment:
   ```suggestion
   #endif /* __APPS_GRAPHICS_LVGL_LV_PORTING_LV_LCDDEV_INTERFACE_H */
   ```



##########
graphics/lvgl/lv_porting/lv_encoder_interface.h:
##########
@@ -0,0 +1,80 @@
+/****************************************************************************
+ * apps/graphics/lvgl/lv_porting/lv_encoder_interface.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 __LV_ENCODER_INTERFACE_H__
+#define __LV_ENCODER_INTERFACE_H__
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+#include <lvgl/lvgl.h>
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+#if defined(CONFIG_LV_USE_ENCODER_INTERFACE)
+
+/****************************************************************************
+ * Type Definitions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Data
+ ****************************************************************************/
+
+#ifdef __cplusplus
+#define EXTERN extern "C"
+extern "C"
+{
+#else
+#define EXTERN extern
+#endif
+
+/****************************************************************************
+ * Public Function Prototypes
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: lv_encoder_interface_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.
+ *
+ ****************************************************************************/
+
+lv_indev_t *lv_encoder_interface_init(const char *dev_path);
+
+#undef EXTERN
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* CONFIG_LV_USE_ENCODER_INTERFACE */
+
+#endif /* __LV_ENCODER_INTERFACE_H__ */

Review Comment:
   ```suggestion
   #endif /* __APPS_GRAPHICS_LVGL_LV_PORTING_LV_ENCODER_INTERFACE_H */
   ```



##########
graphics/lvgl/lv_porting/lv_button_interface.h:
##########
@@ -0,0 +1,80 @@
+/****************************************************************************
+ * apps/graphics/lvgl/lv_porting/lv_button_interface.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 __LV_BUTTON_INTERFACE_H__
+#define __LV_BUTTON_INTERFACE_H__
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+#include <lvgl/lvgl.h>
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+#if defined(CONFIG_LV_USE_BUTTON_INTERFACE)
+
+/****************************************************************************
+ * Type Definitions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Data
+ ****************************************************************************/
+
+#ifdef __cplusplus
+#define EXTERN extern "C"
+extern "C"
+{
+#else
+#define EXTERN extern
+#endif
+
+/****************************************************************************
+ * Public Function Prototypes
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: lv_button_interface_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.
+ *
+ ****************************************************************************/
+
+lv_indev_t *lv_button_interface_init(const char *dev_path);
+
+#undef EXTERN
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* CONFIG_LV_USE_BUTTON_INTERFACE */
+
+#endif /* __LV_BUTTON_INTERFACE_H__ */

Review Comment:
   ```suggestion
   #endif /* __APPS_GRAPHICS_LVGL_LV_PORTING_LV_BUTTON_INTERFACE_H */
   ```



##########
graphics/lvgl/lv_porting/lv_button_interface.h:
##########
@@ -0,0 +1,80 @@
+/****************************************************************************
+ * apps/graphics/lvgl/lv_porting/lv_button_interface.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 __LV_BUTTON_INTERFACE_H__
+#define __LV_BUTTON_INTERFACE_H__

Review Comment:
   ```suggestion
   #ifndef __APPS_GRAPHICS_LVGL_LV_PORTING_LV_BUTTON_INTERFACE_H
   #define __APPS_GRAPHICS_LVGL_LV_PORTING_LV_BUTTON_INTERFACE_H
   ```



##########
graphics/lvgl/lv_porting/lv_keypad_interface.h:
##########
@@ -18,36 +18,59 @@
  *
  ****************************************************************************/
 
-#ifndef __APPS_EXAMPLES_LVGLDEMO_TP_CAL_H
-#define __APPS_EXAMPLES_LVGLDEMO_TP_CAL_H
+#ifndef __LV_KEYPAD_INTERFACE_H__
+#define __LV_KEYPAD_INTERFACE_H__
 
 /****************************************************************************
- * Public Function Prototypes
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+#include <lvgl/lvgl.h>
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+#if defined(CONFIG_LV_USE_KEYPAD_INTERFACE)
+
+/****************************************************************************
+ * Type Definitions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Data
  ****************************************************************************/
 
 #ifdef __cplusplus
+#define EXTERN extern "C"
 extern "C"
 {
+#else
+#define EXTERN extern
 #endif
 
 /****************************************************************************
- * Name: tp_cal_create
+ * Name: lv_keypad_interface_init
  *
  * Description:
- *   Create a touchpad calibration screen
+ *   Keypad interface initialization.
  *
  * Input Parameters:
- *   None
+ *   dev_path - input device path, set to NULL to use the default path
  *
  * Returned Value:
- *   None
+ *   lv_indev object address on success; NULL on failure.
  *
  ****************************************************************************/
 
-void tp_cal_create(void);
+lv_indev_t *lv_keypad_interface_init(const char *dev_path);
 
+#undef EXTERN
 #ifdef __cplusplus
 }
 #endif
 
-#endif /* __APPS_EXAMPLES_LVGLDEMO_TP_CAL_H */
+#endif /* CONFIG_LV_USE_KEYPAD_INTERFACE */
+
+#endif /* __LV_KEYPAD_INTERFACE_H__ */

Review Comment:
   ```suggestion
   #endif /* __APPS_GRAPHICS_LVGL_LV_PORTING_LV_KEYPAD_INTERFACE_H */
   ```



##########
graphics/lvgl/lv_porting/lv_porting.h:
##########
@@ -0,0 +1,76 @@
+/****************************************************************************
+ * apps/graphics/lvgl/lv_porting/lv_porting.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 __LV_PORTING_H__
+#define __LV_PORTING_H__
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <lv_porting/lv_button_interface.h>
+#include <lv_porting/lv_encoder_interface.h>
+#include <lv_porting/lv_fbdev_interface.h>
+#include <lv_porting/lv_lcddev_interface.h>
+#include <lv_porting/lv_mem_interface.h>
+#include <lv_porting/lv_keypad_interface.h>
+#include <lv_porting/lv_syslog_interface.h>
+#include <lv_porting/lv_touchpad_interface.h>
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Type Definitions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Data
+ ****************************************************************************/
+
+#ifdef __cplusplus
+#define EXTERN extern "C"
+extern "C"
+{
+#else
+#define EXTERN extern
+#endif
+
+/****************************************************************************
+ * Public Function Prototypes
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: lv_porting_init
+ *
+ * Description:
+ *   Initialize all porting.
+ *
+ ****************************************************************************/
+
+void lv_porting_init(void);
+
+#undef EXTERN
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __LV_PORTING_H__ */

Review Comment:
   ```suggestion
   #endif /* __APPS_GRAPHICS_LVGL_LV_PORTING_LV_PORTING_H */
   ```



##########
graphics/lvgl/lv_porting/lv_keypad_interface.h:
##########
@@ -18,36 +18,59 @@
  *
  ****************************************************************************/
 
-#ifndef __APPS_EXAMPLES_LVGLDEMO_TP_CAL_H
-#define __APPS_EXAMPLES_LVGLDEMO_TP_CAL_H
+#ifndef __LV_KEYPAD_INTERFACE_H__
+#define __LV_KEYPAD_INTERFACE_H__

Review Comment:
   ```suggestion
   #ifndef __APPS_GRAPHICS_LVGL_LV_PORTING_LV_KEYPAD_INTERFACE_H
   #define __APPS_GRAPHICS_LVGL_LV_PORTING_LV_KEYPAD_INTERFACE_H
   ```



##########
graphics/lvgl/lv_porting/lv_lcddev_interface.h:
##########
@@ -0,0 +1,82 @@
+/****************************************************************************
+ * apps/graphics/lvgl/lv_porting/lv_lcddev_interface.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 __LV_LCDDEV_INTERFACE_H__
+#define __LV_LCDDEV_INTERFACE_H__

Review Comment:
   ```suggestion
   #ifndef __APPS_GRAPHICS_LVGL_LV_PORTING_LV_LCDDEV_INTERFACE_H
   #define __APPS_GRAPHICS_LVGL_LV_PORTING_LV_LCDDEV_INTERFACE_H
   ```



##########
graphics/lvgl/lv_porting/lv_syslog_interface.h:
##########
@@ -18,21 +18,20 @@
  *
  ****************************************************************************/
 
-#ifndef __APPS_GRAPHICS_LVGL_LV_FS_INTERFACE_H
-#define __APPS_GRAPHICS_LVGL_LV_FS_INTERFACE_H
+#ifndef __LV_SYSLOG_INTERFACE_H__
+#define __LV_SYSLOG_INTERFACE_H__

Review Comment:
   ```suggestion
   #ifndef __APPS_GRAPHICS_LVGL_LV_PORTING_LV_SYSLOG_INTERFACE_H
   #define __APPS_GRAPHICS_LVGL_LV_PORTING_LV_SYSLOG_INTERFACE_H
   ```



##########
graphics/lvgl/lv_porting/lv_encoder_interface.h:
##########
@@ -0,0 +1,80 @@
+/****************************************************************************
+ * apps/graphics/lvgl/lv_porting/lv_encoder_interface.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 __LV_ENCODER_INTERFACE_H__
+#define __LV_ENCODER_INTERFACE_H__

Review Comment:
   ```suggestion
   #ifndef __APPS_GRAPHICS_LVGL_LV_PORTING_LV_ENCODER_INTERFACE_H
   #define __APPS_GRAPHICS_LVGL_LV_PORTING_LV_ENCODER_INTERFACE_H
   ```



##########
graphics/lvgl/lv_porting/lv_fbdev_interface.h:
##########
@@ -0,0 +1,81 @@
+/****************************************************************************
+ * apps/graphics/lvgl/lv_porting/lv_fbdev_interface.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 __LV_FBDEV_INTERFACE_H__
+#define __LV_FBDEV_INTERFACE_H__

Review Comment:
   ```suggestion
   #ifndef __APPS_GRAPHICS_LVGL_LV_PORTING_LV_FBDEV_INTERFACE_H
   #define __APPS_GRAPHICS_LVGL_LV_PORTING_LV_FBDEV_INTERFACE_H
   ```



##########
graphics/lvgl/lv_porting/lv_syslog_interface.h:
##########
@@ -54,13 +53,21 @@ extern "C"
  * Public Function Prototypes
  ****************************************************************************/
 
-void lv_fs_interface_init(void);
+/****************************************************************************
+ * Name: lv_syslog_interface_init
+ *
+ * Description:
+ *   Syslog interface initialization.
+ *
+ ****************************************************************************/
+
+void lv_syslog_interface_init(void);
 
 #undef EXTERN
 #ifdef __cplusplus
 }
 #endif
 
-#endif /* LV_USE_FILESYSTEM */
+#endif /* CONFIG_LV_USE_SYSLOG_INTERFACE */
 
-#endif /* __APPS_GRAPHICS_LVGL_LV_FS_INTERFACE_H */
+#endif /* __LV_PORTING_H__ */

Review Comment:
   ```suggestion
   #endif /* __APPS_GRAPHICS_LVGL_LV_PORTING_LV_SYSLOG_INTERFACE_H */
   ```



##########
graphics/lvgl/lv_porting/lv_porting.h:
##########
@@ -0,0 +1,76 @@
+/****************************************************************************
+ * apps/graphics/lvgl/lv_porting/lv_porting.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 __LV_PORTING_H__
+#define __LV_PORTING_H__

Review Comment:
   ```suggestion
   #ifndef __APPS_GRAPHICS_LVGL_LV_PORTING_LV_PORTING_H
   #define __APPS_GRAPHICS_LVGL_LV_PORTING_LV_PORTING_H
   ```



##########
graphics/lvgl/lv_porting/lv_mem_interface.h:
##########
@@ -0,0 +1,96 @@
+/****************************************************************************
+ * apps/graphics/lvgl/lv_porting/lv_mem_interface.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 __LV_MEM_INTERFACE_H__
+#define __LV_MEM_INTERFACE_H__
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+#include <lvgl/lvgl.h>
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+#ifndef CONFIG_LV_MEM_INTERFACE_CUSTOM_SIZE
+#define CONFIG_LV_MEM_INTERFACE_CUSTOM_SIZE 0
+#endif
+
+#ifndef CONFIG_LV_MEM_INTERFACE_CUSTOM_NAME
+#define CONFIG_LV_MEM_INTERFACE_CUSTOM_NAME ""
+#endif
+
+#if CONFIG_LV_MEM_INTERFACE_CUSTOM_SIZE
+
+/****************************************************************************
+ * Type Definitions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Data
+ ****************************************************************************/
+
+#ifdef __cplusplus
+#define EXTERN extern "C"
+extern "C"
+{
+#else
+#define EXTERN extern
+#endif
+
+/****************************************************************************
+ * Public Function Prototypes
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: lv_mem_custom_alloc
+ ****************************************************************************/
+
+FAR void *lv_mem_custom_alloc(size_t size);
+
+/****************************************************************************
+ * Name: lv_mem_custom_free
+ ****************************************************************************/
+
+void lv_mem_custom_free(FAR void *mem);
+
+/****************************************************************************
+ * Name: lv_mem_custom_realloc
+ ****************************************************************************/
+
+FAR void *lv_mem_custom_realloc(FAR void *oldmem, size_t size);
+
+/****************************************************************************
+ * Name: lv_mem_custom_memalign
+ ****************************************************************************/
+
+FAR void *lv_mem_custom_memalign(size_t alignment, size_t size);
+
+#undef EXTERN
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* CONFIG_LV_MEM_INTERFACE_CUSTOM_SIZE */
+
+#endif /* __LV_MEM_INTERFACE_H__ */

Review Comment:
   ```suggestion
   #endif /* __APPS_GRAPHICS_LVGL_LV_PORTING_LV_MEM_INTERFACE_H */
   ```



##########
graphics/lvgl/lv_porting/lv_mem_interface.h:
##########
@@ -0,0 +1,96 @@
+/****************************************************************************
+ * apps/graphics/lvgl/lv_porting/lv_mem_interface.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 __LV_MEM_INTERFACE_H__
+#define __LV_MEM_INTERFACE_H__

Review Comment:
   ```suggestion
   #ifndef __APPS_GRAPHICS_LVGL_LV_PORTING_LV_MEM_INTERFACE_H
   #define __APPS_GRAPHICS_LVGL_LV_PORTING_LV_MEM_INTERFACE_H
   ```



##########
graphics/lvgl/lv_porting/lv_encoder_interface.h:
##########
@@ -0,0 +1,80 @@
+/****************************************************************************
+ * apps/graphics/lvgl/lv_porting/lv_encoder_interface.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 __LV_ENCODER_INTERFACE_H__
+#define __LV_ENCODER_INTERFACE_H__
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+#include <lvgl/lvgl.h>
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+#if defined(CONFIG_LV_USE_ENCODER_INTERFACE)
+
+/****************************************************************************
+ * Type Definitions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Data
+ ****************************************************************************/
+
+#ifdef __cplusplus
+#define EXTERN extern "C"
+extern "C"
+{
+#else
+#define EXTERN extern
+#endif
+
+/****************************************************************************
+ * Public Function Prototypes
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: lv_encoder_interface_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.
+ *
+ ****************************************************************************/
+
+lv_indev_t *lv_encoder_interface_init(const char *dev_path);

Review Comment:
   ```suggestion
   FAR lv_indev_t *lv_encoder_interface_init(FAR const char *dev_path);
   ```



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@nuttx.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [nuttx-apps] acassis merged pull request #1341: LVGL v8 upgrade

Posted by GitBox <gi...@apache.org>.
acassis merged PR #1341:
URL: https://github.com/apache/nuttx-apps/pull/1341


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@nuttx.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [incubator-nuttx-apps] gustavonihei commented on a diff in pull request #1341: LVGL v8 upgrade

Posted by GitBox <gi...@apache.org>.
gustavonihei commented on code in PR #1341:
URL: https://github.com/apache/incubator-nuttx-apps/pull/1341#discussion_r991580797


##########
graphics/lvgl/lv_conf/Kconfig:
##########
@@ -0,0 +1,1110 @@
+# Kconfig file for LVGL v8.0
+
+menu "LVGL configuration"

Review Comment:
   Kconfig files in NuttX are indented with tabs.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@nuttx.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [nuttx-apps] FASTSHIFT commented on a diff in pull request #1341: LVGL v8 upgrade

Posted by GitBox <gi...@apache.org>.
FASTSHIFT commented on code in PR #1341:
URL: https://github.com/apache/nuttx-apps/pull/1341#discussion_r1033532350


##########
graphics/lvgl/port/lv_port_fbdev.c:
##########
@@ -0,0 +1,755 @@
+/****************************************************************************
+ * 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 color_match;
+  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_flush_convert
+ ****************************************************************************/
+
+static void fbdev_flush_convert(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 x2 = area_p->x2;
+  int y2 = area_p->y2;
+
+  const uint8_t bpp = fbdev_obj->pinfo.bpp;
+  const fb_coord_t xres = fbdev_obj->vinfo.xres;
+  int x;
+  int y;
+
+  LV_LOG_TRACE("start copy");
+
+  switch (bpp)
+    {
+      case 32:
+      case 24:
+        {
+          FAR uint32_t *fbp = fbdev_obj->act_buffer;
+          for (y = y1; y <= y2; y++)
+            {
+              FAR uint32_t *cur_pos = fbp + (y * xres) + x1;
+              for (x = x1; x <= x2; x++)
+                {
+                  *cur_pos = lv_color_to32(*color_p);
+                  cur_pos++;
+                  color_p++;
+                }
+            }
+        }
+        break;
+      case 16:
+        {
+          FAR uint16_t *fbp = fbdev_obj->act_buffer;
+          for (y = y1; y <= y2; y++)
+            {
+              FAR uint16_t *cur_pos = fbp + (y * xres) + x1;
+              for (x = x1; x <= x2; x++)
+                {
+                  *cur_pos = lv_color_to16(*color_p);
+                  cur_pos++;
+                  color_p++;
+                }
+            }
+        }
+        break;
+      case 8:
+        {
+          FAR uint8_t *fbp = fbdev_obj->act_buffer;
+          for (y = y1; y <= y2; y++)
+            {
+              FAR uint8_t *cur_pos = fbp + (y * xres) + x1;
+              for (x = x1; x <= x2; x++)
+                {
+                  *cur_pos = lv_color_to8(*color_p);
+                  cur_pos++;
+                  color_p++;
+                }
+            }
+        }
+        break;
+      default:
+        break;
+    }
+
+  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 displey and match bpp */

Review Comment:
   done



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@nuttx.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [nuttx-apps] FASTSHIFT commented on a diff in pull request #1341: LVGL v8 upgrade

Posted by GitBox <gi...@apache.org>.
FASTSHIFT commented on code in PR #1341:
URL: https://github.com/apache/nuttx-apps/pull/1341#discussion_r1033554864


##########
graphics/lvgl/port/lv_port_fbdev.c:
##########
@@ -0,0 +1,755 @@
+/****************************************************************************
+ * 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 color_match;
+  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_flush_convert
+ ****************************************************************************/
+
+static void fbdev_flush_convert(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 x2 = area_p->x2;
+  int y2 = area_p->y2;
+
+  const uint8_t bpp = fbdev_obj->pinfo.bpp;
+  const fb_coord_t xres = fbdev_obj->vinfo.xres;
+  int x;
+  int y;
+
+  LV_LOG_TRACE("start copy");
+
+  switch (bpp)
+    {
+      case 32:
+      case 24:
+        {
+          FAR uint32_t *fbp = fbdev_obj->act_buffer;
+          for (y = y1; y <= y2; y++)
+            {
+              FAR uint32_t *cur_pos = fbp + (y * xres) + x1;
+              for (x = x1; x <= x2; x++)
+                {
+                  *cur_pos = lv_color_to32(*color_p);
+                  cur_pos++;
+                  color_p++;
+                }
+            }
+        }
+        break;
+      case 16:
+        {
+          FAR uint16_t *fbp = fbdev_obj->act_buffer;
+          for (y = y1; y <= y2; y++)
+            {
+              FAR uint16_t *cur_pos = fbp + (y * xres) + x1;
+              for (x = x1; x <= x2; x++)
+                {
+                  *cur_pos = lv_color_to16(*color_p);
+                  cur_pos++;
+                  color_p++;
+                }
+            }
+        }
+        break;
+      case 8:
+        {
+          FAR uint8_t *fbp = fbdev_obj->act_buffer;
+          for (y = y1; y <= y2; y++)
+            {
+              FAR uint8_t *cur_pos = fbp + (y * xres) + x1;
+              for (x = x1; x <= x2; x++)
+                {
+                  *cur_pos = lv_color_to8(*color_p);
+                  cur_pos++;
+                  color_p++;
+                }
+            }
+        }
+        break;
+      default:
+        break;
+    }
+
+  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 displey and match bpp */
+
+  if (!(pinfo.display != state->pinfo.display
+     && pinfo.bpp == state->pinfo.bpp))
+    {
+      LV_LOG_WARN("fbmem2 is incorrect");

Review Comment:
   There are two ways to allocate double-frame framebuffers, one is traditional two-frame buffers next to consecutive addresses, relying on `pinfo.yoffset` to switch the buffer to be displayed. However, on embedded devices, the size of a single block of SRAM may be limited and cannot accommodate two frames of buffers with consecutive addresses. It is necessary to place the two buffers on two discontinuous addresses. Here we use the method of the `fbdev_try_init_fbmem2` function, which will Re-acquire the address of the second buffer from the driver, so that the logic of the switch buffer (by setting `pinfo.yoffset`) can be shared perfectly. (this solution comes from @xiaoxiang781216 )



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@nuttx.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [nuttx-apps] FASTSHIFT commented on a diff in pull request #1341: LVGL v8 upgrade

Posted by GitBox <gi...@apache.org>.
FASTSHIFT commented on code in PR #1341:
URL: https://github.com/apache/nuttx-apps/pull/1341#discussion_r1033558724


##########
graphics/lvgl/port/lv_port_fbdev.c:
##########
@@ -0,0 +1,755 @@
+/****************************************************************************
+ * 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 color_match;
+  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_flush_convert
+ ****************************************************************************/
+
+static void fbdev_flush_convert(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 x2 = area_p->x2;
+  int y2 = area_p->y2;
+
+  const uint8_t bpp = fbdev_obj->pinfo.bpp;
+  const fb_coord_t xres = fbdev_obj->vinfo.xres;
+  int x;
+  int y;
+
+  LV_LOG_TRACE("start copy");
+
+  switch (bpp)
+    {
+      case 32:
+      case 24:
+        {
+          FAR uint32_t *fbp = fbdev_obj->act_buffer;
+          for (y = y1; y <= y2; y++)
+            {
+              FAR uint32_t *cur_pos = fbp + (y * xres) + x1;
+              for (x = x1; x <= x2; x++)
+                {
+                  *cur_pos = lv_color_to32(*color_p);
+                  cur_pos++;
+                  color_p++;
+                }
+            }
+        }
+        break;
+      case 16:
+        {
+          FAR uint16_t *fbp = fbdev_obj->act_buffer;
+          for (y = y1; y <= y2; y++)
+            {
+              FAR uint16_t *cur_pos = fbp + (y * xres) + x1;
+              for (x = x1; x <= x2; x++)
+                {
+                  *cur_pos = lv_color_to16(*color_p);
+                  cur_pos++;
+                  color_p++;
+                }
+            }
+        }
+        break;
+      case 8:
+        {
+          FAR uint8_t *fbp = fbdev_obj->act_buffer;
+          for (y = y1; y <= y2; y++)
+            {
+              FAR uint8_t *cur_pos = fbp + (y * xres) + x1;
+              for (x = x1; x <= x2; x++)
+                {
+                  *cur_pos = lv_color_to8(*color_p);
+                  cur_pos++;
+                  color_p++;
+                }
+            }
+        }
+        break;
+      default:
+        break;
+    }
+
+  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 displey and match bpp */
+
+  if (!(pinfo.display != state->pinfo.display
+     && pinfo.bpp == state->pinfo.bpp))
+    {
+      LV_LOG_WARN("fbmem2 is incorrect");

Review Comment:
   > I'm still getting this warning using the `ttgo_t_display_esp32:lvgl_fb`. I couldn't figure out the implementation, but I'd say to double-check the examples that use framebuffer.
   > 
   > ```
   > [LVGL] [Warn]   (18.030, +18030)         fbdev_try_init_fbmem2: fbmem2 is incorrect     (in lv_port_fbdev.c line #522)
   > ```
   
   I have lowered this LOG level to INFO level and can ignore this warning. lvgl will continue to use the traditional single frame framebuffer logic.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@nuttx.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [nuttx-apps] FASTSHIFT commented on a diff in pull request #1341: LVGL v8 upgrade

Posted by GitBox <gi...@apache.org>.
FASTSHIFT commented on code in PR #1341:
URL: https://github.com/apache/nuttx-apps/pull/1341#discussion_r1033558724


##########
graphics/lvgl/port/lv_port_fbdev.c:
##########
@@ -0,0 +1,755 @@
+/****************************************************************************
+ * 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 color_match;
+  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_flush_convert
+ ****************************************************************************/
+
+static void fbdev_flush_convert(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 x2 = area_p->x2;
+  int y2 = area_p->y2;
+
+  const uint8_t bpp = fbdev_obj->pinfo.bpp;
+  const fb_coord_t xres = fbdev_obj->vinfo.xres;
+  int x;
+  int y;
+
+  LV_LOG_TRACE("start copy");
+
+  switch (bpp)
+    {
+      case 32:
+      case 24:
+        {
+          FAR uint32_t *fbp = fbdev_obj->act_buffer;
+          for (y = y1; y <= y2; y++)
+            {
+              FAR uint32_t *cur_pos = fbp + (y * xres) + x1;
+              for (x = x1; x <= x2; x++)
+                {
+                  *cur_pos = lv_color_to32(*color_p);
+                  cur_pos++;
+                  color_p++;
+                }
+            }
+        }
+        break;
+      case 16:
+        {
+          FAR uint16_t *fbp = fbdev_obj->act_buffer;
+          for (y = y1; y <= y2; y++)
+            {
+              FAR uint16_t *cur_pos = fbp + (y * xres) + x1;
+              for (x = x1; x <= x2; x++)
+                {
+                  *cur_pos = lv_color_to16(*color_p);
+                  cur_pos++;
+                  color_p++;
+                }
+            }
+        }
+        break;
+      case 8:
+        {
+          FAR uint8_t *fbp = fbdev_obj->act_buffer;
+          for (y = y1; y <= y2; y++)
+            {
+              FAR uint8_t *cur_pos = fbp + (y * xres) + x1;
+              for (x = x1; x <= x2; x++)
+                {
+                  *cur_pos = lv_color_to8(*color_p);
+                  cur_pos++;
+                  color_p++;
+                }
+            }
+        }
+        break;
+      default:
+        break;
+    }
+
+  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 displey and match bpp */
+
+  if (!(pinfo.display != state->pinfo.display
+     && pinfo.bpp == state->pinfo.bpp))
+    {
+      LV_LOG_WARN("fbmem2 is incorrect");

Review Comment:
   > I'm still getting this warning using the `ttgo_t_display_esp32:lvgl_fb`. I couldn't figure out the implementation, but I'd say to double-check the examples that use framebuffer.
   > 
   > ```
   > [LVGL] [Warn]   (18.030, +18030)         fbdev_try_init_fbmem2: fbmem2 is incorrect     (in lv_port_fbdev.c line #522)
   > ```
   
   I have lowered this LOG level to INFO level and can ignore this warning.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@nuttx.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [incubator-nuttx-apps] gustavonihei commented on a diff in pull request #1341: LVGL v8 upgrade

Posted by GitBox <gi...@apache.org>.
gustavonihei commented on code in PR #1341:
URL: https://github.com/apache/incubator-nuttx-apps/pull/1341#discussion_r992235246


##########
graphics/lvgl/lv_conf/Kconfig:
##########
@@ -0,0 +1,1110 @@
+# 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

Review Comment:
   I believe the option is valid. It is referenced in several places:
   ```
   ./graphics/lvgl/lvgl/lv_conf_template.h:#define LV_DEMO_WIDGETS_SLIDESHOW 0
   ./graphics/lvgl/lvgl/demos/widgets/lv_demo_widgets.py:LV_DEMO_WIDGETS_SLIDESHOW = 0
   ./graphics/lvgl/lvgl/demos/widgets/lv_demo_widgets.py:    if LV_DEMO_WIDGETS_SLIDESHOW == 0:
   ./graphics/lvgl/lvgl/demos/widgets/lv_demo_widgets.py:#    if LV_DEMO_WIDGETS_SLIDESHOW:
   ./graphics/lvgl/lvgl/demos/README.md:#define LV_DEMO_WIDGETS_SLIDESHOW  0
   ./graphics/lvgl/lvgl/src/lv_conf_internal.h:#ifndef LV_DEMO_WIDGETS_SLIDESHOW
   ./graphics/lvgl/lvgl/src/lv_conf_internal.h:    #ifdef CONFIG_LV_DEMO_WIDGETS_SLIDESHOW
   ./graphics/lvgl/lvgl/src/lv_conf_internal.h:        #define LV_DEMO_WIDGETS_SLIDESHOW CONFIG_LV_DEMO_WIDGETS_SLIDESHOW
   ./graphics/lvgl/lvgl/src/lv_conf_internal.h:        #define LV_DEMO_WIDGETS_SLIDESHOW 0
   ./graphics/lvgl/lv_conf/Kconfig:        config LV_DEMO_WIDGETS_SLIDESHOW
   ./examples/lvgldemo/lv_demos/src/lv_demo_widgets/lv_demo_widgets.c:#if LV_DEMO_WIDGETS_SLIDESHOW
   ./examples/lvgldemo/lv_demos/src/lv_demo_widgets/lv_demo_widgets.c:#if LV_DEMO_WIDGETS_SLIDESHOW
   ./examples/lvgldemo/lv_demos/src/lv_demo_widgets/lv_demo_widgets.c:#if LV_DEMO_WIDGETS_SLIDESHOW == 0
   ./examples/lvgldemo/lv_demos/src/lv_demo_widgets/lv_demo_widgets.c:#if LV_DEMO_WIDGETS_SLIDESHOW
   ./examples/lvgldemo/lv_demos/src/lv_demo_widgets/lv_demo_widgets.c:#if LV_DEMO_WIDGETS_SLIDESHOW
   ./examples/lvgldemo/lv_demos/lv_ex_conf_templ.h:#define LV_DEMO_WIDGETS_SLIDESHOW  0
   ```



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@nuttx.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [incubator-nuttx-apps] FASTSHIFT commented on a diff in pull request #1341: LVGL v8 upgrade

Posted by GitBox <gi...@apache.org>.
FASTSHIFT commented on code in PR #1341:
URL: https://github.com/apache/incubator-nuttx-apps/pull/1341#discussion_r991866163


##########
graphics/lvgl/lv_conf/Kconfig:
##########
@@ -0,0 +1,1110 @@
+# 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

Review Comment:
   `LV_DEMO_WIDGETS_SLIDESHOW` is not referenced in the lvgl widgets demo, this option is invalid.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@nuttx.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [incubator-nuttx-apps] FASTSHIFT commented on a diff in pull request #1341: LVGL v8 upgrade

Posted by GitBox <gi...@apache.org>.
FASTSHIFT commented on code in PR #1341:
URL: https://github.com/apache/incubator-nuttx-apps/pull/1341#discussion_r992252530


##########
graphics/lvgl/lv_conf/Kconfig:
##########
@@ -0,0 +1,1110 @@
+# 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

Review Comment:
   Yes, in LVGL v7 it is used, but in LVGL v8 there is no adaptation for this
   ```bash
   src/lv_conf_internal.h:2345:#ifndef LV_DEMO_WIDGETS_SLIDESHOW
   src/lv_conf_internal.h:2346:    #ifdef CONFIG_LV_DEMO_WIDGETS_SLIDESHOW
   src/lv_conf_internal.h:2347:        #define LV_DEMO_WIDGETS_SLIDESHOW CONFIG_LV_DEMO_WIDGETS_SLIDESHOW
   src/lv_conf_internal.h:2349:        #define LV_DEMO_WIDGETS_SLIDESHOW 0
   lv_conf_template.h:729:#define LV_DEMO_WIDGETS_SLIDESHOW 0
   docs/CHANGELOG.md:1353:- `lv_animing` new widget for simple slideshow animations
   Kconfig:1064:        config LV_DEMO_WIDGETS_SLIDESHOW
   demos/widgets/lv_demo_widgets.py:7:LV_DEMO_WIDGETS_SLIDESHOW = 0
   demos/widgets/lv_demo_widgets.py:135:    if LV_DEMO_WIDGETS_SLIDESHOW == 0:
   demos/widgets/lv_demo_widgets.py:234:#    if LV_DEMO_WIDGETS_SLIDESHOW:
   demos/README.md:17:#define LV_DEMO_WIDGETS_SLIDESHOW  0
   ```



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@nuttx.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org