黑苹果启用I2C触控板
前言
如果黑苹果里有什么难度的话,休眠和触控板绝对是入门时最难搞定的内容,而触摸板中又以I2C 触摸板最难搞。如果是常规的SMBUS,PS2,直接使用voodoops2 controller 或者 VoodooRMI就搞定了,但是I2C是需要定制SSDT的,相对比较复杂。事不宜迟,动手开干。
触控板的路径
首先在windows 下进入设备管理器,查看I2C HID设备,一般位于人体工程学输入设备栏目下,查看其BIOS设备名称,如下所示,型号可以根据硬件ID看出来是ELAN073D
同时到资源页面查看IRQ
定制SSDT-XOSI.aml
然后进入macOS,下载SSDTTime 使用SSDTTime.command , 双击运行(如果没有权限,去系统设置
- 隐私与安全性
- 找到提示的内容,点击打开
)
将之前获取的DSDT文件拖进窗口,自动识别路径
自动选择A 或输入数字序号,根据电脑出厂配置的系统来选,电脑是19年,这里选择了19.
回车生成了SSDT-XOSI.aml 文件,在同级的文件夹下有个results
文件夹
同时生成了 patches_OC.plist, 注意将其整合进config.plist中,两个内容
在acpi段中勾选这个SSDT-XOSI.aml
文件,另外一个是在acpi段的补丁中勾选_OSI to XOSI 补丁。
定制SSD-GPI0.aml 以启用GPI0
没有启用前,
打开DSDT查看GPI0相关内容,可以看到如果GPHD为0 的时候,返回0x0F,就启用GPIO了。启用后的情况如下
用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的,略作修改
external 部分的申明是在编译出现错误时,主要是引用这些变量时发现找不到因此特别申明为外部变量
然后增加 scope内容如下
Scope (_SB.PCI0.I2C0)
{
Device(TPDX)
{
//将原来TPD3的内容复制到这里进行后续修改
}
}
由于这个ACPI文件中已经有了SBFB/SBFG 的定义,我们参考指南直接去掉OSYS关于系统的判断相关内容,我这里有两个相关OSYS内容,注释掉
在Method(_CSR ,,) 这个函数中直接清除其他的内容,保留一句
Return (ConcatenateResTemplate (SBFB, SBFG))
粘贴编辑好的内容到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,因此先搜索它,找到对应的位置
这里我们可以看到,当我们选择TPD3时,左边的16进制也相应地被选择了,而我们需要找到TPD3这个设备下的第一个 _STA, 稍微多选一点,复制对应的16进制代码
将_STA 改成XSTA,相应再记录一次 16进制代码
打开config.plist
在acpi段中将SSDT加载进去,在补丁处增加上述的补丁,同时去掉DSDT.aml
使用IORegistery查看发现驱动已经工作GPIO模式
一般的电脑到这里应该就可以驱动I2C触摸板了。