天嵌TQT开发板linux系统,移植百问网lvgl8.1踩坑指南
1 获取资料,
获取主仓库源码 git clone https://gitee.com/weidongshan/lv_100ask_linux_desktop.git
此时会在当前目录下,下载好一个 名字为 lv_100ask_linux_desktop 的文件夹, cd lv_100ask_linux_desktop
同步子仓库模块 git submodule update --init --recursive
到此代码库下载结束
后期如果更新代码库,则需要执行 git submodule update --remote
mkfile打印
$(info __debuginfo__227 )
2 修改Makefile
在 lv_100ask_linux_desktop 下根据指示执行拷贝 dbus 相关内容,此处不同厂家的linux开发板不一样,天嵌开发板提供的SDK中所有的交叉编译文件和源码文件存放在
/opt/EmbedSky/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu/sysroot
所以查找资料就需要从这里查找了
sudo find /opt/EmbedSky/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu/sysroot/ -name *dbus*
根据查找结果,确认需要进入的目录,此处我的目录是
/opt/EmbedSky/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu/sysroot/usr/include
进入次目录后,然后根据100ask提供的指令进行复制
cp dbus-1.0/dbus/ -rfd .
然后执行数据同步指令 sync
最后添加如下,添加时候注意 \ 符号,
-I /opt/EmbedSky/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu/sysroot/usr/include \
-I /opt/EmbedSky/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu/sysroot/usr/lib/dbus-1.0/include
CFLAGS添加结束后,执行make 发现报错,
/opt/EmbedSky/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu/bin/../lib/gcc/aarch64-linux-gnu/7.4.1/../../../../aarch64-linux-gnu/bin/ld: cannot find -ldbus-1
百度后发现找不到对应的文件,另一种可能是,在 /lib 和 /usr/lib 这两个目录下都没有找到与之匹配的库,也可能存在了,但是不是交叉编译需要的函数,因此需要在编译时候就指定目录 ,此处我经过 find 查找,经过多次尝试最终确定在
/opt/EmbedSky/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu/sysroot/usr/lib
因此最终 Makefile 修改结果如下(注意不要自己私自添加LIBS,因为其他的app的编译目录中,只有LDFLAGS,若想修改,其他APP的Makefile也必须全部修改)
3 编译
编译时执行如下指令
make clean && make -j$(nproc) RUN_JOBS=-j$(nproc)
一般情况下可以直接执行,但是我这里报错如下
我在 /opt/EmbedSky/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu/sysroot 目录下进行搜索,发现如下目录有这个,于是简单的将以下两个目录添加到编译环境中,但是依然报错找不到
/opt/EmbedSky/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu/sysroot/usr/lib/
/opt/EmbedSky/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu/sysroot/lib/
开始时候未怀疑 libpthread.so文件,为了找到原因,我开启100ask的编译环境,根据需要修改makefile,执行编译发现正常执行,于是我开始怀疑 libpthread.so
//100ask 编译时候需要的东西(注意不同板子,对应目录不一样)
-I ~/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/include \
-I ~/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/arm-buildroot-linux-gnueabihf/sysroot/usr/include/dbus-1.0/include
cd ~/01_lvgl/lv_100ask_linux_desktop/
cd ~/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/include
make clean && make -j$(nproc) RUN_JOBS=-j$(nproc)
通过以下指令可以在指定文件夹下开始遍历 子目录和当前目录下所有文件,查找指定内容
//从当前目录下所有文件中搜索 libpthread.so.0
sudo grep -nr -i libpthread.so.0 *
在打开天嵌TQT编译环境下libpthread.so文件时发现,是个文本文件,如下,并且,此处目录已经指定了,结合之前,百度结果中有一条,编译后目录不能随意乱动,突然意识到,这个应该是交叉编译时候,可能没有设置好
为了解决这个问题,我突然想到,之前咨询厂家售后时候,了解到注意下检查下动态库是否有对应文件,检查软连接 我到对应 /lib /usr/lib 文件夹下未找到软连接,因此可以创建对应软连接如下
sudo ln -s /opt/EmbedSky/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu/sysroot/usr/lib/* /usr/lib/
sudo ln -s /opt/EmbedSky/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu/sysroot/lib/* /lib/
之后执行 以下指令 正常编译
make clean && make -j$(nproc) RUN_JOBS=-j$(nproc)
4 源码修订
在编译好,移植后,我发现报错
object_path: net.ask100.lvgl.Main, object_iface: /net/ask100/lvgl/Main
Segmentation fault
百度后,发现 Segmentation fault 是内存溢出错误,在添加打印点和多次尝试后,感觉官方提供的方案稍微有点不舒服,于是我进行以下小修改主要是修改main下的 lv_100ask_demo_init_icon(); 函数
目录如下 ./lv_100ask_modules/src/lv_100ask_demo_init_icon/
另一项修改是根据自己需要,在 lv_drv_conf.h 修改自己的触摸的设备事件号
查看所有设备信息 cat /proc/bus/input/devices
监听事件1的事件数据 cat /dev/input/event1 | hexdump
在main入口文件根据需要,修改屏幕分辨率,
根据需要在 lv_conf.h 修改LV_COLOR_DEPTH参数
修改完毕后,重新编译
5 移植
移植时,需要注意文件位置
推荐 文件放置在 /usr/share/100ask_desktop/ 目录下,因为 services 下默认指定是这个目录,创建这样的目录就不用修改 *.service 文件了
文件目录如下,注意
将 assets/icon下所有的文件复制出来,复制到 /usr/share/100ask_desktop/ 目录下,
将编译完毕的文件复制到 /usr/share/100ask_desktop/ 目录下,
将整个assets复制到 /usr/share/100ask_desktop/ 目录下
关于 dbus-1 服务的设置
为了找到这块开发板的 dbus-1 服务位置 执行指令 find / -name dbus-1
一个一个筛查,发现在 /usr/share/dbus-1/services/ 目录下
将 assets/services下的内容复制到此目录下
在板子 /usr/share/100ask_desktop/ 目录下,依次执行以下指令就可以运行起来了
export $(dbus-launch)
./100ask_lvgl_Main
运行效果如图
6 触摸屏矫正问题,在实际使用中,发现触摸屏触摸结果的坐标和实际屏幕坐标不一致,此时可以直接使用lvgl提供的矫正方式,在app层进行触摸矫正,在 lv_drivers/indev/evdev.c 文件里面有源码
矫正算法如下
矫正算法需要的参数 在 lv_drv_conf.h 如下 自己具体的触摸屏,需要根据自己的实际需要自行调整
7 在实际使用中可能出现可以触摸,但是滑动失效情况,此时可以 cat /dev/input/event1 | hexdump 抓取报文,或者利用我提供的以下源码进行分析
#include <sys/types.h> #include <fcntl.h> #include <time.h> #include <stdio.h> #include <unistd.h> #include <linux/input.h> #define mydebug printf("[%s %s] %s: %s: %d\n", __DATE__, __TIME__, __FILE__, __func__, __LINE__); #define mydebugMsg(msg) printf("[%s %s] %s: %s: %d msg:%s\n", __DATE__, __TIME__, __FILE__, __func__, __LINE__,msg); #define mydebugNum(msg) printf("[%s %s] %s: %s: %d num:%d\n", __DATE__, __TIME__, __FILE__, __func__, __LINE__,msg); void listen_mice(const char *dev, int timeout) { char buf[256]; struct input_event in; int n_len; int retval; fd_set readfds; struct timeval tv; int fd = open(dev, O_RDONLY); if (fd < 0) { perror(dev); return; } mydebug; while (1) { FD_ZERO(&readfds); FD_SET(fd, &readfds); tv.tv_sec = timeout; tv.tv_usec = 0; if((retval = select(fd+1, &readfds, NULL, NULL, &tv)) == 1) { if ((n_len = read(fd, &in, sizeof(struct input_event))) > 0) { printf("in.type: %d, in.code=%d, in.value=%d\n", in.type, in.code, in.value); } } else { break; } } close(fd); } void listen_mouse(char*name,int timeout) { printf("test device:%s \t overtime(s):%d\n",name,timeout); listen_mice(name, timeout); } int main(int argc, char **argv) { printf("version:2022-06-23 v0.0.3 \n"); if(argc==2){ listen_mouse (argv[1],200); } else if(argc>2){ listen_mouse (argv[1],atoi(argv[2])); } else{ listen_mouse ("/dev/input/event5",200); } printf("mouse timeout\n"); return 0; }
通过分析源码 lv_drivers/indev/evdev.c 文件,我感觉lvgl对于触控的解析多了几步,对于 ABS_MT_TRACKING_ID 的解析我认为多余,我将其删除后,触控正常,滑动正常
通过测试,我发现,对于 ABS_MT_TRACKING_ID 不同的触摸板,解析出来的结果可能不一致,我手中的两块触摸屏 对 BTN_TOUCH 的解析是一致的
、、