平臺(tái):RK3399
Android 10.0
Android系統(tǒng)對(duì)于USB捣卤,藍(lán)牙接口的觸摸設(shè)備默認(rèn)判斷為外接設(shè)備,外接設(shè)備默認(rèn)操控的是副屏捶索,在雙屏異顯情況下就會(huì)發(fā)現(xiàn)只能點(diǎn)擊到副屏插掂,判斷條件如下:
frameworks/native/services/inputflinger/EventHub.cpp
status_t EventHub::openDeviceLocked(const char* devicePath) {
...
// Determine whether the device is external or internal.判斷是否為外接設(shè)備,如果是加入外接設(shè)備標(biāo)識(shí)
if (isExternalDeviceLocked(device)) {
device->classes |= INPUT_DEVICE_CLASS_EXTERNAL;
}
...
}
一種改法是不管是判斷條件是否通過(guò)都不加入這個(gè)標(biāo)識(shí),即注釋掉 device->classes |= INPUT_DEVICE_CLASS_EXTERNAL 辅甥,這種方法可以保證主屏一直能正常觸控酝润,但是副屏如果再接觸摸就無(wú)法正常觸控
查看判斷方法:
frameworks/native/services/inputflinger/EventHub.cpp
bool EventHub::isExternalDeviceLocked(Device* device) {
if (device->configuration) {
bool value;
if (device->configuration->tryGetProperty(String8("device.internal"), value)) {
return !value;
}
}
return device->identifier.bus == BUS_USB || device->identifier.bus == BUS_BLUETOOTH; 設(shè)備標(biāo)識(shí)符未USB或藍(lán)牙設(shè)備返回true 即外接設(shè)備
}
此處發(fā)現(xiàn)除了設(shè)備標(biāo)識(shí)符還可以通過(guò)device.internal屬性來(lái)控制是否為外接設(shè)備,查詢資料知道璃弄,這個(gè)屬性是輸入設(shè)備配置文件(.idc)文件里面的屬性要销。
1.idc是什么?
idc 是Input Device Configuration的縮寫(xiě)夏块,輸入設(shè)備配置文件(.idc 文件)包含特定設(shè)備的配置屬性疏咐,這些屬性會(huì)影響輸入設(shè)備的行為。
輸入設(shè)備配置文件通常并非標(biāo)準(zhǔn)外圍設(shè)備(例如 HID 鍵盤(pán)和鼠標(biāo))所必需的脐供,因?yàn)槟J(rèn)的系統(tǒng)行為通郴肴可確保它們即插即用。另一方面患民,內(nèi)置的嵌入式設(shè)備(尤其是觸摸屏)幾乎總是需要輸入設(shè)備配置文件來(lái)指定其行為缩举。
2.idc位置按順序查閱以下路徑。
/odm/usr/idc/Vendor_XXXX_Product_XXXX_Version_XXXX.idc
/vendor/usr/idc/Vendor_XXXX_Product_XXXX_Version_XXXX.idc
/system/usr/idc/Vendor_XXXX_Product_XXXX_Version_XXXX.idc
/data/system/devices/idc/Vendor_XXXX_Product_XXXX_Version_XXXX.idc
/odm/usr/idc/Vendor_XXXX_Product_XXXX.idc
/vendor/usr/idc/Vendor_XXXX_Product_XXXX.idc
/system/usr/idc/Vendor_XXXX_Product_XXXX.idc
/data/system/devices/idc/Vendor_XXXX_Product_XXXX.idc
/odm/usr/idc/device-name.idc
/vendor/usr/idc/device-name.idc
/system/usr/idc/device-name.idc
/data/system/devices/idc/device-name.idc
當(dāng)構(gòu)建包含設(shè)備名稱的文件路徑時(shí)匹颤,設(shè)備名稱中除“0-9”仅孩、“a-z”、“A-Z”印蓖、“-”或“”之外的所有字符將替換為“”辽慕。
3.idc文件常用配置屬性
#=0 外部設(shè)備 =1內(nèi)部設(shè)備
device.internal = 0
#定義:keyboard.layout = <name>
#指定與輸入設(shè)備關(guān)聯(lián)的鍵布局文件的名稱,不包括.kl擴(kuò)展名赦肃。 如果找不到此文件溅蛉,輸入系統(tǒng)將使用默認(rèn)鍵布局。
keyboard.layout = qwerty
#定義:keyboard.characterMap = <name>
#指定與輸入設(shè)備關(guān)聯(lián)的鍵字符映射文件的名稱他宛,不包括.kcm擴(kuò)展名船侧。 如果找不到此文件,輸入系統(tǒng)將使用默認(rèn)的鍵字符映射厅各。
#在查找期間镜撩,名稱中的空格將轉(zhuǎn)換為下劃線。
keyboard.characterMap = qwerty
#定義:keyboard.orientationAware = 0 |1
#指定鍵盤(pán)是否應(yīng)對(duì)顯示方向更改做出反應(yīng)队塘。
#如果值為1袁梗,則在關(guān)聯(lián)的顯示方向改變時(shí)旋轉(zhuǎn)方向鍵盤(pán)鍵。
#如果值為0憔古,則鍵盤(pán)不受顯示方向更改的影響遮怜。
#默認(rèn)值為0。
#方向感知用于支持方向鍵盤(pán)鍵的旋轉(zhuǎn)鸿市,例如Motorola Droid上的旋轉(zhuǎn)锯梁。 例如即碗,當(dāng)設(shè)備從其自然方向順時(shí)針旋轉(zhuǎn)90度時(shí),
#KEYCODE_DPAD_UP被重新映射以產(chǎn)生KEYCODE_DPAD_RIGHT涝桅,因?yàn)楫?dāng)設(shè)備保持在該方向時(shí)拜姿,“向上”鍵最終指向“右”。
keyboard.orientationAware = 1
#定義:keyboard.builtIn = 0 |1
#指定鍵盤(pán)是否為內(nèi)置(物理連接)鍵盤(pán)冯遂。
#如果設(shè)備名稱以-keypad結(jié)尾蕊肥,則默認(rèn)值為1,否則為0蛤肌。
#內(nèi)置鍵盤(pán)的設(shè)備ID始終為0.其他非內(nèi)置鍵盤(pán)將分配唯一的非零設(shè)備ID壁却。
#對(duì)于內(nèi)置鍵盤(pán)使用id為0對(duì)于保持與KeyCharacterMap.BUILT_IN_KEYBOARD字段的兼容性非常重要,該字段指定內(nèi)置鍵盤(pán)的id并且值為0.
#此字段已在API中棄用但較舊 應(yīng)用程序可能仍在使用它裸准。
#無(wú)論此屬性的設(shè)置如何展东,特殊功能鍵盤(pán)(其鍵字符映射指定SPECIAL_FUNCTION的類型)將永遠(yuǎn)不會(huì)注冊(cè)為內(nèi)置鍵盤(pán)。
#這是因?yàn)楦鶕?jù)定義炒俱,特殊功能鍵盤(pán)不打算用于通用鍵入盐肃。
keyboard.builtIn = 1
4.idc代碼流程
Eventhub在打開(kāi)設(shè)備時(shí)會(huì)讀取設(shè)備的idc文件
->Eventhub.openDeviceLocked->loadConfigurationLocked
void EventHub::loadConfigurationLocked(Device* device) {
device->configurationFile = getInputDeviceConfigurationFilePathByDeviceIdentifier(
device->identifier, INPUT_DEVICE_CONFIGURATION_FILE_TYPE_CONFIGURATION);
if (device->configurationFile.isEmpty()) {
ALOGD("No input device configuration file found for device '%s'.",
device->identifier.name.string());
} else {
status_t status = PropertyMap::load(device->configurationFile,
&device->configuration);
if (status) {
ALOGE("Error loading input device configuration file for device '%s'. "
"Using default configuration.",
device->identifier.name.string());
}
}
}
綜上可知,我們需要添加idc文件來(lái)控制觸摸屏的屬性
添加方法:
1.獲取輸入設(shè)備的vendorID和productId:dumpsys input 即可列出系統(tǒng)目前所有的輸入設(shè)備的信息权悟,得到以下信息砸王,
********** Touch
Classes: 0x00000014
Path: /dev/input/event3
Enabled: true
Descriptor: 7836b2735840690ea51fda95d6119dfc7eed5e9c
Location: usb-fe3e0000.usb-1/input0
ControllerNumber: 0
UniqueId:
Identifier: bus=0x0003, vendor=0x1fd2, product=0x0201, version=0x0111
KeyLayoutFile:
KeyCharacterMapFile:
ConfigurationFile: /vendor/usr/idc/Vendor_1fd2_Product_0201.idc
HaveKeyboardLayoutOverlay: false
VideoDevice: <none>
2.編寫(xiě)idc文件
Vendor_1fd2_Product_0201.idc
# Filename:Vendor_1fd2_Product_0201.idc
# My TouchScreen Device configuration file.
#add by zhouxw
touch.deviceType = touchScreen
device.internal = 1
touch.orientationAware = 1
keyboard.layout = Vendor_1fd2_Product_0201
keyboard.orientationAware = 1
cursor.mode = navigation
cursor.orientationAware = 1
3.mk文件中將idc文件拷貝到/vendor/usr/idc/ 目錄
PRODUCT_COPY_FILES += \
$(LOCAL_PATH)/keylayout/Vendor_1fd2_Product_0201.idc:vendor/usr/idc/Vendor_1fd2_Product_0201.idc
編譯系統(tǒng)固件升級(jí),觸摸屏即能正常操控主屏了
第二部分:
在進(jìn)行屏幕旋轉(zhuǎn)以后峦阁,觸摸的坐標(biāo)并沒(méi)有跟著屏幕旋轉(zhuǎn)導(dǎo)致觸摸的position存在問(wèn)題谦铃。
修改如下:
diff --git a/frameworks/native/services/inputflinger/InputReader.cpp b/frameworks/native/services/inputflinger/InputReader.cpp
index c541d3e..dcc1ac7 100755
--- a/frameworks/native/services/inputflinger/InputReader.cpp
+++ b/frameworks/native/services/inputflinger/InputReader.cpp
@@ -3837,6 +3837,27 @@ 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);
+ if (cmpRet == 0)
+ {
+ mViewport.orientation = DISPLAY_ORIENTATION_0;
+ }
+ else if(cmpRet == 90)
+ {
+ mViewport.orientation = DISPLAY_ORIENTATION_90;
+ }
+ else if(cmpRet == 180)
+ {
+ mViewport.orientation = DISPLAY_ORIENTATION_180;
+ }
+ else if(cmpRet == 270)
+ {
+ mViewport.orientation = DISPLAY_ORIENTATION_270;
+ }
if (mDeviceMode == DEVICE_MODE_DIRECT || mDeviceMode == DEVICE_MODE_POINTER) {
// Convert rotated viewport to natural surface coordinates.
添加系統(tǒng)屬性,然后根據(jù)系統(tǒng)屬性對(duì)觸摸方向進(jìn)行旋轉(zhuǎn)榔昔。