关于电池显示的解决方案(笔记本)
本帖最后由 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:这里加粗的字都是要按照自己电脑的名字写的。
SBFCinto device labelEC code_regex SBFC,\s+16replace_matched begin BFC0,8,BFC1,8 end;
SBBM
into device label ECcode_regex SBBM,\s+16replace_matched begin BBM0,8,BBM1,8 end;
SBDC
into device label EC code_regex SBDC,\s+16replace_matched begin BDC0,8,BDC1,8 end;
SBDV
into device label EC code_regex SBDV,\s+16replace_matched begin BDV0,8,BDV1,8 end;
SBSN
into device label EC code_regex SBSN,\s+16replace_matched begin BSN0,8,BSN1,8 end;
SBRC
into device labelEC code_regex SBRC,\s+16replace_matched begin BRC0,8,BRC1,8 end;
SBAC
into device labelEC code_regex SBAC,\s+16replace_matched begin BAC0,8,BAC1,8 end;
SBVO
into device label EC code_regex SBVO,\s+16replace_matched begin BVO0,8,BVO1,8 end;
SBCH
Into devicelabel EC code_regex SBCH,\s+32 replace_matched begin BCH0,8,BCH1,8,BCH2,8,BCH3,8 end;
SBMN&SBDN(128)
into devicelabel EC code_regex (SBMN/SBDN,)\s+(128)replace_matched begin BMNX,%2,//%1%2/BDNX,%2,//%1%2 end;
/的意思都懂得吧
5.拆分完自然是要用这些拆分好的,下一步就是调用这些拆分好的。
SBFCInto method label GBIF code_regex \(SBFC,replaceall_matched begin (B1B2(BFC0,BFC1),end;
SBBM
Into method label GBIF code_regex \(SBBM,replaceall_matched begin (B1B2(BBM0,BBM1),end;
SBDC
Into method label GBIF code_regex \(SBDC,replaceall_matched begin (B1B2(BDC0,BDC1),end;
SBDV
Into method label GBST code_regex \(SBDV,replaceall_matched begin (B1B2(BDV0,BDV1),end;
SBSN
Into method label GBIF code_regex \(SBSN,replaceall_matched begin (B1B2(BSN0,BSN1),end;
SBRC
Into method label GBST code_regex \(SBRC,replaceall_matched begin (B1B2(BRC0,BRC1),end;
SBAC
Into method label GBST code_regex \(SBAC,replaceall_matched begin (B1B2(BAC0,BAC1),end;
SBVO
Into method label GBST code_regex \(SBVO,replaceall_matched begin (B1B2(BVO0,BVO1),end;
SBCH
intomethod label GBIF code_regex \(SBCH, replaceall_matched begin (B1B4(BCH0,BCH1,BCH2,BCH3), end;
SBMN&SBDN(128)
into method label GBIF code_regex \(SBMN,replaceall_matched begin (RECB(0xA0,128),end;
intomethod label GBIF code_regex \(SBDN, replaceall_matched begin (RECB(0xA0,128), end;
6.这些都准备好了后细心的朋友应该已经发现多了一些东西B1B2,B1B4,RECB这些,那么这些怎么定义呢,这里我直接抄袭了RM的//
# 创建B1B2 基本都用这个
Method
into
method label B1B2 remove_entry;
into
definitionblock code_regex . insert
begin
Method
(B1B2, 2, NotSerialized) { Return(Or(Arg0, ShiftLeft(Arg1, 8))) }
\n
end;#Create B1B4 Method添加B1B4 函数(32位)into
method label B1B4 remove_entry;
into
definitionblock code_regex . insert
begin
Method
(B1B4, 4, NotSerialized)\n
{\n
Store(Arg3, Local0)\n
Or(Arg2, ShiftLeft(Local0, 8), Local0)\n
Or(Arg1, ShiftLeft(Local0, 8), Local0)\n
Or(Arg0, ShiftLeft(Local0, 8), Local0)\n
Return(Local0)\n
}\n
end;# 还有 56位什么的修改方式类似# 超过32位调用,不添加会有RECB问题# utility methods to read/write buffers from/to ECinto
method label RE1B parent_label EC remove_entry;
into method
label RECB parent_label EC remove_entry;
into
device label EC insert
begin
Method
(RE1B, 1, NotSerialized)\n
//
Arg0 - offset in bytes from zero-based EC\n
{\n
OperationRegion(ERAM,
EmbeddedControl, Arg0, 1)\n
Field(ERAM, ByteAcc, NoLock, Preserve) {
BYTE, 8 }\n
Return(BYTE)\n
}\n
Method
(RECB, 2, Serialized)\n
//
Arg0 - offset in bytes from zero-based EC\n
//
Arg1 - size of buffer in bits\n
{\n
ShiftRight(Arg1,
3, Arg1)\n
Name(TEMP,
Buffer(Arg1) { })\n
Add(Arg0,
Arg1, Arg1)\n
Store(0,
Local0)\n
While
(LLess(Arg0, Arg1))\n
{\n
Store(RE1B(Arg0),
Index(TEMP, Local0))\n
Increment(Arg0)\n
Increment(Local0)\n
}\n
Return(TEMP)\n
}\n
end;
7.最后把这些全部写完就可以用了,我这里我把写的贴上作参考。
// 下一个更新用hotpatch的方式来搞定这个
楼主很爱思考,支持分享 不错,支持一下你 本帖最后由 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。
使用者需要判断的是调用这些拆分数据的程序语句是读还是写,一定要分清,然后使用不同的编写的函数去应用即可。
谢谢分享。。。。 不错,支持一下你 这个比较靠谱 楼主 一定经过大量试验 总计了电池的描述表 才有这篇文字的! 你是大牛 allhigh 发表于 2017-11-9 11:26 https://www.pcbeta.com/static/image/common/back.gif
部分讨论下,如有不对,请指正:
电池补丁其实就是修正数据的读写问题,因为配合补丁使用的 ACPIBattery ...
这里的偏移量offset 我也没写过段日子在谢谢 谢谢楼主分享学习了 很棒 点个赞
来学习了~~~~~ 使用一下看能不能用 谢谢楼主的分享 感谢分享,学习了 好贴要支持,不错不错,学习了! 谢谢谢谢星星 万分感谢楼主 看的一脸懵逼,不是学计算机的 很好。但是看不懂啊
页:
[1]