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 拷贝重命名而来
- 打开文件将#if 0 改为 1;
- 配置屏幕分辨率 和像素格式
#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
- 配置内存
# define LV_MEM_SIZE (10U * 1024U * 1024U)
- 配置触摸屏扫描频率
/* Input device read period in milliseconds */
#define LV_INDEV_DEF_READ_PERIOD 10 //ms
- 配置系统滴答时间获取函数,这个很重要,不然系统的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 开启配置
- 配置显示节点 0 改为 1
#ifndef USE_FBDEV
# define USE_FBDEV 1 //0->1
#endif
#if USE_FBDEV
# define FBDEV_PATH "/dev/fb0"
#endif
- 开启触摸屏驱动功能 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平台上的详细移植过程(下)
更多推荐
所有评论(0)