查看: 110978|回复: 319

[DSDT] 【积谷于此,以至四方】黑苹果i2c触摸驱动教程(第二版)(20190503更新六代相关)

 火.. [复制链接]
penghubingzhou 发表于 2018-10-31 21:07 | 显示全部楼层 |阅读模式
快御云安全
本帖最后由 penghubingzhou 于 2019-5-3 00:35 编辑

楼主的博客已经上线!欢迎关注  www.penghubingzhou.cn!!!



大家好,最近看到了很多人在Mojave板块发帖求助I2C触摸,我发现我无论回多少帖子都没人注意到我的帖子。恰逢我准备更新我的教程,经过长时间的思考与尝试,今天我来在本版块更新我的i2c触摸驱动教程。




本教程是第一版教程(原帖现在应我的要求,已经回收的延伸版,在修正第一版语言的基础上,给各位带来了全新的热补丁驱动触摸板教程





1、前言
2、准备
3、热补丁制作
4、热补丁除错(轮询模式)
5、安装
6、其他
7、致谢








下面开始我们的教程:


前言

什么是热补丁


关于热补丁,Rehabman在他的帖子(帖子地址:https://www.tonymacx86.com/threads/guide-using-clover-to-hotpatch-acpi.200137/)中提供了一个详细的描述,有兴趣的可以自己去查阅。  在这里,我只讲我们最需要的部分。


所谓的热补丁,其实是DSDT的一种特殊形式。它里面提供了跟DSDT一样等效的代码。四叶草在启动的时候,会自动读取热补丁(包括四叶草配置文件的修改以及自制的并放在ACPI/Patched下的SSDT)的代码,并尝试合并到读取到的DSDT里(类似于黑苹果DSDT修改的联合反编译)然后读取修改后的DSDT代码(这个代码也就是你直接打开Maciasl时弹出的Pre-Edited DSDT)。


我为什么需要热补丁?
首先,热补丁的编辑更加高效。使用热补丁,你不需要去修改其他的无关代码,也不需要你去联合反编译DSDT然后除错,更是大大节省了你的工程量。

其次,热补丁更加安全。如果热补丁导致你的启动出现问题,你只需要还原对应的热补丁修改即可,既快捷又方便。而如果是DSDT,在改动前你必须备份原有DSDT,而且有时出了问题还原更改还需要排除代码。

再次,热补丁管理方便。每个功能可以写一个热补丁,无论是配置文件里还是SSDT,都方便管理与添加;并且由于热补丁的动态注入特性,在部分情况下可以实现直接修改DSDT报错而不能完成的修改。

另外,由于热补丁的与平台无关性,有些修改的热补丁可以跨平台使用,大大提高了黑果的移植度以及修改工程量。



热补丁有什么缺点?
热补丁优点这么多,当然也有缺点存在。首先,热补丁是DSDT的延伸,它要求你对于ACPI代码比较熟悉,能够处理DSDT一些基本的错误;其次,比起修改DSDT,你必须在四叶草配置文件里屏蔽对应的方法名(设备名);同时,对于略微复杂的修改(比如电池以及某些大量无规律的名称修改),使用热补丁有时候不如直接修改DSDT方便。

但不管怎么说,在可以使用热补丁的场合,我还是推荐你这么做的。



什么是VoodooI2C?
VoodooI2C是由亚历山大和众多开发者一起完成开发的一款基于Linux代码修改的驱动,可以用于驱动多种i2c总线设备。尤其是触摸板,它现在几乎是所有i2c类型触摸板的首选驱动(目前已知的只有部分ELAN型号允许使用PS2类型触摸板)。目前这款驱动已经更新到2.1.4版本,拥有ELAN、FTE、UPDDEngine、I2CHID、I2CSynaptics五种目标驱动用来驱动你的触摸板。新版也支持白果手势,支持从4代(Haswell架构)到8代(仅限Kaby Lake R架构)的多种Intel处理器,支持从11到14的所有版本系统。当然,对于更低的架构(如Sandy Bridge)和更高架构(如Canon Lake以及Coffee Lake),VoodooI2C尚未提供支持。有关更高架构的使用,我将在后面加以说明。



VoodooI2C支持的硬件ID列表
对于VoodooI2C来说,它能识别下面的硬件ID:

'INT33C2' 和 'INT33C3' - Haswell
'INT3432' 和 'INT3433' - Broadwell
'pci8086,9d60', 'pci8086,9d61', 'pci8086,a160' 和 'pci8086,a161' - Skylake/Kaby Lake







准备
确认触摸板类型
良好的准备是一切的基础。接下来你所需要做的第一项工作就是确认你的触摸板类型,方法如下:


打开设备管理器,找到人体学输入设备,如果是i2c设备,那么现在你应该能看到一个i2c hid设备:





如果你能看到这个设备,说明你的触摸板是I2C触摸板。接下来你需要右击“鼠标和其他指针设备”查看触摸设备的属性,如果显示为“在I2C HID上”,那么就是I2C HID设备;如果是”在I2C USB上“,那么就是I2C USB设备。但是如果找不到,那么就说明你的触摸板不是I2C类型的触摸板而是PS2类型的,这类触摸板的驱动文件一般是Applesmarttouchpad或者VoodooPS2controller,本篇教程你就没有看下去的必要了;如果你的为I2C USB,就请跳步到安装篇章;如果是I2C HID,请继续看下面的教程。


提取BIOS设备名称

接下来我们需要提取BIOS设备名称,这是后续修改的关键。提取步骤如下:

1、打开设备管理器,找到I2C HID设备,双击打开属性





2、进入详细信息,点击下拉菜单,找到“BIOS设备名称”一项,并将它记录下来(可能不止一个)







这样,我们就完成了设备名字的记录操作。一般来说,I2C触摸设备名字是这些中的一个:


  1. 触摸板:TPDX, ELAN, SYNA, CYPR,TPAD
  2. 触摸屏:TPLX, ELAN, ETPD, SYNA, ATML
复制代码



注意:这里的X代表某一个数字




评分

7

查看全部评分

penghubingzhou  楼主| 发表于 2018-10-31 21:20 | 显示全部楼层
本帖最后由 penghubingzhou 于 2019-1-30 12:55 编辑

除了上面提到的,我们还需要下载编写所需要的对应工具:Maciasl和IORegistryExplorer以及VoodooI2C驱动打包。



这里这两款软件都有特殊的要求。Maciasl要求为Rehabman大神编译版,IORegistryExplorer要求为2.1版本。



IORegistryExplorer和Maciasl的下载链接请点击查看。





在安装这两个软件之后,我们还需要在maciasl添加Alexandred的i2c触摸板补丁源。方法如下(mac):


1、打开MaciASL,找到菜单栏的“preferences”







2、打开“Sources”选项卡,点击添加按钮,添加如下VoodooI2C补丁源的地址(图中的VoodooI2C)。






3、关闭




如果添加成功,现在点击”patch“按钮,你应该能看到这个:







然后,我们前往这里下载一份最新版本已经编译好的VoodooI2C驱动打包,然后解压,可以得到VoodooI2C驱动(核心驱动)以及4个目标驱动。它们是:

·VoodooI2CELAN(适用于比较老的ELAN触摸板,但需要修改info.plist的ioprobematch属性来支持设备,只支持中断模式)


·VoodooI2CHID(适用于绝大多数新的I2C多点触摸板,这类触摸板多为智能触摸板(Precision TouchPad)


·VoodooI2CUPDDEngine(UPDD多点触控引擎)


·VoodooI2CFTE(驱动FTE触摸板,也需要更改ID且只支持中断模式)。




具体工作方式是核心驱动加上一个目标驱动,你需要根据自己实际情况选择驱动。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
回复

使用道具 举报

penghubingzhou  楼主| 发表于 2018-10-31 21:21 | 显示全部楼层
本帖最后由 penghubingzhou 于 2019-5-3 00:34 编辑

正如第一版所言,我们修改DSDT的目的,其核心在于让驱动识别触摸板的GPIO控制器,从而让驱动识别触摸板。在第二版中,也是一样。但无论你使用哪一种工作模式,你首先都需要给你的DSDT应用补丁。在第一版中,我们所知道的需要应用的补丁有Windows Patch、GPI0 Controller和I2C Controller补丁(Skylake)。在热补丁教程下,其中,Windows Patch、GPI0 Controller在热补丁下拥有替代品:SSDT-XOSI与SSDT-GPI0。


下载,解压并放在ACPI/Patched目录下,然后在四叶草编辑器的ACPI选项卡下添加如下两个改名补丁:

  1. change _OSI to XOSI    Find:5F4F5349    Replace:584F5349
  2. change _STA to XSTA in GPI0  Find: 5F535441    Replace: 58535441TgtBridge:47504930
复制代码
如下图:




如果你是六代Skylake的,那么你可能还需要注入六代i2c  controller的热补丁:
(具体使用参见里面的说明)



热补丁制作


接下来我们就要正式开始热补丁的主体施工了。在开始之前,我们需要确认自己的APIC Pin值。在没有安装VoodooI2C驱动的情况下,打开IORegistryExplorer,搜索前面保存的BIOS设备名称,然后定位到IOinterruptSpecifiers一项









可以看到,窗口出现了一组十六进制数值。其中,最前面的两位数称为APIC pin值,把它记录下来。如果这个值不存在或者不大于2F(十六进制如何比较大小请自行百度),那么请去安装篇章。



针对VoodooI2C的两种驱动模式,我们分别进行讲解。




1)GPI0中断模式

1、代码复制

以我的小新潮7000为例,首先下载热补丁样本文件:(以下简称样本)




接下来,我们需要在DSDT中搜索前面的BIOS设备名称,然后定位到相应的代码区域,并将设备的ACPI代码复制到样本文件中的DefinitionBlock代码块中去:















复制之后,我们还要修正名称,来确保这个SSDT是正确的。修正的地方有三处:







第一处第二处都修正为你的BIOS名称,而第三处则还要带上BIOS名称的全路径(以我的为例):










2、移除SBFI与_CRS的修正


接下来,我们修改样本的_CRS方法,并删除SBFI方法。搜索SBFG,定位并仔细翻阅,你应该会找到一段类似于这样的代码:


  1. Method (_CRS, 0, Serialized)  // _CRS: Current Resource Settings
  2.                 {
  3.                     Name (SBFI, ResourceTemplate ()
  4.                     {
  5.                         I2cSerialBusV2 (0x0015, ControllerInitiated, 0x00061A80,
  6.                             AddressingMode7Bit, "\\_SB.PCI0.I2C1",
  7.                             0x00, ResourceConsumer, , Exclusive,
  8.                             )
  9.                         Interrupt (ResourceConsumer, Level, ActiveLow, Exclusive, ,, )
  10.                         {
  11.                             0x0000006D,
  12.                         }
  13.                     })
  14.                     Return (SBFI)
  15.                 }
复制代码
找到之后,首先要将SBFI更名为SBFB,并删除下段代码:

  1.      Interrupt (ResourceConsumer, Level, ActiveLow, Exclusive, ,, )
  2.     {
  3.         0x0000006D,
复制代码
PS:改名不是必须的,只要保证修改类似于上面所述即可。
比如我的:






这段代码直接存在于SBFI名称下,因而直接删除它即可。



然后,我们需要修改_CRS方法为这样:






3、SBFG的补全以及GPIO Pin的添加
首先尝试在你触摸设备所对应的DSDT代码里搜索类似如下的这段代码:






如果并没有这段代码,么你需要在触摸设备的根目录下补上这段代码,像这样:


  1. Name (SBFG, ResourceTemplate ()
  2.     {
  3.         GpioInt (Level, ActiveLow, ExclusiveAndWake, PullDefault, 0x0000,
  4.             "\\_SB.PCI0.GPI0", 0x00, ResourceConsumer, ,
  5.             )
  6.             {   // Pin list
  7.                 0x0000
  8.             }
  9.     })
复制代码
如果有这段代码但蓝色字样的数值为0,或者你是后面补上的,那么你可能还需要手动添加GPI0 Pin值。


查找表一,寻找你之前的APIC Pin值,得到一个IRQ值;然后再前往表二根据IRQ找到一个对应的GPI0 Pin值(10进制),把它转换为16进制值。如果这个十六进制数介于5c到77之间,那么这个数就是你需要的GPI0 Pin值。如果这个数不在这俩数之间,那你就会发现:你的16进制APIC pin值在表一对应了两个IRQ值。这就需要你分别对两个值进行测试,看哪个才是正确的。

附上表一表二的传送门:

表一:https://github.com/coreboot/coreboot/blob/master/src/soc/intel/skylake/include/soc/gpio_defs.h#L43

表二:
https://github.com/coreboot/coreboot/blob/master/src/soc/intel/skylake/include/soc/gpio_soc_defs.h#L37



当然。在某些极端状况下,你找到的值都不起作用的话。那么此时,你只能去尝试些比较常见的数值了,如0x17、0x1b、0x34和0x55。



总之,在完成之后,你需要把得到的16进制GPI0 Pin数值填入SBFG语句块里,像这样:


  1. Name (SBFG, ResourceTemplate ()    {        
  2.      GpioInt (Level, ActiveLow, ExclusiveAndWake, PullDefault, 0x0000,           
  3.                              "\\_SB.PCI0.GPI0", 0x00, ResourceConsumer, ,            
  4.                       )            
  5.                       {   // Pin list               
  6.                           0x17     // 这一行就是你需要填写的位置!            
  7.                       }   
  8. })
复制代码
到这里,一个轮询模式的SSDT热补丁就初步完成了。



2)轮询模式
走轮询模式与前面的GPI0中断模式类似,但是尽管如此,它们之间仍然存在着细微的差别:1、在轮询模式下,你不需要进行跟GPI0 Pin有关的操作。


2、你不需要注入GPI0热补丁。


3、修改CRS方法时,返回的语句通常是


  1. Return (ConcatenateResTemplate (SBFB, SBFI))
复制代码

或者


  1. Return (SBFB)
复制代码

但是不管是哪种返回值,你要确保最后的返回值没有SBFG!!!




3)其他补充

在这针对一些问题,楼主进行下补充:

1、不是所有没有IOinterrput值或者值小于2e的设备都可以直接使用VoodooI2C。这类设备中,有一部分必须依赖轮询方式。这类触摸板只需按照上面轮询的方法去修改即可。


2、对于八代的支持问题。在八代中,Kaby Lake R是唯一一个完美支持的,而对于Coffee Lake、Cannon Lake、Whiskey Lake等,很遗憾,目前相关的代码移植仍然处于初级阶段,尚不能提供完美支持。但是不能驱动的机友也不必过于忧心,亚历山大的开发组正在加紧移植,预计用不了多久就会来临。


目前对于这些平台,如果一定要尝试,可以尝试在VoodooGPI0的info.plist下的IONameMatch添加你的GPI0 ID(具体ID去Windows下的设备管理器查找)。然后使用轮询模式,如果能够支持,那么就可以驱动了(最新编译的已经不需要添加ID)。





3、GPI0 Pin值问题。在找到16进制的GPI0 Pin值的过程中,有时候可能出现找到的值只有一个却不在区间的情况,此时也要进行试验,如果不满足再试验其他。





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
回复

使用道具 举报

penghubingzhou  楼主| 发表于 2018-10-31 21:23 | 显示全部楼层
本帖最后由 penghubingzhou 于 2019-1-30 13:31 编辑

热补丁的除错


接下来,我们就进入了给触摸板SSDT排错的过程。




点击compile,你会发现此时热补丁会报一堆错误。这里面的错误,大多是因为缺少东西所致。你可能需要因此添加很多东西,比如引用的Device、Method,还有一些数据等等。


在我提供的样本里,已经提供了两个示例展示如何引用。在这,我还是补几张图说明下引用的过程。比如,以我的报错为例。你可以看到,在其中有一条提示缺少了TPDD:













所以对应地,我们去DSDT搜索,直到最后定位到相应的数值(或者方法、设备以及它们的引用,最后定位只能是这几种):







第一处表示了它的构造区域,第二处则表示这个名称的值。接下来,我们复制这个数据及其对应的构造区域到SSDT中:





再点击compile,与TPDD相关的报错应该都消失了。


除了这个之外,有时候我们缺失的是设备或者方法,我们只需要从Maciasl下方确认它的全路径,然后使用这条语句引用即可:


  1. External (xxxx.xxxx.xxxx, DeviceObj) //如果是方法,就使用MethodObj;如果是区域则使用FieldUnitObj
复制代码


注意:这条语句要放在DefinitionBlock块内的最前面!




总之,最后你的SSDT要同DSDT一样没有ERROR,这才算完成:







最后再补上一份我的DSDT以及热补丁的示例打包:






安装


接下来,我们便进入了安装步骤。除了如第一版所述添加CoolStar补丁或者移除AppleIntelLpssI2C.kext和AppleIntelLpssI2CController.kext并重建缓存外,我们还需要改名DSDT里的触摸设备,来保证热补丁工作。


首先利用ASCII码转换工具(自己百度)将你的触摸设备BIOS名称转换为16位ASCII码,然后给这个触摸设备改个名字来保证其不加载(比如改TPAD为XPAD),再次生成一串16位ASCII码,它们共同构成了一个ACPI补丁,用四叶草编辑器把它填入:








然后再放入我们的热补丁,重启。如果没有问题,我们的触摸板就应该正常工作了。




如果触摸板并不能工作,那么你需要排除错误。热补丁要排除的错误除了修改的补丁错误外,还要重点排查改名等。但不管怎么说,最终一定会有个结果!






其他


VoodooI2C使用CSG以及白果手势引擎来支持各种多点触控。其中,2.1.1后的版本,使用白果手势引擎。这类手势可以通过系统设置里面触摸板的相关选项来设置(部分硬编码的无法更改)。

下面就是VoodooI2C支持的所有手势列表:

CSG手势:

  1. ·单击
  2. ·两指滚动
  3. ·三指配合alt的上下左右滚动
  4. ·四指滑动
  5. ·拖动(在“辅助功能”里的“鼠标和触摸板”中找到相关设置选项)
  6. ·向下 - Command + W
  7. ·向左- Command + Q
  8. ·向上 - 显示桌面
  9. ·向下 - Command + F11
复制代码


白果引擎增加的手势:
  1. ·双指通知中心
  2. ·双指缩放
  3. ·双指返回(Safari浏览器)
复制代码



致谢
谨在此向所有为此篇帖子的完成作出贡献的各位大神们致谢!



@宪武(热补丁部分相关知识,初始成果)
@Alexandred以及其开发团队的所有成员(VoodooI2C驱动)
@bugprogrammer(驱动编译帖子,视频)
@黑果小兵(黑果镜像以及问题解答)




文中有关宪武大神的热补丁作品引用(SSDT-GPI0)已经得到宪武大神的允许!





教程更新到此结束,感谢各位的支持!!!


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×

评分

1

查看全部评分

回复

使用道具 举报

我是人QWQWQW 发表于 2018-10-31 21:26 | 显示全部楼层
前排围观@!
回复

使用道具 举报

wd2776691 发表于 2018-10-31 21:42 | 显示全部楼层
坐等更新!!~
回复

使用道具 举报

seasandz 发表于 2018-10-31 22:53 | 显示全部楼层
学习一下,这方面还是知识空白
回复

使用道具 举报

wangzhe3g 发表于 2018-10-31 23:27 | 显示全部楼层
好东西,谢谢楼主
回复

使用道具 举报

nickzhenyu 发表于 2018-11-1 06:36 | 显示全部楼层
谢谢楼主~~
回复

使用道具 举报

zhaiman 发表于 2018-11-1 11:01 | 显示全部楼层
好东西,谢谢楼主分享
回复

使用道具 举报

cjx1982 发表于 2018-11-1 11:05 | 显示全部楼层
对于更低的架构(如Sandy Bridge)和更高架构(如Canon Lake以及Coffee Lake),VoodooI2C尚未提供支持。。。。。。。。。。。。。。。。。。
我说我改来改去怎么一点反应都没
回复

使用道具 举报

hellozhangx 发表于 2018-11-1 11:48 来自手机 | 显示全部楼层
昨天升级了10.14.1后 原来在gm和 10.14.1beta1工作正常的voodooi2c失效 2.1.4版本的 看作者5天前提交了新的修改 但还没更新版本 估计也快了
回复

使用道具 举报

xvip4420 发表于 2018-11-1 12:01 | 显示全部楼层
不错的教程,支持支持
回复

使用道具 举报

penghubingzhou  楼主| 发表于 2018-11-1 12:42 | 显示全部楼层
hellozhangx 发表于 2018-11-1 11:48
昨天升级了10.14.1后 原来在gm和 10.14.1beta1工作正常的voodooi2c失效 2.1.4版本的 看作者5天前提交了新的 ...

确实存在这个问题,房间里有反映这个问题
回复

使用道具 举报

StyxFox 发表于 2018-11-1 13:07 | 显示全部楼层
积谷于此,以致四方。
意思是屯田积谷,才能有足够的粮食征战四方。
击鼓是什么鬼?打着鼓走四方吗?
回复

使用道具 举报

xiang473535976 发表于 2018-11-1 13:49 | 显示全部楼层
支持了 技术大贴啊
回复

使用道具 举报

jxou 发表于 2018-11-1 14:08 | 显示全部楼层
支持一个。以后研究一下。
回复

使用道具 举报

penghubingzhou  楼主| 发表于 2018-11-1 15:41 | 显示全部楼层
StyxFox 发表于 2018-11-1 13:07
积谷于此,以致四方。
意思是屯田积谷,才能有足够的粮食征战四方。
击鼓是什么鬼?打着鼓走四方吗?

感谢纠正,已经更改
回复

使用道具 举报

remember_lyl 发表于 2018-11-1 21:44 | 显示全部楼层
谢谢楼主,不过修改设备名称那块咋看不着图呀
回复

使用道具 举报

penghubingzhou  楼主| 发表于 2018-11-1 22:23 来自手机 | 显示全部楼层
remember_lyl 发表于 2018-11-1 21:44
谢谢楼主,不过修改设备名称那块咋看不着图呀

远景问题,刷新下,现在教程还没更新完
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋手机版联系我们

Copyright © 2005-2025 PCBeta. All rights reserved.

Powered by Discuz!  CDN加速及安全服务由「快御」提供

请勿发布违反中华人民共和国法律法规的言论,会员观点不代表远景论坛官方立场。

远景在线 ( 苏ICP备17027154号 )|远景论坛 |Win11论坛 |Win10论坛 |Win8论坛 |Win7论坛 |WP论坛 |Office论坛

GMT+8, 2025-2-19 10:35

快速回复 返回顶部 返回列表