Android システムの USB インターフェイスのタッチ スクリーンの問題のデバッグ

Android システムのデフォルトでは、USB および Bluetooth インターフェイスを備えたタッチ デバイスが外部デバイスとして設定されており、外部デバイスはデフォルトでセカンダリ スクリーンを制御します。異なるディスプレイを備えたデュアル スクリーンの場合は、セカンダリ スクリーンをクリックすることしかできません。


1. 判定条件と判定方法

1. 判定条件

フレームワーク/ネイティブ/サービス/inputflinger/EventHub.cpp

status_t EventHub::openDeviceLocked(const char* devicePath) {
    
    
...
// Determine whether the device is external or internal.判断是否为外接设备,如果是加入外接设备标识
    if (isExternalDeviceLocked(device)) {
    
    
        device->classes |= INPUT_DEVICE_CLASS_EXTERNAL;
    }
    ...
    }

判定条件の合否に関わらずこのマークを付けない、
つまりコメントアウトするdevice->classes |= INPUT_DEVICE_CLASS_EXTERNAL 方法もあり、メイン画面は常に正常にタッチできますが、サブ画面をタッチすると正常にタッチできなくなります。また。

2. 判定方法を確認する

フレームワーク/ネイティブ/サービス/inputflinger/EventHub.cpp

bool EventHub::isExternalDeviceLocked(Device* device) {
    
    
    if (device->configuration) {
    
    
        bool value;
        if (device->configuration->tryGetProperty(String8("device.internal"), value)) {
    
    
            return !value;
        }
    }
    //设备标识符未USB或蓝牙设备返回true 即外接设备
    return device->identifier.bus == BUS_USB || device->identifier.bus == BUS_BLUETOOTH; 
}

ここでは、デバイス識別子に加えて、入力デバイス構成ファイル (.idc) ファイル内のdevice.internal属性を使用して、それが外部デバイスであるかどうかを制御できることがわかります。


2、IDC

1.idcとは何ですか?

idc は、Input Device Configuration の略語です。入力デバイス構成ファイル (.idc ファイル) には、入力デバイスの動作に影響を与える特定のデバイスの構成プロパティが含まれています。
HID キーボードやマウスなどの標準周辺機器は、通常、デフォルトのシステム動作によってプラグ アンド プレイであることが保証されているため、入力デバイス プロファイルは通常必要ありません。一方、
組み込みの組み込みデバイス (特にタッチ スクリーン) では、ほとんどの場合、その動作を指定するために入力デバイス構成ファイルが必要です。

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/
デバイス名.idc /system/ usr/idc/デバイス名.idc
/ data/system/devices/idc/デバイス名.idc

デバイス名を含むファイル パスを構築する場合、デバイス名の「0-9」、「az」、「AZ」、「-」、「 」を除くすべての文字は「 」に置き換えられます

3. idc ファイルの共通構成属性

# 0 外部设备,1 内部设备
# 触摸唤醒参数,当设置为0时,系统休眠点击触摸屏可以唤醒,1则反之。
device.internal = 0

# 定义:keyboard.layout = <name>
# 指定与设备关联的键布局文件名称,不包含.kl扩展名。如果找不到此文件,输入系统将使用默认键布局。
keyboard.layout = qwerty

# 定义:keyboard.characterMap = <name>
# 指定与输入设备关联的键字符映射文件的名称,不包括.kcm扩展名。 如果找不到此文件,输入系统将使用默认的键字符映射。在查找期间,名称中的空格将转换为下划线。
keyboard.characterMap = qwerty

#定义:keyboard.orientationAware = 0 |1
#指定键盘是否应对显示方向更改做出反应,如果值为1,则在关联的显示方向改变时旋转方向键盘键,如果值为0,则键盘不受显示方向更改的影响。默认值为0。
#方向感知用于支持方向键盘键的旋转,例如Motorola Droid上的旋转。 例如,当设备从其自然方向顺时针旋转90度时,KEYCODE_DPAD_UP被重新映射以产生KEYCODE_DPAD_RIGHT,因为当设备保持在该方向时,“向上”键最终指向“右”。
keyboard.orientationAware = 1

#定义:keyboard.builtIn = 0 |1
#指定键盘是否为内置(物理连接)键盘,如果设备名称以-keypad结尾,则默认值为1,否则为0。
#内置键盘的设备ID始终为0.其他非内置键盘将分配唯一的非零设备ID。
#对于内置键盘使用id为0对于保持与KeyCharacterMap.BUILT_IN_KEYBOARD字段的兼容性非常重要,该字段指定内置键盘的id并且值为0.此字段已在API中弃用但较旧 应用程序可能仍在使用它。无论此属性的设置如何,特殊功能键盘(其键字符映射指定SPECIAL_FUNCTION的类型)将永远不会注册为内置键盘。
keyboard.builtIn = 1

4.idcコード処理

Eventhub は、デバイスを開くときにデバイスの 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 ファイルを追加する必要があります。


3 番目に、メソッドを追加します。

1. 入力デバイスのvendorIDとproductIDを取得します。

adb shell dumpsys input //システム内のすべての現在の入力デバイスに関する情報をリストします
3: ILITEK ILITEK-TP
クラス: 0x00000014
パス: /dev/input/event0
有効: true
記述子: f1b4838838e240568fcbdd50c0f63be308c623ef
場所: usb-ff500000.usb-1.3/in置く0
コントローラー番号: 0
UniqueId:
識別子: バス = 0x0003、ベンダー = 0x222a、製品 = 0x0001、バージョン = 0x0110
KeyLayoutFile:
KeyCharacterMapFile:
ConfigurationFile:
HaveKeyboardLayoutOverlay: false

2.idcファイルの書き込み

Vendor_222a_Product_0001.idc

# Filename:Vendor_222a_Product_0001.idc
# My TouchScreen Device configuration file.

touch.deviceType = touchScreen
device.internal = 1
touch.orientationAware = 1

keyboard.layout = Vendor_222a_Product_0001
keyboard.orientationAware = 1

cursor.mode = navigation
cursor.orientationAware = 1

3. mk ファイル内の idc ファイルをシステムの /vendor/usr/idc/ (/system/usr/idc/) ディレクトリにコピーします。

PRODUCT_COPY_FILES += \
    $(LOCAL_PATH)/Vendor_222a_Product_0001.idc:vendor/usr/idc/Vendor_222a_Product_0001.idc

システムファームウェアのアップグレードをコンパイルした後、タッチスクリーンはメイン画面を正常に制御できるようになります。

注: (idc ファイル) を変更してもタッチがウェイクアップできない場合は、次の変更を試すことができます。

フレームワーク/ネイティブ/サービス/inputflinger/InputReader.cpp

   // Initial downs on external touch devices should wake the device.
   // Normally we don't do this for internal touch screens to prevent them from waking
   // up in your pocket but you can enable it using the input device configuration.
-    mParameters.wake = getDevice()->isExternal();
+   mParameters.wake = true;
   getDevice()->getConfiguration().tryGetProperty(String8("touch.wake"),
            mParameters.wake);

おすすめ

転載: blog.csdn.net/weixin_45639314/article/details/133030736