Найти правильное устройство для обратного инжиниринга

У меня есть Asus GL503VD, для которого тачпад не работает на Linux.

Я пробовал много разных дистрибутивов: Arch, Debian, Ubuntu 16/17/18, Sabayon, Pop_OS, Fedora. Никто из них не заставил работать тачпад, поэтому я остановился на Ubuntu 18.04 и решил отладить его сам.

Во-первых, этот ноутбук довольно новый, поэтому он не будет загружаться без параметра acpi = force GRUB. Во-вторых, он загрузится на черный экран, если разрешено загружать модуль i2c-hid (поэтому мне пришлось занести в черный список i2c-hid). Я почти уверен, что i2c-hid – это драйвер, который должен заботиться о моем тачпаде, поэтому эту проблему, вероятно, стоит рассмотреть. Дело в том, что когда модуль разрешен для загрузки, я даже не могу добраться до терминала с помощью комбинации ctrl + alt + f *, это просто черный, ничто.

Из раздела Windows я могу сказать, что тачпад – это ELAN1200 (не elantech). Я попытался загрузить модуль hid-elan безуспешно. В отчаянии я также безуспешно попробовал модуль синаптики. Пробовал различные конфигурации x.org.conf.d, которые только мешали моему ноутбуку достигать Gnome DE. Пробовал с помощью libinput, зря.

Пробовал i8042.nomux = 1, i8042.noloop, i8042.nopnp, i8042.kdbreset = 1, i8042.reset; никто из них не работал. (Из того, что я понял, моя комбинация тачпад / клавиатура может управляться микросхемой i8042; хотя из вывода xinput это больше похоже на то, что ITE8910 управляет комбинацией.)

Вывод xinput также говорит о том, что сенсорная панель может быть частью комбинации сенсорной панели и клавиатуры. Я думаю, что тачпад и клавиатура – это одно устройство: ITE8910

вывод xinput:

⎡ Virtual core pointer id=2 [master pointer (3)] ⎜ ↳ Virtual core XTEST pointer id=4 [slave pointer (2)] ⎜ ↳ MOSART Semi. USB Device id=12 [slave pointer (2)] ⎜ ↳ ITE Tech. Inc. ITE Device(8910) id=14 [slave pointer (2)] ⎣ Virtual core keyboard id=3 [master keyboard (2)] ↳ Virtual core XTEST keyboard id=5 [slave keyboard (3)] ↳ Power Button id=6 [slave keyboard (3)] ↳ Asus Wireless Radio Control id=7 [slave keyboard (3)] ↳ Video Bus id=8 [slave keyboard (3)] ↳ Video Bus id=9 [slave keyboard (3)] ↳ Power Button id=10 [slave keyboard (3)] ↳ Sleep Button id=11 [slave keyboard (3)] ↳ USB2.0 HD UVC WebCam: USB2.0 HD id=13 [slave keyboard (3)] ↳ Asus WMI hotkeys id=15 [slave keyboard (3)] ↳ AT Translated Set 2 keyboard id=16 [slave keyboard (3)] ↳ ITE Tech. Inc. ITE Device(8910) id=17 [slave keyboard (3)] 

Выход dmesg говорит мне, что устройство подключено через USB:

 [ 2.408602] usb 1-8: new full-speed USB device number 5 using xhci_hcd [ 2.562105] usb 1-8: New USB device found, idVendor=0b05, idProduct=1869 [ 2.562106] usb 1-8: New USB device strings: Mfr=1, Product=2, SerialNumber=0 [ 2.562107] usb 1-8: Product: ITE Device(8910) [ 2.562108] usb 1-8: Manufacturer: ITE Tech. Inc. 

Если я lsusb, я вижу правильное устройство с идентификатором поставщика и идентификатором продукта:

 Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 001 Device 005: ID 0b05:1869 ASUSTek Computer, Inc. Bus 001 Device 004: ID 13d3:5666 IMC Networks Bus 001 Device 003: ID 8087:0a2b Intel Corp. Bus 001 Device 002: ID 062a:410c Creative Labs Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub 

Примечание. Устройство Creative Labs представляет собой внешнюю мышь.

Когда я lsusb -vd 0b05: 1869, я вижу только дескрипторы, связанные с клавиатурой:

 Bus 001 Device 005: ID 0b05:1869 ASUSTek Computer, Inc. Device Descriptor: bLength 18 bDescriptorType 1 bcdUSB 2.00 bDeviceClass 0 (Defined at Interface level) bDeviceSubClass 0 bDeviceProtocol 0 bMaxPacketSize0 64 idVendor 0x0b05 ASUSTek Computer, Inc. idProduct 0x1869 bcdDevice 0.03 iManufacturer 1 ITE Tech. Inc. iProduct 2 ITE Device(8910) iSerial 0 bNumConfigurations 1 Configuration Descriptor: bLength 9 bDescriptorType 2 wTotalLength 34 bNumInterfaces 1 bConfigurationValue 1 iConfiguration 0 bmAttributes 0xe0 Self Powered Remote Wakeup MaxPower 100mA Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 0 bNumEndpoints 1 bInterfaceClass 3 Human Interface Device bInterfaceSubClass 1 Boot Interface Subclass bInterfaceProtocol 1 Keyboard iInterface 0 HID Device Descriptor: bLength 9 bDescriptorType 33 bcdHID 1.10 bCountryCode 0 Not supported bNumDescriptors 1 bDescriptorType 34 Report wDescriptorLength 263 Report Descriptor: (length is 263) Item(Global): Usage Page, data= [ 0x89 0xff ] 65417 (null) Item(Local ): Usage, data= [ 0x10 ] 16 (null) Item(Main ): Collection, data= [ 0x01 ] 1 Application Item(Global): Report ID, data= [ 0xa5 ] 165 Item(Local ): Usage, data= [ 0x01 ] 1 (null) Item(Global): Logical Minimum, data= [ 0x00 ] 0 Item(Global): Logical Maximum, data= [ 0xff 0x00 ] 255 Item(Global): Report Size, data= [ 0x08 ] 8 Item(Global): Report Count, data= [ 0x10 ] 16 Item(Main ): Feature, data= [ 0x00 ] 0 Data Array Absolute No_Wrap Linear Preferred_State No_Null_Position Non_Volatile Bitfield Item(Main ): End Collection, data=none Item(Global): Usage Page, data= [ 0x89 0xff ] 65417 (null) Item(Local ): Usage, data= [ 0x0f 0xff ] 65295 (null) Item(Main ): Collection, data= [ 0x01 ] 1 Application Item(Global): Report ID, data= [ 0x05 ] 5 Item(Local ): Usage Minimum, data= [ 0x00 ] 0 (null) Item(Local ): Usage Maximum, data= [ 0xff ] 255 (null) Item(Global): Logical Minimum, data= [ 0x00 ] 0 Item(Global): Logical Maximum, data= [ 0xff ] 255 Item(Global): Report Count, data= [ 0x08 ] 8 Item(Global): Report Size, data= [ 0x01 ] 1 Item(Main ): Input, data= [ 0x06 ] 6 Data Variable Relative No_Wrap Linear Preferred_State No_Null_Position Non_Volatile Bitfield Item(Main ): End Collection, data=none Item(Global): Usage Page, data= [ 0x01 ] 1 Generic Desktop Controls Item(Local ): Usage, data= [ 0x06 ] 6 Keyboard Item(Main ): Collection, data= [ 0x01 ] 1 Application Item(Global): Report ID, data= [ 0x01 ] 1 Item(Global): Report Size, data= [ 0x01 ] 1 Item(Global): Report Count, data= [ 0x08 ] 8 Item(Global): Usage Page, data= [ 0x07 ] 7 Keyboard Item(Local ): Usage Minimum, data= [ 0xe0 ] 224 Control Left Item(Local ): Usage Maximum, data= [ 0xe7 ] 231 GUI Right Item(Global): Logical Minimum, data= [ 0x00 ] 0 Item(Global): Logical Maximum, data= [ 0x01 ] 1 Item(Main ): Input, data= [ 0x02 ] 2 Data Variable Absolute No_Wrap Linear Preferred_State No_Null_Position Non_Volatile Bitfield Item(Global): Report Count, data= [ 0x01 ] 1 Item(Global): Report Size, data= [ 0x08 ] 8 Item(Main ): Input, data= [ 0x03 ] 3 Constant Variable Absolute No_Wrap Linear Preferred_State No_Null_Position Non_Volatile Bitfield Item(Global): Report Count, data= [ 0x05 ] 5 Item(Global): Report Size, data= [ 0x01 ] 1 Item(Global): Usage Page, data= [ 0x08 ] 8 LEDs Item(Local ): Usage Minimum, data= [ 0x01 ] 1 NumLock Item(Local ): Usage Maximum, data= [ 0x05 ] 5 Kana Item(Main ): Output, data= [ 0x02 ] 2 Data Variable Absolute No_Wrap Linear Preferred_State No_Null_Position Non_Volatile Bitfield Item(Global): Report Count, data= [ 0x01 ] 1 Item(Global): Report Size, data= [ 0x03 ] 3 Item(Main ): Output, data= [ 0x03 ] 3 Constant Variable Absolute No_Wrap Linear Preferred_State No_Null_Position Non_Volatile Bitfield Item(Global): Usage Page, data= [ 0x07 ] 7 Keyboard Item(Local ): Usage Minimum, data= [ 0x00 ] 0 No Event Item(Local ): Usage Maximum, data= [ 0xff 0x00 ] 255 (null) Item(Global): Logical Minimum, data= [ 0x00 ] 0 Item(Global): Logical Maximum, data= [ 0xff 0x00 ] 255 Item(Global): Report Count, data= [ 0x06 ] 6 Item(Global): Report Size, data= [ 0x08 ] 8 Item(Main ): Input, data= [ 0x00 ] 0 Data Array Absolute No_Wrap Linear Preferred_State No_Null_Position Non_Volatile Bitfield Item(Global): Usage Page, data= [ 0x07 ] 7 Keyboard Item(Local ): Usage Minimum, data= [ 0x00 ] 0 No Event Item(Local ): Usage Maximum, data= [ 0xdf ] 223 (null) Item(Global): Logical Minimum, data= [ 0x00 ] 0 Item(Global): Logical Maximum, data= [ 0x01 ] 1 Item(Global): Report Count, data= [ 0xe0 ] 224 Item(Global): Report Size, data= [ 0x01 ] 1 Item(Main ): Input, data= [ 0x02 ] 2 Data Variable Absolute No_Wrap Linear Preferred_State No_Null_Position Non_Volatile Bitfield Item(Main ): End Collection, data=none Item(Global): Usage Page, data= [ 0x31 0xff ] 65329 (null) Item(Local ): Usage, data= [ 0x76 ] 118 (null) Item(Main ): Collection, data= [ 0x01 ] 1 Application Item(Global): Report ID, data= [ 0x5a ] 90 Item(Local ): Usage Minimum, data= [ 0x00 ] 0 (null) Item(Local ): Usage Maximum, data= [ 0xff 0x00 ] 255 (null) Item(Global): Logical Minimum, data= [ 0x00 ] 0 Item(Global): Logical Maximum, data= [ 0xff 0x00 ] 255 Item(Global): Report Size, data= [ 0x08 ] 8 Item(Global): Report Count, data= [ 0x01 ] 1 Item(Main ): Input, data= [ 0x00 ] 0 Data Array Absolute No_Wrap Linear Preferred_State No_Null_Position Non_Volatile Bitfield Item(Local ): Usage Minimum, data= [ 0x00 ] 0 (null) Item(Local ): Usage Maximum, data= [ 0xff 0x00 ] 255 (null) Item(Global): Logical Minimum, data= [ 0x00 ] 0 Item(Global): Logical Maximum, data= [ 0xff 0x00 ] 255 Item(Global): Report Size, data= [ 0x08 ] 8 Item(Global): Report Count, data= [ 0x10 ] 16 Item(Main ): Feature, data= [ 0x00 ] 0 Data Array Absolute No_Wrap Linear Preferred_State No_Null_Position Non_Volatile Bitfield Item(Main ): End Collection, data=none Item(Global): Usage Page, data= [ 0x31 0xff ] 65329 (null) Item(Local ): Usage, data= [ 0x79 ] 121 (null) Item(Main ): Collection, data= [ 0x01 ] 1 Application Item(Global): Report ID, data= [ 0x5d ] 93 Item(Local ): Usage Minimum, data= [ 0x00 ] 0 (null) Item(Local ): Usage Maximum, data= [ 0xff 0x00 ] 255 (null) Item(Global): Logical Minimum, data= [ 0x00 ] 0 Item(Global): Logical Maximum, data= [ 0xff 0x00 ] 255 Item(Global): Report Size, data= [ 0x08 ] 8 Item(Global): Report Count, data= [ 0x05 ] 5 Item(Main ): Input, data= [ 0x00 ] 0 Data Array Absolute No_Wrap Linear Preferred_State No_Null_Position Non_Volatile Bitfield Item(Local ): Usage Minimum, data= [ 0x00 ] 0 (null) Item(Local ): Usage Maximum, data= [ 0xff 0x00 ] 255 (null) Item(Global): Logical Minimum, data= [ 0x00 ] 0 Item(Global): Logical Maximum, data= [ 0xff 0x00 ] 255 Item(Global): Report Size, data= [ 0x08 ] 8 Item(Global): Report Count, data= [ 0x10 ] 16 Item(Main ): Feature, data= [ 0x00 ] 0 Data Array Absolute No_Wrap Linear Preferred_State No_Null_Position Non_Volatile Bitfield Item(Main ): End Collection, data=none Item(Global): Usage Page, data= [ 0x0c ] 12 Consumer Item(Local ): Usage, data= [ 0x01 ] 1 Consumer Control Item(Main ): Collection, data= [ 0x01 ] 1 Application Item(Global): Report ID, data= [ 0x02 ] 2 Item(Local ): Usage Minimum, data= [ 0x00 ] 0 Unassigned Item(Local ): Usage Maximum, data= [ 0x3c 0x02 ] 572 AC Format Item(Global): Logical Minimum, data= [ 0x00 ] 0 Item(Global): Logical Maximum, data= [ 0x3c 0x02 ] 572 Item(Global): Report Size, data= [ 0x10 ] 16 Item(Global): Report Count, data= [ 0x01 ] 1 Item(Main ): Input, data= [ 0x00 ] 0 Data Array Absolute No_Wrap Linear Preferred_State No_Null_Position Non_Volatile Bitfield Item(Main ): End Collection, data=none Item(Global): Usage Page, data= [ 0x01 ] 1 Generic Desktop Controls Item(Local ): Usage, data= [ 0x80 ] 128 System Control Item(Main ): Collection, data= [ 0x01 ] 1 Application Item(Global): Report ID, data= [ 0x04 ] 4 Item(Local ): Usage Minimum, data= [ 0x81 ] 129 System Power Down Item(Local ): Usage Maximum, data= [ 0x83 ] 131 System Wake Up Item(Global): Logical Minimum, data= [ 0x00 ] 0 Item(Global): Logical Maximum, data= [ 0x01 ] 1 Item(Global): Report Count, data= [ 0x08 ] 8 Item(Global): Report Size, data= [ 0x01 ] 1 Item(Main ): Input, data= [ 0x02 ] 2 Data Variable Absolute No_Wrap Linear Preferred_State No_Null_Position Non_Volatile Bitfield Item(Main ): End Collection, data=none Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x81 EP 1 IN bmAttributes 3 Transfer Type Interrupt Synch Type None Usage Type Data wMaxPacketSize 0x0040 1x 64 bytes bInterval 4 Device Status: 0x0001 Self Powered 

Это говорит мне о том, что тачпад не доступен для меня прямо сейчас. Я даже не вижу этого.

Итак, вот мои вопросы: почему я не вижу тачпад? Что я могу сделать, чтобы найти его и начать реверс-инжиниринг его драйвера?

Ссылка на отчет об ошибке на панели запуска (с гораздо большим количеством файлов журнала)

    Частичный ответ, в основном основанный на ваших данных о том, что тачпад подключен через I2C:

    Даже без i2c_hid вы сможете видеть шину (и) I2C и обмениваться данными с устройствами на них. Пакет lm-sensors i2c-tools имеет программы, связанные с I2C, как и i2c-tools . Установите, прочитайте i2cdetect страницы для i2cdetect , i2cdump , i2cget , i2cset .

    Возможно, вам придется i2c-dev модули I2C, например, i2c-dev , если они не встроены в ваше kernel. После этого вы должны увидеть что-то в /sys/bus/i2c/devices/ и иметь соответствующие узлы устройств в /dev/i2c* . Теперь вам нужно выяснить, какие устройства I2C у вас есть (их, вероятно, довольно много: управление вентилятором, датчики температуры, BIOS EEPROM и т. Д.) И что такое тачпад. Информация от драйвера Windows может помочь.

    Следующим шагом было бы прочитать i2c_hid код i2c_hid , выяснить, есть ли какие-либо стандартизированные протоколы, поискать документацию в Google и попытаться отправлять и получать байты. Кроме того, узнайте, почему i2c_hid позволяет вашему компьютеру загружаться. Вы должны быть в состоянии читать и писать C-код, чтобы сделать это.

    I8042 является устаревшим controllerом PS / 2, он вообще не связан с I2C. Если тачпад не подключен через I2C и этот controller, связываться с kernelм i8042 не поможет.

    редактировать

    Я немного погуглил. HID over I2C уже здесь (очевидно, что-то от Microsoft). Как только вы получите HID поверх I2C, вы должны также прочитать спецификацию HID . В частности, посмотрите на дескрипторы HID. Часто устройства HID имеют причуды, когда отчеты (данные сенсорной панели) не совсем стандартные.

    На Askubuntu есть похожая тема:

    https://askubuntu.com/questions/1038602/18-04-ite-8910-touchpad-on-asus-strix-gl703ge-not-working

    Я попросил в ITE и ASUS спецификации, руководства или спецификацию протокола, но мне пока не повезло, но оба билета все еще открыты.

    К сожалению, я думаю, что мне не повезет с Vogons (поддержка первого уровня ASUS)

    У них должны быть документы где-нибудь, иначе они не могли бы спроектировать ноутбук, а также не написать драйвер для Windows, но леди Вогон сказала мне, что они не поддерживают программное обеспечение или Linux и что они являются производителем оборудования. Когда я сказал, что обычно таблицы данных – это аппаратная вещь, она еще не ответила.

    Как насчет прослушивания i2c драйвера Windows Tocuhpad, чтобы найти последовательность инициализации и выяснить, как она работает.

    Другое дело, что для GL703GE, который, кажется, имеет ту же сенсорную панель, но также не работает ни на Debian, ни на Ubuntu, драйвер Windows на веб-сайте ASUS не работает, поэтому мне прислали ссылки, где я мог скачать рабочие драйверы Windows:

    Попробуйте эту версию http://dlcdnet.asus.com/pub/ASUS/GamingNB/GL703GS/Pricision_TouchPad_V110021.zip или эту версию: http://dlcdnet.asus.com/pub/ASUS/GamingNB/GL703VD/Touchpad_Win10_64_VER11022

    Не уверен, поможет ли это, но я решил добавить дополнительную информацию, которая может оказаться полезной. У меня похожая проблема с Sony Tap 11 и Linux Mint Cinnamon 19 (и Ubuntu 18), работает только тачпад, а кнопки не работают в нескольких дистрибутивах. Я видел (или не видел) то же самое, что вы делали, но не добрались до вас. Я попытался подключить USB-мышь, но проблема все еще была. Под Windows 10 я также не мог определить тип сенсорной панели, и он сказал только PS2-совместимый. Я занимался исследованиями, посвященными Sony Tap 11, в которой есть беспроводная клавиатура со встроенной сенсорной панелью. Я нашел и попробовал большинство стандартных решений, которые люди за последние 15 лет (в буквальном смысле) пытались решить такие проблемы на других машинах, но ничего. Затем я узнал, что Android 4.4 (LineageOS 14.1) будет работать на машине, и подумал, посмотрю, сработает ли и как я могу узнать, как его установить. Это может быть проспект, который стоит изучить для вашей машины. Я также подумал, что если Sony настроит их таким же образом, они могут использовать те же протоколы и иметь документацию где-нибудь. Похоже, что это общая проблема с различными решениями, поэтому я надеюсь, что кто-то сможет собрать все это вместе и пообщаться с разработчиками, которые смогут раз и навсегда устранить эту ошибку.