使用带有 LVGL 的 Linux 帧缓冲设备的嵌入式 GUI

LVGL简介

LVGL 是一个针对资源有限的微控制器的图形库。但是,可以使用它来创建带有运行 Linux 操作系统的高端微处理器和板卡的嵌入式 GUI。最知名的处理器内核是 ARM Cortex A9(例如NXP i.MX6)和 ARM Cortex A53(例如Raspbery PI 3)。你可以通过简单地使用 Linux 的帧缓冲设备(通常是 /dev/fb0)在这台单板计算机上创建嵌入式 GUI。

获取项目源码

git clone https://github.com/lvgl/lv_port_linux_frame_buffer

更新子仓库,否则编译会报错

git submodule update --init --recursive

直接使用框架?

帧缓冲设备是一个非常低级的接口,用于在屏幕上显示某些内容。说到嵌入式 GUI,直接使用帧缓冲区而不是窗口管理器有几个原因:

简单只需将像素写入内存
快速没有窗口管理器,这意味着快速启动和更少的开销
便携独立于发行版,每个 Linux 系统都有一个帧缓冲设备,因此它与所有系统兼容

开始使用 Linux 架构

也许你对 Linux 帧缓冲设备很熟悉。它是一个通常位于/dev/fb0的文件。此文件包含显示器的像素数据。如果将某些内容写入帧缓冲区文件,则更改将显示在显示屏上。如果在 PC 上使用 Linux,可以使用终端进行尝试:

  1. 按Ctrl + Alt + F1 离开桌面并更改为简单字符终端
  2. 输入sudo su并输入你的密码
  3. 停止你的显示管理器(在 Ubuntu 上是lightdm):service lightdm
    stop重要:它会注销你,所以所有的窗口都会被关闭
  4. 将随机数据写入帧缓冲设备:cat /dev/urandom > /dev/fb0你应该在整个屏幕上看到随机颜色的像素。
  5. 要返回正常的图形用户界面:service lightdm start
    在这里插入图片描述
    它也应该在基于 Linux 的单板计算机上工作,例如:
    Raspberry PI
    Banana PI
    BeagleBone
    Gizmo

获取 LVGL 以创建嵌入式 GUI

现在你知道如何更改显示器上的像素了。但是你仍然需要创建 GUI 元素而不是随机像素的东西。LVGL 出现在画面中。该软件库旨在在嵌入式系统的显示器上创建 GUI 元素(如标签、按钮、图表、滑块、复选框等)。在此处检查所有小部件。图形库是用 C 语言编写的,因此你肯定可以在你的项目中进行调整。可以添加使你的 GUI 令人印象深刻的不透明度、流畅的动画、抗锯齿和阴影。

要使用 LVGL,需要从GitHub克隆它或从开发者页面获取。将需要以下组件:

lvgl图形库的核心
lv_drivers包含一个 Linux 帧缓冲驱动程序
lv_examples可选地加载一个演示应用程序进行测试

GUI项目设置

在 Linux PC 上测试基于帧缓冲设备的 GUI 的最简单案例。稍后你也可以在嵌入式设备上应用相同的代码。

在你首选的 IDE 中创建一个新项目
复制lvgllv_drivers文件夹旁边的模板配置文件:
lvgl/lv_conf_templ.h作为lv_conf.h
lv_drivers/lv_drv_conf_templ.h作为lv_drv_conf.h
在配置文件中删除第一个和最后一个#if和#endif以启用它们的内容。
在这里插入图片描述

  1. 在lv_drv_conf.h 中设置USE_FBDEV 1
  2. 在lv_conf.h 中更改颜色深度:LV_COLOR_DEPTH 32
  3. 将项目根文件夹添加为包含路径

创建嵌入式 GUI 应用程序

1.在 main.c 中编写以下代码来创建一个 hello world 标签:

int main(void)
{
    /*LVGL init*/
    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);

    /*Create a "Hello world!" label*/
    lv_obj_t * label = lv_label_create(lv_scr_act());
    lv_label_set_text(label, "Hello world!");
    lv_obj_align(label, LV_ALIGN_CENTER, 0, 0);

    /*Handle LitlevGL tasks (tickless mode)*/
    while(1) {
        lv_tick_inc(5);
        lv_timer_handler();
        usleep(5000);
    }

    return 0;
}

2.编译代码并返回字符终端模式(Ctrl + Alt + F1 和service lightdm stop)

3.转到构建的可执行文件并键入:./file_name

在这里插入图片描述
3.通过将 Hello world 标签 create 替换为以下示例,使用演示应用程序进行测试:demo_create();
在这里插入图片描述
下载一个现成的项目

在lv_port_linux_frame_buffer存储库中,可以找到一个Eclipse CDT项目,以在 Linux PC 上试用基于普通帧缓冲区的 GUI。

还有一个 Makefile 可以在没有 IDE 的情况下在嵌入式硬件上编译项目。

概括

我希望你喜欢本教程,并发现它对你基于微处理器的嵌入式 Linux 项目很有用。如你所见,使用 LVGL 创建一个嵌入式 GUI 非常简单,只使用一个普通的 Linux 帧缓冲区。

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值