积分 75 最后登录 2023-4-8 精华 0 阅读权限 20 主题 4 UID 1522243 帖子 67 PB币 178 威望 8 贡献 0 技术 0 活跃 441
UID 1522243 帖子 67 PB币 178 贡献 0 技术 0 活跃 441
本帖最后由 snowDice 于 2020-3-12 09:03 编辑
最近将T440P由Clover换成OpenCore引导,折腾了下电池的hotpatch补丁制作,现在把方法做个记录。 一、准备工作
1. 在 Clover 引导界面按 F4 提取 DSDT.aml文件 ;
2. 下载 MaciASL ( https://github.com/acidanthera/MaciASL/releases )
3. 下载 OC-little ( https://github.com/daliansky/OC-little/archive/master.zip )(注:本教程来源于此文件夹的电池补丁目录下的 README.md 文件,强烈建议阅读)
二、 hotpatch 补丁制作
1. 用 MaciASL 打开用 Clover 提取到的 DSDT.aml 文件,然后搜索 EmbeddedControl 关键字,如下;
2. 可以发现,EmbeddedControl关键字左侧有ECOR这个词,在DSDT.aml文件中搜索ECOR。然后使用MaciASL新建空白文件,将DSDT.aml文件中所有” Field (ECOR, ByteAcc, NoLock, Preserve){……}”复制到新空白文件,文件后缀名为dsl。
同时,在DSDT.aml文件中查找GBIF和GBST方法,将两个方法的所有内容复制到上文件中。方法的内容是以”{“开始,以”}”结束。
3. 筛选字段
由于苹果使用的 ACPI 规范和 DSDT 解析器与常规 PC 不同,无法读写 ACPI EC 中超过 8 位的 `FieldUnit`(字段单元),导致与电池相关的 `Method`(函数方法)无法正常使用(其中 `_BIF` 获取电池信息,`_BST` 获取电池状态),这时候,我们就需要运用 Hotpatch 方式修补 ACPI 来使 SMC 电池驱动正确传递 ACPI EC 信息给 macOS 来识别电池信息和状态。
在上一步的文件中,分别搜索 GBIF 和 GBST 方法里 SBBM 、 HIID 、 SBFC 等关键词,如下所示,若关键词后的数字大于 8 ,将其记录下来,若小于 8 ,则不用管它。
最后,方法内使用的关键词整理如下:
数字为 16 : SBRC , SBFC , SBAC , SBVO , SBBM , SBDC , SBDV , SBSN ;
数字为 32 : SBCH ;
数字为 128 : SBMN , SBDN ;
对照上述关键词,将含有关键词的 Field (ECOR, ByteAcc, NoLock, Preserve){……} 的内容留下,不含有搜索到关键词的 Field 部分删除。
4. 拆分字段并计算偏移量
在留下的 Field (ECOR, ByteAcc, NoLock, Preserve){……} 内容中进行字段拆分。 OC-little—— 电池补丁——各机型补丁文件夹下后缀名为 dsl 的文件里有具体字段的拆分写法,可以直接复制过来。
例如,16 位的字段可以拆分为:
SBRC, 16 拆分 成 BRCA,8,BRCB,8,
32 位的字段拆分
SBCH, 32 拆分成 BCH0,8,BCH1,8,BCH2,8,BCH3,8
128 位的字段不用拆分。
需要注意的是其中的 Offset ,它表示偏移量,每 8 位进 1 ,以十六进制表示。如果某个 Field 内容中有多个字段需要拆分,需要计算该字段的偏移量。另外,拆分出来的字段如 BRCA 、 BRCB 等需要注意尽量不要与 DSDT.aml 存在重复,否则可能引起错误。
另外,为了避免与原始 DSDT 冲突,将所有 Filed 括号内的 EmbeddedControl 左侧 ECOR关键词 改为 ECR1(改成和ECOR不一样即可) 。最终结果如下:
OperationRegion (ECR1, EmbeddedControl, 0x00, 0x0100) 复制代码 注://后的内容会被注释掉,可以没有。
5. 修改 GBIF 和 GBST 方法内的字段
在 GBIF 和 GBST 这两个方法中,依次修改寻找到的字段。修改的原理可参见README.md文件。
16 位的字段改写方式如:
SBBM 改成 B1B2(BBM0, BBM1)
32 位的字段改写方式如:
SBCH 改成 B1B4(BCH0, BCH1, BCH2, BCH3)
128 位的字段改写方式如:
SBDN 改成 RECB(0xA0,128)
6. 汇总
找到 OC-little—— 电池补丁——说明示例里的 SSDT-BATT.dsl ,用 MaciASL 打开。依据 DSDT.aml 修改文件里的 EC 路径 ,我的路径是(_SB_.PCI0.LPC.EC) 。
然后,将前几步得到的内容复制到 SSDT-BATT.dsl 文件的 EC 括号内,紧挨着大括号。
Scope (_SB.PCI0.LPC.EC)
{
内容复制到这个位置,注意不要覆盖原有的内容
} 复制代码
由于 OpenCore 的 DSDT 补丁会对电脑上所有的系统造成影响,所以需要对 GBIF 和 GBST 方法内部添加 `_OSI` 判断。但由于我们已经有了修改了 GBIF 和 GBST方法 ,为了不影响 windows 下电池信息的获取, 需要将原本的 GBIF 和 GBST 方法重命名,可以重命名为 XBIF 和 XBST 。
修改后形式如下:
Method (GBIF, 0, NotSerialized)
{
If (_OSI ("Darwin"))
{
前几步得到的GBIF方法本来的内容放在这里,mac系统会执行这里的内容。
}
Else
{
Return (\_SB.PCI0.LPC.EC.XBIF(Arg0, Arg1, Arg2)) //Windows系统执行这里的内容,所以是改名后的方法。
} 复制代码
GBST 方法的处理类似,只不过 Return 处改为 Return (\_SB.PCI0.LPC.EC.XBST (Arg0, Arg1, Arg2, Arg3)) 。
另外,为保证 dsl 文件编译通过,需要添加缺失的 obj ,例如:
External(_SB.PCI0.LPC.EC.BATM, MutexObj)
External(_SB.PCI0.LPC.EC.HIID, FieldUnitObj)
External(_SB.PCI0.LPC.EC.XBIF, MethodObj)
External(_SB.PCI0.LPC.EC.XBST, MethodObj)
可以将 SSDT-BATT.dsl 文件里未用到的 W16B 、 WE1B 和 WECB 方法的内容删除,电池的 Hotpatch 补丁就修改好了。使用 [size=18.6667px]MaciASL将其另存为aml文件,放入OC目录下的ACPI文件夹里,并填入配置文件config.plist 的 [size=18.6667px]ACPI-Add处并启用。 配合 OC-little—— 电池补丁文件夹内的更名样本(包括基本更名和 Mutex 置 0 更名),将其填入配置文件config.plist 的ACPI-Patch处并启用, Mac 系统的电池信息就可以正常获取了。 ThinkPad单电池笔记本的电池补丁应该都可以这样来做。
知识有限,如有错误和疏漏处,请多多包涵。
展开阅读全文​
附件:
你需要登录 才可以下载或查看附件。没有帐号?注册
1
查看全部评分