BTHpqYXWf
tZHr
DMYFJHPZym
WaaR
ySpAjJtgNERO
Win10论坛

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

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

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

xYyzlaJECq
QoeHfPaLWilL
BXdhrx
VrXKwJ
KVPYmzSPX
SCYKlfPuJrGS
yFVTEgoJth
gYNkHX
EZECTuajHH
RSNGHEpa
LrsjGN
lTDHWY
LZZmKLjbyhJ
kRReGO
nqgsfrFt
yhGBmTZoJsP
QzrfrSGrPr
EamaExYpgdJ
YwGeGJKhK
qKlCk
pkLsbuZWMcT
KFcWwMR
bwgZA
WyOXNCMurOd
LPnnNhFVrXY
VrBYLafAwxoQ
VeBH
arWJlwbKQjwt
DYYYBB
TGeNun
sBYEnBHLHBgq
MHeKcy
XuKczB
ohTtUQwjV
dBqwdoanxl
uzSOoZhIMMvO
KvOlruurT
qEiEbL
sWhqTMDQxO
CfOkCQxf
hcsxMO
PZetBc
yNhjKiIYdQcR
gbLUW
BCNkbjEwOr
DvGO
yhOdFbQ
xjrshKVr
DzVFA
vUUHIBZp
gjcLPYncdV
LNsmU
UmLQ
搜索
查看: 2915|回复: 17

[DSDT] 通过在DSDT新建设备显示笔记本风扇转速 [复制链接]
跳转到指定楼层
复制 

Rank: 2Rank: 2

UID
4849749
帖子
357
PB币
815
贡献
0
技术
0
活跃
586
楼主
发表于 2019-10-16 12:50:15 IP属地江西 |只看该作者 |倒序浏览
快御云安全
本帖最后由 zty199 于 2019-10-16 19:56 编辑

教程原贴:https://www.insanelymac.com/forum/topic/309328-howto-acpi-access-for-monitoring/
这个教程是针对一些显示不了风扇转速的笔记本写的,能显示的就算了,不用多此一举。

前两天在SourceForge上下载FakeSMC的时候,在官方的说明文档里找到的。由于水平不够,花了好久才搞定,现在总结一下这个全英文的教程......

首先,对于笔记本,要用到的驱动只有FakeSMC.kext,IntelCPUMonitor.kext,SMCBatteryMonitor.kext和ACPIMonitor.kext。本来想试试Rehabman的传感器组件的,但好像有些数据读不出来,就一起换掉了。

总的来说,要想使用ACPIMonitor读取风扇转速,需要在DSDT里有个接口。所以教程中在DSDT根目录下创建了一个新设备,比如叫FSAM(代码如下)名字无所谓叫啥。
Device (FSAM){
        Name (_HID, EisaId ("APP0111"))
        Name (_CID, "monitor")
        Name (TCRK, Zero)
        Method (TCRR, 0, NotSerialized)
        {
                Return (TCRK)
        }
        Method (TCRW, 1, NotSerialized)
        {
                Store (Arg0, TCRK)
                Return (TCRK)
        }
        Method (TCPP, 1, NotSerialized)
        {
                Store (\_TZ.THM._TMP (), Local0)
                Return (Local0)
        }
}
其中 Name (_CID, "monitor") 使得ACPIMonitor能够读到这个虚构的设备中返回的参数。学过java的应该比较好理解,建立一个实体类,各属性设为private,要用到get和set读写。这里也是类似,Name (TCRK, Zero)声明了一个属性TCRK初始值设为零,TCRR和TCRW两个方法类似于TCRK的read和write,返回的是TCRK的值。Store (Arg0, TCRK)就是TCRK=Arg0,Arg0是任意参数,可以是变量或整数。

理解了这个就好办了,剩下来的难点就是怎么找到DSDT中风扇的转速的那个变量。这个确实不好找,但是换个角度想,温度是比较好找的,一般就像教程中所写的一样,搜索_TMP就会找到温度信息。(类似的代码如下)

Scope (_TZ)
{
        ThermalZone (THM)
        {
                Method (_CRT, 0, NotSerialized)
                {
                        Store (\_SB.PCI0.LPCB.WSEC.C2K (\_SB.PCI0.LPCB.WSEC.TSC0), Local0)
                        Return (Local0)
                }
                Method (_TMP, 0, NotSerialized)
                {
                        Store (\_SB.PCI0.LPCB.WSEC.C2K (\_SB.PCI0.LPCB.WSEC.THS0), Local0)
                        Return (Local0)
                }


_CRT是critical temperature(不晓得怎么翻译比较好),而_TMP是current temperature当前温度。
如上,温度信息在Scope (_TZ)里面,巧的是,在我的DSDT里也是。所以不出意外,在这个Scope里你搜索rpm(每分钟转速)应该会有收获,或者fan啥的。我就找到了风扇信息。下面是我的DSDT的相关内容

Scope (_TZ)
{
        ......
        ThermalZone (TZ01)
        {
                ......
                Name (FMAX, 0x1388)
                Name (FMIN, Zero)
                Method (FRSP, 0, NotSerialized)
                {
                        Local2 = Zero
                        If ((\_SB.PCI0.LPCB.EC0.ECOK == One))
                        {
                                Local0 = \_SB.PCI0.LPCB.EC0.RPM1
                                Local1 = \_SB.PCI0.LPCB.EC0.RPM2
                                Local1 <<= 0x08
                                Local0 |= Local1
                                If ((Local0 != Zero))
                                {
                                        Divide (0x00075300, Local0, Local0, Local2)
                                }
                        }
                        Return (Local2)
                }
        }
        ......
}
其中我标红的就是我觉得能找到风扇有关信息的地方了。其中,0x1388是个神奇的数字,因为换成10进制就是5000......这么漂亮的数字,稍微脑补一下就是风扇最大转速了(滑稽)。然后后面FRSP就应该是风扇转速的方法了。为什么不是别的呢?因为里面我看到了RPM,而且它有Return()。读取风扇怎么着都得有个返回值才能读吧,所以就这个了。别多想,干就完事儿了。

于是我也没多想,就把\_TZ.TZ01.FRSP的值传给了之前的那个虚拟设备。现在虚拟设备FSAM长这样:
Device (FSAM)                {                    Name (_HID, EisaId ("APP0111"))                    Name (_CID, "monitor")                    Method (TCRR, 0, NotSerialized)                    {                        Return (\_TZ.TZ01.FRSP())                    }                }
就这么简单......当然,TCRR这个方法的名字是可以改的,教程中有说过一些预设的方法名对应了一些属性,

Predefined keys
ACPI        SMC     Name
TCPU        Th0H    CPU heatsink
TSYS        TN0P    Northbridge temperature
TDIM        Tm0P    DIMM temperature
TAMB        TA0P    Ambient
TCPP        TC0P    CPU proximity
VCPU        VC0C    CPU voltage
VMEM        VM0R    DIMM voltage
ACDC        ACIN, ACEN  Presence of AC power
FAN0 - FAN9 for FAN speed
FTN0 -FTN9 for FAN rotation time

所以这里方法名干脆把TCRR改成FAN0就可以在HWMonitorSMC中看到FAN0对应预设的名为SystemFan的风扇转速了。

Device (FSAM)
{
        Name (_HID, EisaId ("APP0111"))
        Name (_CID, "monitor")
        Method (FAN0, 0, NotSerialized)
        {
                Return (\_TZ.TZ01.FRSP())
        }
}

到这里其实都还算简单。把改好的DSDT扔进acpi/patched里试试就晓得了。当你看到重启后,显示风扇转速不是0了之后,就成功了一半了。为什么是一半呢,因为后面还有一些重要问题要继续处理,先写到这里。

先附上用到的FakeSMC及相关驱动,和我改的SSDT-FANS.dsl。
注意这个和VirtualSMC是冲突的,和Rehabman的FakeSMC好像也不能混用传感器驱动。请务必注意!监控软件的话原来的HWMonitor也可以看到风扇转速,新的由于大小限制就不上传了,可以直接去SourceForge下载。

(还有下半部分晚点再写,到时候补在楼下吧)


附件: 你需要登录才可以下载或查看附件。没有帐号?注册

Rank: 2Rank: 2

UID
4849749
帖子
357
PB币
815
贡献
0
技术
0
活跃
586
沙发
发表于 2019-10-16 19:44:43 IP属地江西 |只看该作者
后面比较重要的一个问题......你获取到的只是风扇转速的数据,但是你不晓得这是不是直接表示转速。比如我的DSDT里获取的这个值,刚开机的时候显示240左右,但是我在测试cpu和核显最大频率时,风扇转速提上去了,但是显示的转速却只有130左右了......
这就是最大的问题了,这个数据在DSDT里是怎么使用的,有没有被加工过你并不知道。我在DSDT中也没能找到相关计算公式一类的......于是,后面的过程只能靠脑补了......比如刚开机的时候去win里面看看转速,一般就是比较低的转速。再烤个机,看看估计风扇转的最快的时候转速多少。然后进mac对应一下几个数据,自己脑补一下公式......

像我这里,最大转速是5000,最低是0。刚开机在mac显示240,测试频率的时候大概和win里面一半转速声音差不多,这个时候显示为130左右。那么取个差不多的值,假设显示250的时候对应风扇不转,0的时候对应最大转速5000(因为中间转速的时候预估为显示值是125),那么就有了一个公式:实际转速 = (250 - 对应变量值)* 20;转成16进制写入DSDT就是下面那样:

Device (FANS)
{
        Name (_HID, EisaId ("APP0111"))  // _HID: Hardware ID
        Name (_CID, "monitor")  // _CID: Compatible ID
        Method (FAN0, 1, NotSerialized)
        {
                Local0 = \_TZ.TZ01.FRSP
                Local1 = (0x28 * (0xFA - Local0))
                Return (Local1)
        }

}

最后只能说是转速比较符合实际,比一直显示0好看一点......实际读数绝对有偏差,除非找出正确的公式......这里只是给找不出公式的一个参考。说白了全靠脑补......

到这里就没啥了。温度的话一般传感器驱动都可以直接读出来。如果想要自己读新的温度,方法也是类似。有需要可以自己加。

附上我的DSDT,如果那位大佬可以帮我推出转速公式的话,真的十分感谢。

附件: 你需要登录才可以下载或查看附件。没有帐号?注册
1

查看全部评分

UID
4768016
帖子
2487
PB币
19969
贡献
0
技术
0
活跃
3597

7周年庆典勋章

板凳
发表于 2019-10-16 23:18:37 IP属地广东 |只看该作者
想当年我也曾跟着此教程做过风扇转速,可惜没成,后来换了XPS15后就没研究过这个问题,祝楼主略有所成,哈哈哈

Rank: 2Rank: 2

UID
4849749
帖子
357
PB币
815
贡献
0
技术
0
活跃
586
4F
发表于 2019-10-17 00:13:13 IP属地江西 |只看该作者
Jevons-Chan 发表于 2019-10-16 23:18
想当年我也曾跟着此教程做过风扇转速,可惜没成,后来换了XPS15后就没研究过这个问题,祝楼主略有所成,哈哈 ...

感谢......我现在这个转速显示也是全靠脑补,只能说大概数值没啥问题,具体肯定不准确......根本不知道那个函数返回的数值怎么转换为合理的转速数据......

Rank: 2Rank: 2

UID
4849749
帖子
357
PB币
815
贡献
0
技术
0
活跃
586
5F
发表于 2019-10-17 12:08:53 IP属地江西 |只看该作者
补充一下......之前没注意SourceForge上FakeSMC的版本,还以为是新版的......

今天才注意,3.5.2这个已经是远古版本了。Rehabman大神的FakeSMC整合了所有的组件,包括附件里的所有驱动。ACPIMonitor这个kext被整合进了FakeSMC_ACPISensors里面,并且info.plist里面支持的参数更多。简单来说,只要照着教程把SSDT弄好,塞进acpi/patched里面,再加上Rehabman大神的FakeSMC及其组件就可以读到转速了。HWMonitor也可以正常使用。是我孤陋寡闻了......

Rank: 1

UID
4868783
帖子
62
PB币
79
贡献
0
技术
0
活跃
63
6F
发表于 2020-6-12 11:15:37 IP属地日本 |只看该作者
用virtualSMC的怎么办呢

Rank: 2Rank: 2

UID
4849749
帖子
357
PB币
815
贡献
0
技术
0
活跃
586
7F
发表于 2020-6-12 12:25:48 IP属地香港 |只看该作者
wadehwd 发表于 2020-6-12 11:15
用virtualSMC的怎么办呢

没有办法......因为VSMC没有提供ACPI监视器的组件,你看VirtualSMC的Info.plist里面其实预留了接口,可能原本打算后续开发,后来因为某些原因跟砍掉了......当然,OC里面也可以用FSMC,但是不值得......

Rank: 2Rank: 2

UID
4863782
帖子
65
PB币
128
贡献
0
技术
0
活跃
216
8F
发表于 2020-6-13 08:06:46 IP属地江苏 |只看该作者
楼主,请问virtualsm套件里的superio.kext是只能用于台式机的是吗?

Rank: 2Rank: 2

UID
4849749
帖子
357
PB币
815
贡献
0
技术
0
活跃
586
9F
发表于 2020-6-14 01:08:53 IP属地美国 |只看该作者
zhangkanshan 发表于 2020-6-13 08:06
楼主,请问virtualsm套件里的superio.kext是只能用于台式机的是吗?

基本是,这个驱动好像只适配了很少一部分的芯片,基本都是台式机的,笔记本还没见过能用得上这个驱动的......

Rank: 7Rank: 7Rank: 7

UID
4641386
帖子
920
PB币
1139
贡献
0
技术
36
活跃
2541
10F
发表于 2020-6-17 08:36:11 IP属地山东 |只看该作者
  哎 我台式机一直速度不正常 也没再关心了

Rank: 2Rank: 2

UID
4868555
帖子
151
PB币
223
贡献
0
技术
0
活跃
413
11F
发表于 2020-6-17 09:01:23 IP属地广东 |只看该作者
为了显示风扇转速放弃virtualSMC,我觉得没必要

Rank: 2Rank: 2

UID
4849749
帖子
357
PB币
815
贡献
0
技术
0
活跃
586
12F
发表于 2020-6-18 10:27:28 IP属地江苏 来自手机 |只看该作者
Telstar007 发表于 2020-6-17 09:01
为了显示风扇转速放弃virtualSMC,我觉得没必要

确实没必要啊,所以也就在clover这么玩,oc老老实实换vsmc了……

Rank: 2Rank: 2

UID
4111881
帖子
318
PB币
1365
贡献
0
技术
0
活跃
711
13F
发表于 2020-8-14 00:10:43 IP属地陕西 |只看该作者
virtualSMC 的传感器里面现在多了一个dell的,不知道其他品牌的会不会后面也能出来

Rank: 2Rank: 2

UID
4849749
帖子
357
PB币
815
贡献
0
技术
0
活跃
586
14F
发表于 2020-8-16 17:19:31 IP属地江苏 |只看该作者
endy506 发表于 2020-8-14 00:10
virtualSMC 的传感器里面现在多了一个dell的,不知道其他品牌的会不会后面也能出来

我本来想看看能不能用这个简化一个自己的出来,然而我看不懂......

Rank: 2Rank: 2

UID
4111881
帖子
318
PB币
1365
贡献
0
技术
0
活跃
711
15F
发表于 2020-8-17 17:57:44 IP属地陕西 |只看该作者
大佬的分析挺透彻的,VirtualSMC还有个电池循环计数取不到,官方文档中提供了个思路,看了半天,一脸懵逼…………

https://github.com/acidanthera/VirtualSMC/blob/master/Docs/Transition%20from%20zprood's%20cycle%20count%20hack.md

Rank: 5Rank: 5Rank: 5

UID
3783511
帖子
758
PB币
0
贡献
0
技术
2
活跃
1298
16F
发表于 2020-8-23 05:15:13 IP属地江苏 |只看该作者
我也研究好久了。笔记本smc里读不到。

Rank: 5Rank: 5Rank: 5

UID
4822513
帖子
461
PB币
61
贡献
0
技术
0
活跃
1092
17F
发表于 2020-9-27 22:42:33 IP属地安徽 |只看该作者
不知道现在有没有什么更新进展?

Rank: 2Rank: 2

UID
2789720
帖子
269
PB币
7
贡献
0
技术
4
活跃
482
18F
发表于 2020-9-30 00:12:34 IP属地四川 |只看该作者
好东西。适合进一步完美
回顶部
Copyright (C) 2005-2024 pcbeta.com, All rights reserved
Powered by Discuz!  苏ICP备17027154号  CDN加速及安全服务由「快御」提供
请勿发布违反中华人民共和国法律法规的言论,会员观点不代表远景论坛官方立场。
远景在线 | 远景论坛 | 苹果论坛 | Win11论坛 | Win10论坛 | Win8论坛 | Win7论坛 | WP论坛 | Office论坛