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,可以使用终端进行尝试:
- 按Ctrl + Alt + F1 离开桌面并更改为简单字符终端
- 输入sudo su并输入你的密码
- 停止你的显示管理器(在 Ubuntu 上是lightdm):service lightdm
stop重要:它会注销你,所以所有的窗口都会被关闭 - 将随机数据写入帧缓冲设备:cat /dev/urandom > /dev/fb0你应该在整个屏幕上看到随机颜色的像素。
- 要返回正常的图形用户界面: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 中创建一个新项目
复制lvgl和lv_drivers文件夹旁边的模板配置文件:
lvgl/lv_conf_templ.h作为lv_conf.h
lv_drivers/lv_drv_conf_templ.h作为lv_drv_conf.h
在配置文件中删除第一个和最后一个#if和#endif以启用它们的内容。
- 在lv_drv_conf.h 中设置USE_FBDEV 1
- 在lv_conf.h 中更改颜色深度:LV_COLOR_DEPTH 32
- 将项目根文件夹添加为包含路径
创建嵌入式 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 帧缓冲区。