针对linux移植lvgl官方已经提供了移植工程,只需要根据自己板子修改frambuffer的设备节点和input event设备节点。
1、下载移植工程源码
下载地址:
由于速度问题只使用以下方式下载:
git clone https://github.com/lvgl/lv_port_linux_frame_buffer]
下载下来发现lv_drivers和lvgl 目录是空的,对于这个问题直接去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 配置交叉编译工具链路径编译完成会输出以下字样:
[100%]: build ok!
在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")