# 修复触控板:手动
# 检查GPI0
本页面假设你已经安装了macOS和IORegistryExplorer (opens new window).
首先要检查GPI0设备是否存在,这是VoodooI2C所需要的。检查它是否正常工作的最好方法是使用IORegistryExplorer。

在这里,我们可以看到VoodooGPIO连接到GPI0,因此不需要对GPI0进行编辑。如果你是这种情况,你可以跳到下一节.
如果VoodooGPIO没有连接,那么你可能需要修改一些值来启用GPI0设备。在这种情况下,您需要在DSDT中找到GPI0设备。
首先打开你的反编译DSDT你从转储DSDT和反编译和编译与MaciASL(如果在macOS)或任何其他文本编辑器,如果在Windows或Linux (VSCode有一个ACPI扩展 (opens new window)也可以帮助)。
接下来搜索Device (GPI0)。你应该得到类似这样的结果:

下面是_STA方法,用于启用或禁用GPI0设备:
Method (_STA, 0, NotSerialized)
{
If ((SBRG == Zero))
{
Return (Zero)
}
If ((GPEN == Zero))
{
Return (Zero)
}
Return (0x0F)
}
我们希望从_STA返回的值非零(在本例中为0x0F)以启用GPI0设备。如果SBRG或GPEN的值为零,则返回零,GPI0将被禁用。一般来说,SBRG不应该被修改,因为修改它会破坏GPI0设备。如果你需要启用GPI0设备,只需要修改GPEN。
下面是更多的例子:

我们关心的是_STA方法:
Method (_STA, 0, NotSerialized)
{
If ((GPHD == One))
{
Return (0x03)
}
Return (0x0F)
}
这里我们想将GPHD设置为Zero,以便返回0x0F。
# 对示例SSDT进行编辑
现在我们知道需要修改哪些变量,让我们获取SSDT并开始工作:
在第一个例子中,我们将GPEN设置为One以允许它在macOS中运行:
// 这可能已经在你下载的SSDT-GPIO中设置好了
If (_OSI ("Darwin"))
{
GPEN = One
}
对于第二个示例,您需要删除GPEN并使用下面的代码:
If (_OSI ("Darwin"))
{
GPHD = Zero
}
此时,您需要通过编译SSDT并将其添加到config.plist中来测试SSDT。VoodooGPIO现在应该连接到GPI0设备,如GPI0部分顶部所示。如果你的触控板在启用GPI0设备后仍然不能工作,请继续下一节。
# 启用触摸板
通常情况下,I2C设备在启用之前会检查它们是否在Windows中运行。与GPI0设备类似,这些设备包含一个_STA方法。
_STA 示例 (可选)

我们关心的部分是_STA方法:
Method (_STA, 0, NotSerialized) // _STA: Status
{
Return (LSTA (SMD1))
}
在这个例子中,_STA指向另一个方法LSTA。如果我们搜索Method (LSTA,我们会看到以下内容:
Method (LSTA, 1, Serialized)
{
If (((Arg0 == 0x00) || (Arg0 == 0x03)))
{
Return (0x00)
}
If (CondRefOf (OSYS))
{
If ((OSYS < 0x07DC))
{
Return (0x00)
}
}
Return (0x0F)
}
取值为OSYS,保存当前操作系统的运行信息。我们需要查找任何设置了OSYS的位置(例如OSYS = 0x07DC)。在这个DSDT中,它被设置在\_SB.PCI0._INI下。如下所示:

对不同版本的Windows有各种各样的检查,但没有对Darwin的检查(苹果的ACPI通常会检查这个)。我们通常希望将OSYS设置为尽可能高的值以启用大多数功能。在本例中,当Windows版本为Windows 2015或Windows 10 (opens new window)时,设置的值最高。这意味着我们应该将OSYS设置为0x07DF。注意,这个值大于0x07DC,这是之前检查的值。如果我们将OSYS设置为0x07DF,那么LSTA中的检查应该返回0x0F。
为这些检查打补丁的最好方法是在SSDT-XOSI中使用_OSI to XOSI。您还可以在I2C设备的范围内设置OSYS,尽管这可能并不总是有效(上面的示例在这里不起作用,因为LSTA不在I2C设备的范围内)。
# _OSI to XOSI
需要以下SSDT和补丁
- SSDT-XOSI.dsl (opens new window) - 如果您需要编辑which versions of Windows the SSDT checks for (opens new window).
- SSDT-XOSI.aml (opens new window) - 预编译
- XOSI 重命名 (添加这个到 ACPI -> Patch in your config.plist):
| Comment | String | Change _OSI to XOSI |
|---|---|---|
| Enabled | Boolean | YES |
| Count | Number | 0 |
| Limit | Number | 0 |
| Find | Data | 5f4f5349 |
| Replace | Data | 584f5349 |
戴尔的机器
您可能需要添加下面的补丁,以允许背光键工作。 请确保此补丁出现在config.plist中之前的_OSI到XOSI补丁的之前 以下补丁由Rehabman提供:
| Comment | String | Change _OSID to XSID (to avoid match against _OSI patch) |
|---|---|---|
| Enabled | Boolean | YES |
| Count | Number | 0 |
| Limit | Number | 0 |
| Find | Data | 4F534944 |
| Replace | Data | 58534944 |
# 创建OSYS变量在I2C范围内
你需要找到检查了OSYS的设备路径,然后在该范围内创建一个新的OSYS变量。这只会改变该范围内设备的ossys,以便更好地控制启用的设备。注意,在上面的例子中,LSTA存在于\_SB.PCI0.LSTA,意味着\_SB.PCI0. 0._INI和\_SB.PCI0.LSTA将控制相同的OSYS变量。如果是这种情况,此方法将不起作用。
If (_OSI("Darwin")) {
Scope (\_SB.PCI0.I2C0) { // I2C0 scope
Name (OSYS, 0x7DF)
}
}
多个Windows版本
Windows在检查Windows的早期版本时也会返回true。例如,Windows 7在"Windows 2000"到"Windows 2009"之间都会返回true,但在此之后的任何版本都不会返回true。这一点很重要,因为一些功能只在早期的Windows检查中启用。例如,新款thinkpad上的DYTC热管理功能只有在检查“Windows 2001”时才能启用。你需要检查你自己的DSDT,看看它设置了什么值,以及它们在哪里被使用。此时,你应该编译SSDT并查看触控板是否工作。
# 进一步设置
如果你需要进一步的帮助让你的触控板工作,那么最好的地方是VoodooI2C的readme (opens new window)
# 结束
完成SSDT后,可以转到下一页完成其余的SSDT,如果准备好了,可以转到此处:
⟵ 修复触摸板 禁用笔记本dGPUs ⟶