USB TP随系统一起旋转

前言:

android12 RK平台,有一个USB接口的TP需要随着系统一起旋转。

参考:

https://blog.csdn.net/SHH_1064994894/article/details/132576404

解决方法:

通过自定义一个系统属性persist.sys.usbtp.rotation 来存储TP旋转方向,修改framework 的input相关文件,补丁如下:

Index: base/services/core/java/com/android/server/wm/DisplayRotation.java
===================================================================
--- base/services/core/java/com/android/server/wm/DisplayRotation.java	(revision 2519)
+++ base/services/core/java/com/android/server/wm/DisplayRotation.java	(working copy)
@@ -1136,7 +1136,12 @@
         if (isFixedToUserRotation()) {
             return mUserRotation;
         }
-
+		
+		// ---add start asw 
+		Slog.d(TAG,"ASW rotationForOrientation mUserRotation = " + mUserRotation);
+		SystemProperties.set("persist.sys.usbtp.rotation", ""+mUserRotation);
+		// ---add end asw 
+		
         int sensorRotation = mOrientationListener != null
                 ? mOrientationListener.getProposedRotation() // may be -1
                 : -1;
Index: native/services/inputflinger/reader/mapper/TouchInputMapper.cpp
===================================================================
--- native/services/inputflinger/reader/mapper/TouchInputMapper.cpp	(revision 2519)
+++ native/services/inputflinger/reader/mapper/TouchInputMapper.cpp	(working copy)
@@ -25,6 +25,7 @@
 #include "CursorScrollAccumulator.h"
 #include "TouchButtonAccumulator.h"
 #include "TouchCursorInputMapperCommon.h"
+#include <cutils/properties.h>
 
 namespace android {
 
@@ -674,6 +675,12 @@
     // Raw width and height in the natural orientation.
     int32_t rawWidth = mRawPointerAxes.getRawWidth();
     int32_t rawHeight = mRawPointerAxes.getRawHeight();
+	
+	// ---add start asw 
+    char rotationvalue[PROPERTY_VALUE_MAX] = "";;
+    property_get("persist.sys.usbtp.rotation", rotationvalue, "0");
+    int rotation = atoi(rotationvalue);
+	// ---add end asw                      
 
     bool viewportChanged = mViewport != *newViewport;
     bool skipViewportUpdate = false;
@@ -691,9 +698,36 @@
             // Apply the inverse of the input device orientation so that the surface is configured
             // in the same orientation as the device. The input device orientation will be
             // re-applied to mSurfaceOrientation.
-            const int32_t naturalSurfaceOrientation =
-                    (mViewport.orientation - static_cast<int32_t>(mParameters.orientation) + 4) % 4;
-            switch (naturalSurfaceOrientation) {
+            
+			// const int32_t naturalSurfaceOrientation =
+                    // (mViewport.orientation - static_cast<int32_t>(mParameters.orientation) + 4) % 4;
+            // switch (naturalSurfaceOrientation) {
+			// ---add start asw 
+			int currentrotation = DISPLAY_ORIENTATION_0;
+            switch (rotation) {
+                case 0:
+                    currentrotation = DISPLAY_ORIENTATION_0;
+                    break;
+                case 90:
+                    currentrotation = DISPLAY_ORIENTATION_90;
+                    break;
+                case 180:
+                    currentrotation = DISPLAY_ORIENTATION_180;
+                    break;
+                case 270:
+                    currentrotation = DISPLAY_ORIENTATION_270;
+                    break;
+                default:
+                    break;
+            }
+
+           if(currentrotation == DISPLAY_ORIENTATION_0 && mViewport.orientation != currentrotation){
+                   rotation = mViewport.orientation;
+                   currentrotation = mViewport.orientation;
+           }
+           
+           switch (currentrotation) {
+           // ---add end asw    
                 case DISPLAY_ORIENTATION_90:
                     naturalLogicalWidth = mViewport.logicalBottom - mViewport.logicalTop;
                     naturalLogicalHeight = mViewport.logicalRight - mViewport.logicalLeft;
@@ -793,7 +827,27 @@
             mSurfaceOrientation = DISPLAY_ORIENTATION_0;
         }
     }
-
+	
+	// ---add start asw 
+    ALOGI("Primary Display Orientation is set to rotation %2d.", rotation);
+    switch (rotation) {
+       case 0:
+               mSurfaceOrientation = DISPLAY_ORIENTATION_0;
+               break;
+       case 1:
+               mSurfaceOrientation = DISPLAY_ORIENTATION_90;
+               break;
+       case 2:
+               mSurfaceOrientation = DISPLAY_ORIENTATION_180;
+               break;
+       case 3:
+               mSurfaceOrientation = DISPLAY_ORIENTATION_270;
+               break;
+       default:
+               break;
+    }
+	// ---add end asw 
+	
     // If moving between pointer modes, need to reset some state.
     bool deviceModeChanged = mDeviceMode != oldDeviceMode;
     if (deviceModeChanged) {
Index: native/services/surfaceflinger/SurfaceFlinger.cpp
===================================================================
--- native/services/surfaceflinger/SurfaceFlinger.cpp	(revision 2519)
+++ native/services/surfaceflinger/SurfaceFlinger.cpp	(working copy)
@@ -2637,7 +2637,30 @@
         if (!info) {
             continue;
         }
-
+        
+		// ---add start asw 
+        char rotationvalue[PROPERTY_VALUE_MAX] = "";;
+        property_get("persist.sys.usbtp.rotation", rotationvalue, "-1");
+        int rotation = atoi(rotationvalue);
+        ALOGI("Primary Display Orientation is set to rotation %2d.", rotation);
+        switch (rotation) {
+           case 0:
+                internalDisplayOrientation = ui::ROTATION_0;
+                break;
+           case 1:
+                internalDisplayOrientation = ui::ROTATION_90;
+                break;
+           case 2:
+                internalDisplayOrientation = ui::ROTATION_180;
+                break;
+           case 3:
+                internalDisplayOrientation = ui::ROTATION_270;
+                break;
+           default:
+                break;
+        }
+		// ---add end asw  
+		
         const auto displayId = info->id;
         const auto it = mPhysicalDisplayTokens.find(displayId);
 

 在device.mk下自定义persist.sys.usbtp.rotation属性。

修改完成之后,TP触摸屏能随着系统一起旋转了,但是TP触摸屏有一部分触摸失效。可能是这个TP固件没有适配,需要找TP原厂适配。

 

posted @ 2024-02-20 14:37  simple雨  阅读(54)  评论(0编辑  收藏  举报