前言
之前分享了如何移植lvgl这个开源的gui库到自己的开发板上运行后,后续看到有人留言在问有没有移植官方的demo例程。今天刚好有时间,就试着移植下官方的demo,以下是大致过程。
一、准备工作
在移植官方demo之前,我们需要先确保lvgl gui库已经移植到我们的开发板上并正常运行。这里可以直接参考之前的文章,链接如下:
讯为4412开发板移植lvgl-7.11.0
到github上下载官方提供的lv_demos:
lv_demos v7.11.0
这里我直接拿之前移植好的工程来使用:
移植好lvgl-v7的工程
下面开始官方demo的移植
二、移植步骤
1.lv_demos v7.11.0 解压缩
我们先解压缩下载好的lv_demos-7.11.0.zip,然后将解压后的文件重命名为lv_examples并移动到lvgl路径下。
查看解压缩后该文件的内容如下:
可以看到同移植lvgl核心库和lv_drivers库类似,该文件夹下同样有一个lv_ex_conf_template.h文件,复制这份.h文件
将copy的lv_ex_conf.h文件中的#if 0 改为#if 1,然后随便打开一个demo的宏定义:
/*Music player for LVGL*/
#define LV_USE_DEMO_MUSIC 1
#if LV_USE_DEMO_MUSIC
#define LV_DEMO_MUSIC_AUTO_PLAY 0
#endif
2.编译lv_demos
更改lvgl路径下的Makefile:
CC := arm-none-linux-gnueabi-gcc
RM := rm
MV := mv
MKDIR := mkdir
CUR_PATH=$(shell pwd)
LVGL_DIR = $(CUR_PATH)
LVGL_DIR_NAME ?= lvgl
include $(LVGL_DIR)/lvgl/lvgl.mk
include $(LVGL_DIR)/lv_drivers/lv_drivers.mk
include $(LVGL_DIR)/lv_examples/lv_examples.mk
OBJDIR:=./__tmp__
OBJEXT ?= .o
AOBJS = $(ASRCS:.S=$(OBJEXT))
COBJS = $(CSRCS:.c=$(OBJEXT))
SRC = $(ASRCS) $(CSRCS)
OBJ = $(AOBJS) $(COBJS)
CFLAGS:=-g -Wall -std=c99 -I$(LVGL_DIR)/lvgl -I$(LVGL_DIR)/lv_drivers -I$(LVGL_DIR)/lv_examples \
-DLV_CONF_INCLUDE_SIMPLE -DLV_LVGL_H_INCLUDE_SIMPLE -DLV_EX_CONF_INCLUDE_SIMPLE
.PHONY: all
.DEFAULT: all
all: $(OBJ)
$(MKDIR) $(OBJDIR) -p
$(MV) $(OBJ) $(OBJDIR)
clean:
$(RM) $(OBJDIR) -rf
更改完后先尝试make下lvgl路径下的文件,发下如下报错:
提示lv_font_montserrat_12和v_font_montserrat_30未定义,这里我们只需要在lvgl/lv_conf.h文件中打开相关的宏定义即可
/* Montserrat fonts with bpp = 4
* https://fonts.google.com/specimen/Montserrat */
#define LV_FONT_MONTSERRAT_8 0
#define LV_FONT_MONTSERRAT_10 0
#define LV_FONT_MONTSERRAT_12 0
#define LV_FONT_MONTSERRAT_14 1
#define LV_FONT_MONTSERRAT_16 0
#define LV_FONT_MONTSERRAT_18 0
#define LV_FONT_MONTSERRAT_20 0
#define LV_FONT_MONTSERRAT_22 0
#define LV_FONT_MONTSERRAT_24 0
#define LV_FONT_MONTSERRAT_26 0
#define LV_FONT_MONTSERRAT_28 0
#define LV_FONT_MONTSERRAT_30 0
#define LV_FONT_MONTSERRAT_32 0
#define LV_FONT_MONTSERRAT_34 0
#define LV_FONT_MONTSERRAT_36 0
#define LV_FONT_MONTSERRAT_38 0
#define LV_FONT_MONTSERRAT_40 0
#define LV_FONT_MONTSERRAT_42 0
#define LV_FONT_MONTSERRAT_44 0
#define LV_FONT_MONTSERRAT_46 0
#define LV_FONT_MONTSERRAT_48 0
改完之后编译,我们可以看到关于lvgl库和lvgl_demos相关的中间文件都可以正常生成。
3.调用demo
main.c
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <sys/time.h>
#include <linux/fb.h>
#include "lvgl.h"
#include "lv_examples.h"
#include "display/fbdev.h"
#include "indev/evdev.h"
int main(int argc, char *argv[])
{
lv_init();
fbdev_init();
static lv_color_t buf[DISP_BUF_SIZE];
static lv_disp_buf_t disp_buf;
/* fb init */
lv_disp_buf_init(&disp_buf, buf, NULL, DISP_BUF_SIZE);
lv_disp_drv_t disp_drv;
lv_disp_drv_init(&disp_drv);
disp_drv.buffer = &disp_buf;
disp_drv.flush_cb = fbdev_flush;
lv_disp_drv_register(&disp_drv);
lv_demo_music();
while (1)
{
lv_task_handler();
usleep(5000);
}
}
同步更改Makefile:
SRCDIR:=.
OBJDIR:=.
TOP_PATH=$(shell pwd)
CC:=arm-none-linux-gnueabi-gcc
#STRIP:=strip
RM := rm
MV := mv
CD := cd
LVGL_DIR = $(TOP_PATH)/external/lvgl
LVGL_DIR_NAME ?= lvgl
include $(LVGL_DIR)/lvgl/lvgl.mk
include $(LVGL_DIR)/lv_drivers/lv_drivers.mk
include $(LVGL_DIR)/lv_examples/lv_examples.mk
CFLAGS:=-w -O2 -O3 -g0 -std=c99 -I$(LVGL_DIR)/lvgl -I$(LVGL_DIR)/lv_drivers -I$(LVGL_DIR)/lv_examples \
-DPLAYER_DEBUG_VER -DLV_CONF_INCLUDE_SIMPLE -DLV_LVGL_H_INCLUDE_SIMPLE -DLV_EX_CONF_INCLUDE_SIMPLE
.PHONY: all
.DEFAULT: all
LVGL_OBJDIR:=./external/lvgl/__tmp__
#LVGL_OBJS:=$(wildcard $(LVGL_OBJDIR)/*.o)
OBJDIR:=./__tmp__
SRCS:=$(wildcard $(SRCDIR)/*.c)
OBJS:=$(addprefix $(OBJDIR)/,$(patsubst %.c,%.o,$(SRCS)))
PROGRAM:=player
all: $(LVGL_OBJDIR) $(PROGRAM)
$(LVGL_OBJDIR) :
$(CD) $(LVGL_DIR) && make
$(OBJS) : $(OBJDIR)/%.o : %.c
@if [ ! -d $(dir $@) ] ; then mkdir -v -p $(dir $@) ; fi
@echo compile: $<
$(CC) $(CFLAGS) -c $< -o $@
$(PROGRAM): $(OBJS) $(LVGL_OBJDIR)
$(CC) $(OBJS) $(wildcard $(LVGL_OBJDIR)/*.o) -o $(PROGRAM) -lpthread -static -lm
$(MV) $(PROGRAM) $(OBJDIR)
clean:
$(RM) -rf $(LVGL_OBJDIR)
$(RM) -rf $(OBJDIR)
最后make clean 和 make all以下,没有发现报错
将player执行程序拷贝到开发板上运行
运行结果如下:
总结
以上就是移植lv_demos的全部过程,如果要运行其他例程,只需要在lv_ex_conf.h中打开对应的宏定义即可,这里就不再赘述。