VC获取CPU温度,SMbus,winIo,superIO



------
怎样写SMBus驱动来读取CPU温度,哪位有范例给我一份,其他的方法能实现读出cpu温度,也可,麻烦给出详细代码。
------
加载ACPI驱动
命令: cat /proc/acpi/thermal_zone/THRM/temperature
输出结果:temperature: XX C
另外好像注册表里也有bios CPU 的温度记录好像
------
你这是linux下的,我要通用的,windows下也能实现的方法!
------
1:各位高手,回句话啊!!cpu的温度放在那里了!!有谁知道!!
bios里面那个对么??可以通过读bios来得到cpu的温度么??
2:我对这个了解的不多。
但是,我看过一些主板带的温度监视软件,应该是和主板的BIOS中的温度显示是联系的。
希望楼主能够找一找关于读取BIOS方面的代码,或文档来研究一下。
3:但是那位高手能告诉我,bios显示的cpu温度是通过什么途径得到的!!我知道是读取cpu温度传感器的值!但是这个读取的值是否是存在bios的某个地址里面,或者是只是简单的读取与显示!!另外谁能告诉我那里还能得到cpu的温的值!!
4:学习ing
5:我也想知道,关注.........
6:有种方法大家看行不行,好像bios内容已经映射到了物理内存的0x00000000-0x00f00000范围内,我想读这部分的物理内存,但是现在又两个问题
1)不知道这样是否能读到我所需的温度值
2)不知道温度所映射到的物理地址
7:^_^,除非window或者厂商提供了这个API,否则的话,没辙!!
读取物理内存,怎么可能呢? 

8:呵呵,有点难度.很早以前就有人问过这个问题.
找主板提供的DLL接口看行不行.
9:这个应该可以通过ACPI或者WMI来获取,但是我的代码没有通过测试,不知道是不是因为
我用的是笔记本的缘故。

uses
ComObj, ActiveX;

procedure TForm1.Button1Click(Sender: TObject);
var
Locator: OleVariant;
WMI: OleVariant;
RET: OleVariant;
Enum: IEnumVariant;
Tmp: OleVariant;
Value: Cardinal;
begin
Locator := CreateOleObject('WbemScripting.SWbemLocator');
WMI := Locator.ConnectServer('.', '', '', '');
Ret := WMI.ExecQuery('SELECT * FROM MSAcpi_ThermalZoneTemperature');

Enum:= IUnknown(RET._NewEnum) as IEnumVariant;
while (Enum.Next(1, Tmp, Value) = S_OK) do
begin
if not varisNull(Tmp.CurrentTemperature) then
Memo1.Lines.Add(Format('%6.2f', [(Tmp.CurrentTemperature - 2732) / 10]));
end;
end;
10:谢谢tseug的提示,请问你有没有关于ACPI和WMI的资料,希望你能共享一下,谢谢!!
我的e-mail:h6003113@yeah.net
谢谢了!!
11:学习
12:应该是与主板的硬件对应吧,因为我装过很多电脑,测温芯片不同,自带的显示程序不通用,想必BIOS里面对应的程序也是不同的。很多硬盘也有测温,这个应该有通用的吧
13:haha,嚴重學習中
14:学习,强烈认为应该有API函数可以调用
15:好象以前的帖子提过,读注册表的数据。
并且说,不少监视CPU温度的软件也用这个方法。
偶觉得这类东东都比较占CPU资源,所以不怎么用,也没怎么去关心。
16:还能编程控制CPU的温度?!厉害呀!学习!
17:现在我在使用WMI读取cpu温度传感器的温度,通过WMI我读到了bios的生产厂家,但是不知道为什么,当读到Win32_CurrentProbe是就没用了。请那位大虾指点一下!!
18:怎么没人回答啊!!
19:采用WMI和SMBIOS来读取CPU温度传感器的方式是不可行的。事实上WMI本质上微软依然走的是通过SMBIOS/DMI方式来获取生成WMI数据的,虽然BIOS规范的“Type 28”是温度传感器,并且还注明了偏移量为06H为温度最大值等...与Type 27的冷却设备区域类似,不过在最后14H偏移的温度值我发现是名义上的(即:不过是规范定义者的一厢情愿罢了),我曾经写过几个程序来获取几种主板(BIOS从2.0-2.31版)的各类别各偏移量的值,发现该值是无效的,同时也发现所谓Type 27中的风扇转速等,也无效,即便对于IBM的原装机也是如此。在此过程中,也发现凡有效部分往往与WMI获取的值一样。因此,也印证了从WMI获取诸如温度等参数的不可行,除非微软修改WMI信息的获取方式,否则,我看...呵呵...还不如我们另外想办法了。
顺便说一下,我个人认为微软之所以采用上述方式获取温度传感器的信息,是因为WMI规范发布的时候,微软也认为主板生产商都会把温度的获取和刷新写到驱动里面---也就是刷新Type 28区域的信息,不过,遗憾的是,硬件生产商没有这样做。
另外,我认为目前的温度检测软件几乎都是通过SMBUS来入手设计的,若你实在要详细了解这些与硬件紧密的软件开发步骤,不妨留下你Email,我在下次来看到后会与你联系。另外,无汇编经验,只用过Delphi等OO工具就不要留Email了。 

20:首先谢谢LAMB
如果LAMB兄有时间还是可以发些相关的资料给小弟研究研究。
小弟是搞自动化的,用过汇编,相信看相关的程序不会有很大的问题。
最后留下我的E-Mail:h6003113@yeah.net
21:把厂商自带的温度监视软件中包含的DLL拿出来分析,有些接口直接能读到CPU温度,你用你的程序直接引用这些DLL应该能行吧。
谁能接着这个讨论下去,我也能获得bios信息了,可惜不知道温度的偏移。
------
没用过, MSDN查一下: Win32_TemperatureProbe, 在SDK的Windows Management Instrumentation(WMI)下
------
楼上的是不是没看我上面的发的东西,wmi是不行的。
------
抱歉, 我没看清楚
------
我看过WMI说明 这个值是不能变化的 我也很关心这个问题 帮楼主顶一下 如果知道了 告诉我一下 或者加我咱们一起探讨一下 留你Q喽 呵呵
------
Three Ways to Retrieve Processor Information

http://www.codeguru.com/cpp/w-p/system/hardwareinformation/article.php/c9087/
------
好像没那么简单,呵呵.
------
关注该问题好几天了,用winio读取的端口数据总是-1,希望高手指教,我的邮箱enjoycoding@163.com
------
过来这么久不知道你们实现了没有,如果实现了发一份代码给我!谢谢啊 gm747@163.com
------
ding...
------
ding...
------
up
------
不同品牌的BIOS有不同的温控I/O调用, 具体得看BIOS程序调用手册.
------
关注,应该和BIOS相关
------
和BIOS相关
------
UP

------
我想获取芯片组信息,是不是也是同smbus进行获取。这类的驱动应该怎么写。我看到cpuz中的代码很简单。能不能给个说明。我的mail:whf727@hotmail.com.
------
查看了好几天pci相关资料总算是有点眉目了。
------
什么眉目?
------
这个帖子要关注一下
------
我试过可以读到启动时的温度。但即时温度就没有获得到

------
我也想获的这个代码啊。不知道哪位高手有,
------
哎,这个帖子都快两年了,还不结贴啊

我就做回坏人吧,希望LZ能看到

cpu 温度,系统 温度,风扇转速,所有的系统电压
你要得到,首先你的主板线路做了对他的侦测

如果做了

以上的所有值全存在一个叫着 superio 的device的isa space里面

superio 一般常用的品牌有 winbound fintek ....等等,不同的型号的superio他们里面的INDEX是不一样的

这个你得要有对应的superio 的datasheet
没有通吃的方法,除非bios透过acpi告诉你

以上方法是透过 io access的方法

具体操作,任何一个bios工程师都知道,向他们请教吧
------
有能获得cpu温度的源码也发我一份吧,谢谢啊,最近项目要弄这个,对汇编不了解,头都大了 chiyun1@yahoo.cn
------
我也想要一份,最近被这问题搞得头大!4609rain@163.com
------
在NB下好像是EC芯片去控制的 怎么去读CPU的温度?? 请各位大侠指教啊?
------
我最近一直在网上查关于获取CPU温度的资料,花了很多时间,可是没有结果。
DWORD temp_dwPortVal=0;  
InitializeWinIo();  
SetPortVal(0x6C,0x80,1);//将命令写入命令端口0x6C  
SetPortVal(0x68,0x0E7,1);//将要访问的寄存器号写入数据端口0x68  
GetPortVal(0x68,&temp_dwPortVal, 1);//将数据从数据端口读出  
ShutdownWinIo();  
代码只能写到这一层,得到的结果是-1,很多人结果和我一样。
原因可能是没有判断缓冲0x6c,可是就是不知道应该怎么判断,

哪位达人站出来指点一下啊!!!
------
我的邮箱 lihaodong10@163.com 有资料的话给我发一份
------
ding 之
------
谁帮我把我的驱动问题搞定啊

http://topic.csdn.net/u/20100201/16/68464d49-ce7c-45e2-9721-6a1af59bfa5e.html?99448
------
关注!!
------
#32楼的,我回复了!不知道对你有没有帮助!
------
觉得这个会和 硬件比较相关吧!
不同的平台,采用不同的components,操作的方法也会不太一样吧!

移动些列的电脑一般都会用EC的,这些动作可以让EC去做,我们可能可以发个command要EC reports我们想要的东西(一般通过 0x62和0x66 port),当然这个就需要看你和EC定义如何通信,没标准的!当然也不排除你直接操作EC,这种方法我没试验过,不知道说的对不对!
还有一个方法就是通过WMI-ACPI,EC的memory可以有一段是对Windows可见的,记得当初我们规定的是EC把类似这样的信息放到这个内存中(EC的内存),然后我们通过WMI-ACPI的方式去读。不过需要我们自己写ASL code然后includes到BIOS中。

台式机器一般会用supper I/O,常用的用ITE,Winbond!你若是想直接access to supper I/O, 恐怕你要读相关的datasheet了。一般是通过 0x2e/0x2f or 0x4e/0x4f端口!

类似这样的tools我没有做过,以前是我的另外一个同事在负责玩,不仅仅是有HW monitor的功能,还有超频等功能!俺不是这方面的专家,欢迎大家指教了!
------
这个有点意思
------
慢慢看看
------
高手就像是有钱人一样,又少又小气
------
引用 35 楼 balloonpig 的回复:
觉得这个会和 硬件比较相关吧!
不同的平台,采用不同的components,操作的方法也会不太一样吧!

移动些列的电脑一般都会用EC的,这些动作可以让EC去做,我们可能可以发个command要EC reports我们想要的东西(一般通过 0x62和0x66 port),当然这个就需要看你和EC定义如何通信,没标准的!当然也不排除你直接操作EC,这种方法我没试验过,不知道说的对不对!
还有……

------
有实现的吗,可以发一份给我吗,364943092@qq.com,谢谢
------
接分走人啥
------
引用 29 楼 lihaodong10 的回复:
我最近一直在网上查关于获取CPU温度的资料,花了很多时间,可是没有结果。
DWORD temp_dwPortVal=0;
InitializeWinIo();
SetPortVal(0x6C,0x80,1);//将命令写入命令端口0x6C
SetPortVal(0x68,0x0E7,1);//将要访问的寄存器号写入数据端口0x68
GetPortVal(0x68,&amp……

------
引用 39 楼 qingtain2008 的回复:
引用 35 楼 balloonpig 的回复:
觉得这个会和 硬件比较相关吧!
不同的平台,采用不同的components,操作的方法也会不太一样吧!

移动些列的电脑一般都会用EC的,这些动作可以让EC去做,我们可能可以发个command要EC reports我们想要的东西(一般通过 0x62和0x66 port),当然这个就需要看你和EC定义如何通信,没标准的!当然也不排除你直接操作E……

------
深奥,学习下~~
------
学习,做个记号
------
还没有搞定啊
------
还没有搞定么?

------
类似鲁大师的那种东东,怎么做,关注。。
------
挖啊..看来真是难题
------
通过superio的EC获得,不过这需要相关公司的Datasheet,如8728,8718等芯片,还要看线路图怎么连的.麻烦.
------
太深奥了 帮顶、、、、、、、、、、、、、
------
顶,支持。
------
继续顶楼上的
------
最近一直做这设计却不得要领;望有资料的大神也发我一份,我的邮箱1070632115qq@.com;万分感谢
桂ICP备07017180号