【Linux】移植:LVGL 8.0.2 ui库显示

转自:https://blog.csdn.net/h451884098/article/details/120119545

  开发板:JZ2440
  系统版本:Linux 4.10.17 + 设备树
  代码仓库地址:lvgl 仓库
  LVGL 版本:v8.0.2
  LVGL 驱动版本:v6.1.1
  LVGL demo版本:v5.2-rc

  注:
  1)在使用 lvgl 之前,要确保当前系统支持了显示屏驱动,如 /dev/fb0。
  2)lvgl 编译会将自己所用到的库全部打包到一起,所以不需要额外添加动态库文件。

  

一、创建目录
  创建一个 lvgl 目录,然后将 lvgl 的源码放进该目录。
  1)lvgl-8.0.2
  2)lv_drivers-6.1.1
  3)lv_demos-5.2-rc(可以不要,只是用来验证的)
  
  但是,为了兼容这三个目录中的 .mk 文件,我们需要将这三个目录重新命名(与上面三个目录对应):
  1)lvgl
  2)lv_drivers
  3)lv_examples(可以不要,只是用来验证的)

  

二、拷贝头文件
  也就是将头文件拷贝到 lvgl 目录下。

cd lvgl
cp ./lvgl/lv_conf_template.h lv_conf.h
cp ./lv_drivers/lv_drv_conf_templ.h lv_drv_conf.h
cp ./lv_examples/lv_ex_conf_templ.h lv_ex_conf.h

  

三、修改头文件
1、lv_conf.h
#if 1 /*Set it to "1" to enable content*/
...
#define LV_COLOR_DEPTH 16
...
#endif

2、lv_drv_conf.h
#if 1 /*Set it to "1" to enable the content*/
...
#ifndef USE_FBDEV
# define USE_FBDEV 1
#endif
...
#endif

3、lv_ex_conf.h
#if 1 /*Set it to "1" to enable the content*/
...    /* 根据自己需求选择对应的 demo,可以不要,自己来验证 */
#endif

  

四、添加 Makefile
  在 lvgl 目录下创建一个 output 目录,用于存放生成文件。

mkdir output
1
  在 lvgl 目录下创建一个 Makefile 文件。

CC := arm-zepunt-linux-gnueabi-gcc
LVGL_DIR ?= ${shell pwd}
LVGL_DIR_NAME ?= lvgl

WARNINGS = -Wall -Wextra \
-Wshadow -Wundef -Wmaybe-uninitialized -Wmissing-prototypes -Wpointer-arith -Wuninitialized \
-Wunreachable-code -Wreturn-type -Wmultichar -Wdouble-promotion -Wclobbered -Wdeprecated \
-Wempty-body -Wtype-limits -Wsizeof-pointer-memaccess

CFLAGS ?= -O3 -g0 $(WARNINGS) -I$(LVGL_DIR)/$(LVGL_DIR_NAME) -I$(LVGL_DIR) -I.

LDFLAGS ?= -lm

BIN = ./output/demo

#Collect the files to compile
MAINSRC = ./main.c

include $(LVGL_DIR)/lvgl/lvgl.mk
include $(LVGL_DIR)/lv_drivers/lv_drivers.mk
include $(LVGL_DIR)/lv_examples/lv_tutorial/1_hello_world/lv_tutorial_hello_world.mk

OBJEXT ?= .o

AOBJS = $(ASRCS:.S=$(OBJEXT))
COBJS = $(CSRCS:.c=$(OBJEXT))

MAINOBJ = $(MAINSRC:.c=$(OBJEXT))

SRCS = $(ASRCS) $(CSRCS) $(MAINSRC)
OBJS = $(AOBJS) $(COBJS)

## MAINOBJ -> OBJFILES
all: default

%.o: %.c
@$(CC) $(CFLAGS) -c $< -o $@
@echo "CC $<"

default: $(AOBJS) $(COBJS) $(MAINOBJ)
$(CC) -o $(BIN) $(MAINOBJ) $(AOBJS) $(COBJS) $(LDFLAGS)

clean: 
rm -f $(BIN) $(AOBJS) $(COBJS) $(MAINOBJ)

  

五、编写 main.c 文件,用来测试
#include "lvgl/lvgl.h"
#include "lv_drivers/display/fbdev.h"
#include "lv_ex_conf.h"

#define DISP_BUF_SIZE (480 * 272) /* lvgl 用于绘制屏幕的缓冲区 */

static lv_obj_t *label;

static lv_color_t buf[DISP_BUF_SIZE];
static lv_disp_draw_buf_t disp_buf;

lv_disp_drv_t disp_drv;

lv_disp_t *disp;

void demo(void)
{
lv_obj_t * label1 = lv_label_create(lv_scr_act());

/*Modify the Label's text*/
lv_label_set_text(label1, "Hello world!");

/* Align the Label to the center
* NULL means align on parent (which is the screen now)
* 0, 0 at the end means an x, y offset after alignment*/
lv_obj_align(label1, LV_ALIGN_CENTER, 0, 0);
}

int main(int argc, char **argv)
{
lv_init(); /* lvgl 初始化 */

/**
* fb 初始化 此函数在 lv_drivers/display/fbdev.c 中
* 就是打开 fb 设备映射显存出来使用
*/
fbdev_init();

lv_disp_draw_buf_init(&disp_buf, buf, NULL, (480 * 272));

lv_disp_drv_init(&disp_drv);
disp_drv.draw_buf = &disp_buf;
disp_drv.flush_cb = fbdev_flush; /* fbdev_flush这就是输入显示驱动提供的操作函数 */
disp_drv.hor_res = 480;
disp_drv.ver_res = 272; 
disp = lv_disp_drv_register(&disp_drv);

demo();

while(1)
{
lv_task_handler();
usleep(5000);
}
}

  将 output 目录下的 demo 文件通过串口(lrzsz)传给开发板,然后执行下面的命令就可以检查代码运行情况了。

chmod +x demo
./demo
————————————————
版权声明:本文为CSDN博主「Zeepunt」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/h451884098/article/details/120119545

 

posted @ 2022-05-07 10:06  Sky&Zhang  阅读(706)  评论(0编辑  收藏  举报