本帖最后由 VIVXIX 于 2012-5-17 13:53 编辑
- https://bbs.pcbeta.com/viewthread-935509-1-1.html
复制代码 首先先感谢上面链接提供的电池kext。不过似乎很多人用了会五国(看下面)Y450的请跳到这个帖子
https://bbs.pcbeta.com/viewthread-937628-1-1.html
不过如果使用上面链接提供的AppleACPIBatterManager.kext五国的话
请参照http://www.osx86.net/downloads.php?do=file&id=1498
请换用上面链接上下载的AppleACPIBatterManager.kext
为什么要那么辛苦折腾dsdt,主要是为了不去替换AppleACPIPlatform,
黑苹果完美和原则就是需要尽量少添加第三方kext,用原版的。
我个人还很排斥Voodoo的kext。给我的印象就是五国,五国,五国,还启动慢。
dsdt修改好后,只需下载上面链接里提供的AppleACPIBatterManager.kext,用回原版的AppleACPIPlatform,删除Voodoobattery即可,修复权限,重建缓存什么的。
我的修改方法用到自己写的一个method,发现部分dsdt可能在BAT时需要在其以外修改,因此 我决定把B1B2放到DTGP(修改过dsdt都知道这是什么)后面;也就是下面这样
- Method (DTGP, 5, NotSerialized)
- {
- 省略
- }
- //如果有16bit的才使用来合并拆开的值
- //B1B2(Arg0,Arg1) 把2个8bit合并成16bit, Arg1高8位,Arg0低位,
- Method (B1B2, 2, NotSerialized)
- {
- Or (ShiftLeft(Arg1,0x08), Arg0, Local0)
- Return (Local0)
- }
- //如果有32bit的才使用来合并拆开的值,否则无需添加这个。
- //更高的话也需要这个,下面的 Method (L1L4, 4, NotSerialized)会用到
- //B1B4(Arg0,Arg1Arg2,Arg3) 把4个8bit合并成32bit,Arg3是最高高8位,Arg0是最低低8位
- Method (B1B4, 4, NotSerialized)
- {
- Or (ShiftLeft(Arg1,0x08), Arg0, Local0)
- Or (ShiftLeft(Arg2,0x10), Local0, Local0)
- Or (ShiftLeft(Arg3,0x18), Local0, Local0)
- Return (Local0)
- }
- //如果有128bit的才使用来合并拆开的值,更高的话也需要添加这个,
- //L1L4(Arg0,Arg1Arg2,Arg3) 把4个32bit合并成128bit,Arg3是最高高32位,Arg0是最低低32位
- Method (L1L4, 4, NotSerialized)//32*4=128
- {
- Or (ShiftLeft(Arg1,0x20), Arg0, Local0)
- Or (ShiftLeft(Arg2,0x40), Local0, Local0)
- Or (ShiftLeft(Arg3,0x60), Local0, Local0)
- Return (Local0)
- }
复制代码
(自己原创的,这样修改起来更简洁了) Method (B1B2, 2, NotSerialized) B1B2自己取自1 byte to 2 byte(8位到16位)的缩写 Method (B1B4, 4, NotSerialized) B1B4自己取自1 byte to 4 byte(8位到32位)的缩写 Method (L1L4, 4, NotSerialized) L1L4自己取自1 Long to 4 Long(32位到128位)的缩写 Method (D2D4, 4, NotSerialized) D2D4自己取自2 double to 4doubel(128位到256位)的缩写
在Device (BAT0)或者Device (BAT1)里(具体是0还是1,自己从IORegisterExplorer搜索BAT查看) 如下面这些,都在Method (_BIF 和Method (_BST里读取了, (有的人的Method (_BIF 和Method (_BST非常简洁,实际是里面再调用别的 Method ,如有的ECG9() ,UPBI()、IVBI()、IVBI()、UPBS()、IVBS() 、IVBS() 诸如此类的调用, 就再搜索 ,寻找要修改的16bit值,实际最终修改方法还是类似的。 具体你得每一个搜索一下,不断next来查看它出现的所有位置, 若是定义成16bit,就需要拆开若是则需要拆成两个8bit的; 这只是我的是如此,不同机子,名字具体的名字是不一样的。 - //BPV0, 16,
- //BDC0, 16,
- //BFC0, 16,
- //BAC0, 16,
复制代码
上面这些都发现出现在 在Device (EC0) 的 (ERAM, ByteAcc, Lock, Preserve)下(个人自己的得具体看) 要拆成两个8bit的;注一律改B为S,避免冲突(//是注释掉原来的) - //BPV0, 16,
- SPV0, 8,
- SPV1, 8,
- //BDC0, 16,
- SDC0, 8,
- SDC1, 8,
- //BFC0, 16,
- SFC0, 8,
- SFC1, 8,
- //BAC0, 16,
- SAC0, 8,
- SAC1, 8,
复制代码具体形式的修改例子,你的dsdt里不一定出现这样的形式,只是给个参考 ,注意我都用到了我前面自己增加的一个方法 Method (B1B2,Method (B1B4,Method (B4BF 里面的参数顺序不能乱,参见前面。 (一)常见的 1.Store (^^EC0.BAC0, Local5) - //Store (^^EC0.BAC0, Local5)
- Store (B1B2(^^EC0.SAC0,^^EC0.SAC1), Local5)
复制代码2.Store (^^EC0.BDC0, Index (STAT, One)) (很多人是这种形式的) - //Store (^^EC0.BDC0, Index (STAT, One))
- Store (B1B2(^^EC0.SDC0,^^EC0.SDC1), Index (STAT, One))
复制代码 3.Multiply (BGU1, BFC1 ,Local2)- //Multiply (BGU1, BFC1 ,Local2)
- Multiply (BGU1, B1B2 (BFC0, BFC1), Local2)
复制代码
(二)特殊的 3.If (^^EC0.BDC0 ) - //If (^^EC0.BDC0 )
- If (B1B2(^^EC0.SDC0,^^EC0.SDC1))
复制代码
4.If (LGreater (^^EC0.BAC0, 0xFB00))
- //If (LGreater (^^EC0.BAC0, 0xFB00))
- If (LGreater (B1B2(^^EC0.SAC0,^^EC0.SAC1), 0xFB00)
复制代码
5.Store (^^EC0.BDC0, BFC1) 这个更特殊,^^EC0.BDC0和BFC1都是16bit的,因此需要同时处理- //Store (^^EC0.BDC0, BFC1)
- Store (^^EC0.SDC1, BFC1)
- Sleep (0x14)
- Store (^^EC0.SDC0, BFC0)
复制代码
上面只是一些你可能遇到需要修改的形式,下面才是我自己的完整修改例子。
但不同机子,dsdt里的修改的具体名字是有区别的,方法是类似的。所以仅供参考。 (一)Method (_BIF 下 0.BFC1
要特别拿出来说 Store (^^EC0.BDC0, BFC1)搜索BFC1会发现它的定义似乎有两个地方,一个EC0下和下面提到的一样, 但仔细会发现这个Store (^^EC0.BDC0, BFC1)里的BFC1并不是EC0下的,否则应该用^^EC0.BFC1来访问 而另一处在Field (GNVS, AnyAcc, Lock, Preserve)下,这才是要修改的地方。 - //BFC1, 16,
- BFC0, 8,
- BFC1, 8,
- //Store (^^EC0.BDC0, BFC1)(这个同时要改BDC0)
- Store (^^EC0.SDC1, BFC1)
- Sleep (0x14)
- Store (^^EC0.SDC0, BFC0)
- //If (BFC1)
- If (B1B2(BFC0,BFC1))
- // Multiply (BGU1,BFC1, Local2)
- Multiply (BGU1, B1B2(BFC0,BFC1), Local2)
复制代码
1.BFC0 - //BFC0, 16,
- SFC0, 8
- SFC1, 8,
- //Store (^^EC0.BFC0, Local0)
- Store (B1B2(^^EC0.SFC0,^^EC0.SFC1), Local0)
- //Store (^^EC0.BFC0, Local2)
- Store (B1B2(^^EC0.SFC0,^^EC0.SFC1), Local2)
复制代码
2.BDC0- //BDC0, 16,
- SDC0, 8,
- SDC1, 8,
- Store (^^EC0.SDC1, BFC1)
- Sleep (0x14)
- Store (^^EC0.SDC0, BFC0)
复制代码
(二)Method (_BST1.BPV0 - //BPV0, 16,
- SPV0, 8,
- SPV1, 8,
- //Store (^^EC0.BPV0, Local3)
- Store (B1B2(^^EC0.SPV0,^^EC0.SPV1), Local3)
复制代码
2.BAC0 - //BAC0, 16,
- SAC0, 8,
- SAC1, 8,
- //If (LGreater (^^EC0.BAC0, 0xFB00))
- If (LGreater (B1B2(^^EC0.SAC0,^^EC0.SAC1), 0xFB00))
- //Store (^^EC0.BAC0, Local5)
- Store (B1B2(^^EC0.SAC0,^^EC0.SAC1), Local5)
复制代码
原版10.7.2用的1.4版AppleACPIPlatform.kext
AppleACPIPlatform.kext.zip
(441.84 KB, 下载次数: 658)
成功的例子
0.DefinitionBlock ("dsdt.aml", "DSDT", 2, "LENOVO", "CB-01 ", 0x00000001)
dsdt.aml.zip
(11.91 KB, 下载次数: 460)
我自己使用的
1.DefinitionBlock ("dsdt.aml", "DSDT", 1, "HPQOEM", "SLIC-MPC", 0x00000001)
dsdt.aml.zip
(18.13 KB, 下载次数: 113)
2.efinitionBlock ("dsdt.aml", "DSDT", 1, "ACRSYS", "ACRPRDCT", 0x00000001)
dsdt.aml.zip
(16.78 KB, 下载次数: 74)
3.DefinitionBlock ("dsdt.aml", "DSDT", 2, "LENOVO", "CB-01 ", 0x00000001)
dsdt.aml.zip
(11.72 KB, 下载次数: 81)
4.DefinitionBlock ("dsdt.aml", "DSDT", 2, "INTEL ", "CRESTLNE", 0x06040000)
dsdt.aml.zip
(11.37 KB, 下载次数: 55)
5.DefinitionBlock ("dsdt.aml", "DSDT", 2, "LENOVO", "CB-01 ", 0x06040000)
dsdt.dsl.zip
(33.24 KB, 下载次数: 157)
这个Y450的,已经验证有效果了,转到我单独发的另一个帖子https://bbs.pcbeta.com/viewthread-937628-1-1.html
6.gateway nv57 miziho 328楼上传
dsdt.zip
(17.87 KB, 下载次数: 38)
请换用上面链接上下载的AppleACPIBatterManager.kext
|