本帖最后由 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 | SBBM | BBM0,BBM1 | SBDC | BDC0,BDC1 | SBDV | BDV0,BDV1 | SBSN | BSN0,BSN1 | SBRC | BRC0,BRC1 | SBAC | BAC0,BAC1 | SBVO | BVO0,BVO1 | SBCH | BCH0,BCH1,BCH2,BCH3 | SBMN&SBDN(128) | 这个比较特殊后面会有提起 |
4.拆解代码
ps:这里加粗的字都是要按照自己电脑的名字写的。
SBFC | - into device label EC code_regex SBFC,\s+16 replace_matched begin BFC0,8,BFC1,8 end;
复制代码
| | SBBM |
- into device label EC code_regex SBBM,\s+16 replace_matched begin BBM0,8,BBM1,8 end;
复制代码
|
| SBDC |
- into device label EC code_regex SBDC,\s+16 replace_matched begin BDC0,8,BDC1,8 end;
复制代码
|
| SBDV |
- into device label EC code_regex SBDV,\s+16 replace_matched begin BDV0,8,BDV1,8 end;
复制代码
|
| SBSN |
- into device label EC code_regex SBSN,\s+16 replace_matched begin BSN0,8,BSN1,8 end;
复制代码
|
| SBRC |
- into device label EC code_regex SBRC,\s+16 replace_matched begin BRC0,8,BRC1,8 end;
复制代码
|
| SBAC |
- into device label EC code_regex SBAC,\s+16 replace_matched begin BAC0,8,BAC1,8 end;
复制代码
|
| SBVO |
- into device label EC code_regex SBVO,\s+16 replace_matched begin BVO0,8,BVO1,8 end;
复制代码
|
| SBCH |
- Into device label EC code_regex SBCH,\s+32 replace_matched begin BCH0,8,BCH1,8,BCH2,8,BCH3,8 end;
复制代码
|
| SBMN&SBDN(128) |
- into device label EC code_regex (SBMN/SBDN,)\s+(128) replace_matched begin BMNX,%2,//%1%2/BDNX,%2,//%1%2 end;
复制代码
| /的意思都懂得吧 |
5.拆分完自然是要用这些拆分好的,下一步就是调用这些拆分好的。
SBFC | - Into 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 |
- into method 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;
复制代码
| - into method 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 EC - into
- 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的方式来搞定这个
|