RK3568 android11 usb接口TP与电磁笔触点上报优先级问题

一,问题描述

双USB接口,电容触摸跟电磁手写笔触摸会产生误触现象,所以需要在底层实现电磁笔优先级。
电磁屏优先(指当笔和手都放屏上,手不发信息),因为都是USB接口使用,电容触摸跟电磁手写笔触摸会产生误触现象;

rk3568:/ # getevent
add device 1: /dev/input/event5name:     "ILITEK ILITEK-TP"
add device 2: /dev/input/event0name:     "fdd70030.pwm"
add device 3: /dev/input/event1name:     "rk805 pwrkey"
add device 4: /dev/input/event4name:     "rk-headset"
add device 5: /dev/input/event3name:     "adc-keys"
add device 6: /dev/input/event2name:     "HUION Huion Monitor"

cat sys/kernel/debug/usb/devices 查看本地usb设备信息

rk3568:/ # cat sys/kernel/debug/usb/devices
T:  Bus=02 Lev=02 Prnt=02 Port=01 Cnt=01 Dev#=  3 Spd=12   MxCh= 0
D:  Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs=  1
P:  Vendor=222a ProdID=0001 Rev= 0.02
S:  Manufacturer=ILITEK
S:  Product=ILITEK-TP
C:* #Ifs= 1 Cfg#= 1 Atr=a0 MxPwr=400mA
I:* If#= 0 Alt= 0 #EPs= 2 Cls=03(HID  ) Sub=00 Prot=00 Driver=usbhid
E:  Ad=81(I) Atr=03(Int.) MxPS=  64 Ivl=1ms
E:  Ad=02(O) Atr=03(Int.) MxPS=  64 Ivl=1msT:  Bus=03 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#=  2 Spd=12   MxCh= 0
D:  Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 8 #Cfgs=  1
P:  Vendor=256c ProdID=006d Rev= 1.12
S:  Manufacturer=HUION
S:  Product=Huion Monitor
C:* #Ifs= 2 Cfg#= 1 Atr=a0 MxPwr=100mA
I:* If#= 0 Alt= 0 #EPs= 1 Cls=03(HID  ) Sub=01 Prot=02 Driver=usbhid
E:  Ad=81(I) Atr=03(Int.) MxPS=  64 Ivl=2ms
I:* If#= 1 Alt= 0 #EPs= 1 Cls=03(HID  ) Sub=01 Prot=02 Driver=usbhid
E:  Ad=82(I) Atr=03(Int.) MxPS=  16 Ivl=2ms

dev/input/event5 (触摸 ILITEK ILITEK-TP)
dev/input/event2 (电磁笔 HUION Huion Monitor)


二,驱动代码分析

1. TP上报

源码路径:kernel/drivers/hid/hid-multitouch.c

主要是mt_report函数:

static void mt_report(struct hid_device *hid, struct hid_report *report)  //静态函数mt_report
{struct mt_device *td = hid_get_drvdata(hid); //通过 hid_get_drvdata 获取与 HID设备有关的多点触控设备数据结构(mt_device)struct hid_field *field = report->field[0];  //获取当前报告的第一个字段 fieldstruct mt_report_data *rdata;if (!(hid->claimed & HID_CLAIMED_INPUT))  //检查设备状态return;rdata = mt_find_report_data(td, report); //查找与当前报告相关联的多点触控数据结构 rdataif (rdata && rdata->is_mt_collection)   //如果 rdata 存在并且它标记为多点触控集合,则调用 mt_touch_report(hid, rdata) 函数来处理该触控报告return mt_touch_report(hid, rdata);if (field && field->hidinput && field->hidinput->input)input_sync(field->hidinput->input);  //同步输入设备状态
}

这段代码是用于在一个 HID (人机接口设备)驱动中处理多点触控(MT, Multi-Touch)报告的函数。

2. 电磁笔上报

跟踪代码发现电磁笔使用的是hid通用驱动;
源码路径:kernel/drivers/hid/hid-input.c

上报信息主要是以下位置:

if (usage->hid == (HID_UP_DIGITIZER | 0x0032)) { /* InRange */if (value) {   //如果 value 为真(通常表示触控笔或指针当前在数字化仪的感应范围内)input_event(input, usage->type, (*quirks & HID_QUIRK_INVERT) ? BTN_TOOL_RUBBER : usage->code, 1);  //表示正在使用电磁笔return;}input_event(input, usage->type, usage->code, 0);  //表示当前工具不再激活(使用 usage->code 设置为 0)input_event(input, usage->type, BTN_TOOL_RUBBER, 0);  //表示电磁笔不在使用return;
}

这段代码首先判断 usage 结构的 hid 字段是否等于一个特定值,这个值表明当前事件对应于数字化仪的 “InRange” 事件。


三,功能实现

思路如下:
1.在电磁笔上报信息的地方定义一个全局变量,按下设置为true,松开设置为false;
2.在TP触摸处理多点触控的位置根据变量的状态进行判断
3.电磁笔上报时,屏蔽TP触摸的上报;反之电磁笔停止上报,TP触摸正常;

参考补丁:

diff --git a/kernel/drivers/hid/hid-input.c b/kernel/drivers/hid/hid-input.c
index dd3f4aa052..e644b599c9 100644
--- a/kernel/drivers/hid/hid-input.c
+++ b/kernel/drivers/hid/hid-input.c
@@ -36,6 +36,9 @@
#define unk    KEY_UNKNOWN
+bool touch_blocked;
+EXPORT_SYMBOL(touch_blocked);static const unsigned char hid_keyboard[256] = {0,  0,  0,  0, 30, 48, 46, 32, 18, 33, 34, 35, 23, 36, 37, 38,50, 49, 24, 25, 16, 19, 31, 20, 22, 47, 17, 45, 21, 44,  2,  3,
@@ -1268,12 +1271,17 @@ void hidinput_hid_event(struct hid_device *hid, struct hid_field *field, struct}if (usage->hid == (HID_UP_DIGITIZER | 0x0032)) { /* InRange */
+    printk(KERN_ERR "[fy-1]:value = %d,quirks = %x, BTN_TOOL_RUBBER = %d, usage->code = %d,usage->type = %u\n",value,(*quirks & HID_QUIRK_INVERT), BTN_TOOL_RUBBER, usage->code, usage->type);if (value) {input_event(input, usage->type, (*quirks & HID_QUIRK_INVERT) ? BTN_TOOL_RUBBER : usage->code, 1);
+            touch_blocked = true;
+            printk(KERN_ERR "[fy-2]:value = %d,usage->code = %d,usage->type = %u,BTN_TOOL_RUBBER = %d\n",value,usage->code, usage->type, BTN_TOOL_RUBBER);return;}input_event(input, usage->type, usage->code, 0);input_event(input, usage->type, BTN_TOOL_RUBBER, 0);
+        touch_blocked = false;
+        printk(KERN_ERR "[fy-3]:value = %d,usage->code = %d,usage->type = %u,BTN_TOOL_RUBBER = %d\n",value,usage->code, usage->type, BTN_TOOL_RUBBER);return;}
diff --git a/kernel/drivers/hid/hid-multitouch.c b/kernel/drivers/hid/hid-multitouch.c
index 0c72702fc1..ffb9a4820b 100644
--- a/kernel/drivers/hid/hid-multitouch.c
+++ b/kernel/drivers/hid/hid-multitouch.c
@@ -1366,18 +1366,28 @@ static int mt_event(struct hid_device *hid, struct hid_field *field,return 0;
}
+extern bool touch_blocked;
static void mt_report(struct hid_device *hid, struct hid_report *report)
{struct mt_device *td = hid_get_drvdata(hid);struct hid_field *field = report->field[0];struct mt_report_data *rdata;
+    printk(KERN_INFO "[FY-1]------mt_report: Entered mt_report for HID device: %p\n", hid);if (!(hid->claimed & HID_CLAIMED_INPUT))return;rdata = mt_find_report_data(td, report);
-    if (rdata && rdata->is_mt_collection)
-        return mt_touch_report(hid, rdata);
+    if (rdata && rdata->is_mt_collection){
+        printk(KERN_INFO "[FY-2]------mt_report: Found MT collection, processing touch report\n");
+        if(touch_blocked){
+           printk(KERN_INFO "[FY-3]------mt_report: Touch events are blocked.\n");
+           return;
+        }else{
+           printk(KERN_INFO "[FY-4]------mt_report: Touch events are open.\n");
+           return mt_touch_report(hid, rdata);
+        }
+    }if (field && field->hidinput && field->hidinput->input)input_sync(field->hidinput->input);

编译烧录后,验证功能正常(电磁笔使用时TP不上报);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/458486.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker中如何控制服务启动顺序实现探讨

文章目录 一、Docker概述二、Docker三剑客1. Compose2. Machine3. Swarm 三、简要需求1. 样例工程2. 代码模块3. 调用方向4. 期望启动顺序 四、思路分析1.各走各路1.)docker-compose -f指定不同配置文件2.)docker-compose up -d service-name指定服务名3…

【CSS in Depth 2 精译_055】8.3 伪类 :is() 和 :where() 的正确打开方式

当前内容所在位置(可进入专栏查看其他译好的章节内容) 【第三部分 现代 CSS 代码组织】 ✔️【第八章 层叠图层及其嵌套】 ✔️ 8.1 用 layer 图层来操控层叠规则(上篇) 8.1.1 图层的定义(上篇)8.1.2 图层的…

巡飞单机多旋翼无人机技术详解

巡飞单机多旋翼无人机技术是一种集成了多种先进技术的无人机系统,它具备自主飞行、长续航、高精度控制以及多任务负载能力等特点。以下是对巡飞单机多旋翼无人机技术的详细解析: 一、机架与结构设计 1.材料选择:为了确保无人机能够承载足够…

cmake命令使用

有关cmake的入门简介可参见 CMake入门教程_cmake静态test.c编译-CSDN博客 本文是进一步对cmake常用命令做进一步详述 配置项目 cmake_minimum_required 作用 配置cmake最低版本 用法 cmake_minimum_required(VERSION 3.0) project 作用:设置预设变量 PROJEC…

深度学习(一)基础:神经网络、训练过程与激活函数(1/10)

深度学习基础:神经网络、训练过程与激活函数 引言: 深度学习作为机器学习的一个子领域,近年来在人工智能的发展中扮演了举足轻重的角色。它通过模仿人脑的神经网络结构,使得计算机能够从数据中学习复杂的模式和特征,…

dmsql日志分析工具部署与使用DM8/DM7

dmsql日志分析工具部署与使用DM8/DM7 1 环境介绍2 JAVA 环境变量配置2.1 Os Kylin 10 JAVA 环境变量配置2.2 Windos7 JAVA环境变量配置 3 数据库配置3.1 数据库初始化参数3.2 数据库创建表 4 配置DMLOG日志分析工具4.1 Kylin v10 配置DMLOG日志分析工具4.2 执行日志分析4.3 Win…

linux面试题复习

前言 现在只是初版,很多格式我还没有改好,会慢慢修改订正。 可能用到的网址:在线 EXCEL 到 MARKDOWN 转换器。 参考了很多网上的面试题和外网上的面试题: 参考文档: 程序员的50大Linux面试问题及答案 Top 60 Linux …

MySQL——test4(综合练习)

目录 建库建表(题目)处理表1. 修改student 表中年龄(sage)字段属性,数据类型由int 改变为smallint2. 为Course表中Cno 课程号字段设置索引,并查看索引3. 为SC表建立按学号(sno)和课程号(cno)组合的升序的主键索引,索引名为SC_INDE…

数据结构:“小猫钓鱼游戏”

一:题目 栈和队列的综合应用:“小猫钓鱼”的游戏规则是:将一副扑克牌平均分成两份,每人拿一份。玩家甲先拿出手中的第一张扑克牌放在桌上,然后玩家乙也拿出手中的第一张扑克牌,并放在玩家甲刚打出的扑克牌的…

前端算法:树(力扣144、94、145、100、104题)

目录 一、树(Tree) 1.介绍 2.特点 3.基本术语 4.种类 二、树之操作 1.遍历 前序遍历(Pre-order Traversal):访问根节点 -> 遍历左子树 -> 遍历右子树。 中序遍历(In-order Traversal&#xf…

STM32L476芯片在KEIL环境下BOOT跳转APP注意事项

BOOT工程 分配BOOT程序地址、设置参数地址、APP程序地址、下载缓冲区地址 #define BOOT_SECTOR_ADDR 0x08000000 #define BOOT_SECTOR_SIZE 0x0000A000 #define SETTING_SECTOR_ADDR 0x0800A000 #define SETTING_SECTOR_SIZE 0x00002000 #define APP_S…

R语言 | paletteer包:拥有2100多个调色板!

看到 PMID:39024031 文章的代码中&#xff0c;有颜色设置的语句&#xff1a; pal <- paletteer_d("ggsci::category20_d3")[c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18)]DimPlot(MM,reduction umap,group.by "sample",label F,pt.size 0.1,c…

从零开始机器学习——基于PyTorch构建你的第一个线性回归模型

随着人工智能技术的迅猛发展&#xff0c;机器学习成为了现代科技领域中最炙手可热的话题之一。然而&#xff0c;对于初学者来说&#xff0c;机器学习似乎总是充满了复杂的理论和难以理解的概念。本文将带你从零开始&#xff0c;使用PyTorch深度学习框架&#xff0c;构建一个最简…

【设计模式系列】代理模式(八)

一、什么是代理模式 代理模式&#xff08;Proxy Pattern&#xff09;是一种结构型设计模式&#xff0c;它为其他对象提供一种代理以控制对这个对象的访问。代理模式在不直接访问实际对象的情况下&#xff0c;提供了对目标对象的间接访问。通过引入一个代理对象来间接操作实际对…

layui扩展组件之----右键菜单

源码&#xff1a;rightmenu.js layui.define([element], function (exports) {let element layui.element;const $ layui.jquery;let MOD_NAME rightmenu;let RIGHTMENUMOD function () {this.v 1.0.0;this.author raowenjing;};String.prototype.format function () {…

检索引擎Elasticsearch

一.为什么要用Elasticsearch 由于我们在运行我们的项目的时候通常都是将数据存到mysql或者sql serve等数据库中&#xff0c;在进行数据搜索时使用sql 语句 like进行模糊匹配查询&#xff0c;其一&#xff1a;虽然可以查到数据&#xff0c;但是它模糊匹配查询速度较慢&#xff0…

世优科技“AI+空间计算”推动消费行业向智能化升级

人工智能的演进正从初期的技术探索阶段&#xff0c;转向技术应用阶段&#xff0c;在此趋势下&#xff0c;融合了多模态大模型、虚拟现实、空间计算等前沿技术的人工智能应用新方向&#xff0c;展现出了巨大的潜力和商业价值。 10月19日&#xff0c;2024北京朝阳国际灯光节全新…

[C++11] 右值引⽤与移动语义

文章目录 左值和右值左值&#xff08;Lvalue&#xff09;右值&#xff08;Rvalue&#xff09;区别 左值引⽤和右值引⽤左值引用&#xff08;Lvalue Reference&#xff09;右值引用&#xff08;Rvalue Reference&#xff09;右值引用的特点 右值引用延长生命周期右值引⽤和移动语…

数据结构——树、二叉树和森林间的转换

前言 介绍 &#x1f343;数据结构专区&#xff1a;数据结构 参考 该部分知识参考于《数据结构&#xff08;C语言版 第2版&#xff09;》129~130页 &#x1f308;每一个清晨&#xff0c;都是世界对你说的最温柔的早安&#xff1a;ૢ(≧▽≦)و✨ 目录 前言 1、基础知识 2…

Matlab 车牌识别技术

1.1设计内容及要求&#xff1a; 课题研究的主要内容是对数码相机拍摄的车牌&#xff0c;进行基于数字图像处理技术的车牌定位技术和车牌字符分割技术的研究与开发&#xff0c;涉及到图像预处理、车牌定位、倾斜校正、字符分割等方面的知识,总流程图如图1-1所示。 图1-1系统总…