lvgl v8 linux下使用xmake交叉编译移植

移植准备

针对linux移植lvgl官方已经提供了移植工程,只需要根据自己板子修改frambuffer的设备节点和input event设备节点。

1、下载移植工程源码

下载地址:

由于速度问题只使用以下方式下载:

git clone https://github.com/lvgl/lv_port_linux_frame_buffer]

下载下来发现lv_driverslvgl 目录是空的,对于这个问题直接去lvgl github仓库那里
下载release的压缩包:

lvgl-8.3.1.tar.gz
lv_drivers-8.3.0.tar.gz

解压并重命名为lvgl、lv_driver:

# 解压
tar xvf lvgl-8.3.1.tar.gz
tar xvf lv_drivers-8.3.0.tar.gz

# 重命名
mv lvgl-8.3.1 lvgl
mv lv_drivers-8.3.0 lv_drivers

移植修改

修改驱动配置头文件lv_drv_conf.h

322 #if USE_FBDEV
323 #  define FBDEV_PATH          "/dev/fb0"
324 #endif

根据板子实际情况选择fb设备节点

449 #if USE_EVDEV || USE_BSD_EVDEV
450 #  define EVDEV_NAME   "/dev/input/event1"  

根据实际情况选择 input event

交叉编译

lvgl官方的移植工程已经写好makefile,只需要make就可以编译成功。
但是这里不使用写好的makefile,使用makefile后续添加自己应用的目录和文件太麻烦,
这里我使用xmake进行工程构建工作。

xmake是类似cmake的构建工具。
cmake也用过,cmake似乎每个有源码的目录都需要一个CMakeList.txt ?像lvgl移植工程源码目录层级太多,添加CMakeLists.txt要吐血。

xmake可以只有一个xmake.lua在根目录。

xmake github : https://github.com/xmake-io/xmake
xmake 文档 :https://xmake.io/#/

编写xmake.lua :

target("mutlimedia")  -- 设置目标程序名字
    set_kind("binary")   -- 设置编译成二进制程序,不设置默认编译成二进制程序,可选择编译成动静态库等
    
    -- 设置交叉编译工具链头文件目录
    add_includedirs("/usr/local/arm_gcc/gcc-linaro-4.9.4-2017.01-i686_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr/include")   
    
    -- 设置链接库搜索路径
    add_linkdirs("/opt/tslib-1.21/lib")  
    add_linkdirs("/usr/local/arm_gcc/gcc-linaro-4.9.4-2017.01-i686_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr/lib")
    -- 设置链接的库
    add_links("m", "pthread", "ts");

    stdc = "c99"
    set_languages(stdc, "c++11")
    
    add_files("./*.c")  

    -- 递归遍历获取所有子目录
    for _, dir in ipairs(os.dirs("lvgl/src/**")) do
        add_files(dir.."/*.c");    
        add_includedirs(dir);
    end

    -- 递归遍历获取所有子目录
    for _, dir in ipairs(os.dirs("lvgl/demos/**")) do
        add_files(dir.."/*.c");   -- 添加目录下所有C文件
        add_includedirs(dir);  -- 添加目录作为头文件搜索路径
    end

    for _, v in ipairs(os.dirs("lv_drivers/**")) do
        add_files(v.."/*.c");
        add_includedirs(v);
    end

    add_includedirs(".")   
    add_includedirs("/opt/tslib-1.21/include")  

编写build_xmake.sh脚本方便编译和拷贝程序到nfs目录:

#!/bin/bash

xmake f -p cross --sdk=/usr/local/arm_gcc/gcc-linaro-4.9.4-2017.01-i686_arm-linux-gnueabihf

xmake -P . -v

app_file=build/cross/arm/release/mutlimedia

if [ -e "${app_file}" ]; then   # if this file is exist?
    sudo cp build/cross/arm/release/mutlimedia /mnt/nfs/
    echo "copy app to nfs directory ok!!!"
else 
    echo "file is not exist!!!"
fi
  • xmake f -p cross --sdk=/usr/local/arm_gcc/gcc-linaro-4.9.4-2017.01-i686_arm-linux-gnueabihf 配置交叉编译工具链路径
  • xmake -P . -v ,构建编译工程;-P表示强制在当前目录构建编译工程,-v表示输出更多编译信息。
  • 执行./build_xmake.sh进行编译

编译完成会输出以下字样:

[100%]: build ok!

在build/cross/arm/release/下生成app程序mutlimedia。build等目录是xmake自动生成的。

开发板测试

测试成功显示,使用官方移植好的工程来移植是很容易。
测试发现触摸不灵敏,使用tslib库来解决:修改lvgl Linux demo使用tslib获取触摸坐标

xmake构建文件优化


-- 设置工程名
set_project("mutilmedia")

-- 设置工程版本
set_version("1.1.0")

-- 自定义工具链
toolchain("arm-linux-gnueabihf")
    -- 标记为独立工具链
    set_kind("standalone")
    -- 定义交叉编译工具链地址
    set_sdkdir("/usr/local/arm_gcc/gcc-linaro-4.9.4-2017.01-i686_arm-linux-gnueabihf")
    add_linkdirs("/usr/local/arm_gcc/gcc-linaro-4.9.4-2017.01-i686_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr/lib")
    add_includedirs("/usr/local/arm_gcc/gcc-linaro-4.9.4-2017.01-i686_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr/include")   
toolchain_end()

target("lvglv8")
    -- static lib
    set_kind("static")  
     -- 设置使用的交叉编译工具链
    set_toolchains("arm-linux-gnueabihf")  
    
    set_languages("c99", "c++11")

    local lvgl_src_path = {
        "lvgl/src/",
    }

    for _, index in ipairs(lvgl_src_path) do
        for _, dir in ipairs(os.dirs(index.."/**")) do
            add_files(dir.."/*.c");    
            add_includedirs(dir);
        end
    end
    
    add_includedirs("lvgl");

target("mutlimedia")  -- 设置目标程序名字
    set_kind("binary")   -- 设置编译成二进制程序,不设置默认编译成二进制程序,可选择编译成动静态库等
    
     -- 设置使用的交叉编译工具链
    set_toolchains("arm-linux-gnueabihf")  

    -- 设置平台
    set_plat("cross")
    -- 设置架构
    set_arch("arm")

    -- 设置链接库搜索路径
    add_linkdirs("/opt/tslib-1.21/lib")  
    -- 设置链接的库
    add_links("m", "pthread", "ts");
    
    add_deps("lvglv8")

    stdc = "c99"
    set_languages(stdc, "c++11")

     add_cflags(
        "-O3"
     )

    local lvgl_src_path = {
        "lvgl/demos/",
        "lv_drivers/"
    }

    for _, index in ipairs(lvgl_src_path) do
        for _, dir in ipairs(os.dirs(index.."/**")) do
            add_files(dir.."/*.c");    
            add_includedirs(dir);
        end
    end

    add_includedirs("lvgl");

    local usr_src_path = {
        ".",
        "multimedia",
        "multimedia/font",
        "multimedia/img/camera",
        "multimedia/img/desktop",
        "multimedia/img/light",
        "multimedia/img/music",
        "multimedia/img/time", 
        "multimedia/img/video",
        "multimedia/img/weather",
    }

     for _, dir in ipairs(usr_src_path) do
        add_files(dir.."/*.c");  
    end
	
	-- 排除文件,不参与编译
    remove_files("multimedia/font/myFontDailyWeather.c")
    remove_files("multimedia/font/myFont_Foshan.c")
    remove_files("multimedia/font/myFontNumber.c")

    add_includedirs(".")   
    add_includedirs("/opt/tslib-1.21/include")  

    after_build(
        function(target)
        cprint("Compile finished!!!")

        print(" ");
        os.exec("sudo cp build/cross/arm/release/mutlimedia /mnt/nfs/")  
    end)
  • toolchain("arm-linux-gnueabihf"),定义工具链,不使用shell脚本设置工具链,直接执行xmake编译
  • target("lvglv8"),定义target目标, set_kind("static") 将lvgl编译成静态库
  • add_deps("lvglv8"),设置app程序依赖lvglv8静态库
  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

欲盖弥彰1314

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值