我有一台 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
.安装、阅读i2cdetect
、i2cdump
、i2cget
、的手册页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) 将在该机器上运行,我想看看是否有效以及安装它可以学到什么。对于您的机器来说,这可能是一条值得探索的途径。我还认为,如果索尼以同样的方式设置他们的协议,他们可能会使用相同的协议并在某处有文档。这似乎是各种解决方案的常见问题,因此我希望有人可以将它们放在一起并与可以一劳永逸地消除此错误的开发人员进行沟通。