ykCPRAo
GvEcOrz
AfLtUgwuBrE
cfVsc
iEaBfi
HtAaHVesRYln
EvHMOKHtZfPi
RaBKbxZQL
WDiPJlTViB
Wgunfov
Win10论坛

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

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

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

XmJGXfC
zFWTrBH
DtFbwyqI
vXGxQiZDJ
HbgEgCnzus
SAgbTeose
fFsXKUnAqOsN
jWdhA
DNgugDGR
OHeNPq
bUgh
YvBsxxhtG
VMiiDZ
bAEUDJCVdBrR
dGjzWWG
AdEkWEnnHOa
SezprOvk
GDZAERvpn
fHWxmqiqA
ihZd
ZMkPUJrdQ
JzoTkW
WtErkBu
lyMbFBzAXwXR
FAbk
pZhb
bApRr
JRvKjGaenEn
LrZVUITP
apgyTBMQM
YadfjkNNuzD
spEAa
ncIrHV
EgmO
zLZsy
sQvUQbJMQgj
gdcbfkWnSfHV
PJIGnYWycl
KWebNYIbeo
wMIRxFQsaLv
RgJFCAG
VDhNitb
avCLu
WIExgUTxGpTy
rdPgt
jHJucQwSa
EiMuBJNJ
vPzmdoSh
rmVBAJFIEpfP
rkUKdBPvrTTt
ESPZLUuyV
kQzar
elNqMcrhj
lrzQJBxOdiH
IYPNtbry
UjWeKgEYPb
NQgKpuy
搜索
查看: 8917|回复: 36

[DSDT] 小白都能看懂的DSDT电量显示补丁教程 [复制链接]
跳转到指定楼层
复制 

Rank: 1

UID
4840327
帖子
47
PB币
137
贡献
0
技术
3
活跃
41
楼主
发表于 2018-5-7 12:43:36 IP属地广东 |只看该作者 |倒序浏览
快御云安全
简介
知识储备
  • DSDT
  • 正则匹配(不懂就依葫芦画瓢)

背景
由于普通PC的电池设备并不兼容与苹果的SMbus设备,所以,对于黑苹果,只能够通过ACPI来获取电池状态。为了解决电量显示我可是爬了不少帖子、花了不少时间呢。但是从我参考的中外教程来看,我觉得都不太理想,作为一个程序员的我都要看好几遍,普通用户怕是望而却步。再说作为小白用户其实没必要搞清楚里面的弯弯道道,能正常显示电量就是目标,所以萌生了写这篇文章的念头。

参考资料

  • 修改DSDT实现电量显示方法【转载】

  • [Guide] How to patch DSDT for working battery status

  • Laptop-DSDT-Patch)下载了battery_HP-Envy-14(我的是HP Envy 13,当时认为应该是最接近的)参考对照,补丁和源文件都有的留下,补丁有源文件没有的删了,再依葫芦画瓢把源文件有补丁没有的补上,最后编译,除了16位、32位拆字节补丁无效(也就是类似下面的代码),其它的都正常,然后就傻不拉几的手工拆
    1. into device label H_EC code_regex BDC0,\s+16 replace_matched begin DC00,8,DC01,8 end;//我确定自己的设备标识也是H_EC
    2. ……
    复制代码
    特别注意类型如下代码
    1.     # 0x10即上面找出来的BDN0偏移量
    2.     into method label GBTI code_regex \(BDN0, replaceall_matched begin (RECB(0x10,56), end;
    3.     # 0x20即上面找出来的BMN0偏移量
    4.     into method label GBTI code_regex \(BMN0, replaceall_matched begin (RECB(0x20,128), end;
    5.     # 0x31即上面找出来的BCT0偏移量
    6.     into method label GBTI code_regex \(BCT0, replaceall_matched begin (RECB(0x31,128), end;
    复制代码
    编译成功另存为aml文件替换重启正常显示电量。至此,如果你不想继续看,用我一样的笨方法理论上是能解决问题的。码农天生喜欢折腾,不然也不会玩黑苹果了,于是我把补丁文件研究了一番寻求优雅方式

    高级进阶
    通过分析补丁文件,我发现了一个特点,就是除了增加方法,其它的都是正则匹配替换(在这里我假设你懂正则),于是我去看了Patching Syntax Grammar,下面我简单说明一下
    • 第一部分into|into_all就是在什么范围(后面跟着的限定),into应该的匹配第一个,into_all有多少匹配多少
    • 第二部分即限定,可以有All|DefinitionBlock|Scope|Method|Device|Processor|ThermalZone这些值
    • 第三部分即名称标识啥的了,支持标签名称、正则匹配、父项名称等
    • 第四部分selector,即选择器(支持正则)
    • 第五部分动作(就是在匹配项里干什么),支持insert|set_label|replace_matched|replaceall_matched|remove_matched|removeall_matched|remove_entry|replace_content|store_%8|store_%9这些
    • begin end里面的就是主体

    拆字节补丁例子
    1. # 在范围为^LPCB中查找(即)BDC0, 16的内容(s+就是有至少一个空格),替换成DC00,8,DC01,8
    2. # 也就是将BDC0, 16拆成两个字节DC00,8,DC01,8
    3. # 注意这里16后面没有逗号(,),替换第二个8后面也没有,所以即使是}前一个也是通用的
    4. # 这个是GitHub下载补丁里的,我的设备标识是H_EC,但我发现无效,原因未知,于是我改了

    5. into device label H_EC code_regex BDC0,\s+16 replace_matched begin DC00,8,DC01,8 end;
    6. into scope label ^^LPCB code_regex BDC0,\s+16 replace_matched begin DC00,8,DC01,8 end;
    7. # 拆分32位属性
    8. into scope code_regex BTY0,\s+32 replace_matched begin TY00,8,TY01,8,TY02,8,TY03,8 end;
    9. # 所有大于32位的都不用拆
    复制代码


    从上面的图片可以看到补丁完美实现拆字节,下面再看看调用例子

    访问属性补丁例子

        # 16位属性访问替换补丁
        # 注意BFC0在两个方法中有调用,都要写补丁替换
        into method label BTIF code_regex \(BFC0, replaceall_matched begin (B1B2(FC00,FC01), end;
        into method label _Q09 code_regex \^\^BFC0\) replaceall_matched begin ^^B1B2(FC00,FC01)) end;
        # 32位属性访问替换补丁
        into method label GBTI code_regex \(BTY0, replaceall_matched begin (B1B4(TY00,TY01,TY02,TY03), end;
        # 56位属性替换补丁
        into method label GBTI code_regex \(BDN0, replaceall_matched begin (RECB(0x10,56), end;
        # 128位属性替换补丁
        into method label GBTI code_regex \(BMN0, replaceall_matched begin (RECB(0x20,128), end;
        # 从56位和128位属性访问补丁可以看到是通过RECB(偏移量, 位数)这个方法实现的,理论上16位、32位的也可以不拆,访问的时候用这个方法,但是回到准备阶段第4部我们发现算每个属性的偏移量这工作比拆字节还头大


    其它举例
    # 在做Thinakpad E430电量补丁的时候发现有类型\_SB.PCI0.LPCB.EC.HWAK这样的调用,我用下面的补丁修正
    into method label _L43 code_regex \(\\\_SB.PCI0.LPCB.EC.HWAK replaceall_matched begin \(\\_SB.B1B2(\\_SB.PCI0.LPCB.EC.AK00, \\_SB.PCI0.LPCB.EC.AK01) end;
    # 理论上不需要上面那个补丁应该都能替换掉所有的,但发现不彻底,原因未知
    into ALL code_regex \(\\\_SB.PCI0.LPCB.EC.HWAK replaceall_matched begin \(\\_SB.B1B2(\\_SB.PCI0.LPCB.EC.AK00, \\_SB.PCI0.LPCB.EC.AK01) end;


    ehabMan大神提供通用代码
    ## RehabMan大神提供通用代码
    1. # 这部分之间拷贝到你的补丁文件前面
    2. # 特别注意部分行后面的\n,因为补丁里你即使输入了换行也是当一行出来的,所以加入了硬换行代码
    3. # 删除原有B1B2方法(一般都没)
    4. into method label B1B2 remove_entry;
    5. # 新插入B1B2方法
    6. # 这里需要注意一下,一般情况下默认的都没问题
    7. # 有些型号可能会导致打完补丁的少量代码访问不了B1B2方法
    8. # 这时候要么调整补丁绝对路径访问,要么插入的时候改个位置
    9. into definitionblock code_regex . insert
    10. # into Scope label \_SB code_regex . insert // 这是我改的位置
    11. begin
    12. Method (B1B2, 2, NotSerialized) { Return(Or(Arg0, ShiftLeft(Arg1, 8))) }
    13. end;

    14. into method label B1B4 remove_entry;
    15. into definitionblock code_regex . insert
    16. begin
    17. Method (B1B4, 4, NotSerialized)\n
    18. {\n
    19. Store(Arg3, Local0)\n
    20. Or(Arg2, ShiftLeft(Local0, 8), Local0)\n
    21. Or(Arg1, ShiftLeft(Local0, 8), Local0)\n
    22. Or(Arg0, ShiftLeft(Local0, 8), Local0)\n
    23. Return(Local0)\n
    24. }\n
    25. end;

    26. into method label RE1B parent_label EC0 remove_entry;
    27. into method label RECB parent_label EC0 remove_entry;
    28. into device label EC0 insert
    29. begin\n
    30. Method (RE1B, 1, NotSerialized)\n
    31. // Arg0 - offset in bytes from zero-based EC\n
    32. {\n
    33. OperationRegion(ECOR, EmbeddedControl, Arg0, 1)\n
    34. Field(ECOR, ByteAcc, NoLock, Preserve) { BYTE, 8 }\n
    35. Return(BYTE)\n
    36. }\n
    37. Method (RECB, 2, Serialized)\n
    38. // Arg0 - offset in bytes from zero-based EC\n
    39. // Arg1 - size of buffer in bits\n
    40. {\n
    41. ShiftRight(Arg1, 3, Arg1)\n
    42. Name(TEMP, Buffer(Arg1) { })\n
    43. Add(Arg0, Arg1, Arg1)\n
    44. Store(0, Local0)\n
    45. While (LLess(Arg0, Arg1))\n
    46. {\n
    47. Store(RE1B(Arg0), Index(TEMP, Local0))
    48. Increment(Arg0)
    49. Increment(Local0)
    50. }
    51. Return(TEMP)\n
    52. }\n
    53. end;

    54. into method label RE1B parent_label EC remove_entry;
    55. into method label RECB parent_label EC remove_entry;
    56. into device label EC insert
    57. begin
    58. Method (RE1B, 1, NotSerialized)\n
    59. // Arg0 - offset in bytes from zero-based EC\n
    60. {\n
    61. OperationRegion(ECOR, EmbeddedControl, Arg0, 1)\n
    62. Field(ECOR, ByteAcc, NoLock, Preserve) { BYTE, 8 }\n
    63. Return(BYTE)\n
    64. }\n
    65. Method (RECB, 2, Serialized)\n
    66. // Arg0 - offset in bytes from zero-based EC\n
    67. // Arg1 - size of buffer in bits\n
    68. {\n
    69. ShiftRight(Arg1, 3, Arg1)\n
    70. Name(TEMP, Buffer(Arg1) { })\n
    71. Add(Arg0, Arg1, Arg1)\n
    72. Store(0, Local0)\n
    73. While (LLess(Arg0, Arg1))\n
    74. {\n
    75. Store(RE1B(Arg0), Index(TEMP, Local0))\n
    76. Increment(Arg0)\n
    77. Increment(Local0)\n
    78. }\n
    79. Return(TEMP)\n
    80. }\n
    81. end;
    复制代码
    补丁例子
    提供我做的两个型号(HP-ENVY-13及ThinkaPad E430)的补丁及原始DSL文件参考
    链接: https://pan.baidu.com/s/1Y8Vcnzn-SFTEZ_itMcRvKw 密码: gryy
3

查看全部评分

Rank: 5Rank: 5Rank: 5

UID
2619827
帖子
815
PB币
22
贡献
0
技术
4
活跃
720
沙发
发表于 2018-5-7 17:23:29 IP属地江西 |只看该作者
谢谢分享   占楼备用

Rank: 2Rank: 2

UID
4674963
帖子
277
PB币
5
贡献
0
技术
3
活跃
929
板凳
发表于 2018-5-7 17:40:11 IP属地美国 |只看该作者
谢谢分享。。

Rank: 1

UID
4840327
帖子
47
PB币
137
贡献
0
技术
3
活跃
41
4F
发表于 2018-5-7 19:08:22 IP属地内网 |只看该作者
因为发这贴的时候一直被拦截,删掉了一下内容才发成功,然后又进入审核,审核过了又没法再次编辑,
嗯,远景发帖很蛋疼
完整阅读请移步blog
http://xiegengcai.github.io/2018/05/05/how-to-create-battery-dsdt-fix/

Rank: 7Rank: 7Rank: 7

UID
4781711
帖子
1788
PB币
1131
贡献
0
技术
0
活跃
2224
5F
发表于 2018-5-7 19:27:05 IP属地内网 |只看该作者
我是小白,小白是我,嘻嘻。

Rank: 2Rank: 2

UID
1657393
帖子
163
PB币
85
贡献
0
技术
0
活跃
354
6F
发表于 2018-5-7 19:43:49 IP属地内蒙古 |只看该作者
谢谢 分享

Rank: 2Rank: 2

UID
4840984
帖子
298
PB币
194
贡献
0
技术
0
活跃
756
7F
发表于 2018-5-10 23:37:01 IP属地广东 |只看该作者
非常感谢,爬楼好久才找到这教程,谢谢

Rank: 2Rank: 2

UID
2854743
帖子
180
PB币
1
贡献
0
技术
0
活跃
67
8F
发表于 2018-5-10 23:49:00 IP属地浙江 |只看该作者
非常感谢,爬楼好久才找到这教程,谢谢
1

查看全部评分

Rank: 9

UID
4660277
帖子
4337
PB币
6821
贡献
0
技术
7
活跃
2717
9F
发表于 2018-5-11 09:18:54 IP属地黑龙江 |只看该作者
这种普及型的帖子多点最好 。感谢分享。

Rank: 2Rank: 2

UID
4831118
帖子
189
PB币
0
贡献
0
技术
0
活跃
186
10F
发表于 2018-5-11 11:50:18 IP属地福建 |只看该作者
感谢分享。

Rank: 1

UID
4841935
帖子
12
PB币
56
贡献
0
技术
0
活跃
23
11F
发表于 2018-6-9 20:30:44 IP属地江西 |只看该作者
谢谢分享~   

Rank: 5Rank: 5Rank: 5

UID
4067897
帖子
1155
PB币
570
贡献
0
技术
0
活跃
2981
12F
发表于 2018-6-9 20:36:32 IP属地江苏 |只看该作者
希望提供word教程下载。

Rank: 2Rank: 2

UID
4621102
帖子
105
PB币
138
贡献
0
技术
0
活跃
146
13F
发表于 2018-6-9 21:23:34 IP属地山东 |只看该作者
感谢对小白的支持,很有用处

Rank: 2Rank: 2

UID
4780063
帖子
128
PB币
25
贡献
0
技术
0
活跃
332
14F
发表于 2018-6-12 08:58:06 IP属地广东 |只看该作者
收藏了,感谢楼主

Rank: 2Rank: 2

UID
4606295
帖子
56
PB币
66
贡献
0
技术
0
活跃
155
15F
发表于 2018-6-12 09:31:45 IP属地重庆 来自手机 |只看该作者
看不懂xili

厉害楼主

Rank: 1

UID
4840327
帖子
47
PB币
137
贡献
0
技术
3
活跃
41
16F
发表于 2018-6-20 09:32:50 IP属地广东 |只看该作者
应回复提供附件文档
附件: 你需要登录才可以下载或查看附件。没有帐号?注册

Rank: 1

UID
4840327
帖子
47
PB币
137
贡献
0
技术
3
活跃
41
17F
发表于 2018-6-20 09:34:07 IP属地广东 |只看该作者
liugj47 发表于 2018-6-9 20:36
希望提供word教程下载。

远景动不动要审核,很麻烦,4楼有我博客的地址

Rank: 2Rank: 2

UID
2674890
帖子
281
PB币
181
贡献
0
技术
0
活跃
1034
18F
发表于 2018-6-20 10:36:32 IP属地上海 来自手机 |只看该作者
技术贴吧支持

Rank: 5Rank: 5Rank: 5

UID
4702532
帖子
1053
PB币
534
贡献
0
技术
0
活跃
1079
19F
发表于 2018-6-20 10:55:48 IP属地广东 |只看该作者
感谢分享,DSDT太复杂了

Rank: 5Rank: 5Rank: 5

UID
1501018
帖子
933
PB币
119
贡献
0
技术
1
活跃
901
20F
发表于 2018-6-20 12:02:36 IP属地上海 |只看该作者
写的好详细,可以好好的研究一下,不在做伸手党
回顶部
Copyright (C) 2005-2024 pcbeta.com, All rights reserved
Powered by Discuz!  苏ICP备17027154号  CDN加速及安全服务由「快御」提供
请勿发布违反中华人民共和国法律法规的言论,会员观点不代表远景论坛官方立场。
远景在线 | 远景论坛 | 苹果论坛 | Win11论坛 | Win10论坛 | Win8论坛 | Win7论坛 | WP论坛 | Office论坛