当前位置: 首页 > news >正文

RK3288 android7.1 修改双屏异触usb tp触摸方向

一,问题描述:

android机器要求接两个屏(lvds+mipi)两个usb tp要实现双屏异触。由于mipi的方向和lvds方向转成一样的了。两个usb tp的方向在异显示的时候也要作用一样。这个时候要根据pid和vid修改触摸上报的数据。usb tp有通用的触摸驱动/kernel/drivers/hid/hid-multitouch.c
即通过vid pid区分!

二,修改方法:

1. device/rockchip/rk3288/下添加idc文件:
Vendor_222a_Product_0001.idc#*****************************************************
# Input Device Configuration File for the generaltouch touch screen.
#*****************************************************# Basic Parameters
touch.deviceType = touchScreen
touch.orientationAware = 1keyboard.layout = qwerty
keyboard.characterMap = qwerty
keyboard.orientationAware = 1
keyboard.builtIn = 1cursor.mode = navigation
cursor.orientationAware = 1device.internal = 0
Vendor_0457_Product_0819.idc#*****************************************************
# Input Device Configuration File for the generaltouch touch screen.
#*****************************************************# Basic Parameters
touch.deviceType = touchScreen
touch.orientationAware = 1keyboard.layout = qwerty
keyboard.characterMap = qwerty
keyboard.orientationAware = 1
keyboard.builtIn = 1cursor.mode = navigation
cursor.orientationAware = 1device.internal = 1
2. device/rockchip/rk3288/device.mk,拷贝到系统中:
# for usb tp
PRODUCT_COPY_FILES += \device/rockchip/rk3288/Vendor_222a_Product_0001.idc:system/usr/idc/Vendor_222a_Product_0001.idc \device/rockchip/rk3288/Vendor_0457_Product_0819.idc:system/usr/idc/Vendor_0457_Product_0819.idc
3. kernel/drivers/hid/hid-multitouch.c修改驱动:
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);}}

定义宏参数含义:
define MAINmGtpChange_X2Y 1 //为主屏tp的x和y互换宏定义
define MIANmGtp_X_Reverse 1 //为主屏tp的x反向宏定义
define MAINNmGtp_Y_Reverse 0 //为主屏tp的y反向宏定义
define AUXmGtpChange_X2Y 1 //为副屏tp的x和y互换宏定义
define AUXmGtp_X_Reverse 1 //为副屏tp的x反向宏定义
define AUXNmGtp_Y_Reverse 0 //为副屏tp的y反向宏定义


以上修改在rk3288_7.1上实测有效,其他平台可参考修改,整体实现方法类似。

关于idc文件控制触摸屏的属性可参考链接:Android系统 调试usb接口触摸屏问题

相关文章:

RK3288 android7.1 修改双屏异触usb tp触摸方向

一,问题描述: android机器要求接两个屏(lvdsmipi)两个usb tp要实现双屏异触。由于mipi的方向和lvds方向转成一样的了。两个usb tp的方向在异显示的时候也要作用一样。这个时候要根据pid和vid修改触摸上报的数据。usb tp有通用的触…...

软考 系统架构设计师系列知识点之软件架构风格(8)

接前一篇文章:软考 系统架构设计师系列知识点之软件架构风格(7) 这个十一注定是一个不能放松、保持“紧”的十一。由于报名了全国计算机技术与软件专业技术资格(水平)考试,11月4号就要考试,因此…...

ubuntu安装ssh

安装 OpenSSH 服务器(如果尚未安装): apt-get update && apt-get upgrade -y sudo apt-get install -y openssh-server 检查 SSH 服务是否正在运行: sudo service ssh status 如果 SSH 服务未运行,请通过以…...

webpack不同环境下使用CSS分离插件mini-css-extract-plugin

1.背景描述 使用mini-css-extract-plugin插件来打包css文件(从css文件中提取css代码到单独的文件中,对css代码进行代码压缩等)。 本次采用三个配置文件: 公共配置文件:webpack.common.jsdev开发环境配置文件&#x…...

[MongoDB]-权限验证管理

[MongoDB]-权限验证管理 senge | 2023年9月 背景说明:现有两套MongoDB副本集群给开发人员使用时未开启认证。 产生影响:用户若输入账号以及密码则会进行校验,但用户可以在不输入用户名和密码的情况下也可直接登录。 倘若黑客借此进行攻击勒索…...

bootstrapjs开发环境搭建

Bootstrapjs是一个web前端页面应用开发框架,其提供功能丰富的JavaScript工具集以及用户界面元素或组件的样式集,本文主要描述bootstrapjs的开发环境搭建。 如上所示,使用nodejs运行时环境、使用npm包管理工具、使用npm初始化一个项目工程test…...

远程实时监控管理:5G物联网技术助力配电站管理

配电站远程监控管理系统是基于物联网和大数据处理等技术的一种创新解决方案。该系统通过实时监测和巡检配电场所设备的状态、环境情况、安防情况以及火灾消防等信息,实现对配电站的在线实时监控与现场设备数据采集。 配电站远程监控管理系统通过回传数据进行数据系…...

ubuntu 23.04安装中文输入法

使用ubuntu 23.04安装中文输入法,尝试了最新的搜狗,谷歌拼音,fcitx的原始拼音,最终的结果就是使用了谷歌拼音。 搜狗输入法:好用,但是用了没几天发现各种闪退,一打开就闪烁,根本无法…...

java:解析json的几种方式

Java是一种流行的编程语言,它提供了很多实用的库和工具,在处理JSON数据时也不例外。在本文中,我们将介绍Java中如何解析JSON数据。 JSON是一种轻量级的数据交换格式,它已经成为Web应用程序中最流行的数据格式之一。Java提供了许多…...

pytorch_神经网络构建1

文章目录 pytorch简介神经网络基础分类问题分析:逻辑回归模型逻辑回归实现多层神经网络多层网络搭建保存模型 pytorch简介 为什么神经网络要自定义数据类型torch.tensor? tensor可以放在gpu上训练,支持自动求导,方便快速训练,同时支持numpy的运算,是加强版,numpy不支持这些 为…...

Android 多线程并发详解

一,基础概念 1.1什么是CPU 中央处理器(CPU),是电子计算机的主要设备之一,电脑中的核心配件。其功能主要是解释计算机指令以及处理计算机软件中的数据。CPU是计算机中负责读取指令,对指令译码并执行指令的…...

系统架构设计:8 论软件架构风格

目录 一 软件架构风格 1 数据流风格 (1)批处理风格 (2)管道-过滤器风格...

[Elasticsearch] 邻近匹配 (一) - 短语匹配以及slop参数

本文翻译自Elasticsearch官方指南的Proximity Matching一章。 邻近匹配(Proximity Matching) 使用了TF/IDF的标准全文搜索将文档,或者至少文档中的每个字段,视作"一大袋的单词"(Big bag of Words)。match查询能够告诉我们这个袋子中是否包含了…...

Bootstrap中让元素尽可能往父容器的左侧靠近或右侧造近(左浮动和右浮动)

在Bootstrap中,float-left是一个用于浮动元素的CSS类。它的作用是将一个元素向左浮动,使其在父容器内尽可能靠近左侧边缘,同时允许其他元素在其右侧排列。 使用float-left类可以创建多列布局,将元素水平排列在一行上,…...

网络流量安全分析-工作组异常

在网络中,工作组异常分析具有重要意义。以下是网络中工作组异常分析的几个关键点: 检测网络攻击:网络中的工作组异常可能是由恶意活动引起的,如网络攻击、病毒感染、黑客入侵等。通过对工作组异常的监控和分析,可以快…...

Flink之Watermark源码解析

1. WaterMark源码分析 在Flink官网中介绍watermark和数据是异步处理的,通过分析源码得知这个说法不够准确或者说不够详细,这个异步处理要分为两种情况: watermark源头watermark下游 这两种情况的处理方式并不相同,在watermark的源头确实是异步处理的,但是在下游只是做的判断,这…...

基于支持向量机SVM和MLP多层感知神经网络的数据预测matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 一、支持向量机(SVM) 二、多层感知器(MLP) 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 .…...

【微服务】RedisSearch 使用详解

目录 一、RedisJson介绍 1.1 RedisJson是什么 1.2 RedisJson特点 1.3 RedisJson使用场景 1.3.1 数据结构化存储 1.3.2 实时数据分析 1.3.3 事件存储和分析 1.3.4 文档存储和检索 二、当前使用中的问题 2.1 刚性数据库模式限制了敏捷性 2.2 基于磁盘的文档存储导致瓶…...

第三章 栈、队列和数组

第三章 栈、队列、数组 栈栈的基本概念栈的顺序实现栈的链接实现栈的简单应用和递归 队列队列的基本概念队列的顺序实现队列的链接实现 数组数组的逻辑结构和基本运算数组的存储结构矩阵的压缩存储 小试牛刀 栈和队列可以看作是特殊的线性表,是运算受限的线性表 栈 …...

使用GitLab CI/CD 定时运行Playwright自动化测试用例

创建项目并上传到GitLab npm init playwright@latest test-playwright # 一路enter cd test-playwright # 运行测试用例 npx playwright test常用指令 # Runs the end-to-end tests. npx playwright test# Starts the interactive UI mode. npx playwright...

EMD过时了?从故障诊断实战看经验小波变换(EWT)的三大优势

EMD过时了?从故障诊断实战看经验小波变换(EWT)的三大优势 在工业设备状态监测领域,振动信号分析一直是故障诊断的黄金标准。传统方法如经验模态分解(EMD)曾因其自适应特性广受推崇,但工程师们逐渐发现它在处理轴承点蚀、齿轮断齿等典型故障时…...

折叠表达式:左折叠,右折叠

关于何为左右折叠表达式可以直接通过 C Insights (C Insights) 来进行查看原理。左折叠template <typename... Args> auto getSum(Args... args) {return (args ...); }int main() {getSum(1, 2, 3, 4, 5); } template <typename... Args> auto getSum(Args... ar…...

用RP2350微控制器实现《黑客帝国》数字雨:嵌入式图形系统实战

1. 项目概述与核心价值如果你和我一样&#xff0c;对《黑客帝国》里那些从屏幕顶端倾泻而下的绿色字符雨有着难以言喻的情结&#xff0c;同时又是个喜欢动手鼓捣硬件的开发者&#xff0c;那么这个项目绝对能让你兴奋起来。它不是一个简单的屏幕保护程序&#xff0c;而是一个完整…...

FPGA静态侧信道攻击防御与传感器绕过技术解析

1. FPGA安全防御机制与静态侧信道攻击概述在现代数字安全领域&#xff0c;现场可编程门阵列(FPGA)因其可重构性和高性能特性&#xff0c;已成为加密加速、信号处理等关键应用的核心组件。然而&#xff0c;FPGA面临的物理安全威胁与日俱增&#xff0c;特别是针对硬件的侧信道攻击…...

用Python和nilmtk库,5分钟上手非侵入式用电分析(附实战代码)

用Python和nilmtk库&#xff0c;5分钟上手非侵入式用电分析&#xff08;附实战代码&#xff09; 当你站在电表前&#xff0c;看着那个不断跳动的数字&#xff0c;是否好奇过家里每台电器究竟消耗了多少电能&#xff1f;传统方法需要在每个电器上安装传感器&#xff0c;既麻烦又…...

告别点点点!用Ranorex Studio录制你的第一个计算器自动化测试(附详细截图)

从零开始&#xff1a;用Ranorex Studio实现计算器自动化测试的完整指南 第一次接触自动化测试时&#xff0c;那种既期待又忐忑的心情我至今记忆犹新。作为一位长期被重复性手工测试困扰的QA工程师&#xff0c;每天面对相同的测试用例&#xff0c;点击相同的按钮&#xff0c;验证…...

RAG优化秘籍:为何“检索系统”才是关键?掌握这三大核心,效果飙升!

本文深入探讨了RAG&#xff08;检索增强生成&#xff09;系统中被忽视的“检索系统”对整体效果的决定性影响。核心内容围绕三种主流检索方式&#xff08;向量检索、关键词检索、混合检索&#xff09;展开&#xff0c;重点解析了混合检索的必要性和具体架构&#xff0c;同时强调…...

【NotebookLM+IEA/IRENA数据融合实战】:72小时内完成新型储能技术竞争力评估

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;NotebookLM能源技术研究 NotebookLM 是 Google 推出的基于 AI 的研究协作者工具&#xff0c;其核心能力在于对用户上传的文档进行语义理解与上下文驱动的问答。在能源技术研究领域&#xff0c;NotebookLM 可显…...

Projects-from-Scratch学习路径:如何系统性地掌握Web开发全栈技术

Projects-from-Scratch学习路径&#xff1a;如何系统性地掌握Web开发全栈技术 【免费下载链接】Projects-from-Scratch Read and do projects. 项目地址: https://gitcode.com/gh_mirrors/pr/Projects-from-Scratch Projects-from-Scratch是一个精心策划的开源项目列表&…...

八大网盘直链解析工具:高效跨平台文件下载全攻略

八大网盘直链解析工具&#xff1a;高效跨平台文件下载全攻略 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 &#xff0c;支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼云盘 …...