BIOS实战之HW monitor

本文介绍了如何使用HWmonitor和IT8738芯片监控硬件状态,包括温度传感器、风扇转速和环境控制器(EC)的IO空间操作。重点讲解了获取EC地址、读写温度和风扇数据的方法,并提到了温度和转速计算的原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先看下HW monitor,也就是硬件监控,什么温度,电压,系统风扇,CPU风扇啥的。在IT8738芯片文档9.5节中,我们可以看到,这些是在芯片内置的EC逻辑设备中进行的,也就是环境控制(不是嵌入式控制):

环境控制器(EC)内置于IT8738中,包括七个电压输入、三个温度传感器输入、四个风扇转速计输入和四套高级风扇控制器。IT8738包含一个8位ADC(模数转换器),负责监控电压和温度。ADC将0V至2.8V(VREF)的模拟输入转换为8位数字字节。通过额外的外部组件,模拟输入可以监控不同的电压范围,除了监测0伏到2.8伏的固定输入范围。通过外部热敏电阻或热敏电阻二极管,温度传感器输入可转换为8位数字字节,使传感器输入监控各种部件的温度。还提供了一个内置ROM来调整非线性热敏电阻的特性。

怎么操作的之前在smart fan基础介绍中讲到过,我就直接copy到下面来了

就拿LDN 4 EC这个设备来说,我们要访问他的IO Space,首先得知道它的地址是多少,从IT8625的SPEC可以知道,地址就是0x60,0x61中的值。

这里的两个值是不能直接用的,按照说明,需要分别给他们加上05h和06h,再用index/data的IO方式访问就可以了。假如0x60的值是02h,0x61的值是90h(这两个值可以用RW看到),则:

index port address = 290h + 05h = 295h
data port address = 290h + 06h = 296h

理解上面的我们就可以写出逻辑了(PNP mode就不写了)

 我估计上面这个也得设置enable才行,所以总的代码应该是如下:

unsigned int GetEcAddress()
{
    unsigned int addr1,addr2,baseaddr;
    EnterPnPMode();

    IoWrite8(0x2E,0x07);
    IoWrite8(0x2F,0x04);

    IoWrite8(0x2E,0x30);
    IoWrite8(0x2F,0x01);

    IoWrite8(0x2E,0x60);
    addr1=IoRead8(0x2F);

    IoWrite8(0x2E,0x61);
    addr2=IoRead8(0x2F);

    ExitPnPMode();

    baseaddr=(addr1<<8&0xFF00) | addr2;

    return baseaddr;

}

ok,这样我们就获得了基地址,有了这个我们就可以读写EC里面的IO space了:

unsigned int ReadEcSpace(unsigned int index){

    unsigned int data,Addr=0;
    unsigned int INDEX_PORT,DATA_PORT;
    
    Addr=GetEcAddress();
    INDEX_PORT = Addr+5;
    DATA_PORT = Addr+6;

    IoWrite8(INDEX_PORT,index);
    data=IoRead8(DATA_PORT);

    return data;
}

void WriteEcSpace(unsigned int index,unsigned int data){

    unsigned int Addr=0;
    unsigned int INDEX_PORT,DATA_PORT;
    
    Addr=GetEcAddress();
    INDEX_PORT = Addr+5;
    DATA_PORT = Addr+6;

    IoWrite8(INDEX_PORT,index);
    IoWrite8(DATA_PORT,data);

    return;
}

读写函数写完了,接下来依然看9.5节,这一节中介绍了这里面space的值具体是干什么用的,代表什么:

 总之有一连串,我们看下:

 前文中有说道,该芯片有三个温度传感器输入,那么我们就取前面三个的值,就是温度的大小了:

void TempRead()
{
    unsigned int temp0,temp1,temp2;

    temp0=ReadEcSpace(0x29);
    temp1=ReadEcSpace(0x2A);
    temp2=ReadEcSpace(0x2B);
    
    printf("Temperature0=%d",temp0);
    printf("Temperature1=%d",temp1);
    printf("Temperature2=%d",temp2);
    //这里只简单写下,温度肯定有范围,如果值为FF,那温度真是这样不得爆炸,所以要排除
}

风扇主要是如下的寄存器:

 注意对应组合,比如读取18h的值后,这个值左移8位,然后加上0Dh处的值,然后根据风扇转速公式,算得该风扇转速。

同理电压监控的为20h---28h,读取这些寄存器的值,估计还要计算,可能需要硬件参与(猜测),ok,总的硬件监测就先学习到这-_-||

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值