积分 173 最后登录 2023-10-26 精华 0 阅读权限 20 主题 37 UID 4849749 帖子 357 PB币 815 威望 5 贡献 0 技术 0 活跃 586
UID 4849749 帖子 357 PB币 815 贡献 0 技术 0 活跃 586
本帖最后由 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下载。
(还有下半部分晚点再写,到时候补在楼下吧)
展开阅读全文​
附件:
你需要登录 才可以下载或查看附件。没有帐号?注册