文章目录1. 引言2. 硬件与软件环境准备3. 驱动适配4. 修改内核驱动HID Multitouch5. 环境变量说明记录6. 常见问题与解决方案1. 引言背景介绍在飞凌的开发板上移植完成显示屏驱动后需要再进行触摸屏驱动移植触摸屏是采用usb接口与原板的接口不一样需要在内核增加驱动。USB-电容屏触摸屏的优势如多点触控、高精度。2. 硬件与软件环境准备硬件清单飞凌OKT133开发板需包含USB接口。USB-电容屏触摸屏。软件环境搭建操作系统Linux发行版如Ubuntu用于交叉编译。工具链飞凌的SDK、交叉编译器如arm-linux-gnueabihf。内核版本Linux内核5.4支持标准输入子系统。3. 驱动适配查看触摸屏USB 驱动运行开发板使用串口工具MobaXterm进入开发板调试界面。通过指令查看驱动名称和事件号event#查看驱动程序加载和设备识别情况dmesg|grep-itouch#触摸屏设备输入设备信息cat/proc/bus/input/devices检测屏幕是否有输入信息使用evtest工具进行测试,可以检测触摸屏的事件输出。我的输入设备是event4所以选择第四个输入4点击屏幕可以查看到对应的输出信息和点击信息BTN_TOUCH有的是BTN_LEFT 如果没有evtest, 直接用cat也能看到触摸时会有乱码数据输出用hexdump可以看到二进制数据4. 修改内核驱动HID MultitouchPS:如果内核源码里没有HID Multitouch panels选项就需要自己移植对应的多点触控驱动请找其他教程1、进入内核配置./build.sh menuconfig2、搜索驱动 按 “/” 输入multitouch进行搜索3、如果有驱动就可以查找出来按数字“1”选择跳转到对应选项4、按空格选择选项5、保存退出编译镜像./build.sh saveconfig //编译配置 ./build.sh config //全部编译 ./build.sh //打包 ./build.sh pack6、烧写镜像后重启就会发现坐标不对或者没反应这时需要修改环境变量和校准#修改环境变量vim/etc/profile.d/qtenv.sh将下面两个地方的环境变量修改为自己evtest查看到的对应的事件号我的是4就修改为47、输入 ts_calibrate 进行校准ts_calibrate8、校准完成后重启即可正常触摸可以使用ts_test进行测试ts_test5. 环境变量说明记录exportTSLIB_TSDEVICE/dev/input/event4#表示触摸设备文件exportTSLIB_CALIBFILE/etc/pointercal#指定校准数据保存文件exportTSLIB_CONFFILE/etc/ts.conf#指定ts配置文件exportTSLIB_PLUGINDIR/usr/lib/ts#tslib 插件目录位置exportQT_QPA_PLATFORMlinuxfbexportQT_QPA_GENERIC_PLUGINStslibexportQT_QPA_FB_TSLIB1#与qt相关的配置exportTSLIB_cONSOLEDEVICEnone#表示控制台设置exportQT_QPA_FB_NOCURSOR1#强制使用触摸事件而非鼠标事件exportQT_QPA_FB_FORCEINPUT1exportQT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS/dev/input/event4:rotate0:invertx0:inverty0# 禁用鼠标事件合成exportQT_QPA_FB_DISABLE_MOUSE1#设置触摸屏特性exportQT_QPA_EVDEV_TOUCHSCREEN_MATCH1exportQT_QPA_EVDEV_TOUCHSCREEN_ABS_PRESSURE16. 常见问题与解决方案1、拔插usb和重新上电触摸屏eventX编号改变问题使用eudev来配置软连接以便在系统重启或设备重新插拔时保持一致。eudev配置USB设备的固定event在OK113i-linux-sdk/platform/framework/auto/rootfs/etc/udev/rules.d/创建文件54-usbscreentouch.rulesKERNELevent*,SUBSYSTEMinput, ATTRS{name}ILITEK ILITEK-TP,SYMLINKinput/event_touch#意思是匹配event事件设备名字为ILITEK ILITEK-TP创建新连接input/event_touch1、获取输入设备信息 找到目标设备的供应商IDVendor ID和产品IDProduct ID。例如输出可能如下所示cat/proc/bus/input/devices2、使用udevadm info命令获取设备的详细属性udevadm info--queryall--name/dev/input/eventX# 获取设备属性udevadm info --attribute-walk--name/dev/input/eventX# 获取所有子属性记录下3、开发板里增加测试vim/etc/udev/rules.d/66-usbscreentouch.rules写入下面内容目的是将id为ATTRS{idVendor}222a ATTRS{idProduct}0001我的触摸屏有两个鼠标事件使用id区分不开所以使用ATTRS{name}ILITEK ILITEK-TOUCH作为区分KERNELevent*,SUBSYSTEMinput, ATTRS{idVendor}222a, ATTRS{idProduct}0001,SYMLINKinput/event_usb_touchKERNELevent*,SUBSYSTEMinput, ATTRS{name}ILITEK ILITEK-TOUCH,SYMLINKinput/event_usb_touch配置完成后重启或者使用指令查看/dev/input/是否新增一个event_usb_touch事件,有表示链接成功udevadm control --reload-rules#重载规则udevadm trigger--actionadd /dev/input/eventX#重载事件ls-l/dev/input/eventls-l/dev/input/event_usb_touch4、重新映射软件链接到环境变量vim/etc/profile.d/qtenv.sh5、量产时虚拟机环境里使用上述信息创建一个自定义的udev规则文件具体路径如下 OK113i-linux-sdk/platform/framework/auto/rootfs/etc/udev/rules.d/66-usbscreentouch.rules复制一个文件重命名或者新建一个然后右键使用TextEditor编辑KERNELevent*,SUBSYSTEMinput, ATTRS{name}ILITEK ILITEK-TOUCH,SYMLINKinput/event_usb_touch2、量产时通过镜像修改输入设备信息可以通过修改路径内容每次编译到开发板上的etc/profile.d/qtenv.shOK113i-linux-sdk/platform/framework/auto/rootfs/etc/profile.d/qtenv.sh3、QT应用热插USB拔识别问题// 从426行开始if(errno!EINTRerrno!EAGAIN){qErrnoWarning(errno,evdevtouch-test: Could not read from input device);if(errnoENODEV){// device got disconnected -stop reading delete m_notify;m_notifynullptr;QT_CLOSE(m_fd);m_fd-1;while(1){m_fdQT_OPEN(d-deviceNode.toLocal8Bit().constData(), O_RDONLY|O_NDELAY,0);if(m_fd0){m_notifynew 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;}