LVGL linux arm平台上的详细移植过程(上)

一、环境准备

pc系统:Ubuntu 16.04 LTS
sudo apt-get install git
sudo apt-get install cmake

二、下载代码

我们需要下载lvgl v7.11.0版本的三个代码包如下
1、lvgl 核心绘图代码

git clone https://github.com/lvgl/lvgl.git 切到tag v7.11.0
或者直接下载压缩包https://github.com/lvgl/lvgl/tree/v7.11.0

2、lv_drivers 设备相关中间驱动层

git clone https://github.com/lvgl/lv_drivers.git 切到tag v7.11.0
或者直接下载压缩包 https://github.com/lvgl/lv_drivers/tree/v7.11.0

3、lv_demos 演示demo

git clone https://github.com/lvgl/lv_demos.git 切到tag v7.11.0
或者直接下载压缩包 https://github.com/lvgl/lv_demos/tree/v7.11.0

三、修改集成

1、将代码解压并放置成如下形式

├── lvgl_prj
├── CMakeLists.txt #1
└── src
    ├── CMakeLists.txt #2
    ├── lv_conf.h  #6
    ├── lv_drivers
    │   ├── CMakeLists.txt #3
    │   ├── lv_port_disp.c  #9
    │   ├── lv_port_disp.h  #10
    │   ├── lv_port_indev.c #11
    │   ├── lv_port_indev.h #12
    │   ├── display
    │   ├── docs
    │   ├── indev
    │   ├── lv_drv_conf_templ.h
    │   ├── win_drv.c
    │   └── win_drv.h
    ├── lv_drv_conf.h #7
    ├── lv_demos
    │   ├── CMakeLists.txt #4
    │   ├── docs
    │   ├── lv_apps
    │   ├── lv_examples.h
    │   ├── lv_ex_conf_templ.h
    │   ├── lv_tests
    │   ├── lv_tutorial
    ├── lv_ex_conf.h #8
    ├── lvgl
    │   ├── CMakeLists.txt #5
    │   ├── docs
    │   ├── lv_conf_template.h
    │   ├── lvgl.h
    │   ├── examples
    │   │   └── porting
    │   │       ├── lv_port_disp_template.c
    │   │       ├── lv_port_disp_template.h
    │   │       ├── lv_port_indev_template.c
    │   │       └── lv_port_indev_template.h
    │   ├── scripts
    │   └── src
    ├── sys_tick.c #13
    ├── sys_tick.h #14
    ├── tslib.h
    └── main.c     #15

将代码解压到lvgl_prj文件夹的src目录下即如:

├── lvgl_prj
└── src
		├── lvgl
		├── lv_drivers
		└── lv_demos

接着按照上面标注的 #n 序号开始移植编写工作。

3.1 配置cmake工程的 CMakeLists.txt 配置文件

在使用我们的cmake 产生makefile之前先组织好工程的CMakeLists.txt cmake工程配置文件

#1 工程根目录下的CMakeLists.txt

cmake_minimum_required (VERSION 2.8)  
#cmake最低使用版本
set(CMAKE_C_COMPILER "arm-none-linux-gnueabi-gcc") 
#设置编译器,此处为ARM平台,如果你安装了编译链就用名称,没安装请用绝对路径
project(lvgl_prj)
#工程名
add_subdirectory(src)
#添加src目录

#2 src目录下的CMakeLists.txt

SET(CMAKE_BUILD_TYPE "Debug")
SET(CMAKE_C_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g2 -ggdb -std=gnu11")
SET(CMAKE_C_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")

aux_source_directory(. DIR_SRCS) #将当前c文件名添加至DIR_SRC
message("DIR_SRC : ${DIR_SRCS}")
add_subdirectory(lvgl)        #添加目录 lvgl
add_subdirectory(lv_demos) #添加目录 lv_examples
add_subdirectory(lv_drivers)  #添加目录 lv_drivers

include_directories(./lvgl/)  #设置头文件路劲
include_directories(./lv_drivers/)  #设置头文件路劲
include_directories(./lv_demos/src/lv_demo_music/)  #设置头文件路劲
include_directories(./lv_demos/src/lv_demo_widgets/)  #设置头文件路劲
add_executable(little_prj ${DIR_SRCS})  #链接生成文件little_prj 由DIR_SRC链接。
find_package(Threads)

set(VAR lv_examples_lib)
set(VAR ${VAR} lvgl_lib)
set(VAR ${VAR} lv_drivers_lib)

message("VAR : ${VAR}")
target_link_libraries(lvgl_prj ${VAR})   #设置链接little_prj的 依赖关系 ,依赖 VAR = lvgl_lib lv_drivers
target_link_libraries(lvgl_prj /home/cks/work/lvgl/tslib/libts.so)
#链接tslib的动态库
target_link_libraries(lvgl_prj ${CMAKE_THREAD_LIBS_INIT})

#3 lv_drivers 目录下的CMakeLists.txt

file(GLOB_RECURSE SOURCES ./*.c)
#add_library(lv_drivers STATIC ${SOURCES})
add_library(lv_drivers_lib ${SOURCES})

#4 lv_demos 目录下的CMakeLists.txt

file(GLOB_RECURSE SOURCES src/*.c)
add_library(lv_examples_lib ${SOURCES})

#5 lvgl 目录下的CMakeLists.txt 将 #endif 前面的add_library(lvgl STATIC ${SOURCES}) 改一下改成下面这样其余不变

file(GLOB_RECURSE SOURCES src/*.c)
#add_library(lvgl STATIC ${SOURCES})
add_library(lvgl_lib ${SOURCES})

endif()

3.2 为工程添加conf.h 配置文件

工程配置文件都放到src底下

#6 lv_conf.h 系统配置文件由lvgl目录下的lv_conf_template.h 拷贝重命名而来

  1. 打开文件将#if 0 改为 1;
  2. 配置屏幕分辨率 和像素格式
#define LV_HOR_RES_MAX          (1024)
#define LV_VER_RES_MAX          (600)
/* Color depth:
 * - 1:  1 byte per pixel
 * - 8:  RGB332
 * - 16: RGB565
 * - 32: ARGB8888
 */
#define LV_COLOR_DEPTH     16
  1. 配置内存
#  define LV_MEM_SIZE    (10U * 1024U * 1024U)
  1. 配置触摸屏扫描频率
/* Input device read period in milliseconds */
#define LV_INDEV_DEF_READ_PERIOD          10  //ms
  1. 配置系统滴答时间获取函数,这个很重要,不然系统的task都不能被驱动
/* 1: use a custom tick source.
 * It removes the need to manually update the tick with `lv_tick_inc`) */
#define LV_TICK_CUSTOM     1
#if LV_TICK_CUSTOM == 1
#define LV_TICK_CUSTOM_INCLUDE  "../../../sys_tick.h"         /*Header for the system time function*/
#define LV_TICK_CUSTOM_SYS_TIME_EXPR (custom_tick_get())     /*Expression evaluating to current system time in ms*/
#endif   /*LV_TICK_CUSTOM*/

如果你有debug的需求可以开启log #define LV_USE_LOG 1

#7 lv_drv_conf.h 驱动配置文件由lv_drivers目录下的lv_drv_conf_template.h 拷贝重命名而来

同样的把 #if 0 改成1 开启配置

  1. 配置显示节点 0 改为 1
#ifndef USE_FBDEV
#  define USE_FBDEV           1 //0->1
#endif
#if USE_FBDEV
#  define FBDEV_PATH          "/dev/fb0"
#endif
  1. 开启触摸屏驱动功能 0改为1
/*-------------------------------------------------
 * Mouse or touchpad as evdev interface (for Linux based systems)
 *------------------------------------------------*/
#ifndef USE_EVDEV
#define USE_EVDEV           1
#endif

#ifndef USE_BSD_EVDEV
#  define USE_BSD_EVDEV       0
#endif

#if USE_EVDEV || USE_BSD_EVDEV
#define EVDEV_NAME   "/dev/input/event0" //具体的名字根据自身的触摸屏事件上报节点动态改动

#8 lv_ex_conf.h demo 库配置文件由lv_demos目录下的lv_ex_conf_template.h 拷贝重命名而来

同样的if 0 改为1 启动配置
我们可以使能多widget的demo 就是很多控件的那个演示demo 我就不贴图上来了。

/*Show some widget*/
#define LV_USE_DEMO_WIDGETS        1

以上的步骤基本完善了整个工程的编译及功能配置。

由于篇幅问题,下一篇我们将完善相关平台驱动的配置包括framebuffer及触摸屏驱动tslib,以及main.c demo文件的编写。
LVGL linux arm平台上的详细移植过程(下)


LVGL linux arm平台上的详细移植过程(上)_第1张图片

你可能感兴趣的:(LVGL,LVGL,ARM,LINUX)