查看: 3817|回复: 18

[交流] 关于电池显示的解决方案(笔记本)

[复制链接]
YangTuDou1220 发表于 2017-10-30 16:14 | 显示全部楼层 |阅读模式
快御云安全
本帖最后由 YangTuDou1220 于 2017-10-30 21:21 编辑

首先声明本帖基于Rehabman的帖子的延伸,确切的来说是我自己的一点思考。本文参考贴:外文原帖。

论坛大神多,我就不班门弄斧了。大致梳理一下思路和给大家做了一个模板作为参考。
本人机器Thinkpad T440
1.提取DSDT&ssdt————————————————clover界面F4,等待5秒左右。
2.在DSDT里面搜索关键词EmbeddedControl,然后找出前面自己的电池名字比方说我的是ECOR。如图:

3.接着搜索ECOR你将发现一个或者一个以上的地方有着名字。那么在这些名字下面有16位的32位的活着56,128位之类的,而你的目的就是让他们变成8位。

4.下面一步涉及的是拆分为8位。
  • 罗列出所有的相同位数的名字,验证它们是否在DSDT里出现过一次,并记录他们的位置。
# 16
SBRC \_SB.PCI0.LPC.EC.GBST
SBFC \_SB.PCI0.LPC.EC.GBIF
SBAE 这里只出现一次就不考虑了
SBRS 这里只出现一次就不考虑了
SBAC   \_SB.PCI0.LPC.EC.GBST
SBVO   \_SB.PCI0.LPC.EC.GBST
SBAF 这里只出现一次就不考虑了
SBBS 这里只出现一次就不考虑了
SBBM   \_SB.PCI0.LPC.EC.GBIF
SBMD 这里只出现一次就不考虑了
SBCC 这里只出现一次就不考虑了
SBDC   \_SB.PCI0.LPC.EC.GBIF
SBDV   \_SB.PCI0.LPC.EC.GBIF
SBOM 这里只出现一次就不考虑了
SBSI 这里只出现一次就不考虑了
SBDT 这里只出现一次就不考虑了
SBSN   \_SB.PCI0.LPC.EC.GBIF
# 32
SBCH \_SB.PCI0.LPC.EC.GBIF
# 128
SBMN \_SB.PCI0.LPC.EC.GBIF
SBDN \_SB.PCI0.LPC.EC.GBIF
2.整理一下,不用的删掉,把同一地址的放在一起。
\_SB.PCI0.LPC.EC.GBIF  \_SB.PCI0.LPC.EC.GBST
SBFC(16) SBRC(16)
SBBM(16) SBAC(16)
SBDC(16) SBVO(16)
SBDV(16)
SBSN(16)
SBCH(32)
SBMN&SBDN(128)
3.初步拆解,遵循的原理是16——2x8,32——4x8,128——nx8等

至于名字怎么起,看心情。
这里要注意一点的是拆完后的名字只能在DSDT里出现一次!
SBFC BFC0,BFC1
SBBMBBM0,BBM1
SBDCBDC0,BDC1
SBDV BDV0,BDV1
SBSN BSN0,BSN1
SBRC BRC0,BRC1
SBAC BAC0,BAC1
SBVOBVO0,BVO1
SBCH BCH0,BCH1,BCH2,BCH3
SBMN&SBDN(128) 这个比较特殊后面会有提起

4.拆解代码
ps:这里加粗的字都是要按照自己电脑的名字写的。
  SBFC
  1. into   device label  EC code_regex SBFC,\s+16  replace_matched begin BFC0,8,BFC1,8 end;
复制代码

SBBM

  1. into   device label      EC  code_regex SBBM,\s+16  replace_matched begin BBM0,8,BBM1,8 end;
复制代码


SBDC

  1. into   device label    EC code_regex SBDC,\s+16  replace_matched begin BDC0,8,BDC1,8 end;
复制代码


SBDV

  1. into   device label     EC code_regex SBDV,\s+16  replace_matched begin BDV0,8,BDV1,8 end;
复制代码


SBSN

  1. into   device label     EC code_regex SBSN,\s+16  replace_matched begin BSN0,8,BSN1,8 end;
复制代码


SBRC

  1. into   device label  EC code_regex SBRC,\s+16  replace_matched begin BRC0,8,BRC1,8 end;
复制代码


SBAC

  1. into   device label  EC code_regex SBAC,\s+16  replace_matched begin BAC0,8,BAC1,8 end;
复制代码


SBVO

  1. into   device label   EC code_regex SBVO,\s+16  replace_matched begin BVO0,8,BVO1,8 end;
复制代码


SBCH

  1. Into device  label EC code_regex SBCH,\s+32 replace_matched begin BCH0,8,BCH1,8,BCH2,8,BCH3,8 end;
复制代码


SBMN&SBDN(128)

  1. into device  label EC code_regex (SBMN/SBDN,)\s+(128)  replace_matched begin BMNX,%2,//%1%2/BDNX,%2,//%1%2 end;
复制代码

/的意思都懂得吧
5.拆分完自然是要用这些拆分好的,下一步就是调用这些拆分好的。

  
  SBFC
  
  
  1. Into method label GBIF code_regex \(SBFC,  replaceall_matched begin (B1B2(BFC0,BFC1),  end;
复制代码

  
  
SBBM
  
  
  
  1. Into method label GBIF code_regex \(SBBM,  replaceall_matched begin (B1B2(BBM0,BBM1),  end;
复制代码

  
  
  
  
SBDC
  
  
  
  1. Into method label GBIF code_regex \(SBDC,  replaceall_matched begin (B1B2(BDC0,BDC1),  end;
复制代码

  
  
  
  
SBDV
  
  
  
  1. Into method label GBST code_regex \(SBDV,  replaceall_matched begin (B1B2(BDV0,BDV1),  end;
复制代码

  
  
  
  
SBSN
  
  
  
  1. Into method label GBIF code_regex \(SBSN,  replaceall_matched begin (B1B2(BSN0,BSN1),  end;
复制代码

  
  
  
  
SBRC
  
  
  1. Into method label GBST code_regex \(SBRC,  replaceall_matched begin (B1B2(BRC0,BRC1),  end;
复制代码

  
  
  
  
SBAC
  
  
  
  1. Into method label GBST code_regex \(SBAC,  replaceall_matched begin (B1B2(BAC0,BAC1),  end;
复制代码

  
  
  
  
SBVO
  
  
  
  1. Into method label GBST code_regex \(SBVO,  replaceall_matched begin (B1B2(BVO0,BVO1),  end;
复制代码

  
  
  
  
SBCH
  
  
  
  1. into  method label GBIF code_regex \(SBCH, replaceall_matched begin (B1B4(BCH0,BCH1,BCH2,BCH3), end;
复制代码

  
  
  
  
SBMN&SBDN(128)
  
  
  1. into method label GBIF code_regex \(SBMN,  replaceall_matched begin (RECB(0xA0,128),  end;
复制代码

  
  
  1. into  method label GBIF code_regex \(SBDN, replaceall_matched begin (RECB(0xA0,128), end;
复制代码

  

6.这些都准备好了后细心的朋友应该已经发现多了一些东西B1B2,B1B4,RECB这些,那么这些怎么定义呢,这里我直接抄袭了RM的//

# 创建B1B2 基本都用这个

  1. Method

  2. into
  3. method label B1B2 remove_entry;

  4. into
  5. definitionblock code_regex . insert

  6. begin

  7. Method
  8. (B1B2, 2, NotSerialized) { Return(Or(Arg0, ShiftLeft(Arg1, 8))) }

  9. \n

  10. end;
复制代码
#Create B1B4 Method  添加B1B4 函数(32位)
  1. into
  2. method label B1B4 remove_entry;

  3. into
  4. definitionblock code_regex . insert

  5. begin

  6. Method
  7. (B1B4, 4, NotSerialized)\n

  8. {\n

  9.    Store(Arg3, Local0)\n

  10.    Or(Arg2, ShiftLeft(Local0, 8), Local0)\n

  11.    Or(Arg1, ShiftLeft(Local0, 8), Local0)\n

  12.    Or(Arg0, ShiftLeft(Local0, 8), Local0)\n

  13.    Return(Local0)\n

  14. }\n

  15. end;
复制代码
# 还有 56位什么的修改方式类似
# 超过32位调用,不添加会有RECB问题
# utility methods to read/write buffers from/to EC
  1. into
  2. method label RE1B parent_label EC remove_entry;

  3. into method
  4. label RECB parent_label EC remove_entry;

  5. into
  6. device label EC insert

  7. begin

  8. Method
  9. (RE1B, 1, NotSerialized)\n

  10. //
  11. Arg0 - offset in bytes from zero-based EC\n

  12. {\n

  13. OperationRegion(ERAM,
  14. EmbeddedControl, Arg0, 1)\n

  15.     Field(ERAM, ByteAcc, NoLock, Preserve) {
  16. BYTE, 8 }\n

  17.     Return(BYTE)\n

  18. }\n

  19. Method
  20. (RECB, 2, Serialized)\n

  21. //
  22. Arg0 - offset in bytes from zero-based EC\n

  23. //
  24. Arg1 - size of buffer in bits\n

  25. {\n

  26.     ShiftRight(Arg1,
  27. 3, Arg1)\n

  28.     Name(TEMP,
  29. Buffer(Arg1) { })\n

  30.     Add(Arg0,
  31. Arg1, Arg1)\n

  32.     Store(0,
  33. Local0)\n

  34.     While
  35. (LLess(Arg0, Arg1))\n

  36.     {\n

  37.         Store(RE1B(Arg0),
  38. Index(TEMP, Local0))\n

  39. Increment(Arg0)\n

  40. Increment(Local0)\n

  41.      }\n

  42.      Return(TEMP)\n

  43. }\n

  44. end;

复制代码

7.最后把这些全部写完就可以用了,我这里我把写的贴上作参考。

// 下一个更新用hotpatch的方式来搞定这个






































本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×

评分

3

查看全部评分

wchb 发表于 2017-10-30 19:28 | 显示全部楼层
楼主很爱思考,支持分享
回复

使用道具 举报

liwenloveyou 发表于 2017-11-9 10:14 | 显示全部楼层
不错,支持一下你
回复

使用道具 举报

allhigh 发表于 2017-11-9 11:26 | 显示全部楼层
本帖最后由 allhigh 于 2017-11-9 11:28 编辑

部分讨论下,如有不对,请指正:

电池补丁其实就是修正数据的读写问题,因为配合补丁使用的 ACPIBatteryManager.kext 只处理 8 位字节的地址数据。所以,很多定义大过 8 位的地址(如16、32、52、64、128等)都要拆分为 8 位。

因为 ACPI 规范要兼容旧习惯,integer 整型数据是 32 位的,大于 32 位的数据类型一般归于 Buffer 类型,读写这两类数据就要用不同的函数处理方法。

低于 32 位的拆分,RehabMan 写了 2 个函数,B1B2 和 B1B4,前者用于 16 位,后者用于 32 位。

所以文中提到的 WECB 等函数也是 RehabMan 写的用于读写大于 32 位的数据用的。
WECB 是 Write EC Buffer 的缩写(RehabMan 自己起的名字),如果是读数据,则是 RECB。

使用者需要判断的是调用这些拆分数据的程序语句是读还是写,一定要分清,然后使用不同的编写的函数去应用即可。


回复

使用道具 举报

baojiwx 发表于 2017-11-9 11:33 | 显示全部楼层
谢谢分享。。。。
回复

使用道具 举报

lgt521 发表于 2017-11-9 11:39 | 显示全部楼层
不错,支持一下你
回复

使用道具 举报

ZHUO_XIAO_0831 发表于 2017-11-9 11:41 | 显示全部楼层
这个比较靠谱 楼主 一定经过大量试验 总计了电池的描述表 才有这篇文字的! 你是大牛
回复

使用道具 举报

YangTuDou1220  楼主| 发表于 2017-11-9 12:30 | 显示全部楼层
allhigh 发表于 2017-11-9 11:26
部分讨论下,如有不对,请指正:

电池补丁其实就是修正数据的读写问题,因为配合补丁使用的 ACPIBattery ...

这里的偏移量offset 我也没写过段日子在谢谢
回复

使用道具 举报

sunbin074526 发表于 2017-11-9 17:50 | 显示全部楼层
谢谢楼主分享学习了
回复

使用道具 举报

PrettyGF 发表于 2017-11-11 23:07 | 显示全部楼层
很棒 点个赞
回复

使用道具 举报

onlyjim 发表于 2017-12-2 15:29 | 显示全部楼层
来学习了~~~~~
回复

使用道具 举报

lht600 发表于 2018-1-15 16:15 | 显示全部楼层
使用一下看能不能用
回复

使用道具 举报

shyboyga 发表于 2018-2-10 06:43 | 显示全部楼层
谢谢楼主的分享
回复

使用道具 举报

Aimisoy糊涂 发表于 2018-2-10 09:55 | 显示全部楼层
感谢分享,学习了
回复

使用道具 举报

ubuntu123456 发表于 2018-2-10 10:01 | 显示全部楼层
好贴要支持,不错不错,学习了!
回复

使用道具 举报

qwe882547 发表于 2018-2-11 02:15 | 显示全部楼层
谢谢谢谢星星
回复

使用道具 举报

ekarlee 发表于 2018-3-7 12:47 | 显示全部楼层
万分感谢楼主
回复

使用道具 举报

zzjyat 发表于 2018-3-25 14:58 | 显示全部楼层
看的一脸懵逼,不是学计算机的
回复

使用道具 举报

liusi20000 发表于 2020-2-29 22:15 | 显示全部楼层
很好。但是看不懂啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋手机版联系我们

Copyright © 2005-2025 PCBeta. All rights reserved.

Powered by Discuz!  CDN加速及安全服务由「快御」提供

请勿发布违反中华人民共和国法律法规的言论,会员观点不代表远景论坛官方立场。

远景在线 ( 苏ICP备17027154号 )|远景论坛 |Win11论坛 |Win10论坛 |Win8论坛 |Win7论坛 |WP论坛 |Office论坛

GMT+8, 2025-2-5 20:00

快速回复 返回顶部 返回列表