黑苹果启用I2C触控板

黑苹果启用I2C触控板

前言

如果黑苹果里有什么难度的话,休眠和触控板绝对是入门时最难搞定的内容,而触摸板中又以I2C 触摸板最难搞。如果是常规的SMBUS,PS2,直接使用voodoops2 controller 或者 VoodooRMI就搞定了,但是I2C是需要定制SSDT的,相对比较复杂。事不宜迟,动手开干。

触控板的路径

首先在windows 下进入设备管理器,查看I2C HID设备,一般位于人体工程学输入设备栏目下,查看其BIOS设备名称,如下所示,型号可以根据硬件ID看出来是ELAN073D

tpd3

同时到资源页面查看IRQ

irq1024

定制SSDT-XOSI.aml

然后进入macOS,下载SSDTTime 使用SSDTTime.command , 双击运行(如果没有权限,去系统设置 - 隐私与安全性 - 找到提示的内容,点击打开

image-20250708123341835

image-20250708123519930

将之前获取的DSDT文件拖进窗口,自动识别路径

image-20250708123849206

自动选择A 或输入数字序号,根据电脑出厂配置的系统来选,电脑是19年,这里选择了19.

image-20250708124040126

回车生成了SSDT-XOSI.aml 文件,在同级的文件夹下有个results文件夹

image-20250708124317726

同时生成了 patches_OC.plist, 注意将其整合进config.plist中,两个内容

在acpi段中勾选这个SSDT-XOSI.aml 文件,另外一个是在acpi段的补丁中勾选_OSI to XOSI 补丁。

image-20250708124902720

image-20250708124929901

定制SSD-GPI0.aml 以启用GPI0

没有启用前,

image-20250709230525280

打开DSDT查看GPI0相关内容,可以看到如果GPHD为0 的时候,返回0x0F,就启用GPIO了。启用后的情况如下

image-20250709232306465

image-20250709230620490

用maciASL 新建SSDT-GPI0.dsl, 在全局里设置GPHD为0,从而激活GPI0

DefinitionBlock ("", "SSDT", 2, "DRTNIA", "GPI0", 0x00000000)
{
    External (GPHD, FieldUnitObj)
    If (_OSI ("Darwin"))
    {
        GPHD = Zero
    }
}

定制SSDT-TPDX.aml

根据神乐小白的指南

从windows下获取 APIC PIN数值,我这里是SB.PCI0.I2C0.TPD3

资源中是 0x00000400 (1024),由于括号中数字为1024,刚刚好需要制作热补丁(>=1024时需要补丁)。

这里我们的主要有两个工作内容,一个是将原来的TPD3给禁用,另一个则是新建一个TPDX来代替原来的TPD3,以驱动设备。直接在DSDT中改TPD3应该也是可以的。

从原始DSDT.aml文件(可以用SSDTTime获得)中找到TPD3内容,建议在vscode 或者 xcode 进行文字编辑,最后放入macIASL中进行错误排查

文件头可以复制DSDT的,略作修改

image-20250709204306176

external 部分的申明是在编译出现错误时,主要是引用这些变量时发现找不到因此特别申明为外部变量

然后增加 scope内容如下

Scope (_SB.PCI0.I2C0)
    {
            Device(TPDX)
            {
             //将原来TPD3的内容复制到这里进行后续修改
            }
    }

由于这个ACPI文件中已经有了SBFB/SBFG 的定义,我们参考指南直接去掉OSYS关于系统的判断相关内容,我这里有两个相关OSYS内容,注释掉

image-20250709204705616

在Method(_CSR ,,) 这个函数中直接清除其他的内容,保留一句

Return (ConcatenateResTemplate (SBFB, SBFG))

image-20250709205028670

粘贴编辑好的内容到maciASL中进行编译,另存为aml文件,放入EFI/OC/ACPI目录下

定制禁用原设备的SSDT

方法同样,此处只要一个STA函数就行了,最后的内容如下

DefinitionBlock ("", "DSDT", 2, "HPQOEM", "RMTPD3", 0x00000000){
    External (_SB_.PCI0.I2C0.TPD3, DeviceObj)
  External (_SB_.PCI0.I2C0.TPD3.XSTA, MethodObj)
  Scope (_SB.PCI0.I2C0){
        Device (TPD3){
            Method (_STA, 0, NotSerialized)
            {
                If (_OSI ("Darwin")){
                    Return (Zero)
                }
                Else{
                    Return (XSTA())
                }
            }

        }
   }
}

命名这个为 SSDT-RMTPD3.aml

配套这个还需要进行改名,使用HEX Friend 打开DSDT,搜索,点击TEXT,切换成搜索右边的文字,我的路径是TPD3,因此先搜索它,找到对应的位置

image-20250709211215109

这里我们可以看到,当我们选择TPD3时,左边的16进制也相应地被选择了,而我们需要找到TPD3这个设备下的第一个 _STA, 稍微多选一点,复制对应的16进制代码

image-20250709211533916

将_STA 改成XSTA,相应再记录一次 16进制代码

image-20250709211752917

打开config.plist

在acpi段中将SSDT加载进去,在补丁处增加上述的补丁,同时去掉DSDT.aml

image-20250709211945033

image-20250709212111811

使用IORegistery查看发现驱动已经工作GPIO模式

image-20250709232434344

image-20250710142010650

一般的电脑到这里应该就可以驱动I2C触摸板了。

发表回复