zenglg1977 发表于 2011-10-24 21:00

Lion下的新版AppleACPIBatteryManager/AppleSmartBatteryManager

本帖最后由 zenglg1977 于 2013-2-15 18:14 编辑

针对Lion的笔记本电池不能取得电池信息的问题,经过查阅和参考其他人的分析,发现我的笔记本(Acer 3820TG)中的设备BAT0读取设备信息和状态的函数_BIF和_BST存在多字节读取的问题,因此导致设备信息读取失败,为此我把其中读取多字节的地方修改成单字节读取,这样通过VoodooBattery就可以显示电池信息了。不过,我个人喜欢AppleACPIBatterManager,因此我编译了一个Lion下的AppleACPIBatterManager,桌面可以显示电池信息,但遗憾的是通过System Profiler查看电源信息失败。今天修改了这部分的代码,现在通过System Profiler也可以查看电池信息了。参见下图。


补充,我是通过修改BAT的DSDT代码,然后使用这个进行显示的。如果直接使用这个驱动不能显示,就说明BAT的DSDT代码有问题,解决方法有两种:要么修改DSDT,要么替换旧版的AppleACPIPlatform等。

DSDT修改方法:我笔记本DSDT中的_BIF会调用GBIF,而函数GBIF中存在着如下等语句:
Multiply (BSDC, 0x0A, Local1)或者Store (BSDC, Local1)
而BSDC的定义如下所示,
      Field (RAM, ByteAcc, Lock, Preserve)
      {
                  Offset (0xE0),
            BSDC,   16,
            BSDV,   16,
            BSSN,   16
      }
从中可以看出BSDC占16位,也就是两个字节,所以Multiply (BSDC, 0x0A, Local1)存在一次读两字节的问题,这个在Lion中是不允许的。因此,你就必须把它拆分成两个8位的读取就可以了。

修改方法如下:
1)把定义重新拷贝一份,然后重新定义,如下所示:
       Field (RAM, ByteAcc, Lock, Preserve)
      {
                  Offset (0xE0),
            SDC0,   8,
            SDC1,   8,
            SDV0,   8,
            SDV1,   8,
            SSN0,   8,
            SSN1,   8
      }
2) 修改数据的读取方法
把Multiply (BSDC, 0x0A, Local1)修改为如下:
Multiply (SDC1, 0x100, Local1)
Add (SDC0, Local1, Local1)
Multiply (Local1, 0x0A, Local1)
也就是高位字节乘0x100,然后加低位字节;
把Store (BSDC, Local1)修改为
Multiply (SDC1, 0x100, Local1)
Add (SDC0, Local1, Local1)

对于大于2个字节的字符串最好的方式是直接修改成常量,然后把相关的设置代码删除,如电池的序列号和电池类型等。
可参考我的DSDT。
更新(20111025):修改驱动名为AppleSmartBatteryManger.kext,使得iStat Pro等能够显示电池信息。
更新(20111026):在iStatMenus/Pro中能够正确显示设计容量,在启动电池保养时可显示正确的百分比(目前只对应AppleSmartBatteryManger.kext)。
更新(20111027):在_BIF信息后若追加循环数,则设置指定的循环数(AppleSmartBatteryManger和AppleACPIBatteryManger都进行了更新),另外共享目前最新的源代码。
更新(20120206): 由于以前编译时选择最新的SDK使得在10.7.3下不能使用,这里更新两个驱动。
更新(20130205):修改可能导致操作系统五国或者崩溃的BUG。更新(20130215):加入在电池电量不够时进行提示。

达芬奇密码 发表于 2011-10-24 21:04

ok thank you LZ

ldflmh123 发表于 2011-10-24 21:20

留名备用,试试看

wuzhengxian 发表于 2011-10-24 21:36

其他本本可以用么?

zenglg1977 发表于 2011-10-24 21:39

wuzhengxian 发表于 2011-10-24 21:36 static/image/common/back.gif
其他本本可以用么?

通用的,不限制

ajarod 发表于 2011-10-24 21:46

谢谢,我来试试看!

siriusalive 发表于 2011-10-24 21:47

哇撒。。我的DSDT中没有BAT0 。。。好像电池的信息都在BAT1中。。。不知道可不可用。。
不管能不能用。。。楼主都威武!

liangyu147258 发表于 2011-10-24 21:57


谢谢,我ye来试试看

zhouhsc_cnn 发表于 2011-10-24 21:58

上次用一个AppleACPIBatteryManager 五国了,这个不知道会不会五国。

honglau 发表于 2011-10-24 22:00

非常感谢,马上试下。。。。谢谢楼主。

xiaobangdelei 发表于 2011-10-24 22:02

本帖最后由 xiaobangdelei 于 2011-10-24 22:05 编辑

感谢楼主分享,我也比较喜欢appleacpibattery!另外有个重点问题,要不要替换老版本的appleacpiplatform??

heliansky 发表于 2011-10-24 22:06

感谢楼主

frogwawa 发表于 2011-10-24 22:07

我要试试看我也是ACER得本本啊

zenglg1977 发表于 2011-10-24 22:16

xiaobangdelei 发表于 2011-10-24 22:02 static/image/common/back.gif
感谢楼主分享,我也比较喜欢appleacpibattery!另外有个重点问题,要不要替换老版本的appleacpiplatform?? ...

我是通过修改BAT0的DSDT然后直接使用这个就可以了。如果不修改DSDT,可能会出现ACPI读取失败,这时就需要替换appleacpibattery。

honglau 发表于 2011-10-24 22:19

zenglg1977 发表于 2011-10-24 22:16 static/image/common/back.gif
我是通过修改BAT0的DSDT然后直接使用这个就可以了。如果不修改DSDT,可能会出现ACPI读取失败,这时就需要 ...

能否贴出修改的代码和方法?谢 谢了。。

xiaobangdelei 发表于 2011-10-24 22:20

zenglg1977 发表于 2011-10-24 22:16 static/image/common/back.gif
我是通过修改BAT0的DSDT然后直接使用这个就可以了。如果不修改DSDT,可能会出现ACPI读取失败,这时就需要 ...

也就是还得修改dsdt或者替换appleacpiplatrom?那麻烦请楼主把dsdt的修改方法贴到主帖里面吧!

gzqboy 发表于 2011-10-24 22:40

同是3820TG,留着备用

siriusalive 发表于 2011-10-24 22:42

求楼主的dsdt修改方法。。。。
我的电池信息是在bat1中,是否影响呢?

viva73 发表于 2011-10-24 23:08

楼主威武...

z6will 发表于 2011-10-24 23:54

能分享source么?
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: Lion下的新版AppleACPIBatteryManager/AppleSmartBatteryManager