参考资料(必看):
以上三个页面建议打开多个标签页与本教程互相参考
需要准备的软件
0x00 新建DSL文件
保存并且命名为SSDT-BATT.dsl
0x01 反编译原来的 DSDT
参考https://jcstaff.club/2019/DSDT-SSDT-battery/的提取和反编译两个小节来进行提取,不要用MaciASL来提取,因为MaciASL提取到的DSDT会受到Clover/OC的二进制重命名影响,用Clover提取到的是最好的原厂DSDT。
将 DSDT.aml 和 DSDT.dsl 都复制到桌面,在我们要确定如何做二进制更名时需要用到原本的aml文件。
0x02 搜索EC
在DSDT.dsl中搜索「PNP0C09」来找到你的EC,然后再从EC之中寻找所有的Field
... 表示省略了部分代码,下同
OperationRegion (ERAM, EmbeddedControl, Zero, 0xFF)
Field (ERAM, ByteAcc, Lock, Preserve)
{
SMPR, 8,
SMST, 8,
SMAD, 8,
SMCM, 8,
SMD0, 256, //
BCNT, 8,
SMAA, 8,
...
Offset (0x82),
MBST, 8,
MCUR, 16, //
MBRM, 16, //
MBCV, 16, //
FGM1, 8,
FGM2, 8,
FGM3, 8,
Offset (0x8D),
...
}
...
Field (ERAM, ByteAcc, NoLock, Preserve)
{
Offset (0x04),
SMW0, 16 //
}
Field (ERAM, ByteAcc, NoLock, Preserve)
{
Offset (0x04),
SMB0, 8
}
Field (ERAM, ByteAcc, NoLock, Preserve)
{
Offset (0x04),
FLD0, 64 //
}
Field (ERAM, ByteAcc, NoLock, Preserve)
{
Offset (0x04),
FLD1, 128 //
}
Field (ERAM, ByteAcc, NoLock, Preserve)
{
Offset (0x04),
FLD2, 192 //
}
Field (ERAM, ByteAcc, NoLock, Preserve)
{
Offset (0x04),
FLD3, 256 //
}
像这样,把逗号后面数字大于8的变量和他们的Offset记录下来。
Offset怎么计算呢?
我们先看OperationRegion (ERAM, EmbeddedControl, Zero, 0xFF)这一句,括号里面第一个参数是区域名ERAM。
接着我们发现所有的Field里面的第一个参数也都是ERAM,可以确定它们是对同一个内存区域进行操作的,这一块内存区域名为 ERAM。
你的DSDT不一定都是 ERAM,如果出现了其他名字的 Field,请寻找对应的 OperationRegion 来确定它的类型和偏移量
OperationRegion (ERAM, EmbeddedControl, Zero, 0xFF)的第二个参数是EmbeddedControl,这个是操作空间类型,我的是 EmbeddedControl,而有的主板厂商会选择将EC数据映射到内存中,此时类型为 SystemMemory,且第三个参数通常不为零。
第三个参数是Zero,在ASL中 Zero 和 0 等效。此处参数为操作空间的偏移量,也就是Offset,如果不为零的话我们也要把这个参数记录下来。
第四个参数是0xFF,为操作空间的最大大小,此处为 0xFF Byte,化成十进制就是255个字节,不重要。
ok,现在我们知道我们只有一个操作区 ERAM,偏移量为0。
我们从头开始看
{
SMPR, 8,
SMST, 8,
SMAD, 8,
SMCM, 8,
SMD0, 256, //
BCNT, 8,
SMAA, 8,
前面的 SMPR 是变量名,其类型为FieldUnitObj,后面的 8 是长度,单位为 bit。
8 bit,也就是 1 byte。
因此我们可以确定到第一个箭头指向的变量SMD0的偏移量是 (8+8+8+8)/8=