找到合适的设备进行逆向工程

找到合适的设备进行逆向工程

我有一台 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 但没有成功。出于绝望,我也尝试了 synaptics 模块,但没有任何运气。尝试了各种 x.org.conf.d 配置,但这只阻止了我的笔记本电脑访问 Gnome DE。尝试使用libinput,但没有成功。

尝试过 i8042.nomux=1、i8042.noloop、i8042.nopnp、i8042.kdbreset=1、i8042.reset;这些都不起作用。 (据我所知,我的触摸板/键盘组合可能由 i8042 芯片管理;尽管从 xinput 输出来看,它看起来更像是 ITE8910 正在管理该组合。)

xinput 输出还告诉我触摸板可能是触摸板/键盘组合的一部分。我认为触摸板和键盘是一个设备:ITE8910

x输入输出:

⎡ 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 我会看到带有供应商 ID 和产品 ID 的正确设备:

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

这告诉我现在无法使用触摸板方面的功能。我什至看不到它。

所以这是我的问题:为什么我看不到触摸板?我该怎么做才能找到它并开始对其驱动程序进行逆向工程?

链接到启动板错误报告(包含更多日志文件)

答案1

部分答案,主要基于您的触摸板通过 I2C 连接的信息:

即使没有,i2c_hid您也应该能够看到 I2C 总线,并与总线上的设备进行通信。该软件包lm-sensors有 I2C 相关程序,i2c-tools.安装、阅读i2cdetecti2cdumpi2cget、的手册页i2cset

您可能需要 modprobe I2C 模块,例如i2c-dev,如果它们没有内置在您的内核中。之后,您应该在 中看到一些内容/sys/bus/i2c/devices/,并且在 下有相应的设备节点/dev/i2c*。现在您必须弄清楚您拥有哪些 I2C 设备(可能有很多:风扇控制、温度传感器、BIOS EEPROM 等),以及触摸板是什么。来自 Windows 驱动程序的信息可能会有所帮助。

下一步是阅读i2c_hid源代码,找出是否有任何标准化协议,谷歌搜索文档,并尝试发送和接收字节。同时,还要找出i2c_hid计算机无法启动的原因。您需要能够读写 C 代码才能执行此操作。

i8042 是传统的 PS/2 控制器,它与 I2C 完全无关。除非触摸板通过 I2C 连接这个控制器,搞乱 i8042 内核的东西根本没有帮助。

编辑

我用谷歌搜索了一下。 I2C 上的 HID 是这里(显然是微软的东西)。一旦您通过 I2C 使 HID 正常工作,您还应该阅读HID规格。特别是查看 HID 描述符。当报告(触摸板数据)不太标准时,HID 设备通常会出现异常。

答案2

askubuntu 上有一个类似的帖子:

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

我向 ITE 和华硕询问了数据表、手册或协议规范,但到目前为止我没有运气,但两张票仍然开放。

不幸的是,我认为我不会有 Vogons 的运气(华硕一级支持)

他们必须在某个地方有这些文档,否则他们无法设计笔记本电脑,也无法编写 Windows 驱动程序,但 Vogon 女士首先告诉我,他们不支持软件或 Linux,他们是硬件制造商。当我说数据表通常是硬件的东西时,她还没有回答。

嗅探 Windows Tocuhpad 驱动程序的 i2c 以查找 init 序列并了解其工作原理怎么样?

另一件事是,对于 GL703GE,它似乎具有相同的触摸板,并且在 Debian 或 Ubuntu 上也不起作用,华硕网站上的 Windows 驱动程序已损坏,因此他们向我发送了可以下载工作 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.zip

答案3

我在使用 Sony Tap 11 和 Linux Mint Cinnamon 19(和 Ubuntu 18)时遇到了类似的问题,只有我的触摸板可以工作,而按钮在多个发行版中不起作用。我看到(或没有)看到与您所做的相同的事情,但没有达到您所做到的程度。我尝试插入 USB 鼠标,但仍然遇到同样的问题。在Windows 10下我也无法识别触摸板的类型,它只说PS2兼容。我正在专门针对 Sony Tap 11 进行研究,它具有带内置触摸板的无线键盘。我发现并尝试了大多数标准解决方案,人们在过去 15 年(字面上)尝试在其他机器上解决此类问题,但一无所获。然后我了解到 Android 4.4 (LineageOS 14.1) 将在该机器上运行,我想看看是否有效以及安装它可以学到什么。对于您的机器来说,这可能是一条值得探索的途径。我还认为,如果索尼以同样的方式设置他们的协议,他们可能会使用相同的协议并在某处有文档。这似乎是各种解决方案的常见问题,因此我希望有人可以将它们放在一起并与可以一劳永逸地消除此错误的开发人员进行沟通。

相关内容