天嵌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 的解析是一致的

    

 

 

 

 

 

 

、、

posted @ 2022-06-30 13:49  小城熊儿  阅读(743)  评论(0编辑  收藏  举报