|
发表于 2024-3-16 14:45:38| 字数 3,543| - 中国–北京–北京 联通
|
显示全部楼层
|阅读模式
本帖最后由 chenxinyi 于 2024-3-16 19:06 编辑
周末写点东西,分享一下。
非常感兴趣Thinkpad E16 Gen 1 i7-13700H这台机器的性释放,但是,作为新机器和本人极差的动手能力(最多拆个壳),
还是将散热改造暂且搁置一下。
研究了几天,明白了如何手动控制风扇转速!其原理应该和早期使用TPFancontrol的软件来手动调节风扇转速的原理也差不多,
很可惜,TPFancontrol没法在Thinkpad E16上使用,网上也找了很多都未成功。
想到手动控制Thinkapd E16风扇转速,需要准备:
笔电EC监控软件 RWEverything
安装前请在Windows 10/11中关闭“内核隔离 > 内存完整性”(Core Isolotion > Memory integrity) ,并且以管理员权限运行下面命令允许驱动签名测试, 然后重启机。
- bcdedit -set TESTSIGNING ON
复制代码 注意:BitLock如果打开,重启后,将会询问密钥进入!(所以,最好先备份BitLock密钥到u盘)
RWEverything装完启动后,点击工具条上EC按钮,开始显示和监控EC当前256个寄存器数值,并且这些寄存器的数值可以手工修改(注意改动有风险,可能造成硬件损坏!),
注意,默认是1.3秒刷新一次(点右上refresh按钮改变监控时间间隔),
现在可以作一些压力测试(比如cpu-z),让笔记本风扇速度逐渐提高,可以观察到哪些寄存器发生了变化,比如风扇转速值是在寄存器0x84和0x85(2字节表示),
不过很不幸,这个数值虽然可以改变,但很快又被EC固件程序自动更新了,也有可能是BIOS/UEFI固件程序接管自动更新。
那究竟有没有办法让这个风扇转速可以手动控制呢?虽然,RWEverything给出了变化的寄存器,冒着风险去改,都没有结果,
好在没有硬件损坏。
在读了一篇笔电风扇程序开发者写的一篇短文以后(如何分析笔电DSDT表)Analyze your notebook's DSDT,
大概明白了操作系统如何与BIOS/UEFI固件程序进行通讯的原理,这篇文章具有很大的启发性,分析方法类似,
如果你不想费脑阅读控制原理,请直接跳到最后,用我写的一个EC小程序修改风扇转速!
=========== 知其然, 知其所以然 [BEGIN] ===============
BIOS/UEFI固件会提供操作系统一个标准的ACPI高级电源管理接口, DSDT(差异系统描述表)是它的一部分,描述了很多硬件设备的信息,
其中,就包括了EC 。但是,这个DSDT表是汇编代码,还要反汇编成ASL可读代码,
幸运的是RWEverything这个工具软件不仅可以读出ACPI > DSDT表,而且已经自动完成了反汇编ASL可读代码:
- OperationRegion(ECOR, EmbeddedControl, Zero, 0x0100)
- Field(ECOR, ByteAcc, NoLock, Preserve)
- {
- HDBM, 1,
- , 1,
- , 1,
- ......
- HFSP, 8
- ......
复制代码 上面的代码描述了ECOR (EC控制)可操作寄存器的描述表, 表明HFSP这个8位寄存器的偏移位值(这里只截取关键部分),
经过码农计算器16进制计算得到,HFSP寄存器的偏移值是0x2F,
为什么对HFSP寄存器这么感兴趣? 因为,这个寄存器就是Thinkpad E16 的关键EC寄存器用来改变风扇转速的!
看下面继续找到的ASL代码,很明显告诉我们, 如果修改HFSP = 0x40,那就是最大风扇转速!
- If(LEqual(HFSP, 0x40))
- {
- ADBG("MAX FAN speed")
- If(And(Arg0, 0x00040000))
- {
- Store(One, SCRM)
- }
- Else
- {
- Store(Zero, SCRM)
- }
- }
- Else
- {
- ADBG("Allow to change FAN speed")
- If(And(Arg0, 0x00040000))
- {
- Store(One, SCRM)
- Store(0x07, HFSP)
- }
- Else
- {
- Store(Zero, SCRM)
- Store(0x80, HFSP)
- }
- }
复制代码
上面代码,表明3个数值可以设置到HFSP寄存器,0x40, 0x07, 0x80 ,
实际结合RWEverything工具软件,修改HFSP寄存器可以调节出手动9档转速,如下:
HFSP = 0x40 / 64 (5800RPM)
HFSP = 0x07 / 7 (4400RPM)
HFSP = 0x06 / 6 (4000RPM)
HFSP = 0x05 / 5 (3700RPM)
HFSP = 0x04 / 4 (3400RPM)
HFSP = 0x03 / 3 (3100RPM)
HFSP = 0x02 / 2 (2800RPM)
HFSP = 0x01 / 1 (2500RPM)
HFSP = 0X00 / 0 (关闭风扇)
如果将HFSP寄存器设置为0x80数值,表示切换为EC控制程序自动调节风扇转速(0~1800RPM~4100RPM)。
有点意思的是,将HFSP寄存器数值设为0x40(64),能调节出一个默认EC自动控制风扇都没有的最高转速5800RPM !
这个转速的确很厉害,声音和风噪声音达到了极致...
写点多余的,通过手动修改Thinkpad E16 Gen 1 的风扇转速到5800RPM以后, 作了几次Intel XTU压力测试(avx2指令集, 5分钟鸡血测试),可以持续近1分钟保持在45W的性能
随后触及Motherboard VR Thermal throttling (应该是CPU供电过热),另一个EDP电流墙一开始就存在。(EDP电流墙没法破除,但是,VR墙可能通过硬件散热改造有所改进。)
此外,在EC自动调节风扇转速时,相信应该还有一个可以让风扇启动的温度上限阈值(比如CPU或其它传感器温度到了50度,风扇开始启动),
目前还没有找到如何修改。
=========== 知其然, 知其所以然 [END] ===============
这种结合DSDT + RWEverything工具监控分析出手动修改风扇转速的方法, 相信应该适用于绝大多数Thinkpad甚至Thinkbook / Ideapad / Legion等系列,
甚至绝大多数其它OEM厂商的笔电。
下面放出一个自已写的EC读写程序(站在巨人肩上完成),在本人的Thinkpad E16 gen 1 (Intel i7-13700H) / Windows 11下测试通过,
免责声明: 如果你用此程序修改EC寄存器造成的任何硬件损坏,本人不承担任何责任!
使用前请打开驱动签名测试,无需关闭内核隔离 > 内存完整性,并重启电脑
- bcdedit -set TESTSIGNING ON
复制代码 注意:BitLock如果打开,重启后,将会问密钥进入!(先备份BitLock密钥到u盘)
不加任何参数,会提示使用方法:
请原谅我的烂英文和写代码的能力,目前也懒得改了。
-dump 显示EC全部可操作寄存器(范围0x00到0xFF)当前数值 (16进制)
-rpm 显示当前风扇转速 (只针对Thinkpad E16 Gen 1 Intel机型,不确定其它机型,主要原理是读出寄存器0x84, 0x85数值)
-r {port} 这里{port}替换为你想读的某个寄存器地址(0x00到0xFF),读出的数据以16进制显示
-w {port} {value} 这里{port}替换为你想写的某个寄存器地址(0x00到0xFF),{value}替换为你想写入的数值(1字节,以16进制表示,范围在0x00到0xFF)
下面举一些实际例子,只针对Thinkpad E16有效,不保证其它笔电有效,请结合本文分析原理,查找自已笔电EC寄存器如何手动控制风扇转速!
老王想把E16风扇转速调节到最高5800 RPM(自动模式下最高也只有4100 RPM) ,执行命令:
老王想把E16风扇转速调节到手动档最低1档 2500 RPM,执行命令:
从1档到7档,改最后一个参数变为0x01, 0x02, 0x03, 0x04, 0x05, 0x05, 0x06, 0x07
老王想把E16风扇关闭,执行命令: (危险!这是手动档,关闭风扇后 ,CPU温度升到100度,EC也不会自动打开风扇,有烧毁CPU风险!)
老王想恢复EC自动风扇调节, 执行命令:
再次免责声明: 如果你用此程序修改EC寄存器造成的任何硬件损坏,本人不承担任何责任!
注释:
了解到有些笔电的EC控制风扇转速的方式与Thinkpad E16类似,但差异可能是,有独立的寄存器或标志位在自动/手动模式切换。
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?注册
x
评分
-
查看全部评分
|