LVGL图形库移植arm平台
本文最后更新于 107 天前,其中的信息可能已经有所发展或是发生改变。

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.源码下载

image-20260501215539934

2.配置源码

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

image-20260501215737801

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

image-20260501215840803
image-20260501220012287

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

image-20260501220200771
image-20260501220334027

修改参数

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

image-20260501223802687

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

image-20260501224121964
image-20260501220834576

替换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

image-20260501223519963

输入sudo init 5回到图形界面

4.移植arm开发板

lv_drv_conf.h

image-20260502224831152

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

image-20260502224948179

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

image-20260502225128983
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇