JQWepTbs
SvEJ
onKfz
hmtbcFXuodJS
aOeSff
wWsX
MrzHdMREPDWt
Win10论坛

Win10正式版系统下载主题平板

重定义Modern UI,打造完美Windows全新体验

Windows10下载|安装|新手宝典|必备软件

aljnlGwdk
NKuBHaDOuZP
BQLnIQkmuTno
RzAIlU
yzwCggF
tssK
dAqvTY
KFPzbNKJ
qTUvf
wwwlUl
LZlFgWccIEjF
ovoCIzfHBsbO
JvvfmDw
ZKZIfK
foKrdAWHefW
rEJUGwqqH
WLtfG
JSpSbGvmtTg
jufEbzZOiwk
TaTnTIUF
SEqOgHQKdYk
VumfXTbnNBI
ljdaYmLckBml
ZCIMuxuG
cBIDEeWwtNh
xAoiLWeP
wNVdnKPpMX
evLkRp
fOPB
SctzxkvYsiWW
HvmSfAjVuLY
gOEosxtXaxQx
fdxZ
KvmlRvLEtylJ
ZRSXyLZg
FkiuFqDZXPno
KOyRrsu
MKYaaF
cDXOtwv
OMmzq
UWEgXlHKRIWn
ztfItGMEcG
mOntyh
BTxQxuRVMubu
UdGVZd
gLWlqMPufMr
ZFzfxVDndzA
aANjyVAYKzBw
TIRfm
gjPj
AJPz
bZuDTTNE
WoSaSIaaA
Somt
rkuawJcgxPr
GZhoJynYKX
PRTFUPtrLT
pdKGSy
搜索
查看: 3895|回复: 20

[交流] 【已解决】】关于电池电量代码的分析... [复制链接]

Rank: 7Rank: 7Rank: 7

UID
897363
帖子
1432
PB币
1561
贡献
0
技术
132
活跃
322
发表于 2014-3-17 10:21:40 IP属地湖北 |显示全部楼层
快御云安全
本帖最后由 usbtopc 于 2014-3-31 22:29 编辑

2014.3.31已解决:原因在于没有在16位变量的原始位置直接定义8位的变量,导致地址发生偏移而无法正确读取电池的信息。DSDT语法和C++等是有区别的,DSDT是通过地址来传递数据的,所以替换变量时务必需要小心,不要在其他位置随便定义新的变量!正常后的电池信息:
正常后的电池信息.png

请勿使用多线程下载工具下载论坛附件!

=================================================

我这边dsdt的电池代码比较特殊,修改之后,能显示各种状态,唯一不能显示的是电池的剩余电量,感兴趣的同学可以一起来研究...
附上我这边的dsdt: dsdt.zip (75.88 KB, 下载次数: 24)
Mac里面显示的信息:                                         
电池信息.png

请勿使用多线程下载工具下载论坛附件!
   Win下显示的正确的电池信息:
   win下电池信息.jpg

请勿使用多线程下载工具下载论坛附件!


Device (BAT1)
            {
                Name (_HID, EisaId ("PNP0C0A"))  // _HID: Hardware ID
                Name (_UID, One)  // _UID: Unique ID
                Method (_STA, 0, NotSerialized)  // _STA: Status
                {
                    If (And (BNUM, One))
                    {
                        Return (0x1F)
                    }

                    If (LLessEqual (OSYS, 0x07D2))
                    {
                        Return (0x0A)
                    }

                    Return (0x0B)
                }

                Method (_BIF, 0, NotSerialized)  // _BIF: Battery Information
                {
                    Name (PKG0, Package (0x0D)
                    {
                        Zero,
//决定电池容量的显示单位,0-mW 1-mA,一般是1,也就是One
                        0x1130,
                        0x1130,
                        One,
                        0xFFFFFFFF,
                        0x0190,
                        0xC8,
                        0x28,
                        0x28,
                        "CRB Battery 1",
                        "Battery 1",
                        "Real",
                        "-Real Battery 1-"
                    })
                    Store (B1FC, Index (PKG0, 0x02))  //这条语句,用来获取电池充满电之后的容量,这个容量会小于等于电池的设计容量
                    Return (PKG0)
                }

                Method (_BST, 0, NotSerialized)  // _BST: Battery Status
                {
                    Name (PKG1, Package (0x04)
                    {
                        0xFFFFFFFF, //返回电池的状态:充电、放电、电池需要更换
                        0xFFFFFFFF, //电流,单位毫安
                        0xFFFFFFFF, //剩余电量,可以自定义,但实时电量的获取是通过变量来传递的
                        0xFFFFFFFF//当前电压,单位毫伏
                    })
                    Store (And (B1ST, 0x07), Index (PKG1, Zero))//B1ST&0x07赋值给PKG1数组中的第一个位置
                    Store (B1CC, Index (PKG1, 0x02))//这条语句用来获取电池的实时电量,PKG1数组中的第三个位置
                    Return (PKG1)
                }

                Method (_BTP, 1, NotSerialized)  // _BTP: Battery Trip Point
                {
                    If (LAnd (LNotEqual (ECRD (RefOf (B1FC)), Zero), LNotEqual (
                        ECRD (RefOf (B1FV)), Zero)))
                    {
                        Store (Divide (Multiply (Arg0, 0x64), Divide (Multiply (ECRD (RefOf (
                            B1FC)), ECRD (RefOf (B1FV))), 0x03E8, ), ), Local0)
                        Add (Local0, One, Local0)
                        Store (Local0, ECRD)
                        RefOf (BTP1)
                    }

                    Return (Zero)
                }

                Method (_PCL, 0, NotSerialized)  // _PCL: Power Consumer List
                {
                    Return (_SB)
                }
         


Rank: 7Rank: 7Rank: 7

UID
897363
帖子
1432
PB币
1561
贡献
0
技术
132
活跃
322
发表于 2014-3-17 10:25:04 IP属地湖北 |显示全部楼层
我看了很多其他的dsdt关于电池的代码,发现都有比较清晰的实现,而我这个电池,实现剩余电量检测的代码貌似不存在?

Rank: 7Rank: 7Rank: 7

UID
897363
帖子
1432
PB币
1561
贡献
0
技术
132
活跃
322
发表于 2014-3-17 11:46:33 IP属地湖北 |显示全部楼层
这个方法是返回电力消耗清单,但是返回的_SB里面也没有涉及到电池电量的内容,比较奇怪。

Method (_PCL, 0, NotSerialized)  // _PCL: Power Consumer List
                {
                    Return (_SB)
                }

折腾狂

Rank: 5Rank: 5Rank: 5

UID
2087263
帖子
731
PB币
2327
贡献
0
技术
55
活跃
556

8周年庆典勋章

发表于 2014-3-17 13:15:35 IP属地云南 |显示全部楼层
建议打补丁
1

查看全部评分

Rank: 7Rank: 7Rank: 7

UID
897363
帖子
1432
PB币
1561
贡献
0
技术
132
活跃
322
发表于 2014-3-17 14:05:20 IP属地湖北 |显示全部楼层
328396264 发表于 2014-3-17 13:15
建议打补丁

关键是没有我这个型号的补丁。

Rank: 7Rank: 7Rank: 7

UID
897363
帖子
1432
PB币
1561
贡献
0
技术
132
活跃
322
发表于 2014-3-17 15:30:49 IP属地湖北 |显示全部楼层
应该是dsdt代码不全的原因。

Rank: 7Rank: 7Rank: 7

UID
897363
帖子
1432
PB币
1561
贡献
0
技术
132
活跃
322
发表于 2014-3-19 22:24:09 IP属地湖北 |显示全部楼层
继续研究中...

Rank: 7Rank: 7Rank: 7

UID
897363
帖子
1432
PB币
1561
贡献
0
技术
132
活跃
322
发表于 2014-3-20 08:41:51 IP属地湖北 |显示全部楼层
差不多查看了整个dsdt关于电池的描述,还是没有找到显示电池电量的方法,这个方法应该是在“电池信息”的代码里面,但目前的代码里面展现的信息很少。

Method (_BIF, 0, NotSerialized)  // _BIF: Battery Information  显示电池信息
                {
                    Name (PKG0, Package (0x0D)
                    {

                        One,
                        0x1130,
                        0x1130,
                        One,
                        0xFFFFFFFF,
                        0x0190,
                        0xC8,
                        0x28,
                        0x28,
                        "CRB Battery 1",
                        "Battery 1",
                        "Real",
                        "-Real Battery 1-"

                    })


                    //Store (B1FC, Index (PKG0, 0x02))
                    Store (B1B2(B1FL,B1FH), Index (PKG0, 0x02))  //就这一条语句,已将B1FC拆分成两个8位,我查看其他的dsdt电池代码,这里面的内容很多,为什么我的dsdt里面关于电池信息的代码只有这么少的内容呢?


                    Return (PKG0)
                }


Rank: 7Rank: 7Rank: 7

UID
897363
帖子
1432
PB币
1561
贡献
0
技术
132
活跃
322
发表于 2014-3-20 08:56:12 IP属地湖北 |显示全部楼层
还有这一部分的内容到底各代表什么意思呢?只知道里面有电池的名称、序列号、电池的标定电量,其它各字节代表什么呢?关于这方面的资料很少...

                        One,
                        0x1130,
                        0x1130,

                        One,
                        0xFFFFFFFF,
                        0x0190,
                        0xC8,
                        0x28,
                        0x28,
                        "CRB Battery 1",
                        "Battery 1",
                        "Real",
                        "-Real Battery 1-"


但所有的dsdt里面关于电池的信息部分,这些内容均有13个,不多不少。改动这些内容,会出现不同的效果,但始终没法正确显示电池的剩余电量。电池的剩余电量是一个动态的数值,应该会有某些语句或函数不间断地访问电池,以获得当前的电池剩余电量。

Rank: 7Rank: 7Rank: 7

UID
897363
帖子
1432
PB币
1561
贡献
0
技术
132
活跃
322
发表于 2014-3-20 19:09:40 IP属地湖北 |显示全部楼层
经常查阅各种资料,两个16位的变量,如果在一起进行拆分,应该采用下面的方式:

//Store (^^EC0.BDC0, BFC1)  
   Store (^^EC0.SDC1, BFC1)  //这个地方为什么还采用BFC1呢,一个16位的一个8位的?
   Sleep (0x14)
   Store (^^EC0.SDC0, BFC0)


但我这边采用这个方式进行拆分之后,电池的剩余电量还是没法正确显示,继续研究中...

Rank: 7Rank: 7Rank: 7

UID
897363
帖子
1432
PB币
1561
贡献
0
技术
132
活跃
322
发表于 2014-3-21 14:40:19 IP属地湖北 |显示全部楼层
可能问题就出在两个16位的变量拆分上面。测试了多种方法,但貌似都不对...
头像被屏蔽

Rank: 2Rank: 2

UID
3134320
帖子
293
PB币
0
贡献
0
技术
2
活跃
184
发表于 2014-3-21 15:41:31 IP属地广东 来自手机 |显示全部楼层

回帖奖励 +5

提示: 作者被禁止或删除 内容自动屏蔽

Rank: 7Rank: 7Rank: 7

UID
897363
帖子
1432
PB币
1561
贡献
0
技术
132
活跃
322
发表于 2014-3-21 16:37:05 IP属地湖北 |显示全部楼层
447059008 发表于 2014-3-21 15:41
都是把它拆成两个8位,比如ABCD 16,拆成SBCD 8和SBCE 8,同时把ABCD 16删掉。其实改了之后会发觉ABCD 16是 ...

里面的涉及到16位的变量已经全部都改完了,就是没有删除原来的16位的变量,是不是和继续保留原来的16位的变量有关呢?按理说应该关系不大,我删除试试看,谢谢!

Rank: 7Rank: 7Rank: 7

UID
897363
帖子
1432
PB币
1561
贡献
0
技术
132
活跃
322
发表于 2014-3-21 17:07:13 IP属地湖北 |显示全部楼层
447059008 发表于 2014-3-21 15:41
都是把它拆成两个8位,比如ABCD 16,拆成SBCD 8和SBCE 8,同时把ABCD 16删掉。其实改了之后会发觉ABCD 16是 ...

删除了被改的16位的变量,貌似有一点点变化,但电量的显示还是不正常。
我这个dsdt里面有一个比较特殊的情况:

Store (\_SB.PCI0.LPCB.H_EC.B1CC, B1SC) //B1CC和B1SC都是16位

大家的电池代码里面很少有这种情况,按照下面帖子里面的方法,应该改成:

http://www.insanelymac.com/forum/topic/272459-appleacpibatterymanagerapplesmartbatterymanager-for-lion/

            Store (\_SB.PCI0.LPCB.H_EC.B1MH, B1SH)
            Sleep (0x14)
            Store (\_SB.PCI0.LPCB.H_EC.B1ML, B1SL)

但是即使这样改,也不能正常显示电池的剩余电量,我之前是这样改的:

Store (B1B2(\_SB.PCI0.LPCB.H_EC.B1ML,\_SB.PCI0.LPCB.H_EC.B1MH), B1B2(B1SL,B1SH))

也是不正常,继续研究中...
头像被屏蔽

Rank: 2Rank: 2

UID
3134320
帖子
293
PB币
0
贡献
0
技术
2
活跃
184
发表于 2014-3-21 17:11:17 IP属地广东 |显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

Rank: 7Rank: 7Rank: 7

UID
897363
帖子
1432
PB币
1561
贡献
0
技术
132
活跃
322
发表于 2014-3-21 17:21:31 IP属地湖北 |显示全部楼层
447059008 发表于 2014-3-21 17:11
理论上是这样的,建议你把第一个字母改为S,防止重复,而且这两个都要改地,再看一下是不是都是8

我确认没有重复的变量,而且目前都是8位的,可能还是两个16位的变量在一起赋值的拆分问题。

我查阅了很多dsdt中关于电池的代码描述,没有遇到两个16位的变量在一起的情况:Store(A16 , B16)

Rank: 7Rank: 7Rank: 7

UID
897363
帖子
1432
PB币
1561
贡献
0
技术
132
活跃
322
发表于 2014-3-22 08:30:26 IP属地湖北 |显示全部楼层
继续研究中,研究Store(A16 , B16)类型的拆分方法...

Rank: 7Rank: 7Rank: 7

UID
897363
帖子
1432
PB币
1561
贡献
0
技术
132
活跃
322
发表于 2014-3-29 16:33:28 IP属地湖北 |显示全部楼层
这个问题估计一时半会解决不了...

Rank: 7Rank: 7Rank: 7

UID
897363
帖子
1432
PB币
1561
贡献
0
技术
132
活跃
322
发表于 2014-3-30 11:31:56 IP属地湖北 |显示全部楼层
Store (B1CC, Index (PKG1, 0x02))

很明显,电池实时电量的传递是通过B1CC来完成的,但目前来说B1CC的值貌似始终不对,当然拆分是没有任何问题的。

Rank: 7Rank: 7Rank: 7

UID
897363
帖子
1432
PB币
1561
贡献
0
技术
132
活跃
322
发表于 2014-3-31 11:22:14 IP属地湖北 |显示全部楼层
B1CC的值到底是由谁来提供,这个就是问题的关键,整个dsdt里面都没有看到取得B1CC的值的方法。可能需要自己来重新构建获取B1CC值的代码,这个问题就比较困难了,只能参照其他类似的dsdt代码来摸索完成。
回顶部
Copyright (C) 2005-2024 pcbeta.com, All rights reserved
Powered by Discuz!  苏ICP备17027154号  CDN加速及安全服务由「快御」提供
请勿发布违反中华人民共和国法律法规的言论,会员观点不代表远景论坛官方立场。
远景在线 | 远景论坛 | 苹果论坛 | Win11论坛 | Win10论坛 | Win8论坛 | Win7论坛 | WP论坛 | Office论坛