嵌入式 Linux 下的 LVGL 移植

5 篇文章 0 订阅

LVGL(Light and Versatile Graphics Library)是一个轻量化的、开源的、在嵌入式系统中广泛使用的图形库,它提供了一套丰富的控件和组件,只需要少量的内存和计算资源,使得在资源受限的设备上创建高端的图形界面成为可能。本文记录如何将 LVGL 移植到嵌入式 Linux 系统中。

  • 编程环境:Windows11 VS Code
  • 编译环境:Ubuntu18.04 交叉编译
  • 测试平台:正点原子 i.MX6ULL
  • 显示屏:5inch RGB 800×480

准备

打开 LVGL 的 Github 主页,分别下载 lvgllv_driverslv_port_linux_frame_buffer 仓库源码

lvgl 和 lv_drivers 我这里选择了当前最新的已发布版本:

创建工程

  1. 创建 lvgl_demo 文件夹;
  2. 将 lvgl、lv_drivers 复制到 lvgl_demo 中;
  3. 将 lv_port_linux_frame_buffer 仓库中的 main.c 文件和 makefile 文件复制到 lvgl_demo 中;
  4. 将 lvgl 中的 lv_conf_template.h 文件复制到 lvgl_demo 中并且改名为 lv_conf.h;
  5. 将 lv_drivers 中的 lv_drv_conf_template.h 文件复制到 lvgl_demo 中并且改名为 lv_drv_conf.h;
  6. 创建好的工程目录如图所示:

修改配置

修改 lv_drv_conf.h

  • #if 0 改成 #if 1

  • USE_FBDEV 的值改为 1,使能 frame buffer 设备:

  • USE_EVDEV 的值改为 1,配置触控输入设备的文件路径:

可以通过 cat /dev/input/eventx 的方式查看输入事件,x 为事件编号,通过触摸屏幕时查看有没有内容输出确认 x

修改 lv_conf.h

  • #if 0 改成 #if 1

  • 根据实际情况适当扩大内存:

  • 这里可以修改刷新频率,默认为 30ms:

  • 配置 Tick:

  • 使能 widgets demo:

修改 main.c

  • 修改后的 main.c 文件如下所示:
#include "lvgl/lvgl.h"
#include "lvgl/demos/lv_demos.h"
#include "lv_drivers/display/fbdev.h"
#include "lv_drivers/indev/evdev.h"
#include <unistd.h>
#include <time.h>
#include <sys/time.h>

#define DISP_BUF_SIZE (800 * 480)

int main(void)
{
    lv_init();

    /*Linux frame buffer device init*/
    fbdev_init();

    /*A small buffer for LittlevGL to draw the screen's content*/
    static lv_color_t buf[DISP_BUF_SIZE];

    /*Initialize a descriptor for the buffer*/
    static lv_disp_draw_buf_t disp_buf;
    lv_disp_draw_buf_init(&disp_buf, buf, NULL, DISP_BUF_SIZE);

    /*Initialize and register a display driver*/
    static lv_disp_drv_t disp_drv;
    lv_disp_drv_init(&disp_drv);
    disp_drv.draw_buf   = &disp_buf;
    disp_drv.flush_cb   = fbdev_flush;
    disp_drv.hor_res    = 800;
    disp_drv.ver_res    = 480;
    lv_disp_drv_register(&disp_drv);

    /* Linux input device init */
    evdev_init();

    /* Initialize and register a display input driver */
    lv_indev_drv_t indev_drv;
    lv_indev_drv_init(&indev_drv);      /*Basic initialization*/

    indev_drv.type = LV_INDEV_TYPE_POINTER;
    indev_drv.read_cb = evdev_read;
    lv_indev_t * my_indev = lv_indev_drv_register(&indev_drv); 

    /*Create a Demo*/
    lv_demo_widgets();

    /*Handle LVGL tasks*/
    while(1) {
        lv_timer_handler();
        usleep(5000);
    }

    return 0;
}

/*Set in lv_conf.h as `LV_TICK_CUSTOM_SYS_TIME_EXPR`*/
uint32_t custom_tick_get(void)
{
    static uint64_t start_ms = 0;
    if(start_ms == 0) {
        struct timeval tv_start;
        gettimeofday(&tv_start, NULL);
        start_ms = (tv_start.tv_sec * 1000000 + tv_start.tv_usec) / 1000;
    }

    struct timeval tv_now;
    gettimeofday(&tv_now, NULL);
    uint64_t now_ms;
    now_ms = (tv_now.tv_sec * 1000000 + tv_now.tv_usec) / 1000;

    uint32_t time_ms = now_ms - start_ms;
    return time_ms;
}

修改 Makefile

  • 指定编译器,因为我在编译前会设置编译器环境变量,为避免错误,此处注释掉该配置,使用环境下默认编译器:

  • 添加 lv_drivers.mk,注释掉鼠标样式源文件:

  • 修改了下构建目标名称:

  • 若编译过程中出现未识别的编译选项,如报 error: unrecognized command line option '-Wshift-negative-value' 类似错误,可删除 -Wshift-negative-value 选项,该选项的作用是检查左移操作(<<)中可能出现的负数:

编译运行

  • 首先设置交叉编译链的环境变量,执行 make 命令:

  • 编译成功后在工程目录生成一个可执行文件 lvgl_demo,将其复制到 IMX6U 开发板上;
  • 我这里使用 NFS 挂载的方式,将 lvgl_demo 复制到 NFS 工作目录:

  • 启动 IMX6U,查看 IP,挂载 NFS:

  • 切换到 /mnt/ 目录下,运行 lvgl_demo

  • 运行成功:

更多内容

  • 29
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 16
    评论
### 回答1: 嵌入式Linux移植LVGL的步骤如下: 1. 确认目标平台的处理器架构和操作系统版本,以及LVGL的版本和依赖库。 2. 下载LVGL源代码,并根据目标平台的处理器架构进行编译。 3. 根据目标平台的操作系统版本,修改LVGL的配置文件,包括屏幕分辨率、颜色深度、字体等。 4. 根据目标平台的硬件接口,编写驱动程序,包括屏幕驱动、输入设备驱动等。 5. 将LVGL的库文件和驱动程序集成到目标平台的文件系统中。 6. 在目标平台上运行测试程序,验证LVGL的功能和性能。 7. 根据实际需求,进行优化和定制化开发,以满足特定应用场景的需求。 以上是嵌入式Linux移植LVGL的基本步骤,需要根据具体情况进行调整和完善。 ### 回答2: 嵌入式Linux系统是一种常用的嵌入式系统,它具有可扩展性、灵活性、可靠性等优点。而LVGL是一种高性能、可定制的图形界面库,常被用于嵌入式Linux系统中,来提供用户友好、美观、易用的交互界面。因此,移植LVGL嵌入式Linux系统中,已成为很多开发者的需求。以下是关于嵌入式Linux移植LVGL的一些指南: 1. 确认硬件平台 首先,需要确定嵌入式Linux系统所使用的硬件平台,包括处理器体系结构、SoC等。因为LVGL是一个跨平台的图形界面库,所以需要对其进行移植移植LVGL需要确保底层硬件的驱动已经完善,并经过了充分的测试和验证。 2. 安装必要的开发工具 在移植LVGL之前,需要安装必要的开发工具。首先,需要安装嵌入式Linux系统的开发环境,包括交叉编译工具链、调试器、开发板的bootloader等。其次,需要安装LVGL相关的开发工具,如GUI Builder、Font Converter等。 3. 下载LVGL源码并配置 下一步是下载LVGL源代码,然后配置工程。在配置工程时,需要在makefile中添加相关参数,如编译选项、链接选项等。还需要将LVGL与所使用的嵌入式Linux系统进行整合,以确保LVGL能够与系统完美地交互。 4. 编写应用程序 接下来,需要编写应用程序,以实现与LVGL的交互。开发人员可以使用现有的LVGL应用程序作为模板,然后进行修改和调整。在编写应用程序时,需要确保使用了正确的调用接口,以保证LVGL库能够正确地运行,并与所选择的硬件平台相匹配。 5. 测试与验证 一旦完成LVGL移植和应用程序开发,需要进行测试和验证。在进行系统测试时,需要关注系统的性能和稳定性。测试过程中需要注重测试用例,尽可能地涵盖各种情况,以确保系统的完整性和正确性。 综上所述,移植LVGL嵌入式Linux系统中,需要开发人员具备一定的嵌入式开发经验和系统调试能力。需要注意移植过程中的细节问题,及时发现和解决问题,确保系统的稳定性和可靠性。 ### 回答3: 嵌入式Linux移植LVGL是一个相对复杂和庞大的工作,需要深入理解Linux系统、LVGL图形库以及嵌入式系统的相关知识和技术。 在移植过程中,可以按照以下步骤进行: 1. 安装交叉编译器 需要安装与目标硬件架构相对应的交叉编译器,以便在开发机上生成目标平台的可执行文件。可以选择使用已有的交叉编译器或自行编译交叉编译器。 2. 准备开发环境 需要配置和准备开发环境,包括交叉编译工具链、系统工具、库文件等。 3. 准备源代码 需要在Linux主机上下载LVGL的源代码和相关的依赖库代码,并进行适当的调试和修改。 4. 配置Makefile文件 需要根据硬件平台的不同,对Makefile文件进行相关配置,包括编译器路径、库文件路径、头文件路径等。 5. 编译和链接 使用Makefile文件进行编译和链接生成目标文件。 6. 运行测试 将生成的目标文件拷贝到目标嵌入式系统上,进行测试,并及时调整和修改。 除了以上步骤外,还需要注意以下几点: 1. 熟悉LVGL图形库的使用方法和API,以便在移植过程中进行相应的调整和修改。 2. 根据目标硬件平台的不同,需要针对硬件的特性进行相应的调整和优化。 3. 在移植过程中需要处理好库文件和头文件的依赖关系,防止出现链接或编译错误。 4. 要注意码大小和性能,针对不同的应用场景进行相应的优化。 综上所述,嵌入式Linux移植LVGL需要技术水平比较高的开发人员,并且需要进行细致的调试和优化工作。但是,一旦成功移植,将大大加快嵌入式Linux图形界面开发的速度,提高系统的性能和稳定性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hello阿尔法

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值