Как я исправляю эту mismapped кнопку стилуса?

Я выполняю Kubuntu 15.10 на HP Spectre x360, который имеет non-Wacom активный цифровой преобразователь, встроенный в дисплей. Я использую стилус с двумя кнопками с этим, но вторая кнопка не работает. Я не мог добраться xinput показать любое изменение состояния при нажатии кнопки; это кажется X, не видят его вообще. evtest действительно видит событие, но оно сообщает о кнопке как BTN_TOOL_RUBBER вместо соответствующего BTN_STYLUS2:

Input driver version is 1.0.1
Input device ID: bus 0x3 vendor 0x4f3 product 0x2073 version 0x110
Input device name: "ELAN Touchscreen Pen"
Supported events:
  Event type 0 (EV_SYN)
  Event type 1 (EV_KEY)
    Event code 256 (BTN_0)
    Event code 320 (BTN_TOOL_PEN)
    Event code 321 (BTN_TOOL_RUBBER)
    Event code 330 (BTN_TOUCH)
    Event code 331 (BTN_STYLUS)
  Event type 3 (EV_ABS)
    Event code 0 (ABS_X)
      Value  23080
      Min        0
      Max    32256
      Resolution     110
    Event code 1 (ABS_Y)
      Value  10408
      Min        0
      Max    17920
      Resolution     108
    Event code 24 (ABS_PRESSURE)
      Value      0
      Min        0
      Max      255
  Event type 4 (EV_MSC)
    Event code 4 (MSC_SCAN)
Properties:
Testing ... (interrupt to exit)
Event: time 1453608432.242049, type 1 (EV_KEY), code 321 (BTN_TOOL_RUBBER), value 1
Event: time 1453608432.242049, -------------- SYN_REPORT ------------

Стилус не имеет никакой подсказки по средству стирания. input-kbd дает мне scancodes и показывает ту же проблему:

/dev/input/event8
   bustype : BUS_USB
   vendor  : 0x4f3
   product : 0x2073
   version : 272
   name    : "ELAN Touchscreen Pen"
   phys    : "usb-0000:00:14.0-4/input0"
   uniq    : ""
   bits ev : EV_SYN EV_KEY EV_ABS EV_MSC

map: 15 keys, size: 294/320
0xd0032 = 320  # BTN_TOOL_PEN
0xd0042 = 330  # BTN_TOUCH
0xd0044 = 331  # BTN_STYLUS
0xd003c = 321  # BTN_TOOL_RUBBER
0xd0045 = 256  # BTN_0
0xd0042 = 330  # BTN_TOUCH
0xd0042 = 330  # BTN_TOUCH
0xd0042 = 330  # BTN_TOUCH
0xd0042 = 330  # BTN_TOUCH
0xd0042 = 330  # BTN_TOUCH
0xd0042 = 330  # BTN_TOUCH
0xd0042 = 330  # BTN_TOUCH
0xd0042 = 330  # BTN_TOUCH
0xd0042 = 330  # BTN_TOUCH
0xd0042 = 330  # BTN_TOUCH

Попытка использовать input-kbd присваивать новую карту дает "scancode из диапазона" ошибка. Простое setkeycodes d003c 332 также не работает (ошибка клавиатуры USB).

Обновление: я попытался фиксировать это через udev путем добавления пользовательского hwdb файла к/etc/udev/hwdb.d, но это, кажется, не имеет эффекта.

$ cat /etc/udev/hwdb.d/61-touchscreen-quirks.hwdb 
evdev:input:b0003v04f3p2073e0110*   # Matches ELAN Touchscreen devices
 KEYBOARD_KEY_d003c=14c             # Reassigns scancode from BTN_TOOL_RUBBER to BTN_STYLUS2

$ sudo udevadm --debug hwdb --update
calling: hwdb
reading file '/lib/udev/hwdb.d/20-OUI.hwdb'
reading file '/lib/udev/hwdb.d/20-acpi-vendor.hwdb'
reading file '/lib/udev/hwdb.d/20-bluetooth-vendor-product.hwdb'
reading file '/lib/udev/hwdb.d/20-libgphoto2-6.hwdb'
reading file '/lib/udev/hwdb.d/20-net-ifname.hwdb'
reading file '/lib/udev/hwdb.d/20-pci-classes.hwdb'
reading file '/lib/udev/hwdb.d/20-pci-vendor-model.hwdb'
reading file '/lib/udev/hwdb.d/20-sdio-classes.hwdb'
reading file '/lib/udev/hwdb.d/20-sdio-vendor-model.hwdb'
reading file '/lib/udev/hwdb.d/20-usb-classes.hwdb'
reading file '/lib/udev/hwdb.d/20-usb-media-players.hwdb'
reading file '/lib/udev/hwdb.d/20-usb-vendor-model.hwdb'
reading file '/lib/udev/hwdb.d/60-evdev.hwdb'
reading file '/lib/udev/hwdb.d/60-keyboard.hwdb'
reading file '/etc/udev/hwdb.d/61-touchscreen-quirks.hwdb'
reading file '/lib/udev/hwdb.d/69-libmtp.hwdb'
reading file '/lib/udev/hwdb.d/70-mouse.hwdb'
reading file '/lib/udev/hwdb.d/70-pointingstick.hwdb'
=== trie in-memory ===
nodes:             3899920 bytes (   97498)
children arrays:   1559952 bytes (   97497)
values arrays:     1241904 bytes (   77619)
strings:           1721567 bytes
strings incoming:  4005992 bytes (  240722)
strings dedup'ed:  2347672 bytes (  177476)
=== trie on-disk ===
size:              6863455 bytes
header:                 80 bytes
nodes:             2339952 bytes (   97498)
child pointers:    1559952 bytes (   97497)
value pointers:    1241904 bytes (   77619)
string store:      1721567 bytes
strings start:     5141888

$ sudo udevadm -d control --reload
calling: control

$ sudo udevadm -d trigger /dev/input/event*
calling: trigger

$ sudo udevadm info -q all -p /devices/pci0000:00/0000:00:14.0/usb1/1-4/1-4:1.0/0003:04F3:2073.0004/input/input9
P: /devices/pci0000:00/0000:00:14.0/usb1/1-4/1-4:1.0/0003:04F3:2073.0004/input/input9
E: ABS=1000003
E: DEVPATH=/devices/pci0000:00/0000:00:14.0/usb1/1-4/1-4:1.0/0003:04F3:2073.0004/input/input9
E: EV=1b
E: ID_BUS=usb
E: ID_FOR_SEAT=input-pci-0000_00_14_0-usb-0_4_1_0
E: ID_INPUT=1
E: ID_INPUT_TABLET=1
E: ID_MODEL=Touchscreen
E: ID_MODEL_ENC=Touchscreen
E: ID_MODEL_ID=2073
E: ID_PATH=pci-0000:00:14.0-usb-0:4:1.0
E: ID_PATH_TAG=pci-0000_00_14_0-usb-0_4_1_0
E: ID_REVISION=5107
E: ID_SERIAL=ELAN_Touchscreen
E: ID_TYPE=hid
E: ID_USB_DRIVER=usbhid
E: ID_USB_INTERFACES=:030000:
E: ID_USB_INTERFACE_NUM=00
E: ID_VENDOR=ELAN
E: ID_VENDOR_ENC=ELAN
E: ID_VENDOR_ID=04f3
E: KEY=c03 1 0 0 0 0
E: MODALIAS=input:b0003v04F3p2073e0110-e0,1,3,4,k100,140,141,14A,14B,ra0,1,18,m4,lsfw
E: MSC=10
E: NAME="ELAN Touchscreen Pen"
E: PHYS="usb-0000:00:14.0-4/input0"
E: PRODUCT=3/4f3/2073/110
E: PROP=0
E: SUBSYSTEM=input
E: TAGS=:seat:
E: UNIQ=""
E: USEC_INITIALIZED=4595650

Что я делал неправильно здесь, или альтернативно, что такое лучший способ сделать это?

5
задан 24 January 2016 в 13:22

3 ответа

Мне наконец удалось повторно отображать scancode на BTN_STYLUS2 использование ir-keytable. Команда была:

sudo ir-keytable --device /dev/input/event8 --set-key 0xd003c=BTN_STYLUS2

ОДНАКО, в то время как я видел, что scancode был успешно восстановлением, кнопка осталась мертвой. evtest больше сообщаемый любое событие, когда кнопка была нажата.

Перед этим, был нет MSC_SCAN событие, о котором сообщают evtest когда та кнопка была нажата, хотя были scancodes, о которых сообщают для другой кнопки и также перьевого касания. Это не показалось мне больше, чем нечетная причуда в то время, но теперь кажется, что кнопка действительно не генерирует scancode. Как сделал evtest сообщить о событии кода клавиши вообще, затем? Бьет меня, и в этой точке я рисую мелом его до ошибки ядра.

В конце, я просто kludged вместе сценарий удара для наблюдения evtest для BTN_TOOL_RUBBER события и моделируют щелчок правой кнопкой с xdotool:

#!/bin/bash

# Find the input device number.
devicename="ELAN Touchscreen Pen"
numevents=$(ls /dev/input | grep -c event*)
for ((devnr=0;devnr<$numevents;devnr++)); do
    input-kbd $devnr | grep -q "$devicename"
    if [[ $? == 0 ]]; then
        break
    fi
done

# Listen for BTN_TOOL_RUBBER events.
evtest /dev/input/event$devnr | while read line; do
for value in {0..1}; do
    echo $line | grep -q "type 1 (EV_KEY), code 321 (BTN_TOOL_RUBBER), value $value"
    if [[ $? == 0 ]]; then
        case $value in
            0)  xdotool mouseup 3   ;;
            1)  xdotool mousedown 3 ;;
        esac
    fi
done
done

Это дает мне по существу основную функциональность, которую я хотел так или иначе. Это не прекрасно: событие mouseUp только происходит однажды перьевая листовая близость, не, когда кнопка отпускается (это когда BTN_TOOL_RUBBER в ключевом событии сообщают evtest), но это работает достаточно хорошо, что я не собираюсь пытаться отладить ядро.

1
ответ дан 23 November 2019 в 10:58

Этот - год, но я хотел сказать, что Ваш hwdb файл почти корректен. Но:

  1. правая сторона должна быть в десятичном числе, не шестнадцатеричном числе, так использование 332 не 14c.
  2. левая сторона прибывает от evtest не input-kbd (не спрашивайте, потому что я действительно не знаю). Конкретно это от value поле в MSC_SCAN строка, СРАЗУ предшествующая BTN_TOOL_RUBBER (или независимо от того, что mismapped ключ), событие.

В моем случае я имел:

type 4 (EV_MSC), code 4 (MSC_SCAN), value d0045

Так мое полное hwdb файл:

evdev:input:b0003v04F3p21D0*
  KEYBOARD_KEY_d0045=332
  1. sudo udevadm hwdb --update
  2. sudo udevadm trigger /dev/input/event*
  3. Перезагрузка.
-1
ответ дан 23 November 2019 в 10:58

У меня были те же проблемы с Surface Pro 3, и я решил их следующим образом:

https://forums.linuxmint.com/viewtopic.php?f=59&t=312005&p=1762496#p1762496

После устройство указано в xsetwacom list device , вы можете легко переназначить кнопки с помощью xsetwacom .

0
ответ дан 14 February 2020 в 19:10

Другие вопросы по тегам:

Похожие вопросы: