Вращающийся сенсорный драйвер в ядре

#linux-device-driver #hid #android-kernel

#linux-драйвер устройства #hid #android-ядро

Вопрос:

У меня есть этот 7-дюймовый сенсорный экран Xenarc с контроллером eGalaxy, USB 0eef: 0001. Проблема в том, что ориентация дисплея по оси X-Y отклонена на 90 градусов от сенсорного контроллера. В Xorg я бы исправил это с помощью калибровки, но я пытаюсь что-то сделать в Android 11, поэтому мне нужно использовать другой подход.

В принципе, исправление:

y <- x x <- 4096 — y

Я пытаюсь отследить, где это сделать. Существует особенность, которая соответствует этому поставщику: устройство:

 hid-quirks.c:   { HID_USB_DEVICE(USB_VENDOR_ID_DWAV, USB_DEVICE_ID_EGALAX_TOUCHCONTROLLER), HID_QUIRK_MULTI_INPUT | HID_QUIRK_NOGET },
  

я думал, что это будет означать, что он будет использовать hid-multitouch.c в качестве конкретного драйвера hid, но я поместил отладочные сообщения в mt_touch_input_mapping(), где я думал, что выполню преобразование. Я обнаружил, что функция никогда не вызывается.

 [    3.319231] usb 1-1.1: New USB device found, idVendor=0eef, idProduct=0001, bcdDevice= 1.00
[    3.327836] usb 1-1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[    3.335421] usb 1-1.1: Product: USB TouchController
[    3.340555] usb 1-1.1: Manufacturer: eGalax Inc.
[    3.350584] Found special quirk 0x48 for HID device 0x0eef:0x0001
  

но я думаю, что вижу доказательства того, что он управляется только hid-generic:

 [    3.411400] hid-generic 0003:0EEF:0001.0001: input,hidraw0: USB HID v2.10 Pointer [eGalax Inc. USB TouchController] on usb-0000:01:00.0-1.1/input0
  

и в hid-generic нет кода, специально предназначенного для работы с сенсорными экранами.

getevent действительно видит события от прикосновений:

 /dev/input/event1: EV_SYN       SYN_REPORT           00000000
/dev/input/event1: EV_ABS       ABS_X                000007b5
/dev/input/event1: EV_ABS       ABS_Y                000006ba
  

Я остаюсь, пытаясь понять, как это работает, и задаюсь вопросом, не используется ли он вообще как мультитач-устройство, а скорее просто отправляет события EV_ABS. Net, я посмотрел в drivers / hid, чтобы посмотреть, что их отправляет, и единственное, что я могу найти, это wacom_wac.c. Я не думаю, что это используется здесь, потому что об этом нет упоминания в dmesg или / sys.

Итак, мне остается только гадать, что обрабатывает эти события устройства и отправляет их во входную подсистему, и, возможно, что более важно, где я могу их перехватить (в ядре), чтобы я мог выполнить свою магию аффинного преобразования для x и y? Действительно ли все это обрабатывается hid-input.c? Мне кажется, что добавление вращения в качестве причуды было бы ужасной вещью в таком общем месте, и мне нужно выяснить, как заставить его использовать hid-мультитач или, может быть, что-то новое.

Комментарии:

1.Я вижу набор причуд для этого устройства drivers/hid/hid-quirks.c:77: { HID_USB_DEVICE(USB_VENDOR_ID_DWAV, USB_DEVICE_ID_EGALAX_TOUCHCONTROLLER), HID_QUIRK_MULTI_INPUT | HID_QUIRK_NOGET }, elixir.bootlin.com/linux/latest/source/drivers/hid /…

2. И да, похоже, что он обслуживается универсальными драйверами USB HID -> HID.

3. Я тоже это видел (это было в моем вопросе). Так нужно ли мне заставить его использовать свой собственный драйвер? Я не уверен, сделал бы я это, установив HID_QUIRK_HAVE_SPECIAL_DRIVER или просто добавив VID:PID в hid-multitouch (или новый драйвер).

4. Действительно ли он использует hid-generic.c И hid-input.c?