Android USB TP方向修改

搜集的一些关于Android USB TP的方向修改的代码,X to Y , X反转 , Y反转,双触屏配置,双屏异触等。

diff --git a/kernel/drivers/hid/hid-multitouch.c b/kernel/drivers/hid/hid-multitouch.c
old mode 100644new mode 100755
index 9de379c1b3..b8456b1e50
--- a/kernel/drivers/hid/hid-multitouch.c
+++ b/kernel/drivers/hid/hid-multitouch.c
@@ -98,7 +98,23 @@ struct mt_fields {unsigned usages[HID_MAX_FIELDS];unsigned int length;
};
-
+#define GTP_SWAP(x, y)                 do{\
+                                         typeof(x) z = x;\
+                                         x = y;\
+                                         y = z;\
+                                       }while (0)
+                              
+#define MAINmGtpChange_X2Y   1 
+#define MIANmGtp_X_Reverse    1
+#define MAINNmGtp_Y_Reverse      0 
+static int  MAINX_max=0;
+static int  MAINY_max=0;
+                              
+#define AUXmGtpChange_X2Y    1 
+#define AUXmGtp_X_Reverse    1
+#define AUXNmGtp_Y_Reverse   0 
+static int  AUXX_max=0;
+static int  AUXY_max=0;
struct mt_device {struct mt_slot curdata; /* placeholder of incoming data */struct mt_class mtclass;    /* our mt device class */
@@ -461,6 +477,14 @@ static int mt_touch_input_mapping(struct hid_device *hdev, struct hid_input *hi,case HID_UP_GENDESK:switch (usage->hid) {case HID_GD_X:
+       if (hdev->vendor==0x0457 && hdev->product==0x0819)
+       {
+           MAINX_max =     field->logical_maximum;
+       }
+       else if (hdev->vendor==0x222a && hdev->product ==0x0001)
+       {
+           AUXX_max =  field->logical_maximum;
+       }if (prev_usage && (prev_usage->hid == usage->hid)) {hid_map_usage(hi, usage, bit, max,EV_ABS, ABS_MT_TOOL_X);
@@ -476,6 +500,14 @@ static int mt_touch_input_mapping(struct hid_device *hdev, struct hid_input *hi,mt_store_field(usage, td, hi);return 1;case HID_GD_Y:
+       if (hdev->vendor==0x0457 && hdev->product==0x0819)
+       {
+           MAINY_max =     field->logical_maximum;
+       }
+       else if (hdev->vendor==0x222a && hdev->product ==0x0001)
+       {
+           AUXY_max =  field->logical_maximum;
+       }if (prev_usage && (prev_usage->hid == usage->hid)) {hid_map_usage(hi, usage, bit, max,EV_ABS, ABS_MT_TOOL_Y);
@@ -613,8 +645,10 @@ static int mt_compute_slot(struct mt_device *td, struct input_dev *input)* this function is called when a whole contact has been processed,* so that it can assign it to a slot and store the data there*/
-static void mt_complete_slot(struct mt_device *td, struct input_dev *input)
+static void mt_complete_slot(struct mt_device *td, struct input_dev *input,struct hid_device *hid_device)
{
+   
+   if ((td->mtclass.quirks & MT_QUIRK_CONTACT_CNT_ACCURATE) &&td->num_received >= td->num_expected)return;
@@ -649,7 +683,33 @@ static void mt_complete_slot(struct mt_device *td, struct input_dev *input)int major = max(s->w, s->h) >> 1;int minor = min(s->w, s->h) >> 1;
-           input_event(input, EV_ABS, ABS_MT_POSITION_X, s->x);
+if (hid_device->vendor==0x0457 && hid_device->product==0x0819)
+{
+   #if MAINmGtpChange_X2Y
+       GTP_SWAP(s->x, s->y);
+   #endif
+       if(MIANmGtp_X_Reverse){
+           s->x = MAINX_max -s->x;+       }
+
+       if(MAINNmGtp_Y_Reverse){
+           s->y = MAINY_max - s->y;
+       }
+}
+else if (hid_device->vendor==0x222a && hid_device->product==0x0001)
+{
+   #if AUXmGtpChange_X2Y
+       GTP_SWAP(s->x, s->y);
+   #endif
+       if(AUXmGtp_X_Reverse){
+           s->x = AUXX_max -s->x;
+       }
+
+       if(AUXNmGtp_Y_Reverse){
+           s->y = AUXY_max - s->y;
+       }
+}input_event(input, EV_ABS, ABS_MT_POSITION_X, s->x);input_event(input, EV_ABS, ABS_MT_POSITION_Y, s->y);input_event(input, EV_ABS, ABS_MT_TOOL_X, s->cx);input_event(input, EV_ABS, ABS_MT_TOOL_Y, s->cy);
@@ -752,7 +812,7 @@ static void mt_process_mt_event(struct hid_device *hid, struct hid_field *field,if (usage->usage_index + 1 == field->report_count) {/* we only take into account the last report. */if (usage->hid == td->last_slot_field)
-               mt_complete_slot(td, field->hidinput->input);
+               mt_complete_slot(td, field->hidinput->input,hid);}}diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c
index 9de379c1b3fd..0c08b397792f 100644
--- a/drivers/hid/hid-multitouch.c
+++ b/drivers/hid/hid-multitouch.c
@@ -164,6 +164,8 @@ static void mt_post_parse(struct mt_device *td);#define MT_USB_DEVICE(v, p)    HID_DEVICE(BUS_USB, HID_GROUP_MULTITOUCH, v, p)#define MT_BT_DEVICE(v, p)     HID_DEVICE(BUS_BLUETOOTH, HID_GROUP_MULTITOUCH, v, p)+static int vendor_id,vendor_temp,vendor_logical_max;
+@@ -415,6 +417,7 @@ static void set_abs(struct input_dev *input, unsigned int code,int fuzz = snratio ? (fmax - fmin) / snratio : 0;input_set_abs_params(input, code, fmin, fmax, fuzz, 0);input_abs_set_res(input, code, hidinput_calc_abs_res(field, code));
+       vendor_logical_max = fmax;}static void mt_store_field(struct hid_usage *usage, struct mt_device *td,
@@ -640,6 +643,13 @@ static void mt_complete_slot(struct mt_device *td, struct input_dev *input)active = (s->touch_state || s->inrange_state) &&s->confidence_state;+        		/*Identifier: bus=0x0003, vendor=0x222a, product=0x0001, version=0x0110 */
+               if(vendor_id == 0x222a){
+                       vendor_temp = s->x;
+                       s->x = vendor_logical_max - s->y;
+                       s->y = vendor_temp;
+               }
+input_mt_slot(input, slotnum);input_mt_report_slot_state(input, MT_TOOL_FINGER, active);if (active) {
@@ -764,6 +774,7 @@ static void mt_touch_report(struct hid_device *hid, struct hid_report *report)struct hid_field *field;unsigned count;int r, n;
+       vendor_id = hid->vendor;/** Includes multi-packet support where subsequent

或者修改上层 framework/native/services/inputflinger/InputReader.cpp

diff --git a/services/inputflinger/InputReader.cpp b/services/inputflinger/InputReader.cpp
index c1a36ff79..851b98027 100644
--- a/services/inputflinger/InputReader.cpp
+++ b/services/inputflinger/InputReader.cpp
@@ -3814,6 +3814,29 @@ void TouchInputMapper::configureSurface(nsecs_t when, bool* outResetNeeded) {bool viewportChanged = mViewport != newViewport;if (viewportChanged) {mViewport = newViewport;+        char buffer_orientation[PROP_VALUE_MAX];
+        memset(buffer_orientation, 0, sizeof(buffer_orientation));
+        property_get("persist.sys.panel.flip", buffer_orientation, "270");
+        int cmpRet = atoi(buffer_orientation);
+        ALOGE("persist.sys.hwrotation~~~~~~~~~~~~~~~~~~~~~~~~~ = %d",cmpRet);
+        ALOGE("fy-1:mViewport.orientation----------------------- = %d",mViewport.orientation);
+        if (cmpRet == 0)
+        {
+            mViewport.orientation = mViewport.orientation + DISPLAY_ORIENTATION_0;
+        }
+        else if(cmpRet == 90)
+        {
+            mViewport.orientation = mViewport.orientation  + DISPLAY_ORIENTATION_90;
+        }
+        else if(cmpRet == 180)
+        {
+            mViewport.orientation = mViewport.orientation + DISPLAY_ORIENTATION_180;
+        }
+        else if(cmpRet == 270)
+        {
+            mViewport.orientation = mViewport.orientation + DISPLAY_ORIENTATION_270;
+        }
+        ALOGE("fy-2:mViewport.orientation----------------------- = %d",mViewport.orientation);if (mDeviceMode == DEVICE_MODE_DIRECT || mDeviceMode == DEVICE_MODE_POINTER) {// Convert rotated viewport to natural surface coordinates.

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

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

相关文章

EtherCAT主站SOEM -- 29 -- STM32F767-SOEM通过 CSP模式(周期同步位置模式)控制一个电机转圈圈

EtherCAT主站SOEM -- 29 -- STM32F767-SOEM通过 CSP模式(周期同步位置模式)控制一个电机转圈圈 0 QT-SOEM视频预览及源代码下载:0.1 QT-SOEM视频预览0.2 QT-SOEM源代码下载1 程序文件修改替换1.1 allvalue.h1.2 allvalue.c1.3 motrorcontrol.h1.4 motrorcontrol.cpp1.5 main…

QT drawPixmap和drawImage处理图片模糊问题

drawPixmap和drawImage显示图片时,如果图片存在缩放时,会出现模糊现象,例如将一个100x100 的图片显示到30x30的区域,这个时候就会出现模糊。如下: 实际图片: 这个问题就是大图显示成小图造成的像素失真。 当…

【笔试】02

TCP TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议 它能够提供以下服务: 可靠传输 通过序列号、确认应答、重传机制等确保数据完整、准确地从发送端传输到接收端。 三次握手: 点对点全双工面向字节流…

1260. 二维网格迁移

1260. 二维网格迁移 原题链接:完成情况:解题思路:参考代码:错误经验吸取 原题链接: 1260. 二维网格迁移 https://leetcode.cn/problems/shift-2d-grid/description/ 完成情况: 解题思路: 这…

使用稳压管和三极管射极输出器电路驱动PMOS

当电源电压大于PMOS 管的最大栅源电源时,不能直接把栅极拉到地,需要一点特殊的电路来限制栅极驱动电压。有的地方是用电阻分压器做的,比如这种: NPN 三极管导通时,MOS 管栅极电压是两个电阻中间的电压。这种设计最大的…

106.从中序与后序遍历构造二叉树

给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。 思路: 中序遍历数组中,找到一个根节点,那么其前为其左子树&a…

(delphi11最新学习资料) Object Pascal 学习笔记---第9章第6节(嵌套异常和 InnerException机制)

9.6 异常的高级功能 ​ 除非你对这门语言已经有了很好的了解,否则第一次阅读这部分内容时最好跳过。在此之前,你可以先阅读下一章,将来再回到这一部分。 ​ 在本章的最后一部分,我将介绍一些与异常处理相关的高级主题。我将介绍…

嵌入式学习——Linux基础——day1

1. linux基础命令 1.1 ls 查看当前目录下的所有文件 ls -l 查看文件的详细信息 ls -a 查看当前目录下的所有文件(包含隐藏文件) 1.2 touch 创建一个空的普通文件 1.3 rm 删除一个普通文件 rm -rf 删除非…

大模型用到的位置编码汇总(面试)

不同于RNN、CNN等模型,对于Transformer模型来说,位置编码的加入是必不可少的,因为纯粹的Attention模块是无法捕捉输入顺序的,即无法区分不同位置的Token。为此我们大体有两个选择:想办法将位置信息融入到输入中&#x…

用odin实现的资源复制编辑器

用odin实现了一个资源复制编辑器,使用要安装odin,功能是把要复制的资源路径一个个添加设置,点copy能把列表里的资源全部复制,支持目录复制到目录,文件复制到目录,文件复制替换。提升效率,让自己…

Office 365卡顿怎么办?SD-WAN可以解决

随着数字化浪潮的推进,Office 365等云办公应用已成为企业日常运营不可或缺的工具。然而,许多企业在使用Office 365时遭遇了网络卡顿的难题,给工作人员带来诸多不便。随着SD-WAN技术的成熟和普及,这一难题得到了有效的解决。 Offic…

使用JWT、Redis + token实现用户登录的两种方式。

使用JWT实现登录功能 功能实现流程: 1.用户发起登录请求。 2.使用JwtBuilder生成令牌并返回。 3.写一个拦截器,拦截初登录之外的请求。拦截到请求后解析令牌,若正常放行,并将当前用户id存在当前线程。若出异常则返回登陆失败。…

四足机器人应用篇之solidwork导出URDF

欢迎关注微信公众号 “四足机器人研习社”,本公众号的文章和资料和四足机器人相关,包括行业的经典教材、行业资料手册,同时会涉及到职业知识学习及思考、行业发展、学习方法等一些方面的文章。 |1.URDF介绍 一个URDF pakage示例 urdf是ROS用于…

ABAP MESSAGE 常用的类型

类型文本描述A终止处理终止,用户必须重启事务X退出与消息类型A 类似,但带有程序崩溃 MESSAGE_TYPE_XE错误处理受到干扰,用户必须修正输入条目,左下角提示!W警告处理受到干扰,用户可以修正输入条目,左下角提示!I信息处理受到干扰&a…

数据库讲解---(数据更新、视图、数据控制)【MySQL版本】

目录 前言 一.数据更新 1.1插入数据 1.1.1插入单个元组 1.1.2将一个新学生记录(学号:091530,姓名:夏雨,性别:男,籍:海南,出生年份:1999,学院:计算机)插入到学生表中 1.1.3插入子查询结果 1.1.4有一个表“DEPT”(SDEPT CHAR(20),AVG_AGE SMALLINT)表示每个学院的学生的平…

习题4-1 求奇数和

本题要求计算给定的一系列正整数中奇数的和。 输入格式: 输入在一行中给出一系列正整数,其间以空格分隔。当读到零或负整数时,表示输入结束,该数字不要处理。 输出格式: 在一行中输出正整数序列中奇数的和。 输入样例: 8 7 4 3 70 5 6 …

R 格式(蓝桥杯)

文章目录 R 格式【问题描述】高精度乘法高精度加法 R 格式 【问题描述】 小蓝最近在研究一种浮点数的表示方法:R 格式。对于一个大于 0 的浮点数 d,可以用 R 格式的整数来表示。给定一个转换参数 n,将浮点数转换为 R格式整数的做法是&#…

网络安全-自学笔记

一、自学网络安全学习的误区和陷阱 1.不要试图先成为一名程序员(以编程为基础的学习)再开始学习 我在之前的回答中,我都一再强调不要以编程为基础再开始学习网络安全,一般来说,学习编程不但学习周期长,而…

【力扣TOP100热题图解】T1.两数之和

题目链接点这里—— 力扣(LeetCode)​​​​​​ 法一:暴力枚举 最容易想到的方法是枚举数组中的每一个数 x,寻找数组中是否存在 target - x。 当我们使用遍历整个数组的方式寻找 target - x 时,需要注意到每一个位…

【Linux】磁盘管理和文件系统

目录 一、硬盘 1.硬盘结构 2.结构类型 二、MBR与磁盘分区 1.MBR主引导记录 2.磁盘分区结构 三、文件系统类型 四、linux系统添加并使用新硬盘的步骤 1.添加新的硬盘 2.刷新识别 3.进行分区 4.格式化,创建文件系统 5.挂载使用 一、硬盘 1.硬盘结构…