修改USB觸摸屏為內(nèi)置觸摸

平臺(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)榔昔。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末驹闰,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子撒会,更是在濱河造成了極大的恐慌嘹朗,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件诵肛,死亡現(xiàn)場(chǎng)離奇詭異屹培,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)曾掂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)惫谤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)壁顶,“玉大人珠洗,你說(shuō)我怎么就攤上這事∪糇ǎ” “怎么了许蓖?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我膊爪,道長(zhǎng)自阱,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任米酬,我火速辦了婚禮沛豌,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘赃额。我一直安慰自己加派,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布跳芳。 她就那樣靜靜地躺著芍锦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪飞盆。 梳的紋絲不亂的頭發(fā)上娄琉,一...
    開(kāi)封第一講書(shū)人閱讀 49,144評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音吓歇,去河邊找鬼孽水。 笑死,一個(gè)胖子當(dāng)著我的面吹牛照瘾,可吹牛的內(nèi)容都是我干的匈棘。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼析命,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼主卫!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起鹃愤,我...
    開(kāi)封第一講書(shū)人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤簇搅,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后软吐,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體瘩将,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年凹耙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了姿现。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡肖抱,死狀恐怖备典,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情意述,我是刑警寧澤提佣,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布吮蛹,位于F島的核電站,受9級(jí)特大地震影響拌屏,放射性物質(zhì)發(fā)生泄漏潮针。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一倚喂、第九天 我趴在偏房一處隱蔽的房頂上張望每篷。 院中可真熱鬧,春花似錦端圈、人聲如沸雳攘。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)吨灭。三九已至,卻和暖如春刑巧,著一層夾襖步出監(jiān)牢的瞬間喧兄,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工啊楚, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留吠冤,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓恭理,卻偏偏與公主長(zhǎng)得像拯辙,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子颜价,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容