标签:风扇 生效 NPU 修改 环境 ioc bsp base war
先学习一下GPIO,网上各种找资料,拼凑,所以就不一一贴网址了。
一、GPIO
GPIO的英文全称General-Purpose Input /Output Ports,中文意思是通用I/O端口
一个GPIO端口至少需要两个寄存器,一个做控制用的“通用IO端口控制寄存器”,还有一个是存放数据的“通用I/O端口数据寄存器”。数据寄存器的每一位是和GPIO的硬件引脚对应的,而数据的传递方向是通过控制寄存器设置的,通过控制寄存器可以设置每一位引脚的数据流向。(GPIO相关的寄存器有,IOPIN、IOSET、IOCLR、IODIR四个寄存器。)
GPIO很典型的就是控制LED灯的亮灭,通过高低电平。这部分还得研究电路图,看GPIO的引脚,问题先放在这里,之后会去看电路图。
网址推荐: https://www.cnblogs.com/Obayan/p/3894221.html
再学习一下SuperIO,网上各种找资料,拼凑,所以就不一一贴网址了。
二、SuperIO
这次主要研究SuperIO读取以及控制风扇转速的问题。
参考文章:https://huchanghui123.github.io/Linux/Linux-Superio-CPU-FAN/
首先需要了解的一点是,CPU风扇属于环境控制器(EC)
内置在IT8786E-I中,包括五个电压输入,三个温度传感器输入,五个FAN转速计输入和五组先进的风扇控制器。 EC监控硬件环境,实现个人电脑的环境控制,我们需要找到IT8786E-I芯片的SPEC
流程如下:
1. 可以在Spec里面搜PnP Mode找到基地址,Address Port一般是2E,Data Port 一般是2F,如果有RW工具的话,可以进入Super IO,然后在IO Ports里面Index Port输2E,Data Port输入2F,然后在0x00位置依次输入(87h, 01h, 55h, 55h),进入MB PnP 模式。可能你发现你每输一个,它会自动变为0x00,不要以为没生效,其实它已经进入PnP Mode了。比如你输玩87h,确定后,马上变回00,不要慌,继续输入01h确定。
2. 使能 EC(LDN=04h, Index 30h=01)通过看SPEC,可以发现它的逻辑设备号是04h,所以我们可以选择Logical device 04,然后看它的30h位置是不是01,如果是01的话,则EC生效
3. 得到EC Base Address,可以从SPEC中看出,基地址是需要从60h,61h寄存器读出来的,60h是高八位,61h是低八位,合起来就是基地址base。然后我们的EC控制器的地址端口地址就是base+05h,数据端口就是base+06h。
基地址由逻辑设备寄存器确定(index=60h, 61h)
地址端口(Base+05h);数据端口(Base+06h)
4. 配置风扇转速寄存器(index=0Ch,default=00h)我们找到Fan PWM Control Register,找到控制风扇的寄存器地址,选择手动模式,即(Software Operation),然后根据SPEC,一般选择模式的地址部分会有控制风扇转速的地址说明,我们就可以设置00h-ffh控制风扇的转速。注意一点的是,00h不代表风扇停止,因为风扇会有一个最低转速,ffh是满转。
5. 计算出风扇转速(index=0Dh,18h)风扇转速会有一个公式,可以在SPEC里面直接搜RPM找到类似
这种就是风扇转速的计算公式,其中Count是你通过18h,0Dh读取出来的值换算成十进制的值,比如说18h读的是02h,0Dh读的是90h,那么合起来就是0290h,十进制为656,带入公式即可。
6. 退出MB PnP 模式(index=02h,default=02h)这个也可以在SPEC里面看到,这个退出PnP Mode在2E/2F端口里面的02h部分设置为01h。
至此,风扇控制就完毕了。
以前的机器大部分的流程就是这样就可以完成了。但是新机器经过实验控制不了,可能需要BIOS那边提供相应的寄存器来修改值进入手动模式才可以。还有这种讲的是ITE芯片的,如果不是用ITE芯片控制的话,流程可能就不是这样的了。有的风扇控制是不需要进入PnP Mode 的,这次就是对于其中的一种进行学习。
标签:风扇 生效 NPU 修改 环境 ioc bsp base war
原文地址:https://www.cnblogs.com/smart-zihan/p/11286977.html