android12 双屏异触配置

平台: RK3399  android12。

客户整机是USB接口的TP且需要双屏异触,方案如下。

双屏异触的修改方法有两种:

1、修改 EventHub.cpp 代码。

2、 配置触摸屏的IDC文件。

这里采取第二次方法。

通过 adb shell dumpsys input 确认触摸屏的PID和VID。补丁如下:

Index: device/rockchip/rk3399/Vendor_32d7_Product_0001.idc
===================================================================
--- device/rockchip/rk3399/Vendor_32d7_Product_0001.idc    (nonexistent)
+++ device/rockchip/rk3399/Vendor_32d7_Product_0001.idc    (revision 2735)
@@ -0,0 +1,12 @@
+# Filename:Vendor_32d7_Product_0001.idc
+# My TouchScreen Device configuration file.
+
+touch.deviceType = touchScreen
+device.internal = 0
+touch.orientationAware = 1
+
+keyboard.layout = Vendor_32d7_Product_0001
+keyboard.orientationAware = 1
+
+cursor.mode = navigation
+cursor.orientationAware = 1
\ No newline at end of file

Property changes on: device/rockchip/rk3399/Vendor_32d7_Product_0001.idc
___________________________________________________________________
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: device/rockchip/rk3399/Vendor_32d7_Product_0002.idc
===================================================================
--- device/rockchip/rk3399/Vendor_32d7_Product_0002.idc    (nonexistent)
+++ device/rockchip/rk3399/Vendor_32d7_Product_0002.idc    (revision 2735)
@@ -0,0 +1,12 @@
+# Filename:Vendor_32d7_Product_0002.idc
+# My TouchScreen Device configuration file.
+
+touch.deviceType = touchScreen
+device.internal = 1
+touch.orientationAware = 1
+
+keyboard.layout = Vendor_32d7_Product_0002
+keyboard.orientationAware = 1
+
+cursor.mode = navigation
+cursor.orientationAware = 1
\ No newline at end of file

Property changes on: device/rockchip/rk3399/Vendor_32d7_Product_0002.idc
___________________________________________________________________
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: device/rockchip/rk3399/device.mk
===================================================================
--- device/rockchip/rk3399/device.mk    (revision 2734)
+++ device/rockchip/rk3399/device.mk    (revision 2735)
@@ -134,6 +134,10 @@
 PRODUCT_COPY_FILES += \
     device/rockchip/rk3399/public.libraries.txt:vendor/etc/public.libraries.txt
 
+PRODUCT_COPY_FILES += \
+    device/rockchip/rk3399/Vendor_32d7_Product_0001.idc:system/usr/idc/Vendor_32d7_Product_0001.idc \
+    device/rockchip/rk3399/Vendor_32d7_Product_0002.idc:system/usr/idc/Vendor_32d7_Product_0002.idc
+    
 #fireware for dp
 PRODUCT_COPY_FILES += \
     $(LOCAL_PATH)/dptx.bin:root/lib/firmware/rockchip/dptx.bin

此方法 是在系统是0度情况下验证是OK的。如果系统默认是270度的即:SF_PRIMARY_DISPLAY_ORIENTATION := 270

副屏也旋转270度,persist.sys.rotation.einit=3

那么需要在IDC文件里面配置屏幕的初始旋转角度。例如:

Index: device/rockchip/rk3399/Vendor_32d7_Product_0001.idc
===================================================================
--- device/rockchip/rk3399/Vendor_32d7_Product_0001.idc    (revision 2736)
+++ device/rockchip/rk3399/Vendor_32d7_Product_0001.idc    (revision 2737)
@@ -4,6 +4,7 @@
 touch.deviceType = touchScreen
 device.internal = 0
 touch.orientationAware = 1
+touch.orientation = ORIENTATION_0
 
 keyboard.layout = Vendor_32d7_Product_0001
 keyboard.orientationAware = 1
Index: device/rockchip/rk3399/Vendor_32d7_Product_0002.idc
===================================================================
--- device/rockchip/rk3399/Vendor_32d7_Product_0002.idc    (revision 2736)
+++ device/rockchip/rk3399/Vendor_32d7_Product_0002.idc    (revision 2737)
@@ -4,6 +4,7 @@
 touch.deviceType = touchScreen
 device.internal = 1
 touch.orientationAware = 1
+touch.orientation = ORIENTATION_270
 
 keyboard.layout = Vendor_32d7_Product_0002
 keyboard.orientationAware = 1

 

IDC文件的解析是在frameworks/native/services/inputflinger/reader/mapper/TouchInputMapper.cpp 文件里面的configureParameters 函数里进行配置。

device.internal

定义:device.internal = 0 | 1

指定输入设备属于内置组件,还是外部连接(很可能可拆卸)的外围设备。

  • 如果值为 0,则该设备为外部设备。

  • 如果值为 1,则该设备为内部设备。

  • 如果未指定该值,则 USB (BUS_USB) 或蓝牙 (BUS_BLUETOOTH) 总线上的所有设备的默认值均为 0,否则,值为 1

touch.orientationAware = 1 确保触摸屏后续能够和显示一起旋转。

IDC文件的具体配置可以参考谷歌文档:https://source.android.google.cn/docs/core/interaction/input/touch-devices?hl=zh-cn


疑问:
因为通过IDC文件来进行区分主副屏的TP,发现通过系统属性SF_PRIMARY_DISPLAY_ORIENTATION来设置主屏幕的旋转角度,那么主屏的touch.orientation 需要一起旋转相同的角度。
副屏是通过 persist.sys.rotation.einit 来设置旋转角度。副屏TP必须 touch.orientation = ORIENTATION_0 ,否则副屏TP 是对不上的。
为什么会存在这种差异?

新需求:
因为客户的整机主副屏存在多种角度的组合。需要一个统一的方法来实现双屏异触。这个目前还没有实现。



 

posted @ 2024-04-11 17:05  simple雨  阅读(126)  评论(0编辑  收藏  举报