Android USB TP方向修改

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

cpp 复制代码
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

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.
相关推荐
帅次2 分钟前
Android CoordinatorLayout:打造高效交互界面的利器
android·gradle·android studio·rxjava·android jetpack·androidx·appcompat
SafePloy安策1 小时前
ES信息防泄漏:策略与实践
大数据·elasticsearch·开源
枯骨成佛1 小时前
Android中Crash Debug技巧
android
学术搬运工1 小时前
【珠海科技学院主办,暨南大学协办 | IEEE出版 | EI检索稳定 】2024年健康大数据与智能医疗国际会议(ICHIH 2024)
大数据·图像处理·人工智能·科技·机器学习·自然语言处理
涔溪1 小时前
Ecmascript(ES)标准
前端·elasticsearch·ecmascript
Matrix702 小时前
HBase理论_背景特点及数据单元及与Hive对比
大数据·数据库·hbase
B站计算机毕业设计超人3 小时前
计算机毕业设计Python+大模型农产品价格预测 ARIMA自回归模型 农产品可视化 农产品爬虫 机器学习 深度学习 大数据毕业设计 Django Flask
大数据·爬虫·python·深度学习·机器学习·课程设计·数据可视化
Carl_奕然4 小时前
【大数据算法】MapReduce算法概述之:MapReduce基础模型
大数据·算法·mapreduce
csdn5659738504 小时前
Elasticsearch 重建索引 数据迁移
elasticsearch·数据迁移·重建索引
天幕繁星4 小时前
docker desktop es windows解决vm.max_map_count [65530] is too low 问题
windows·elasticsearch·docker·docker desktop