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


    移植准备

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

    1、下载移植工程源码

    下载地址:

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

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

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

    lvgl-8.3.1.tar.gz
    lv_drivers-8.3.0.tar.gz
    
    • 1
    • 2

    解压并重命名为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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    移植修改

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

    322 #if USE_FBDEV
    323 #  define FBDEV_PATH          "/dev/fb0"
    324 #endif
    
    • 1
    • 2
    • 3

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

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

    根据实际情况选择 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")  
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    编写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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 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!
    
    • 1

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

    开发板测试

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

    后续

    还可以再缩短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")  
    
        local src_path = {
            "lvgl/src/",
            "lvgl/demos/",
            "lv_drivers/"
        }
    
        for _, index in ipairs(src_path) do
            for _, dir in ipairs(os.dirs(index.."/**")) do
                add_files(dir.."/*.c");    
                add_includedirs(dir);
            end
        end
    
        -- -- 递归遍历获取所有子目录
        -- 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")  
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
  • 相关阅读:
    探花交友前置-dubbo
    Sulfo CY3-DBCO蛋白质标记实验-星戈瑞
    42、集合的第一大类:List
    传统呼叫中心与云呼叫中心哪个好
    计算机毕业设计之java+ssm基于个人需求和地域特色的外卖推荐系统
    MVVM项目开发(商品管理系统三)
    macOS Ventura 13.6.5 (22G621) Boot ISO 原版可引导镜像下载
    XGBoost算法讲解和公式推导
    unity自己对象池的使用
    Ajax(2)
  • 原文地址:https://blog.csdn.net/qq_36413982/article/details/126322435