【Linux入坑(二)—全志T133开发板适配USB-电容屏触摸屏驱动(多点触控) 】

文章目录

        • [1. 引言](#1. 引言)
        • [2. 硬件与软件环境准备](#2. 硬件与软件环境准备)
        • [3. 驱动适配](#3. 驱动适配)
        • [4. 修改内核驱动(HID Multitouch)](#4. 修改内核驱动(HID Multitouch))
        • [5. 环境变量说明记录](#5. 环境变量说明记录)
        • [6. 常见问题与解决方案](#6. 常见问题与解决方案)
1. 引言
  • 背景介绍
    • 在飞凌的开发板上移植完成显示屏驱动后,需要再进行触摸屏驱动移植,触摸屏是采用usb接口,与原板的接口不一样,需要在内核增加驱动。
    • USB-电容屏触摸屏的优势(如多点触控、高精度)。
2. 硬件与软件环境准备
  • 硬件清单
    • 飞凌OKT133开发板(需包含USB接口)。
    • USB-电容屏触摸屏()。
  • 软件环境搭建
    • 操作系统:Linux发行版(如Ubuntu)用于交叉编译。
    • 工具链:飞凌的SDK、交叉编译器(如arm-linux-gnueabihf)。
    • 内核版本:Linux内核5.4(支持标准输入子系统)。
3. 驱动适配
  • 查看触摸屏USB 驱动
    • 运行开发板,使用串口工具(MobaXterm)进入开发板调试界面。
      通过指令查看驱动名称和事件号(event)
bash 复制代码
#查看驱动程序加载和设备识别情况
dmesg | grep -i 'touch'
#触摸屏设备输入设备信息
cat /proc/bus/input/devices
  • 检测屏幕是否有输入信息
    使用evtest工具进行测试,可以检测触摸屏的事件输出。
    我的输入设备是event4所以选择第四个,输入4,点击屏幕可以查看到对应的输出信息和点击信息(BTN_TOUCH)有的是(BTN_LEFT) 如果没有evtest, 直接用cat也能看到触摸时会有乱码数据输出,用hexdump可以看到二进制数据;
4. 修改内核驱动(HID Multitouch)

PS:如果内核源码里没有HID Multitouch panels选项,就需要自己移植对应的多点触控驱动,请找其他教程

1、进入内核配置

bash 复制代码
./build.sh menuconfig

2、搜索驱动 按 "/" 输入multitouch进行搜索

3、如果有驱动就可以查找出来,按数字"1"选择跳转到对应选项

4、按空格选择选项:

5、保存退出,编译镜像

bash 复制代码
./build.sh saveconfig
//编译配置
./build.sh config
//全部编译
./build.sh
//打包
./build.sh pack

6、烧写镜像后,重启,就会发现坐标不对,或者没反应,这时需要修改环境变量和校准

bash 复制代码
#修改环境变量
vim /etc/profile.d/qtenv.sh

将下面两个地方的环境变量修改为自己evtest查看到的对应的事件号,我的是4就修改为4

7、输入 ts_calibrate 进行校准

bash 复制代码
 ts_calibrate

8、校准完成后重启即可正常触摸,可以使用ts_test进行测试

bash 复制代码
ts_test
5. 环境变量说明记录
bash 复制代码
export TSLIB_TSDEVICE=/dev/input/event4#表示触摸设备文件
export TSLIB_CALIBFILE=/etc/pointercal#指定校准数据保存文件
export TSLIB_CONFFILE=/etc/ts.conf#指定ts配置文件
export TSLIB_PLUGINDIR=/usr/lib/ts#tslib 插件目录位置
export QT_QPA_PLATFORM=linuxfb
export QT_QPA_GENERIC_PLUGINS=tslib
export QT_QPA_FB_TSLIB=1 #与qt相关的配置
export TSLIB_cONSOLEDEVICE=none#表示控制台设置
export QT_QPA_FB_NOCURSOR=1
#强制使用触摸事件而非鼠标事件
export QT_QPA_FB_FORCEINPUT=1
export QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS=/dev/input/event4:rotate=0:invertx=0:inverty=0
# 禁用鼠标事件合成
export QT_QPA_FB_DISABLE_MOUSE=1
#设置触摸屏特性
export QT_QPA_EVDEV_TOUCHSCREEN_MATCH=1
export QT_QPA_EVDEV_TOUCHSCREEN_ABS_PRESSURE=1
6. 常见问题与解决方案

1、拔插usb和重新上电触摸屏eventX编号改变问题

使用eudev来配置软连接,以便在系统重启或设备重新插拔时保持一致。eudev配置USB设备的固定event

在OK113i-linux-sdk/platform/framework/auto/rootfs/etc/udev/rules.d/创建文件

54-usbscreentouch.rules

bash 复制代码
KERNEL=="event*", SUBSYSTEM=="input", ATTRS{name}=="ILITEK ILITEK-TP", SYMLINK+="input/event_touch"
#意思是匹配event事件设备,名字为ILITEK ILITEK-TP,创建新连接input/event_touch

1、获取输入设备信息 找到目标设备的供应商ID(Vendor ID)和产品ID(Product ID)。例如,输出可能如下所示:

bash 复制代码
cat /proc/bus/input/devices

2、使用udevadm info命令获取设备的详细属性:

bash 复制代码
udevadm info --query=all --name=/dev/input/eventX # 获取设备属性
udevadm info --attribute-walk --name=/dev/input/eventX # 获取所有子属性

记录下:

3、开发板里增加测试

bash 复制代码
vim /etc/udev/rules.d/66-usbscreentouch.rules

写入下面内容,目的是将id为ATTRS{idVendor}=="222a" ATTRS{idProduct}=="0001"

我的触摸屏有两个鼠标事件,使用id区分不开,所以使用ATTRS{name}=="ILITEK ILITEK-TOUCH"作为区分

bash 复制代码
KERNEL=="event*", SUBSYSTEM=="input", ATTRS{idVendor}=="222a", ATTRS{idProduct}=="0001", SYMLINK+="input/event_usb_touch"
bash 复制代码
KERNEL=="event*", SUBSYSTEM=="input", ATTRS{name}=="ILITEK       ILITEK-TOUCH", SYMLINK+="input/event_usb_touch"

配置完成后重启或者使用指令,查看/dev/input/是否新增一个event_usb_touch事件,有表示链接成功

bash 复制代码
udevadm control --reload-rules#重载规则
udevadm trigger --action=add /dev/input/eventX   #重载事件
ls -l /dev/input/event
ls -l /dev/input/event_usb_touch

4、重新映射软件链接到环境变量

bash 复制代码
vim /etc/profile.d/qtenv.sh

5、量产时,虚拟机环境里使用上述信息创建一个自定义的udev规则文件

bash 复制代码
具体路径如下:
OK113i-linux-sdk/platform/framework/auto/rootfs/etc/udev/rules.d/66-usbscreentouch.rules

复制一个文件重命名或者新建一个,然后右键使用TextEditor编辑

bash 复制代码
KERNEL=="event*", SUBSYSTEM=="input", ATTRS{name}=="ILITEK       ILITEK-TOUCH", SYMLINK+="input/event_usb_touch"

2、量产时通过镜像修改输入设备信息

可以通过修改路径内容每次编译到开发板上的 etc/profile.d/qtenv.sh

bash 复制代码
OK113i-linux-sdk/platform/framework/auto/rootfs/etc/profile.d/qtenv.sh

3、QT应用热插USB拔识别问题

bash 复制代码
// 从426行开始
if (errno != EINTR && errno != EAGAIN) {
    qErrnoWarning(errno, "evdevtouch-test: Could not read from input device");
    
    if (errno == ENODEV) { // device got disconnected -> stop reading
        delete m_notify;
        m_notify = nullptr;
        QT_CLOSE(m_fd);
        m_fd = -1;
        
        while (1) {
            m_fd = QT_OPEN(d->deviceNode.toLocal8Bit().constData(), O_RDONLY | O_NDELAY, 0);
            if (m_fd >= 0) {
                m_notify = new QSocketNotifier(m_fd, QSocketNotifier::Read, this);
                connect(m_notify, SIGNAL(activated(int)), this, SLOT(readData()));
                return;
            }
            
            // 被注释的调试语句
            // system("echo waiting for evdevtouch ...");
            system("sleep 1");
        }
        
        // unregisterTouchDevice();
    }
    return;
}
相关推荐
牛马工作号3 小时前
Mosquitto + ACME:从 Docker Compose 部署到 TLS 证书自动续期与加载
运维·docker·容器
强哥聊算力6 小时前
《算力江湖·英伟达传奇》第七集:ChatGPT出现前夜,英伟达发生了什么?
服务器·人工智能·算法·ai·chatgpt·gpu算力
Initialize-le6 小时前
Nginx 504 超时、499 一堆?网关排查法
运维·nginx
砚凝霜8 小时前
【软考信息安全】第二十二章 Web服务器安全分析与增强——Apache与IIS
服务器·前端·安全
Android系统攻城狮8 小时前
Linux Gstreamer深度解析之gst_audio_ring_buffer_delay调用流程与实战(七十二)
linux·运维·服务器·gstreamer音视频·音视频进阶
快乐的韭菜根根9 小时前
ubuntu 安装slurm并配置
linux·运维·ubuntu
数字新视界9 小时前
机房动环监控提升运维效率
大数据·服务器·数据库·动环监控系统·动力与环境监控系统
U-Mail邮件系统10 小时前
自建邮箱服务器有哪些软件?三款主流邮件服务器软件推荐
运维·服务器
倒头就睡的小比特11 小时前
Linux基础指令3
linux·服务器
Smoothcloud润云11 小时前
PyTorch推理服务模型热切换与失败回滚实战:降低版本更新中断
服务器·人工智能·pytorch·python·深度学习·gpu