0.为什么需要“额外”的源码包?
$LVGL$ 为了保持高度的可移植性,把图形算法和底层硬件驱动完全解耦了。
1. 核心库 ($LVGL$)
这是你说的“直接下的源码”。它负责计算:
- 按钮什么时候该变色?
- 动画的轨迹怎么算?
- 多个图层怎么叠加? 但它不负责驱动屏幕。 它只输出一堆代表像素颜色的原始数据。
2. 驱动库 ($lv_drivers$)
这就是老师下载的那个包。针对 Linux 系统(比如你接触过的嵌入式开发板),最常用的显示接口就是 /dev/fb0(Framebuffer)。
- 它的作用: 提供一套现成的代码,告诉 $LVGL$ 如何打开
/dev/fb0设备文件、如何进行mmap内存映射、以及如何把计算好的像素数据填进显存。 - 输入设备: 这个包里通常还包含了触摸屏(
/dev/input/eventX)或鼠标的驱动代码。
移植过程中的“分工”
你提供的截图中其实已经写得很清楚了,我们可以把这个逻辑串起来:
| 步骤 | 涉及内容 | 目的 |
|---|---|---|
| 合并源码 | $LVGL$ + $lv_drivers$ | 把“大脑”和“手脚”放在同一个项目文件夹里。 |
修改 lv_conf.h | 核心配置 | 开启或关闭 $LVGL$ 的功能(比如是否启用中文字体、动画效果等)。 |
修改 lv_drv_conf.h | 驱动配置 | 关键点! 在这里指定你要用 USE_FBDEV(Framebuffer)还是其他驱动,并告诉它设备路径是不是 /dev/fb0。 |
编写 main.c | 逻辑初始化 | 在这里调用 lv_init() 初始化大脑,再调用驱动初始化的函数把两者“缝合”在一起。 |
总结
如果你不下载这个 lv_drivers 包,你就得自己手写一套针对 /dev/fb0 的 C 语言代码,去实现像素点的填充函数。老师直接下载它,是为了利用现成的“中间件”,节省造轮子的时间。
1.源码下载

2.配置源码
把两个分支源码包下载到本地之后,需要对两个源码包进行解压,再把解压之后的所有内容分别拷贝到工程中lvgl文件夹和lvgl_drivers文件夹中即可。

将lvgl文件夹下的lv_conf_template.h的内容,全部替换到lv_port_linux_frame_buffer-master文件夹下的lv_conf.h文件内


将lv_drivers文件夹内的lv_drv_conf_template.h,全部替换到lv_port_linux_frame_buffer-master文件夹下的lv_drv_conf.h文件内


修改参数
在lv_conf.h内,修改色深为32位,启用此头文件

在lv_drv_conf.h内,启用USE_FBDEV宏定义,填入你要启动的帧缓冲设备路径


替换main函数
#include "lvgl/lvgl.h"
#include "lv_drivers/display/fbdev.h"
#include <unistd.h>
#define DISP_BUF_SIZE (800*480)
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;
}
3.编译
代码放进ubuntu虚拟机内,执行make开始编译
编译完成后,构建的可执行文件在build/bin目录下
输入sudo init 3关闭当前屏幕,进入字符界面
运行demo

输入sudo init 5回到图形界面
4.移植arm开发板
在lv_drv_conf.h内

在Makefile内,注意:去掉-Wshift-negative-value选项,要不然编译器可能识别不了

编译后,查看文件属性,为arm平台即可



