- 积分
- 106
- 最后登录
- 2024-3-4
- 精华
- 0
- 阅读权限
- 20
- 主题
- 7
- UID
- 4807766
- 帖子
- 159
- PB币
- 192
- 威望
- 7
- 贡献
- 0
- 技术
- 0
- 活跃
- 230
- UID
- 4807766
- 帖子
- 159
- PB币
- 192
- 贡献
- 0
- 技术
- 0
- 活跃
- 230
|
发表于 2016-9-8 21:17:17
IP属地香港
|显示全部楼层
本帖最后由 hhwzhd 于 2016-9-11 13:15 编辑
先看第一个例子,DSDT/SSDT可以在二楼网盘下载。
先删除x.aml结尾的SSDT,然后用上面的命令反编译生成dsl文件。然后找_OFF函数在哪个文件发现在SSDT-9.dsl文件,打开SSDT-9.dsl发现有三个_OFF方法,不过我们需要的是显卡的_OFF,一般在PEGP下面- Scope (\_SB.PCI0.PEG0.PEGP)
- {
- ......
- Method (_OFF, 0, Serialized) // _OFF: Power Off
- {
- P8XH (Zero, 0x76)
- If (LEqual (CTXT, Zero))
- {
- Store (VGAR, VGAB)
- Store (One, CTXT)
- }
- SGOF ()
- }
- }
复制代码 我们需要移除_OFF对EC的依赖,可以看到_OFF本身没有出现包含EC的代码,但是仍然需要看_OFF所调用的方法有没有对EC的依赖。首先看P8XH,Command+F寻找没有发现P8XH的定义,所以在其他文件,在终端输入命令发现P8XH在DSDT.dsl也出现过,打开DSDT发现P8XH的定义- Method (P8XH, 2, Serialized)
- {
- If (LEqual (Arg0, Zero))
- {
- Store (Or (And (P80D, 0xFFFFFF00), Arg1), P80D)
- }
- If (LEqual (Arg0, One))
- {
- Store (Or (And (P80D, 0xFFFF00FF), ShiftLeft (Arg1, 0x08)), P80D)
- }
- If (LEqual (Arg0, 0x02))
- {
- Store (Or (And (P80D, 0xFF00FFFF), ShiftLeft (Arg1, 0x10)), P80D)
- }
- If (LEqual (Arg0, 0x03))
- {
- Store (Or (And (P80D, 0x00FFFFFF), ShiftLeft (Arg1, 0x18)), P80D)
- }
- Store (P80D, P80H)
- }
复制代码 可以发现没有对EC的依赖(LEqual相等,Or,And逻辑运算,Store赋值,ShiftLeft,ShiftRight位运算,这些方法是不用继续检查的)
回到_OFF方法,发现还调用了一个SGOF方法,在SSDT-8.dsl找到SGOF的定义- Method (SGOF, 0, Serialized)
- {
- Store (LCTL, ELCT)
- Store (SVID, HVID)
- Store (SDID, HDID)
- Store (EMLW, DMLW)
- SPP0 ()
- Store (One, LNKD)
- While (LNotEqual (LNKS, Zero))
- {
- Sleep (One)
- }
- Store (Zero, \_SB.PCI0.LPCB.EC.FDAT)
- Store (0xBF, \_SB.PCI0.LPCB.EC.FCMD)
- Sleep (0x012C)
- Return (Zero)
- }
复制代码 发现它本身有对EC的依赖- Store (Zero, \_SB.PCI0.LPCB.EC.FDAT)
- Store (0xBF, \_SB.PCI0.LPCB.EC.FCMD)
复制代码 然后继续看SGOF调用的SPPO(这里就不贴出来了),没有发现对EC的依赖,所以我们只要移除这两行就行了。
修改后的SGOF- Method (SGOF, 0, Serialized)
- {
- Store (LCTL, ELCT)
- Store (SVID, HVID)
- Store (SDID, HDID)
- Store (EMLW, DMLW)
- SPP0 ()
- Store (One, LNKD)
- While (LNotEqual (LNKS, Zero))
- {
- Sleep (One)
- }
- Sleep (0x012C)
- Return (Zero)
- }
复制代码 然后需要找到_INI方法,发现也在SSDT-8.dsl- Method (_INI, 0, NotSerialized) // _INI: Initialize
- {
- Store (Zero, \_SB.PCI0.PEG0.PEGP._ADR)
- }
复制代码 加入调用_OFF的代码后- Method (_INI, 0, NotSerialized) // _INI: Initialize
- {
- Store (Zero, \_SB.PCI0.PEG0.PEGP._ADR)
- External (\_SB.PCI0.PEG0.PEGP._OFF, MethodObj)
- _OFF()
- }
复制代码 因为_OFF和_INI不在同一个文件,所以需要加上External声明。
移除了_OFF对EC的依赖并且在_INI调用了_OFF后,需要在_REG方法执行移除的代码
在DSDT中发现有好几个_REG方法,不过我们需要的是Device EC下面的_REG- Scope (_SB.PCI0.LPCB)
- {
- Device (EC)
- {
- // 省略若干行
- Method (_REG, 2, NotSerialized) // _REG: Region Availability
- {
- If (LAnd (LEqual (Arg0, 0x03), LEqual (Arg1, One)))
- {
- If (And (OEMF, One))
- {
- // 省略若干行
- }
- }
- }
复制代码 在_REG加入从SGOF移除的代码- Scope (_SB.PCI0.LPCB)
- {
- Device (EC)
- {
- // 省略若干行
- Method (_REG, 2, NotSerialized) // _REG: Region Availability
- {
- If (LAnd(LEqual(Arg0,3), LEqual(Arg1,1))){
- // 把从SGOF移除的代码放在这个{}里面
- Store (Zero, \_SB.PCI0.LPCB.EC.FDAT)
- Store (0xBF, \_SB.PCI0.LPCB.EC.FCMD)
- }
- If (LAnd (LEqual (Arg0, 0x03), LEqual (Arg1, One)))
- {
- If (And (OEMF, One))
- {
- // 省略若干行
- }
- }
- }
复制代码 其中- If (LAnd(LEqual(Arg0,3), LEqual(Arg1,1))){
- Store (Zero, \_SB.PCI0.LPCB.EC.FDAT)
- Store (0xBF, \_SB.PCI0.LPCB.EC.FCMD)
- }
复制代码 是指第一个参数Arg0等于3,并且第二个参数Arg1等于1时(在_INI之后),执行{}里面的两行代码。
好了,我们已经完成了所有应该做的修改,然后要把修改过的DSDT.dsl和SSDT-8.dsl重新编译成aml文件
然后把编译好的DSDT.aml和SSDT-8.aml放进Clover的patched文件夹,并且把其他没有修改过的SSDT0.aml,SSDT1.aml,SSDT2.aml,SSDT6.aml,SSDT7.aml,SSDT9.aml也放进patched文件夹,config.plist配置DropOEM=true,重启进入系统后系统信息->显卡里面就没有独显的信息了。
这个例子是一个很典型的例子,有_INI和_OFF方法,_OFF方法包含对EC的依赖,所以写的比较详细。之后的例子就不会在包括类似如何找_INI,_OFF方法,如何编译dsl为aml的步骤了。
下面是把上述修改做成的补丁- # DSDT.dsl
- into method label _REG parent_hid PNP0C09 code_regex ([\s\S]*) replace_matched
- begin
- If (LAnd(LEqual(Arg0,3), LEqual(Arg1,1)))\n
- {\n
- Store (Zero, \\_SB.PCI0.LPCB.EC.FDAT)\n
- Store (0xBF, \\_SB.PCI0.LPCB.EC.FCMD)\n
- }\n
- %1
- end;
- # SSDT-8.dsl
- into method label _INI insert
- begin
- External (\_SB_.PCI0.PEG0.PEGP._OFF, MethodObj)\n
- _OFF()\n
- end;
- into method label SGOF code_regex .*EC.* removeall_matched;
复制代码 这样如果以后要改DSDT/SSDT直接打个补丁就行了,不用每次都手动修改。 |
附件: 你需要登录才可以下载或查看附件。没有帐号?注册
-
1
查看全部评分
-
|