分析 ThinkPad 触控设备类型
近几年的 ThinkPad 都是 Synaptics(新思)的 ELAN 触控板,连接方式分为三种:通过 I2C 连接、通过 SMBus 连接、通过 PS2 连接。在 Windows 的「设备管理器」中找到触控板设备,双击后在「详细信息」中的菜单、选择「BIOS 设备位置」,查看设备的 PCI 总线路径,可以确认连接方式。
如上图所示,在「设备管理器」中可以看到 Synaptics SMBus 驱动,对应 PCI 总线位置 \_SB.PCI0.SMBU。
除了连接方式的区别以外,根据外观 ThinkPad 的触控板还可以再分成两类,TouchPad 和 ClickPad。
上图的两种触控板的类型是 ClickPad。识别特征是触控板上方有三个独立按键,而触控的部分也可以整体点击,故称 ClickPad。近几年的 ThinkPad 的商务笔记本机型基本都是采用 ClickPad。
上图的两种触控板的类型是 TouchPad。识别特征是触控板有三个独立按键,而在触控板下方还有二至三个独立按键,而触控的部分不能点击。ThinkPad 的移动工作站机型除 ThinkPad P1 以外基本都是采用 TouchPad,代表机型有 ThinkPad P52、P53、P73 等。
确定驱动方式
根据连接类型来看,只有通过 I2C 总线连接触控板的 ThinkPad 机型可以使用 VoodooI2C,已知机型只有 ThinkPad Yoga 系列和 X1 Tablet 系列。即使这部分 ThinkPad 机型可用 VoodooI2C,VoodooI2C 也不支持 ThinkPad 小红点 TrackPoint 的驱动。对于走 PS2 总线的机型使用 VoodooPS2 驱动。
对于走 SMBus 的部分机型,如 ThinkPad E480、E580、R480、R580、L380、T480s、P52、P53,也可以使用 VoodooSMBus 驱动。但是该驱动较不完善、开发进程缓慢,仅供尝鲜、不不推荐日常使用。这部分机型也一样可以使用 VoodooPS2 驱动。这部分机型一般都使用 Synaptics 的触控板设备,因此也可以使用 VoodooRMI 驱动。
对于包含触控屏的 ThinkPad 常规机型(如 ThinkPad X1 Extreme 4K OLED 杜比、ThinkPad P1 4K 等),其触控屏一般使用 I2C 总线与主板连接,因此需要额外使用 VoodooI2C 驱动。
由于 ThinkPad 绝大部分机型都适合用 VoodooPS2 驱动,因此接下来的教程首先介绍如何通过 VoodooPS2 驱动触控板。
VoodooPS2
添加 SSDT
VoodooPS2 兼容几乎所有的笔记本、台式机的 PS2 设备。因此为了启用 VoodooPS2 中内置的 ThinkPad 优化、以及同时启用小红点、触控板顶部的三个按键和触控板,需要通过 SSDT 在 _SB.PCI0.LPC.KBD 下新增 RMCF 变量、注入触控板属性供 VoodooPS2 读取。
相关的热补丁 SSDT 在OC-little 并已经合并,你现在可以直接在 OC-little 的「品牌机器特殊补丁 – ThinkPad 机器专用补丁」章节中直接下载、编译即可。如果你的触控板是 ClickPad,那么需要下载的是 SSDT-ThinkPad_ClickPad.dsl ;如果你的触控板是 TouchPad 则下载 SSDT-ThinkPad-TouchPad.dsl。下载好 DSL 文件后用 iasl 编译为 AML 文件、添加到 EFI 中即可。
需要注意,我提交给 OC-little 中的 SSDT 中已经包含了数位前辈调优过的小红点参数(解决了小红点漂移),如果小红点用起来不习惯,可以自行调整 SSDT 中的参数。除此以外,如果你依赖 Custom PS2 Map 或 Custom ADB Map 的键位映射,也会涉及到对 RMCF 变量的修改,因此需要合并 SSDT。如何合并 SSDT 的样例也已经包含在 OC-little 的「品牌机器特殊补丁 – ThinkPad 机器专用补丁」章节中,自行参考。
放入 kext
下载 VoodooPS2 添加到 EFI 中即可(Clover 直接放入 EFI 对应目录即可,OpenCore 则还需要在 config.plist 中手动添加 Contents/Plugins 下的所有子 kext)。VoodooInput 是一个扩展驱动,目前最新版的 VoodooPS2 已经内置。 VoodooInput 通过模拟 Magic TrackPad 2、可以完整支持全部触控板手势;还可以将 ThinkPad ClickPad 的触控板点击 模拟为 Magic TrackPad 的压力触控(Force Touch and Haptic Feedback)。
放好 SSDT 和 kext 以后,重启即可。如果发现触控板无反应而小红点可以使用,先用下述命令检查相关 kext 是否已经加载:
$ kextstat | grep -Ei "VoodooInput"
$ kextstat | grep -Ei "PS2"
VoodooSMBus
注意,大部分现代的 ThinkPad 机型都使用的是 Synaptics 的触控板,因此建议优先使用 VoodooRMI 驱动。VoodooRMI 的相关教程见下文。
VoodooSMBus 由于还不完善、仍在缓慢开发中,安装方式相对复杂、在 Catalina 上存在随机出现的无法初始化的问题、需要用到的 Patch 不能用于 OpenCore(Replace 和 Find 长度不同),因此 仅推荐使用 Clover 且足够熟悉黑苹果的用户体验 VoodooSMBus。
首先,检查在 macOS 下是否能够识别到下表中的任何一个设备:
名称 | ID |
Sunrise Point-LP (PCH) | pci8086,9d23 |
Cannon Lake-H (PCH) | pci8086,a323 |
接着,检查自己的触控板是否是通过 SMBus 总线连接的。触控板的连接方式除了可以在 Windows 下通过「设备管理器」查看,还可以在 Linux 下用 dmesg | grep -E ‘psmouse|i801’ 命令查看。只有同时满足上述两个条件才可以用 VoodooSMBus 驱动。
注:如果你已经在用 VoodooPS2 驱动,先删除添加的 SSDT 和 VoodooPS2。
下载 VoodooPS2(键盘还是要用 VoodooPS2 驱动的)。接着删除 VoodooPS2Controller.kext 和 VoodooInput.kext(如果使用 Clover 驱动,右键点击「查看包内容」、删除其中的 Contents/Plugins/VoodooPS2Mouse.kext 和 Contents/Plugins/VoodooInput.kext)。
在 Clover 的 config.plist 中添加如下 KextToPatch:
Comment: Prevent VoodooPS2Controller attaching to MOU
Identifier: as.acidanthera.voodoo.driver.PS2Controller
Find: 3C737472 696E673E 504E5030 4630453C 2F737472 696E673E 3C7374 72696E67 3E504E50 30463133 3C2F7374 72696E67 3E
Replace: 3C737472 696E673E 504E5030 4630453C 2F737472 696E673E
Comment: Prevent Apple I2C kexts from attaching to I2C controllers #1, credit CoolStar
Identifier: com.apple.driver.AppleIntelLpssI2C
Find: 494F4B69 74
Replace: 494F4B69 73
Comment: Prevent Apple I2C kexts from attaching to I2C controllers #2, credit CoolStar
Identifier: com.apple.driver.AppleIntelLpssI2CController
Find: 494F4B69 74
Replace: 494F4B69 73
Comment: Prevent Apple SMBus kexts from attaching to SMBUS controller #1
Identifier: com.apple.driver.AppleSMBusController
Find: 494F4B69 74
Replace: 494F4B69 73
Comment: Prevent Apple SMBus kexts from attaching to SMBUS controller #2
Identifier: com.apple.driver.AppleSMBusPCI
Find: 494F4B69 74
Replace: 494F4B69 73
下载 VoodooSMBus 并安装到 EFI 中,重启即可。
VoodooRMI
如果可以确认自己的 ThinkPad 使用的是 Synaptics 触控板,VoodooRMI 是更好的选择:相比 VoodooPS2,VoodooRMI 响应速度更快(操作更跟手),多指手势更灵敏;相比 VoodooSMBus,VoodooRMI 的安装更简单、无需额外的 Patch、并且支持 OpenCore。
首先,将 VoodooPS2 添加到 EFI 中。我们仍然需要使用 VoodooPS2Keyboard 来驱动键盘。
接着,禁用 VoodooPS2 中的 VoodooPS2Mouse、VoodooPS2TrackPad 和 VoodooInput。如果你使用的是 Clover,需要右键点击「查看包内容」、删除其中的 Contents/Plugins/VoodooPS2Mouse.kext、Contents/Plugins/VoodooPS2TrackPad.kext 和 Contents/Plugins/VoodooInput.kext)。如果你使用的是 OpenCore 驱动,注意不要将上述三个驱动添加到 config.plist 中。
接着, 下载 VoodooRMI,解压后将 VoodooSMBus.kext 和 VoodooRMI.kext 两个文件添加到 EFI 中。
VoodooRMI 中内置了数个插件(如 VoodooInput、VoodooTrackpoint、RMISMBus 和 RMII2C),其中 RMII2C 是用于对接 I2C 总线的,大部分 ThinkPad 机型都不需要,因此也将其禁用。如果你使用的是 Clover,需要右键点击「查看包内容」将其删除;如果你使用的是 OpenCore,注意不要将 RMII2C 添加到 config.plist 中。
对于包含触控屏的 ThinkPad 机型,可以尝试保留 RMII2C、搭配 VoodooI2C 驱动触控屏。
完成上述步骤后重启即可。
评论(0)