LVGL的移植

一、获取源码

1、获取lvgl源代码。

https://github.com/lvgl/lvgl/tree/release/v8.3

2、准备移植的资料。

3、可以选择官网地址查看具体的移植信息。

Set up a project — LVGL documentation

二、移植LVGL到2.8英寸LCD电阻屏工程的步骤

1、进入2.8英寸LCD电阻屏工程文件中。

2、创建一个LVGL文件夹。

3、源码工程文件的三个文件夹复制到自己工程文件中。

要复制的三个文件夹
demos、examples、src

4、源码工程文件的两个.h文件复制到自己工程文件中。

lv_conf_template.h更名为lv_conf.h
lvgl.h

5、修改源码文件中的examples\porting路径下的文件名。

lv_port_disp_template.clv_port_disp.c
lv_port_disp_template.hlv_port_disp.h
lv_port_fs_template.clv_port_fs.c
lv_port_fs_template.hlv_port_fs.h
lv_port_indev_template.clv_port_indev.c
lv_port_indev_template.hlv_port_indev.h

6、给Keil工程添加工程文件。

首先创建多个Groups组:

接下来为每个组添加文件:

Groups

文件路径

LVGL_CORE

LVGL\src\core

LVGL_DRAW

LVGL\src\draw

LVGL\src\draw\子文件夹

LVGL_EXTRA

LVGL\src\extra

LVGL\src\extra\子文件夹

LVGL_FONT

LVGL\src\font

LVGL_HAL

LVGL\src\hal

LVGL_MISC

LVGL\src\misc

LVGL_WIDGETS

LVGL\src\widgets

LVGL_PORTING

LVGL\examples\porting

LVGL_CONFIG

LVGL\lvgl.h

LVGL\lvgl_conf.h

LVGL_DEMO_BENCHMARK

LVGL\demos\benchmark

LVGL\demos\benchmark\子文件夹

LVGL_DEMO_STRESS

LVGL\demos\stress

LVGL_DEMO_WIDGETS

LVGL\demos\widgets

LVGL\demos\widgets\子文件夹

LVGL_DEMO_KEYPAD

LVGL\demos\keypad_encoder

(1)、LVGL\src\hal路径下的.c文件复制到LVGL_HAL组中。

(2)、LVGL\src\core路径下的.c文件复制到LVGL_CORE组中。

(3)、LVGL\src\draw和LVGL\src\draw\子文件夹路径下的.c文件复制到LVGL_DRAW组中。

(4)、LVGL\src\font路径下的.c文件复制到LVGL_FONT组中。

(5)、LVGL\src\misc路径下的.c文件复制到LVGL_MISC组中。

(6)、LVGL\src\widgets路径下的.c文件复制到LVGL_WIDGETS组中。

(7)、LVGL\examples\porting路径下的.c文件复制到LVGL_PORTING组中。

(8)、LVGL\lvgl.h和LVGL\lvgl_conf.h这两个.h文件复制到LVGL_CONFIG组中。

(9)、LVGL\demos\benchmark和LVGL\demos\benchmark\子文件夹路径下的.c文件复制到LVGL_DEMO_BENCHMARK组中。

(10)、LVGL\demos\stress路径下的.c文件复制到LVGL_DEMO_STRESS组中。

(11)、LVGL\demos\widgets和LVGL\demos\widgets\子文件夹路径下的.c文件复制到LVGL_DEMO_WIDGETS组中。

(12)、LVGL\demos\keypad_encoder路径下的.c文件复制到LVGL_DEMO_KEYPAD组中。

(13)、LVGL\src\extra和LVGL\src\extra\子文件夹路径下的.c文件复制到LVGL_EXTRA组中。

三、LVGL工程基础配置要点

1、在启动文件中检查栈的大小,至少为0x1000。

2、添加宏定义和选择模式。

设置原因:

(1)、宏LV_LVGL_H_INCLUDE_SIMPLE:不少文件存在以下的宏定义,所以添加这个宏是为了方便访问到lvgl.h头文件

#if defined(LV_LVGL_H_INCLUDE_SIMPLE)
#include "lvgl.h"
#else
#include "lvgl/lvgl.h"
#endif

(2)、C99 Mode:LVGL源码的编译需要C99模式的支持,不然会出现大量的报错。

3、给工程添加头文件包含。

四、LVGL相关文件信息

one-配置文件:LVGL\lv_conf.h

1、默认该文件是不参与编译,要将#if 0 修改为 #if 1。

2、根据当前显示设备支持的颜色深度设置宏LV_COLOR_DEPTH。

(1)、对于SPI TFT屏且每8位的传输,确定是否要交换16位色的高低字节,当前显示设备是高字节优先传输。

(2)、如果使能了DMA传输,要设置宏LV_COLOR_16_SWAP为1。

3、使能LV_USE_DEMO_WIDGETS,该demo验证显示效果。

#define LV_USE_DEMO_WIDGETS 1

two-显示设备:LVGL\examples\porting\lv_port_disp.c、LVGL\examples\porting\lv_port_disp.h

 LVGL\examples\porting\lv_port_disp.h:

1、默认该文件是不参与编译,必须将#if 0 修改为 #if 1。

2、修改分辨率

根据用到的屏幕分辨率修改宏MY_DISP_HOR_RES(屏幕宽度)与MY_DISP_VER_RES(屏幕高度)。

/*********************
 *      DEFINES
 *********************/
#ifndef MY_DISP_HOR_RES
    #warning Please define or replace the macro MY_DISP_HOR_RES with the actual screen width, default value 320 is used for now.
    #define MY_DISP_HOR_RES    320
#endif

#ifndef MY_DISP_VER_RES
    #warning Please define or replace the macro MY_DISP_HOR_RES with the actual screen height, default value 240 is used for now.
    #define MY_DISP_VER_RES    240
#endif

LVGL\examples\porting\lv_port_disp.c:

1、.默认该文件是不参与编译,必须将#if 0 修改为 #if 1。

2、当前文件会涉及到显示设备的初始化、颜色填充等函数,需要引入相关支撑tft函数的头文件。

3、修改lv_port_disp_init函数

一、lv_port_disp_init函数介绍

lv_port_disp_init 函数是LVGL在特定平台或模拟器上初始化显示驱动的接口函数。在实际嵌入式项目中,需要根据硬件平台编写或修改这个函数来适配显示控制器。

lv_port_disp_init 函数的三个部分内容:

【1】初始化硬件:配置和打开与显示屏连接的硬件接口。(disp_init函数)

【2】创建显示器描述符:定义一个 lv_disp_drv_t 结构体实例,该结构体包含了LVGL需要的所有关于显示控制器的信息,例如:一个回调函数用于写像素数据到屏幕。(disp_flush函数)

【3】注册显示器驱动:调用 lv_disp_drv_register 函数,将创建好的显示器驱动结构体注册给LVGL核心库,使其能够通过该驱动与实际硬件进行通信。

二、LVGL缓冲区

LVGL需要使用缓冲区,用于在内部绘制小部件。此缓冲区将传递给显示器驱动程序的“flush_cb”(copy the buffer's content to the display),以将其内容复制到显示器,另外缓冲区必须大于1个显示行。

(1)创建一个行缓冲区(移植时使用该缓冲配置)

LVGL将在此处绘制显示器的内容,并将其写入显示器。

(2)创建两个行缓冲区(有DMA外设则使用该缓冲配置,能大幅提高显示帧率)

LVGL将绘制显示的内容到缓冲区并将其写入显示,并使用DMA将缓冲区的内容写入显示器,它将使LVGL绘制屏幕的下一部分到另一个缓冲区同时数据从第一个缓冲区发送。它使渲染和并行刷新。

(3)双重帧缓冲(有DMA且大内存则推荐使用该缓冲配置,进一步提高显示帧率)

设置2个屏幕大小的缓冲区,并设置disp_drv.full_refresh=1。这样,LVGL将始终在flush_cb中提供整个渲染屏幕,并且只需要更改帧缓冲区的地址。

三、编写函数

1、使用第一种缓冲配置,需注释掉Example for 2 与 Example for 3代码。

2、编写disp_init函数

该函数初始化显示器和所需的外围设备,并被lv_port_disp_init函数所调用。

/*Initialize your display and the required peripherals.*/
static void disp_init(void)
{
    LCD_Init();   
    LCD_Display_Dir(0);    
    LCD_Scan_Dir(U2D_R2L); 
    lcddev.width=320;
    lcddev.height=240;              
}

3、disp_flush函数

将内部缓冲区的内容刷新到显示器上的特定区域,并被disp_drv.flush_cb进行回调。

/*Flush the content of the internal buffer the specific area on the display
 *You can use DMA or any hardware acceleration to do this operation in the background but
 *'lv_disp_flush_ready()' has to be called when finished.*/
static void disp_flush(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t *color_p)
{
    int32_t x;
    int32_t y;
    if(disp_flush_enabled) 
    {
        LCD_Color_Fill(area->x1,area->y1,area->x2,area->y2,(uint16_t *)color_p);        
        lv_disp_flush_ready(disp_drv);
    }
}

three-输入设备:LVGL\examples\porting\lv_port_indev.c、LVGL\examples\porting\lv_port_indev.h

 LVGL\examples\porting\lv_port_indev.h:

1、默认该文件是不参与编译,必须将#if 0 修改为 #if 1。

2、修改头文件#include "lvgl/lvgl.h"为#include "lvgl.h"

LVGL\examples\porting\lv_port_indev.c:

1、默认该文件是不参与编译,必须将#if 0 修改为 #if 1,另外增加以下头文件,支持触摸检测。

2、lv_port_indev_init函数中屏蔽鼠标、键盘、编码器等相关代码,只保留Touchpad(触摸板)设备。

3、touchpad_init函数

该函数会被lv_port_indev_init调用,并需增加初始化触摸板设备的代码。

/*Initialize your touchpad*/
static void touchpad_init(void)
{
    /*Your code comes here*/
    TP_Init();
}

4、touchpad_is_pressed函数

该函数会被touchpad_read调用,并需增加触摸板设备按压检测的代码。

/*Return true is the touchpad is pressed*/
static bool touchpad_is_pressed(void)
{
    /*Your code comes here*/
    if(PEN)
        return false;
    return true;
}

5、touchpad_get_xy函数

该函数会被touchpad_read调用,并需增加触摸板设备获取x、y坐标值的代码。

五、移植结束

自此LVGL的移植就结束了,你可以在项目中使用LVGL进行开发了!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值