首页 > 系统相关 >Linux 环境中使用 LVGL

Linux 环境中使用 LVGL

时间:2024-01-14 17:45:20浏览次数:38  
标签:文件 lvgl 环境 Wno drv lv Linux ##################################### LVGL

原文:https://www.cnblogs.com/jzcn/p/17011647.html

之前有记录过在 esp32 中使用 LVGL 的笔记,需要的小伙伴可以了解一下,esp-idf 移植 lvgl8.3.3
我之前整理的学习资料:https://www.cnblogs.com/jzcn/p/16647106.html

一、准备材料

开发板:一块 linux 的开发板 或 linux 的虚拟机
lvgl:8.3.3
系统:ubuntu 18.04

注意:在 linux 环境下使用 lvgl 就相对比较简单了,这里记录了两个方式。

二、方式一

因为 linux 环境下,官方已经帮我们创建好了项目,所以只需要直接拉取就好了。
仓库地址:https://github.com/lvgl/lv_port_linux_frame_buffer

  1. git 命令

      git clone --recursive https://github.com/lvgl/lv_port_linux_frame_buffer.git
      # 如果拉取不下来,可以使用下面的加速地址,我也不知道是否会失效
      https://github.moeyy.xyz/https://github.com/lvgl/lv_port_linux_frame_buffer.git
       

    注意:拉取的时候已经要加 --recursive,否则项目中的子工程拉不下来,如果拉取时忘记加 --recursive 参数,可以在拉取完成是使用 git submodule update --init --recursive 命令更新一下即可。

  2. 工程目录
    拉取完成后,工程目录如下所示:

  3. 编译工程
    直接使用 make 命令编译即可,完成后如下图所示:会直接生成可执行文件,如下图所示:

    注意: 发现可执行文件后,基本就完成了,直接运行即可,./demo ,毫无疑问基本会运行失败,结果如下图所示:

  4. 修改显示驱动
    这里的显示驱动都是使用的 Framebuffer 缓冲区,我之间有个简单的笔记使用,不了解的小伙伴,可以看我之前的笔记,Linux Framebuffer 实验,知道自己的缓冲区设备后,就可以直接在文件 lv_drv_conf.h 中进行修改,不过多数情况下都是 /dev/fb0 可以不用修改,如下图所示:

  5. 修改鼠标或触摸驱动
    在修改鼠标或触摸驱动时,需要借助 evtest 工具,找到自己设备的输入事件。

    • 安装 evtset 工具

        sudo apt-get install evtest
    • 使用命令 sudo evtest 找到对应的事件编号,如下图所示:

    找到鼠标事件后,直接在 lv_drv_conf.h 文件中,更改对应的事件编号即可,如下图所示:

  6. 运行测试
    完成驱动修改后,重新编译测试,因为使用的是 Framebuffer 缓冲区,所以在 ubuntu 缓冲区中使用是,需要关闭图形显示后,才是正常使用 Framebuffer ,命令如下

      # 关闭图形显示
      systemctl set-default multi-user.target
      reboot
       
      # 打开图形显示
      systemctl set-default graphical.target
      reboot

    关闭图形显示后,测试结果如下图所示:

三、方式二

上面我们已经完成了,在 ubuntu 中测试 LVGL 操作还是比较简单的,现在我们开始尝试手动创建工程,并将编译后生成的.o文件放到指定目录下,然后更改编译工具,使其在arm开发板中进行使用。

注意: 在创建过程中,有什么问题可以直接参考上面的工程,可以解决我们过程中遇到的问题

  1. 下载 LVGL

  2. 创建工程目录
    这里我就不详细说明了,直接上图,只要文件目录如图所示一样即可,路径图下图所示:

  3. 将 lvgl 移动到 lib 文件下,并删除多余的文件,如下图所示:

    注意:其中的 lv_conf.h 文件是直接将 lv_conf_template.h 拷贝后进行重命名的,完成后将文件中的 #if 0 改为 #if 1

  4. 将 lvgl 目录下的 demos 文件拷贝到 lib 文件下,如下图所示:

    注意:这里为了 demos 使用中减少问题,我直接拷贝了 lvgl 文件下的 demos 并重命名为 lv_demos

  5. 将 lv_drivers 拷贝到 lib 文件下,并删除多余的文件,如下图所示:

    注意:其中 lv_drv_conf.h 文件是拷贝 lv_drv_conf_template.h 文件重命名后得到的,完成后将文件中的 #if 0 改为 #if 1

  6. 将 lvgl 目录下的 examples 文件拷贝到 lib 文件下,如下图所示:

  7. 在 application 文件下创建 main.c 文件,内容如下:

      #include "lvgl.h"
      #include "../lib/lv_demos/lv_demos.h"
      #include "../lib/lv_drivers/display/fbdev.h"
      #include "../lib/lv_drivers/indev/evdev.h"
      #include <unistd.h>
      #include <pthread.h>
      #include <time.h>
      #include <sys/time.h>
       
      #define DISP_BUF_SIZE (128 * 1024)
       
      int main(void)
      {
      /*LittlevGL 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);
       
      evdev_init();
      static lv_indev_drv_t indev_drv_1;
      lv_indev_drv_init(&indev_drv_1); /*Basic initialization*/
      indev_drv_1.type = LV_INDEV_TYPE_POINTER;
       
      /*This function will be called periodically (by the library) to get the mouse position and state*/
      indev_drv_1.read_cb = evdev_read;
      lv_indev_t *mouse_indev = lv_indev_drv_register(&indev_drv_1);
       
       
      /*Set a cursor for the mouse*/
      LV_IMG_DECLARE(mouse_cursor_icon)
      lv_obj_t * cursor_obj = lv_img_create(lv_scr_act()); /*Create an image object for the cursor */
      lv_img_set_src(cursor_obj, &mouse_cursor_icon); /*Set the image source*/
      lv_indev_set_cursor(mouse_indev, cursor_obj); /*Connect the image object to the driver*/
       
       
      /*Create a Demo*/
      lv_demo_widgets();
       
      /*Handle LitlevGL tasks (tickless mode)*/
      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;
      }
       
  8. 拷贝鼠标文件 mouse_cursor_icon.c
    将方式一中获取到的鼠标文件拷贝到 application 文件下

  9. 在 lib 目录下创建 lib.mk 文件,内容如下:

      ##################################### lvgl库 #####################################
      # 文件路径
      LVGL_DIR ?= $(PROJECT_PATH)/lib
       
      # 所需的宏定义
      CFLAGS += -DLV_CONF_INCLUDE_SIMPLE
      CFLAGS += -DLV_LVGL_H_INCLUDE_SIMPLE
      # lvgl库
      LVGL_DIR_NAME ?= lvgl
       
      # 所需头文件的路径
      CFLAGS += -I$(LVGL_DIR)/lvgl
       
      # 收集需要编译的源文件
      include $(LVGL_DIR)/lv_demos/lv_demos.mk
      include $(LVGL_DIR)/lv_examples/lv_examples.mk
      include $(LVGL_DIR)/lv_drivers/lv_drivers.mk
      include $(LVGL_DIR)/$(LVGL_DIR_NAME)/lvgl.mk
  10. 在主目录下创建 Makefile 文件,内容如下:

      #
      # Makefile
      # 编译的.o文件和.c文件在同一路径下
      #
       
      $(info "start...")
      # 可执行文件名
      PROJECT_NAME = lvgl_app
       
      ##################################### 项目路径 #####################################
      PROJECT_PATH ?= ${shell pwd}
      OBJ_DIR := $(PROJECT_PATH)/build
       
      ##################################### 设置编译器,默认使用GCC #####################################
      CC = arm-linux-gnueabihf-gcc
      CC ?= gcc
       
      ##################################### 所需头文件的路径 #####################################
      # lv_conf.h
      CFLAGS += -I$(PROJECT_PATH)/lib/lvgl
      # lv_drv_conf.h
      CFLAGS += -I$(PROJECT_PATH)/lib/lv_drivers
       
      ##################################### 编译和链接参数 #####################################
      CFLAGS ?= -O3 -g0 -Wall -Wshadow -Wundef -Wmissing-prototypes -Wno-discarded-qualifiers -Wextra -Wno-unused-function \
      -Wno-error=strict-prototypes -Wpointer-arith -fno-strict-aliasing -Wno-error=cpp -Wuninitialized -Wmaybe-uninitialized \
      -Wno-unused-parameter -Wno-missing-field-initializers -Wtype-limits -Wsizeof-pointer-memaccess -Wno-format-nonliteral \
      -Wno-cast-qual -Wunreachable-code -Wno-switch-default -Wreturn-type -Wmultichar -Wformat-security -Wno-ignored-qualifiers \
      -Wno-error=pedantic -Wno-sign-compare -Wno-error=missing-prototypes -Wdouble-promotion -Wclobbered -Wdeprecated -Wempty-body \
      -Wshift-negative-value -Wstack-usage=2048 -Wno-unused-value
       
      LDFLAGS ?= -lm
       
      ##################################### 收集需要编译的源文件 #####################################
      CSRCS += $(PROJECT_PATH)/application/main.c
      CSRCS += $(PROJECT_PATH)/application/mouse_cursor_icon.c
      include $(PROJECT_PATH)/lib/lib.mk
       
       
      ##################################### 将文件名替换为.o文件 #####################################
      AOBJS = $(ASRCS:.S=.o)
      COBJS = $(CSRCS:.c=.o)
      # CXX_SOURCES = $(foreach dir,$(CSRCS), $(wildcard $(dir)/*.c))
      # CXX_OBJCTS = $(patsubst %.c, $(OBJ_DIR)/%.o, $(CSRCS))
       
      all: default
       
      %.o: %.c
      @$(CC) $(CFLAGS) -c $< -o $@
      #@echo "CC $<"
       
      default: $(COBJS)
      $(CC) -o $(PROJECT_NAME) $(COBJS) $(AOBJS) $(LDFLAGS)
       
      clean:
      rm -f $(PROJECT_NAME) $(COBJS) $(AOBJS)
       

注意: 到此工程文件已经创建好了,接下来只需要解决我们工程放置文件路径导致的问题即可,目录结构如下图所示:

  1. 修改 lib/lv_demos/lv_demos.mk 文件内容如下:

      CSRCS += $(shell find -L $(LVGL_DIR)/lv_demos -name "*.c")
  2. 修改 lib/lv_examples/lv_examples.mk 文件,内容如下:

      CSRCS += $(shell find -L $(LVGL_DIR)/lv_examples -name \*.c)
  3. 修改 lib/lvgl/lvgl.mk

  4. 启动相应的功

    • USE_FBDEV:在文件 lv_drv_conf.h 中
    • USE_EVDEV:在文件 lv_drv_conf.h 中
    • LV_USE_DEMO_WIDGETS:在文件 lv_conf.h,主要作用是启动相应的案例
  5. 在编译的过程中会有 lvgl.h 头文件的引用错误。如下所示:

      #include "../../../lvgl.h"

    这是因为我们移动路径导致的,所以只需要将所以文件引用改为 #include "lvgl.h" 即可

注意:到此我们自己在 Linux 环境下创建的 LVGL 工程就已经完成了,这里自己创建 lvgl 的目的主要是方便版本的选择,可以根据自己的需要选择相应的 LVGL 版本。

四、指定 .o 文件的存放路径

上面的工程中会发现编译生成的.o文件和.c文件是在同一路径下的,那么在实际开发中有不方便之处,所以将.o文件指定到build文件下,操作比较简单,只需要将 Makefile 文件进行更改即可,如下所示:

Makefile 文件

  #
  # Makefile
  # 编译的.o文件和.c文件在同一路径下
  #
   
  $(info "start...")
  # 可执行文件名
  PROJECT_NAME = lvgl_app
   
  ##################################### 项目路径 #####################################
  PROJECT_PATH ?= ${shell pwd}
  OBJ_DIR := $(PROJECT_PATH)/build
   
  ##################################### 设置编译器,默认使用GCC #####################################
  CC = arm-linux-gnueabihf-gcc
  CC ?= gcc
   
  ##################################### 所需头文件的路径 #####################################
  # lv_conf.h
  CFLAGS += -I$(PROJECT_PATH)/lib/lvgl
  # lv_drv_conf.h
  CFLAGS += -I$(PROJECT_PATH)/lib/lv_drivers
   
  ##################################### 编译和链接参数 #####################################
  CFLAGS ?= -O3 -g0 -Wall -Wshadow -Wundef -Wmissing-prototypes -Wno-discarded-qualifiers -Wextra -Wno-unused-function \
  -Wno-error=strict-prototypes -Wpointer-arith -fno-strict-aliasing -Wno-error=cpp -Wuninitialized -Wmaybe-uninitialized \
  -Wno-unused-parameter -Wno-missing-field-initializers -Wtype-limits -Wsizeof-pointer-memaccess -Wno-format-nonliteral \
  -Wno-cast-qual -Wunreachable-code -Wno-switch-default -Wreturn-type -Wmultichar -Wformat-security -Wno-ignored-qualifiers \
  -Wno-error=pedantic -Wno-sign-compare -Wno-error=missing-prototypes -Wdouble-promotion -Wclobbered -Wdeprecated -Wempty-body \
  -Wshift-negative-value -Wstack-usage=2048 -Wno-unused-value
   
  LDFLAGS ?= -lm
   
  ##################################### 收集需要编译的源文件 #####################################
  CSRCS += $(PROJECT_PATH)/application/main.c
  CSRCS += $(PROJECT_PATH)/application/mouse_cursor_icon.c
  include $(PROJECT_PATH)/lib/lib.mk
   
   
  ##################################### 将文件名替换为.o文件 #####################################
  CXX_OBJCTS = $(patsubst %.c, $(OBJ_DIR)/%.o, $(notdir $(CSRCS)))
  SOURSE_DIR = $(dir $(CSRCS))
   
  vpath %.c $(SOURSE_DIR)
   
  $(OBJ_DIR)/%.o: %.c
  @$(CC) $(CFLAGS) -c $< -o $@
  #@echo "CC $<"
   
  all: $(CXX_OBJCTS)
  @$(CC) -o $(PROJECT_NAME) $(CXX_OBJCTS) $(LDFLAGS)
   
  clean:
  @rm -f $(PROJECT_NAME) $(CXX_OBJCTS)
   

笔记到此结束,有写得不好的地方望各位大佬指出

本文来自博客园,作者:浇筑菜鸟,转载请注明原文链接:https://www.cnblogs.com/jzcn/p/17011647.html

如本博客的内容侵犯了你的权益,请与以下地址联系,本人获知后,马上删除。同时本人深表歉意,并致以崇高的谢意! [email protected]

标签:文件,lvgl,环境,Wno,drv,lv,Linux,#####################################,LVGL
From: https://www.cnblogs.com/bruce1992/p/17963970

相关文章

  • linux 驱动 --- unlocked_ioctl 与 compat_ioctl
    1、compat_ioctl:支持64bit的driver必须要实现的ioctl,当有32bit的userspaceapplicationcall64bitkernel的IOCTL的时候,这个callback会被调用到。如果没有实现compat_ioctl,那么32位的用户程序在64位的kernel上执行ioctl时会返回错误:Notatypewriter2、如果是64位的用户程序运行......
  • 精确掌控并发:固定时间窗口算法在分布式环境下并发流量控制的设计与实现
    这是《百图解码支付系统设计与实现》专栏系列文章中的第(14)篇。点击上方关注,深入了解支付系统的方方面面。本篇主要介绍分布式场景下常用的并发流量控制方案,包括固定时间窗口、滑动时间窗口、漏桶、令牌桶、分布式消息中间件等,并重点讲清楚固定时间窗口应用原理和应用场景,以及使用re......
  • Linux安装Docker完整教程
    Linux安装Docker之前使用的CentOS8由于停止维护了,这意味着无法再使用新版本的软件包更新了,由于Docker支持64位版本CentOS7,并且要求内核版本不低于3.10,CentOS7满足最低内核的要求,所以这次在CentOS7安装Docker。本篇文档参考黑马Docker课件,希望这篇文章对大家能有帮助......
  • 重置 wsl2 中的 Linux 子系统的账户密码
    转载:重置wsl2中的Linux子系统的账户密码(liuwenzhuang.github.io)默认账户改为root变更普通账户密码将默认账户从root修改为普通账户其他注意事项参考重置密码的操作也很简单,经过查询资料,可将步骤大致分为3步:将Linux子系统的默认账户改为root利用root......
  • Qt安装环境
    在线安装从http://mirrors.ustc.edu.cn/qtproject/official_releases/online_installers/下载在线安装器。可以使用以下两种方式之一在安装器中配置使用科大源下载Qt:(推荐)新版本的安装器(4.0.1-1后)支持--mirror命令行参数。在命令行中执行安装器,添加--mirrorhttps://mirr......
  • Python3环境安装
    Ubuntu下自带Python。python3-Vpython3--versionPython3.10.12sudoapt-getinstallpython3-pippip -Vpip3--versionpip22.0.2from/usr/lib/python3/dist-packages/pip(python3.10)sudoaptinstallpython3.10-venvpython3-mvenvmyenvsourcemyenv/bin/activ......
  • Linux三大剑客之sed
    一、简介sed英文全称是streameditor。由贝尔实验室开发,如今主流Unix/Linux操作系统上都集成了这个工具。sed由自由软件基金组织(FSF)开发和维护,并且随着GNU/Linux进行分发,通常它也称作GNUsed。本文将按照GUN官方在线手册的内容对sed进行介绍。二、获取帮助信息[sed@GeekDevOps~]$......
  • 利用Linux命令高效查找大文件为windows系统瘦身
    Windows系统是大家平时使用得比较多的办公桌面系统,但是,作为一名运维工程师,Linux命令行才是我的首选。最近在折腾Git这款很强大的工具。在瞎折腾的过程中发现一个比较好用的功能:一条Linux命令,找出你系统中的大文件。在此跟大家分享一下。第一步:安装Git考虑到一些平台不支持发链接,在......
  • Linux通配符的使用详解
    一、简介一般生产环境的服务器默认都是不安装图形化界面的,习惯了在命令行环境下工作是,大家会发现:命令行操作效率比图形化界面效率高很多。由命令行环境中,我们不能直观地看到一些文件或目录的名称及其他一些信息,这时候通配符就派上用场啦!当不知道真正字符或懒得输入完整文件或目录名......
  • Linux三剑客之grep
    一、概述grep(globalsearchregularexpression(RE)andprintouttheline,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。这也是一个我们比较常用的命令之一,好多时候虽然没通过系统的学习,但是我们还是会经常用到......