You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by pk...@apache.org on 2023/02/22 13:33:59 UTC
[nuttx-apps] branch master updated: lvgl/port: add libuv porting
This is an automated email from the ASF dual-hosted git repository.
pkarashchenko pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx-apps.git
The following commit(s) were added to refs/heads/master by this push:
new 6f192bd1e lvgl/port: add libuv porting
6f192bd1e is described below
commit 6f192bd1e0de410d6b2b7d68ce724638a3ed1c32
Author: pengyiqiang <pe...@xiaomi.com>
AuthorDate: Wed Feb 22 16:00:41 2023 +0800
lvgl/port: add libuv porting
Signed-off-by: pengyiqiang <pe...@xiaomi.com>
---
examples/lvgldemo/lvgldemo.c | 15 +++
graphics/lvgl/Kconfig | 5 +
graphics/lvgl/Makefile | 3 +
graphics/lvgl/port/lv_port_libuv.c | 186 +++++++++++++++++++++++++++++++++++++
graphics/lvgl/port/lv_port_libuv.h | 92 ++++++++++++++++++
5 files changed, 301 insertions(+)
diff --git a/examples/lvgldemo/lvgldemo.c b/examples/lvgldemo/lvgldemo.c
index 076ab10f9..8bc986cde 100644
--- a/examples/lvgldemo/lvgldemo.c
+++ b/examples/lvgldemo/lvgldemo.c
@@ -36,6 +36,11 @@
#include <port/lv_port.h>
#include <lvgl/demos/lv_demos.h>
+#ifdef CONFIG_LIBUV
+# include <uv.h>
+# include <port/lv_port_libuv.h>
+#endif
+
/****************************************************************************
* Pre-processor Definitions
****************************************************************************/
@@ -175,6 +180,10 @@ int main(int argc, FAR char *argv[])
const int func_key_pair_len = sizeof(func_key_pair) /
sizeof(func_key_pair[0]);
+#ifdef CONFIG_LIBUV
+ uv_loop_t ui_loop;
+#endif
+
/* If no arguments are specified and only 1 demo exists, select the demo */
if (argc == 1 && func_key_pair_len == 2) /* 2 because of NULL sentinel */
@@ -225,6 +234,11 @@ int main(int argc, FAR char *argv[])
/* Handle LVGL tasks */
+#ifdef CONFIG_LIBUV
+ uv_loop_init(&ui_loop);
+ lv_port_libuv_init(&ui_loop);
+ uv_run(&ui_loop, UV_RUN_DEFAULT);
+#else
while (1)
{
uint32_t idle;
@@ -235,6 +249,7 @@ int main(int argc, FAR char *argv[])
idle = idle ? idle : 1;
usleep(idle * 1000);
}
+#endif
return EXIT_SUCCESS;
}
diff --git a/graphics/lvgl/Kconfig b/graphics/lvgl/Kconfig
index c902757ae..aedf75bfd 100644
--- a/graphics/lvgl/Kconfig
+++ b/graphics/lvgl/Kconfig
@@ -54,6 +54,11 @@ config LV_PORT_FBDEV_DEFAULT_DEVICEPATH
default "/dev/fb0"
depends on LV_PORT_USE_FBDEV
+config LV_PORT_UV_POLL_DEVICEPATH
+ string "Display poll device path"
+ depends on LIBUV
+ default "/dev/fb0"
+
config LV_PORT_USE_TOUCHPAD
bool "Enable touchpad port"
default n
diff --git a/graphics/lvgl/Makefile b/graphics/lvgl/Makefile
index 9188e5d73..e16bf05e3 100644
--- a/graphics/lvgl/Makefile
+++ b/graphics/lvgl/Makefile
@@ -34,6 +34,9 @@ CFLAGS += -Wno-format -Wno-unused-variable
CSRCS += port/lv_port.c
CSRCS += port/lv_port_tick.c
+ifeq ($(CONFIG_LIBUV),y)
+CSRCS += port/lv_port_libuv.c
+endif
ifeq ($(CONFIG_LV_PORT_USE_LCDDEV),y)
CSRCS += port/lv_port_lcddev.c
diff --git a/graphics/lvgl/port/lv_port_libuv.c b/graphics/lvgl/port/lv_port_libuv.c
new file mode 100644
index 000000000..d91fdb238
--- /dev/null
+++ b/graphics/lvgl/port/lv_port_libuv.c
@@ -0,0 +1,186 @@
+/****************************************************************************
+ * apps/graphics/lvgl/port/lv_port_libuv.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 <errno.h>
+#include <fcntl.h>
+#include <inttypes.h>
+#include <uv.h>
+#include <stdlib.h>
+#include <lvgl/lvgl.h>
+#include "lv_port_libuv.h"
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Type Declarations
+ ****************************************************************************/
+
+struct lv_uv_ctx_s
+{
+ int fd;
+ uv_timer_t ui_timer;
+ uv_poll_t ui_refr;
+};
+
+/****************************************************************************
+ * Private Function Prototypes
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: ui_timer_cb
+ ****************************************************************************/
+
+static void ui_timer_cb(FAR uv_timer_t *handle)
+{
+ uint32_t sleep_ms;
+ LV_LOG_TRACE("start");
+
+ sleep_ms = lv_timer_handler();
+
+ /* Prevent busy loops. */
+
+ if (sleep_ms == 0)
+ {
+ sleep_ms = 1;
+ }
+
+ uv_timer_start(handle, ui_timer_cb, sleep_ms, 0);
+ LV_LOG_TRACE("stop, sleep %" PRIu32 " ms", sleep_ms);
+}
+
+/****************************************************************************
+ * Name: ui_refr_cb
+ ****************************************************************************/
+
+static void ui_refr_cb(FAR uv_poll_t *handle, int status, int events)
+{
+ LV_LOG_TRACE("start");
+ _lv_disp_refr_timer(NULL);
+ LV_LOG_TRACE("stop");
+}
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: lv_port_libuv_init
+ *
+ * Description:
+ * Add the UI event loop to the uv_loop.
+ *
+ * Input Parameters:
+ * loop - Pointer to uv_loop.
+ *
+ * Returned Value:
+ * Pointer to UI event context.
+ *
+ ****************************************************************************/
+
+FAR void *lv_port_libuv_init(FAR void *loop)
+{
+ int fd;
+ FAR uv_loop_t *ui_loop = loop;
+ FAR lv_disp_t *disp;
+ FAR struct lv_uv_ctx_s *uv_ctx;
+
+ LV_LOG_INFO("dev: " CONFIG_LV_PORT_UV_POLL_DEVICEPATH " opening...");
+ fd = open(CONFIG_LV_PORT_UV_POLL_DEVICEPATH, O_WRONLY);
+ if (fd < 0)
+ {
+ LV_LOG_ERROR(CONFIG_LV_PORT_UV_POLL_DEVICEPATH
+ " open failed: %d", errno);
+ return NULL;
+ }
+
+ disp = lv_disp_get_default();
+ LV_ASSERT_NULL(disp);
+
+ if (disp->refr_timer == NULL)
+ {
+ LV_LOG_ERROR("disp->refr_timer is NULL");
+ close(fd);
+ return NULL;
+ }
+
+ /* Remove default refr timer. */
+
+ lv_timer_del(disp->refr_timer);
+ disp->refr_timer = NULL;
+
+ uv_ctx = malloc(sizeof(struct lv_uv_ctx_s));
+ LV_ASSERT_MALLOC(uv_ctx);
+
+ memset(uv_ctx, 0, sizeof(struct lv_uv_ctx_s));
+ uv_ctx->fd = fd;
+
+ LV_LOG_INFO("init ui_timer...");
+ uv_timer_init(ui_loop, &uv_ctx->ui_timer);
+ uv_timer_start(&uv_ctx->ui_timer, ui_timer_cb, 1, 1);
+
+ LV_LOG_INFO("init ui_refr...");
+ uv_poll_init(ui_loop, &uv_ctx->ui_refr, fd);
+ uv_poll_start(&uv_ctx->ui_refr, UV_WRITABLE, ui_refr_cb);
+
+ LV_LOG_INFO("ui loop start OK");
+ return uv_ctx;
+}
+
+/****************************************************************************
+ * Name: lv_port_libuv_uninit
+ *
+ * Description:
+ * Remove the UI event loop.
+ *
+ * Input Parameters:
+ * Pointer to UI event context.
+ *
+ ****************************************************************************/
+
+void lv_port_libuv_uninit(FAR void *ctx)
+{
+ FAR struct lv_uv_ctx_s *uv_ctx = ctx;
+
+ if (uv_ctx == NULL)
+ {
+ LV_LOG_WARN("uv_ctx is NULL");
+ return;
+ }
+
+ uv_close((FAR uv_handle_t *)&uv_ctx->ui_timer, NULL);
+ uv_close((FAR uv_handle_t *)&uv_ctx->ui_refr, NULL);
+ close(uv_ctx->fd);
+ free(ctx);
+ LV_LOG_INFO("ui loop close OK");
+}
diff --git a/graphics/lvgl/port/lv_port_libuv.h b/graphics/lvgl/port/lv_port_libuv.h
new file mode 100644
index 000000000..905fb674b
--- /dev/null
+++ b/graphics/lvgl/port/lv_port_libuv.h
@@ -0,0 +1,92 @@
+/****************************************************************************
+ * apps/graphics/lvgl/port/lv_port_libuv.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_LIBUV_H
+#define __APPS_GRAPHICS_LVGL_PORT_LV_PORT_LIBUV_H
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+#if defined(CONFIG_LIBUV)
+
+/****************************************************************************
+ * Type Definitions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Data
+ ****************************************************************************/
+
+#ifdef __cplusplus
+#define EXTERN extern "C"
+extern "C"
+{
+#else
+#define EXTERN extern
+#endif
+
+/****************************************************************************
+ * Public Function Prototypes
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: lv_port_libuv_init
+ *
+ * Description:
+ * Add the UI event loop to the uv_loop.
+ *
+ * Input Parameters:
+ * loop - Pointer to uv_loop.
+ *
+ * Returned Value:
+ * Pointer to UI event context.
+ *
+ ****************************************************************************/
+
+FAR void *lv_port_libuv_init(FAR void *loop);
+
+/****************************************************************************
+ * Name: lv_port_libuv_uninit
+ *
+ * Description:
+ * Remove the UI event loop.
+ *
+ * Input Parameters:
+ * Pointer to UI event context.
+ *
+ ****************************************************************************/
+
+void lv_port_libuv_uninit(FAR void *ctx);
+
+#undef EXTERN
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* CONFIG_LIBUV */
+
+#endif /* __APPS_GRAPHICS_LVGL_PORT_LV_PORT_LIBUV_H */