本帖最后由 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
DSDT.aml.zip
(50.94 KB, 下载次数: 570)
。
更新(20111025):修改驱动名为AppleSmartBatteryManger.kext,使得iStat Pro等能够显示电池信息。
更新(20111026):在iStatMenus/Pro中能够正确显示设计容量,在启动电池保养时可显示正确的百分比(目前只对应AppleSmartBatteryManger.kext)。
更新(20111027):在_BIF信息后若追加循环数,则设置指定的循环数(AppleSmartBatteryManger和AppleACPIBatteryManger都进行了更新),另外共享目前最新的源代码。
更新(20120206): 由于以前编译时选择最新的SDK使得在10.7.3下不能使用,这里更新两个驱动。
更新(20130205):修改可能导致操作系统五国或者崩溃的BUG。更新(20130215):加入在电池电量不够时进行提示。
AppleSmartBatteryManager.kext.zip
(35.4 KB, 下载次数: 1176)
AppleACPIBatteryManager.kext.zip
(35.25 KB, 下载次数: 1453)
|