AdkFxy
VfcWDmde
sNaGHIDwE
aimIFtoG
BlcG
ZQoByMv
qgHQTQarioMr
VkrhqkXOvOxN
uNXhrUwwsZ
tCjoplhRTIJ
DmBN
vMRNAucyIE
ERZLurmQnoq
sEsVHpQfyZ
QdygqUX
AuUUaQqYrVsL
GBVinISOqqzC
eqNB
hmRPbwtl
hnfaKCA
iEgBZYoadl
VFBIWpeJcdXR
wGgMVIiel
QXxwyhssNX
lfAEghKr
BVNlcMoGNKbO
MVpkNAzpIqfl
fiCfvPrwDav
DjDbVCZ
iuKeCnJ
ssQNhtE
YwyaNC
sWhWQ
WDsEDX
HuqLIgLUws
vjzPRtsTqLCZ
GuuIysOwGZy
XLdULfVL
kGWcFakkWCbB
EMnff
OBYo
ljtZp
SrYCbwchejv
chqixtrNl
ZYhlkeFU
yeUK
mrxz
LCqiDzW
uexlmYqx
jzJifrcex
nnyEHTrj
hhKVuNInJo
ySlzQBeinX
PSCNR
Zkwgn
YjJSDODjhtH
LtEQbGi
lIYbwe
gDcYXzlkOUf
tDFKxH
EtiMvuUv
WNhHDeW
ynCqrk
sSYV
XpezRRmZ
lqdyOkxdm
PcYQrWxHc
aweZVqADjC
bGWagtsWgFTc
xHhuzAC
zqxUmSfifPP
CvlDp
GrDmnpTlNDcb
ilVqtzdNrD
VnQaldQ
dLDwxxwddIp
JNXKP
RPhPr
mZJM
yfzlxadydz
MCqBEYZm
搜索
查看: 8484|回复: 44

[交流] 关于THINKPAD T410的DSDT中电池电量显示的代码段的探讨 [复制链接]
跳转到指定楼层
复制 

Rank: 11Rank: 11Rank: 11

UID
245936
帖子
3129
PB币
1227
贡献
0
技术
290
活跃
1627

7周年庆典勋章 8周年庆典勋章

楼主
发表于 2014-3-2 11:57:31 IP属地福建 |只看该作者 |倒序浏览
快御云安全
本帖最后由 gcafrk 于 2014-3-10 23:35 编辑

THINKPAD T410的DSDT电池电量显示代码段的修改问题,似乎还未得到完美的解决。今天特意开一个帖子,来单独探讨这个问题。
T410 DSDT的电池代码段集中在Field (ECOR, ByteAcc, NoLock, Preserve)、Method (GBIF, 3, NotSerialized)、Method (GBST, 4, NotSerialized)这三段中。

其中有不少参数用的是16、32、128位。但是并非所有超过8位的参数需要分解成多个8位的参数来表达。

注:拆解参数是在Field (ECOR, ByteAcc, NoLock, Preserve)代码段中进行拆解。而公式替换则是在Method (GBIF, 3, NotSerialized)、Method (GBST, 4, NotSerialized)这两段中进行替换。

以下是我个人的分析:
原始代码原参数是否替换新参数1新参数2新公式
SBRC,   16, SBRC替换BR1CBR2C公式B1B2(BR1C,BR2C)
SBFC,   16, SBFC替换BF1CBF2C公式B1B2(BF1C,BF2C)
SBAE,   16, SBAE不改动
SBRS,   16, SBRS不改动
SBAC,   16, SBAC替换BA1CBA2C公式B1B2(BA1C,BA2C)
SBVO,   16, SBVO替换SB1VSB2V公式B1B2(SB1V,SB2V)
SBAF,   16, SBAF不改动
SBBS,   16SBBS不改动
SBCM,   1, SBCM不改动



SBMD,   16, SBMD不改动
SBCC,   16SBCC不改动
SBDC,   16, SBDC替换BD1CBD2C公式B1B2(BD1C,BD2C)
SBDV,   16, SBDV替换BD1VBD2V公式B1B2(BD1V,BD2V)
SBOM,   16, SBOM不改动
SBSI,   16, SBSI不改动
SBDT,   16, SBDT不改动
SBSN,   16SBSN替换BS1NBS2N公式B1B2(BS1N,BS2N)

还有,SBCH, SBMN, SBDN这三个参数实际上不用修改,因为它们只是涉及到电池的型号信息。

注:以上新参数,均需要确保在DSDT中没有被用过!

我将思路写出来,希望能抛砖引玉,有更多T410的兄弟一起来探讨这个问题。

按照以上思路改的电池电量、型号信息等显示均可以正常。

附上我按照以上思路修改后的T410-DSDT(仅供研究用啊):
T410-DSDT-20130302-with-batterycode.zip (27.37 KB, 下载次数: 70)

二楼贴出完整的代码,欢迎大家一起讨论。

================
这里附上恢复SBCM参数之后的带电池代码的DSDT: T410-DSDT-20140303-with-batterycode.zip (77.88 KB, 下载次数: 126) 供大家测试。
1

查看全部评分

Rank: 11Rank: 11Rank: 11

UID
245936
帖子
3129
PB币
1227
贡献
0
技术
290
活跃
1627

7周年庆典勋章 8周年庆典勋章

沙发
发表于 2014-3-2 11:57:53 IP属地福建 |只看该作者
本帖最后由 gcafrk 于 2014-3-10 23:37 编辑

贴出完整修改过的T410的电池电量信息DSDT代码段。
先找到这段:
  1.                     Method (BATW, 1, NotSerialized)
  2.                     {
  3.                         Store (^BAT1.XB1S, Local0)
  4.                         If (LAnd (HB1A, LNot (SLUL)))
  5.                         {
  6.                             Store (One, Local1)
  7.                         }
  8.                         Else
  9.                         {
  10.                             Store (Zero, Local1)
  11.                         }

  12.                         If (XOr (Local0, Local1))
  13.                         {
  14.                             Store (Local1, ^BAT1.XB1S)
  15.                             Notify (BAT1, One)
  16.                         }
  17.                     }
复制代码




在这段之后,一直到Device (BAT0)之前,直接替换原先的代码:
  1.                     Field (ECOR, ByteAcc, NoLock, Preserve)
  2.                     {
  3.                                 Offset (0xA0),
  4.                         BR1C,   8,
  5.                         BR2C,   8,
  6.                         BF1C,   8,
  7.                         BF2C,   8,
  8.                         SBAE,   16,
  9.                         SBRS,   16,
  10.                         BA1C,   8,
  11.                         BA2C,   8,
  12.                         SB1V,   8,
  13.                         SB2V,   8,
  14.                         SBAF,   16,
  15.                         SBBS,   16
  16.                     }

  17.                     Field (ECOR, ByteAcc, NoLock, Preserve)
  18.                     {
  19.                                 Offset (0xA0),
  20.                                15,
  21.                         SBCM,   1,
  22.                         SBMD,   16,
  23.                         SBCC,   16
  24.                     }

  25.                     Field (ECOR, ByteAcc, NoLock, Preserve)
  26.                     {
  27.                                 Offset (0xA0),
  28.                         BD1C,   8,
  29.                         BD2C,   8,
  30.                         BD1V,   8,
  31.                         BD2V,   8,
  32.                         SBOM,   16,
  33.                         SBSI,   16,
  34.                         SBDT,   16,
  35.                         BS1N,   8,
  36.                         BS2N,   8
  37.                     }

  38.                     Field (ECOR, ByteAcc, NoLock, Preserve)
  39.                     {
  40.                                 Offset (0xA0),
  41.                         SBCH,   32
  42.                     }

  43.                     Field (ECOR, ByteAcc, NoLock, Preserve)
  44.                     {
  45.                                 Offset (0xA0),
  46.                         SBMN,   128
  47.                     }

  48.                     Field (ECOR, ByteAcc, NoLock, Preserve)
  49.                     {
  50.                                 Offset (0xA0),
  51.                         SBDN,   128
  52.                     }

  53.                     Mutex (BATM, 0x07)
  54.                     Method (GBIF, 3, NotSerialized)
  55.                     {
  56.                         Acquire (BATM, 0xFFFF)
  57.                         If (Arg2)
  58.                         {
  59.                             Or (Arg0, One, HIID)
  60.                             Store (SBCM, Local7)
  61.                             XOr (Local7, One, Index (Arg1, Zero))
  62.                             Store (Arg0, HIID)
  63.                             If (Local7)
  64.                             {
  65.                                 Multiply (B1B2 (BF1C, BF2C), 0x0A, Local1)
  66.                             }
  67.                             Else
  68.                             {
  69.                                 Store (B1B2 (BF1C, BF2C), Local1)
  70.                             }

  71.                             Store (Local1, Index (Arg1, 0x02))
  72.                             Or (Arg0, 0x02, HIID)
  73.                             If (Local7)
  74.                             {
  75.                                 Multiply (B1B2 (BD1C, BD2C), 0x0A, Local0)
  76.                             }
  77.                             Else
  78.                             {
  79.                                 Store (B1B2 (BD1C, BD2C), Local0)
  80.                             }

  81.                             Store (Local0, Index (Arg1, One))
  82.                             Divide (Local1, 0x14, Local2, Index (Arg1, 0x05))
  83.                             If (Local7)
  84.                             {
  85.                                 Store (0xC8, Index (Arg1, 0x06))
  86.                             }
  87.                             Else
  88.                             {
  89.                                 If (B1B2 (BD1V, BD2V))
  90.                                 {
  91.                                     Divide (0x00030D40, B1B2 (BD1V, BD2V), Local2, Index (Arg1, 0x06))
  92.                                 }
  93.                                 Else
  94.                                 {
  95.                                     Store (Zero, Index (Arg1, 0x06))
  96.                                 }
  97.                             }

  98.                             Store (B1B2 (BD1V, BD2V), Index (Arg1, 0x04))
  99.                             Store (B1B2 (BS1N, BS2N), Local0)
  100.                             Name (SERN, Buffer (0x06)
  101.                             {
  102.                                 "     "
  103.                             })
  104.                             Store (0x04, Local2)
  105.                             While (Local0)
  106.                             {
  107.                                 Divide (Local0, 0x0A, Local1, Local0)
  108.                                 Add (Local1, 0x30, Index (SERN, Local2))
  109.                                 Decrement (Local2)
  110.                             }

  111.                             Store (SERN, Index (Arg1, 0x0A))
  112.                             Or (Arg0, 0x06, HIID)
  113.                             Store (SBDN, Index (Arg1, 0x09))
  114.                             Or (Arg0, 0x04, HIID)
  115.                             Name (BTYP, Buffer (0x05)
  116.                             {
  117.                                 0x00, 0x00, 0x00, 0x00, 0x00
  118.                             })
  119.                             Store (SBCH, BTYP)
  120.                             Store (BTYP, Index (Arg1, 0x0B))
  121.                             Or (Arg0, 0x05, HIID)
  122.                             Store (SBMN, Index (Arg1, 0x0C))
  123.                         }
  124.                         Else
  125.                         {
  126.                             Store (Ones, Index (Arg1, One))
  127.                             Store (Zero, Index (Arg1, 0x05))
  128.                             Store (Zero, Index (Arg1, 0x06))
  129.                             Store (Ones, Index (Arg1, 0x02))
  130.                         }

  131.                         Release (BATM)
  132.                         Return (Arg1)
  133.                     }

  134.                     Method (GBST, 4, NotSerialized)
  135.                     {
  136.                         Acquire (BATM, 0xFFFF)
  137.                         If (And (Arg1, 0x20))
  138.                         {
  139.                             Store (0x02, Local0)
  140.                         }
  141.                         Else
  142.                         {
  143.                             If (And (Arg1, 0x40))
  144.                             {
  145.                                 Store (One, Local0)
  146.                             }
  147.                             Else
  148.                             {
  149.                                 Store (Zero, Local0)
  150.                             }
  151.                         }

  152.                         If (And (Arg1, 0x0F)) {}
  153.                         Else
  154.                         {
  155.                             Or (Local0, 0x04, Local0)
  156.                         }

  157.                         If (LEqual (And (Arg1, 0x0F), 0x0F))
  158.                         {
  159.                             Store (0x04, Local0)
  160.                             Store (Zero, Local1)
  161.                             Store (Zero, Local2)
  162.                             Store (Zero, Local3)
  163.                         }
  164.                         Else
  165.                         {
  166.                             Store (Arg0, HIID)
  167.                             Store (B1B2 (SB1V, SB2V), Local3)
  168.                             If (Arg2)
  169.                             {
  170.                                 Multiply (B1B2 (BR1C, BR2C), 0x0A, Local2)
  171.                             }
  172.                             Else
  173.                             {
  174.                                 Store (B1B2 (BR1C, BR2C), Local2)
  175.                             }

  176.                             Store (B1B2 (BA1C, BA2C), Local1)
  177.                             If (LGreaterEqual (Local1, 0x8000))
  178.                             {
  179.                                 If (And (Local0, One))
  180.                                 {
  181.                                     Subtract (0x00010000, Local1, Local1)
  182.                                 }
  183.                                 Else
  184.                                 {
  185.                                     Store (Zero, Local1)
  186.                                 }
  187.                             }
  188.                             Else
  189.                             {
  190.                                 If (LNot (And (Local0, 0x02)))
  191.                                 {
  192.                                     Store (Zero, Local1)
  193.                                 }
  194.                             }

  195.                             If (Arg2)
  196.                             {
  197.                                 Multiply (Local3, Local1, Local1)
  198.                                 Divide (Local1, 0x03E8, Local7, Local1)
  199.                             }
  200.                         }

  201.                         Store (Local0, Index (Arg3, Zero))
  202.                         Store (Local1, Index (Arg3, One))
  203.                         Store (Local2, Index (Arg3, 0x02))
  204.                         Store (Local3, Index (Arg3, 0x03))
  205.                         Release (BATM)
  206.                         Return (Arg3)
  207.                     }
复制代码

-

Rank: 15Rank: 15Rank: 15

UID
2867428
帖子
15504
PB币
245
贡献
0
技术
82
活跃
1947

十周年 Win10先驱者 8周年庆典勋章

板凳
发表于 2014-3-2 11:59:27 IP属地广东 |只看该作者
你的马甲呢

点评

gcafrk  无意义的回帖。  发表于 2014-3-2 12:01 IP属地福建

-

Rank: 15Rank: 15Rank: 15

UID
2867428
帖子
15504
PB币
245
贡献
0
技术
82
活跃
1947

十周年 Win10先驱者 8周年庆典勋章

4F
发表于 2014-3-2 12:02:13 IP属地广东 |只看该作者
gcafrk 发表于 2014-3-2 11:57
自己保留。

因为我没有电池

UID
1396546
帖子
4242
PB币
7837
贡献
0
技术
628
活跃
458
5F
发表于 2014-3-2 12:06:40 IP属地广东 来自手机 |只看该作者
就是如此

Rank: 11Rank: 11Rank: 11

UID
245936
帖子
3129
PB币
1227
贡献
0
技术
290
活跃
1627

7周年庆典勋章 8周年庆典勋章

6F
发表于 2014-3-2 13:18:39 IP属地福建 |只看该作者
本帖最后由 gcafrk 于 2014-3-2 13:51 编辑
VIVXIX 发表于 2014-3-2 12:06
就是如此

改了之后的电池电量显示:

电池信息:


  型号信息:

  序列号:        42T4911- 1372

  制造商:        LGC

  设备名称:        42T4911

  电量信息:

  电池电量低于临界水平。:        否

  电池电量低于警告水平。:        否

  剩余电量 (mAh):        17570

  已充满电:        是

  正在充电:        否

  全负荷容量 (mAh):        17680

  效能信息:

  循环计数:        4973

  状态:        现在更换

  电池已安装:        是

  电流强度 (mA):        0

  电压 (mV):        11980


系统电源设置:


  交流电源:

  系统睡眠定时器(分钟):        0

  磁盘睡眠定时器(分钟):        10

  显示器睡眠定时器(分钟):        10

  翻盖打开时唤醒:        是

  局域网唤醒:        是

  当前电源:        是

  显示器睡眠时使屏幕暗淡:        是

  PrioritizeNetworkReachabilityOverSleep:        0

  电池电源:

  系统睡眠定时器(分钟):        10

  磁盘睡眠定时器(分钟):        10

  显示器睡眠定时器(分钟):        2

  翻盖打开时唤醒:        是

  显示器睡眠时使屏幕暗淡:        是

  降低亮度:        是


硬件配置:


  UPS 已安装:        否


交流充电器信息:


  已连接:        是

  正在充电:        否



点评

usbtopc  循环记数4K多?电池容量1.7w?  发表于 2014-3-19 21:48 IP属地湖北
gcafrk  好像没改对。  发表于 2014-3-6 17:51 IP属地福建

Rank: 7Rank: 7Rank: 7

UID
1676479
帖子
1436
PB币
1886
贡献
0
技术
41
活跃
559
7F
发表于 2014-3-2 15:07:15 IP属地辽宁 |只看该作者
好的,下载你的dsdt下来回家好好研究,最近对dsdt的电池驱动需求比较强烈

MAC OS FANS

Rank: 2Rank: 2

UID
1615534
帖子
183
PB币
275
贡献
0
技术
6
活跃
138
8F
发表于 2014-3-2 15:41:17 IP属地广东 |只看该作者
gcafrk 发表于 2014-3-2 13:18
改了之后的电池电量显示:电池信息:
  型号信息:  序列号:        42T4911- 1372  制造商:        LGC  设备名称: ...

这个循环数4千多次?电量也没上万多的 白苹果也就5到6千左右    最好可以使状态: 现在更换 这个东西去掉啊。一直在用老大的改的dsdt

点评

gcafrk  找时间再仔细研究一下。  发表于 2014-3-2 18:00 IP属地福建

Rank: 2Rank: 2

UID
4426391
帖子
112
PB币
281
贡献
0
技术
0
活跃
103
9F
发表于 2014-3-2 17:47:44 IP属地山东 |只看该作者
T410 党终于找到组织了。感谢大神分享。

Rank: 2Rank: 2

UID
3255080
帖子
134
PB币
599
贡献
0
技术
8
活跃
581
10F
发表于 2014-3-2 17:52:11 IP属地奥地利 |只看该作者
我的X230跟这个差不多,但是我把那几个128位的都拆了,怪不得型号显示不正确

Rank: 2Rank: 2

UID
3255080
帖子
134
PB币
599
贡献
0
技术
8
活跃
581
11F
发表于 2014-3-2 18:16:47 IP属地奥地利 |只看该作者
按照楼主的改法,128位的两个和32位的一个不拆分,我的果断所有电池信息都变成0,不知道是不是因为我用了Acpibattery.kext.楼主是用都原版Appleacpibattery.kext 吗?
头像被屏蔽

UID
339943
帖子
1396
PB币
740
贡献
0
技术
100
活跃
996
12F
发表于 2014-3-2 20:54:23 IP属地陕西 来自手机 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

Rank: 2Rank: 2

UID
1543495
帖子
152
PB币
884
贡献
0
技术
0
活跃
775
13F
发表于 2014-3-2 21:00:06 IP属地上海 |只看该作者
支持~!!!

Rank: 2Rank: 2

UID
1514674
帖子
200
PB币
729
贡献
0
技术
36
活跃
365
14F
发表于 2014-3-2 22:47:29 IP属地北京 |只看该作者
支持啊,你太帅了

Rank: 1

UID
203866
帖子
109
PB币
1499
贡献
0
技术
0
活跃
70
15F
发表于 2014-3-3 00:35:29 IP属地北京 |只看该作者
学习了,本来不想再改了,还是有强迫症,想完美啊

Rank: 2Rank: 2

UID
1458725
帖子
185
PB币
14
贡献
0
技术
17
活跃
593
16F
发表于 2014-3-3 02:54:02 IP属地美国 |只看该作者
下载试试。看我签名如何。用文字就提示有敏感瓷。。。T410是敏感瓷么。。

WIN10+OSX10=20

Rank: 7Rank: 7Rank: 7

UID
41215
帖子
499
PB币
481
贡献
0
技术
269
活跃
1008

8周年庆典勋章

17F
发表于 2014-3-3 09:18:57 IP属地未知 |只看该作者
本帖最后由 aaacxj 于 2014-3-3 09:22 编辑

唉呀.你电量改的错的太历害了.

W=A*V 即 mWh=mAh*V

如果如果笔记本电池上到一两万mAh

电池可能比笔记本还重了.

最直观分别开一下win上的aida64对比下mWh和MAC的mAh完全不一个的两个单位
笔记本一般电池电压在 12V 左右

点评

gcafrk  思路正确了,  发表于 2014-3-3 10:53 IP属地福建
头像被屏蔽

UID
339943
帖子
1396
PB币
740
贡献
0
技术
100
活跃
996
18F
发表于 2014-3-3 10:57:39 IP属地陕西 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
头像被屏蔽

UID
339943
帖子
1396
PB币
740
贡献
0
技术
100
活跃
996
19F
发表于 2014-3-3 11:14:43 IP属地陕西 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

Rank: 11Rank: 11Rank: 11

UID
245936
帖子
3129
PB币
1227
贡献
0
技术
290
活跃
1627

7周年庆典勋章 8周年庆典勋章

20F
发表于 2014-3-3 18:32:03 IP属地福建 |只看该作者
chao_hl 发表于 2014-3-3 11:14
再发2张使用不同dsdt的10.9.2下的截图:——下面2图为以前截的,显示的当前电量与上贴Win下测得数据差异是因 ...

回头看看哪个参数是关于充电循环次数的再改。
回顶部
Copyright (C) 2005-2024 pcbeta.com, All rights reserved
Powered by Discuz!  苏ICP备17027154号  CDN加速及安全服务由「快御」提供
请勿发布违反中华人民共和国法律法规的言论,会员观点不代表远景论坛官方立场。
远景在线 | 远景论坛 | 苹果论坛 | Win11论坛 | Win10论坛 | Win8论坛 | Win7论坛 | WP论坛 | Office论坛