找回密码
 加入计匠网
搜索
热搜: BIOS ACPI CPU Windows
查看: 44137|回复: 19

请教如何实现在VC里读取ACPI table数据

[复制链接]
发表于 2008-6-16 16:18:26 | 显示全部楼层 |阅读模式
小弟想用VC开发一个工具,能读到ACPI 区域里的数据,比如系统温度(如intel TAT 工具),电池信息等数据。请教各位知道用什么接口函数能实现,小弟对ACPI不是很清楚,不知道上述描述是否准确?谢谢!
发表于 2008-6-16 17:20:50 | 显示全部楼层
我先跟你讲讲温度,知道这些温度从何而来,见Intel TAT温度里show的。
. _9 Q3 V, {; [* r4 M; \1、ACPI 温度
4 ?# a2 ]/ t4 t* m" K    这个温度是ACPI spec温度(请看ACPI SPEC),操作系统跟据此温度来选择不同的散热方案,也就是ACPI ThermalZone 提供给OS的温度有:throttling temp,Critical temp,currect temp,TAT所显示的就是currect temp。此温度的由来,一般是由EC提供,EC通过SMBUS读取CPU/System thermal sensor的温度,CPU/System thermal sensor 会通过AD转换,去读取CPU&System的温度感应器。(CPU为一个温敏二极管,Intel 一个物理CPU,就会有一个)。此部分温度从何读?自己决定,ACPI?可以,自己写驱动或用WMI,EC?看你平台是不是这样设置的,CPU&SYSTEM的Thermal Sensor,也可的,看你的平台。
4 ?$ F8 U1 m( V( \* p9 S  k/ o2、DTS温度(Digital Thermal Sensor)/ u8 [& k8 O/ w9 z; W# w& E
    这个温度是CPU自己提供的温度,直接去MSR里去读取即可,一般(只能说一般,好象看到有双CPU只有一个Digital Thermal Sensor的)一个核就有一个Thermal,所以双核基本上是有TM1,TM2。当然,在读之前要把CPU的Thermal打开,把系数设好,具体见CPU的Spec。当然也有把DST温度直接返回给ACPI ThermalZone的情况。
/ g. z# Y* u3 B. O9 L6 h
3 [1 g* m1 n, d! I( }! TSO,你要读取什么?如是温度,那么就搞清楚温度的来源,如果是电池数据,有Windows的API可以获取,如是ACPI Table数据,那么就在内存中,可以通过Windows API & Driver & WMI各种方式去获取,因为ACPI里的东西是for系统不同的Device或不同的用途的,关键是搞清楚自己要什么。
回复

使用道具 举报

 楼主| 发表于 2008-6-17 08:47:24 | 显示全部楼层
感谢bini大侠非常详细的解答!我的程序想实现的功能是这样的:在xp或者vista下运行的程序能读到EC里特定的数据,如LCD屏的背光值,EC读到的温度等。不知道bini说的Windows API & Driver & WM各种获取方法是如何实现的,可否提供一些详细的资料给小弟参考。
回复

使用道具 举报

发表于 2008-6-17 09:07:59 | 显示全部楼层
那你的问题,说起来,跟ACPI是没多少关系,但用ACPI的方法,也是会让系统最稳定,也是最适合用acpi windows程序开发,如低难度的就是WMI ACPI,见DDK中带的WMI-ACPI白皮书。API可以获取电池,CPU,等相关信息的。驱动,你可以建立自己的pnp device驱动来获取,如仅仅是EC里的数据,何必呢,用IO读写就可以,只要你知道如何读EC的space。予人鱼,不好呀,渔才好。. O# g5 m- _4 f7 c
1、其中WMI-ACPI最简单,但是BIOS得配合,推荐。
7 E0 r5 s2 p/ ~3 v& _' o2、Driver最复杂,也需要BIOS配合,推荐。; t2 d3 D- b0 w: q4 C
3、Windows API只能获取到特定信息,不需要特定的BIOS配合。, [( q# V' J8 C# \! z2 B
4、IO的方法,能获取到全部的EC状态信息,需要EC的文档,如果是给for end user,要出货的程序,这种方式不推荐。7 Z% |+ D: b9 u
你可以混合使用。
回复

使用道具 举报

 楼主| 发表于 2008-6-17 11:07:12 | 显示全部楼层
IO方法读EC当然是最简单的,但是好像在windows下也不能直接这么用IO读写,还是要写driver的吧?$ [" C# |& n" O. H

7 x: T1 L7 H& f6 S  J另:如果要想做调节音量和背光的OSD,是不是可以用WMI-ACPI方法来实现?
回复

使用道具 举报

发表于 2008-6-17 11:11:54 | 显示全部楼层
windows下IO读写可以使用WINIO组件,兼容XP/VISTA,很方便,不过LZ还要准备EC的相关SPEC哦
回复

使用道具 举报

发表于 2008-6-17 11:27:57 | 显示全部楼层
Dear Frank,估计你在做NB的APP,WMI-ACPI方法当然可以实现。但是WMI的Event产生的方式是基于Pooling的,也就是主动check,会占用一小小点的CPU时间,同时事件的捕获也不是太及时(WMI中可调Pooling的频率),没有pnp device的那种在ACPI里notify driver的方式好,也就是BIOS去产生PM事件,OS的程序与Driver处于被动,这样就不会占用CPU一些时间,同事实时性也更好。但WMI-ACPI对于NB的小APP程序是够用的。
回复

使用道具 举报

 楼主| 发表于 2008-6-17 11:30:13 | 显示全部楼层
多谢amty,WINIO我之前只知道有xp下的,现在有兼容vista的出来吗?0 A+ `5 }) G. d
关于EC的SPEC我有的,俺是做EC的。
回复

使用道具 举报

发表于 2008-6-17 11:33:32 | 显示全部楼层
是为了debug EC的话,就用WINIO吧,WINIO在VISTA下可用。记得好象需要重新用DDK(for 2003 server?)编译一下。还有一个地方是在64位CPU上需要修改一个地方...嘿嘿...这是Owen的密秘。
回复

使用道具 举报

 楼主| 发表于 2008-6-17 11:41:03 | 显示全部楼层
Dear bini,你说的没错,俺是在写NB的APP,你说用pnp device的那种在ACPI里notify driver的方法,那我不是还要写个driver?如果用SCI的方式做notice,你看怎么样?
回复

使用道具 举报

发表于 2008-6-17 11:44:10 | 显示全部楼层
这个随你呀。具体怎么设计,就是你的工作啦。不过,你要搞清楚,SCI是一个中断,我指的Notify是ACPI中的Notify driver的function。见acpi spec中的notify function.
回复

使用道具 举报

发表于 2008-6-17 13:08:44 | 显示全部楼层
原帖由 bini 于 2008-6-17 09:07 发表 " o6 b- ~2 T6 m6 ]" X
那你的问题,说起来,跟ACPI是没多少关系,但用ACPI的方法,也是会让系统最稳定,也是最适合用acpi windows程序开发,如低难度的就是WMI ACPI,见DDK中带的WMI-ACPI白皮书。API可以获取电池,CPU,等相关信息的。驱动,你可以建立自己的p ...
0 m0 j) M# }( c$ m/ Y3 Z6 o8 V+ J
很全面,学习...
回复

使用道具 举报

发表于 2008-6-17 13:16:14 | 显示全部楼层
WINIO在VISTA下可以直接用的,不需要去重新编译" G( V/ A! _# P, F# A5 s
        [DllImport("winio.dll")]
0 S6 o& r9 ]/ i9 A! O        public static extern bool InitializeWinIo();
) g0 C$ h, Y- Y: c3 ?( p' ]0 g9 d1 R        [DllImport("winio.dll")]
9 p; Y3 g- e# R% s# p/ w        public static extern bool GetPortVal(IntPtr wPortAddr, out int pdwPortVal, byte bSize);
! b6 L8 T, J. K0 L2 i8 Y8 _        [DllImport("winio.dll")]4 o5 v% v# Q' M  m0 G' z6 h
        public static extern bool SetPortVal(uint wPortAddr, IntPtr dwPortVal, byte bSize);
' i" T" p8 i. c4 S        [DllImport("winio.dll")]
7 t7 |9 |- `. W5 {; l* s8 x: |( V        public static extern byte MapPhysToLin(byte pbPhysAddr, uint dwPhysSize, IntPtr PhysicalMemoryHandle);
% G  t, a) s* _5 f6 a* ?6 Q) ?$ |/ D        [DllImport("winio.dll")]( x8 C- J1 V' r  j! [
        public static extern bool UnmapPhysicalMemory(IntPtr PhysicalMemoryHandle, byte pbLinAddr);. R: a: E7 f: f& D/ f
        [DllImport("winio.dll")]
, o2 ]7 i( H$ g9 ~! m* I        public static extern bool GetPhysLong(IntPtr pbPhysAddr, byte pdwPhysVal);
2 V7 z4 B6 b& y2 \9 w. C, R4 ?        [DllImport("winio.dll")]
1 P4 C$ G! C. d) ?8 `+ \        public static extern bool SetPhysLong(IntPtr pbPhysAddr, byte dwPhysVal);
, Y& n# z: f. k" V! Z        [DllImport("winio.dll")]+ ~- |  c( E3 V
        public static extern void ShutdownWinIo();
回复

使用道具 举报

发表于 2008-9-24 14:05:23 | 显示全部楼层
原帖由 bini 于 2008-6-17 09:07 发表
/ h1 J8 _, i2 a- d9 j1 e那你的问题,说起来,跟ACPI是没多少关系,但用ACPI的方法,也是会让系统最稳定,也是最适合用acpi windows程序开发,如低难度的就是WMI ACPI,见DDK中带的WMI-ACPI白皮书。API可以获取电池,CPU,等相关信息的。驱动,你可以建立自己的p ...
. S9 r6 Z7 o' g' a5 f8 U( y  P+ C  o
7 p9 d( a5 S4 C$ L4 k
  o  Q- e. H  \+ z7 t# a5 B
为什么bini不推荐使用 I/O 读EC的方式?
回复

使用道具 举报

发表于 2008-10-18 15:49:09 | 显示全部楼层
原帖由 bini 于 2008-6-17 11:33 发表 1 E/ Q6 e9 K% ]' ^8 r
是为了debug EC的话,就用WINIO吧,WINIO在VISTA下可用。记得好象需要重新用DDK(for 2003 server?)编译一下。还有一个地方是在64位CPU上需要修改一个地方...嘿嘿...这是Owen的密秘。 ...

9 p# k* d, }$ j) z( j: r: V6 y' v% w7 h; u
64位需要改什么啊,可否赐教一下? 不想公开的话,可不可以用短信....
回复

使用道具 举报

发表于 2008-10-22 09:21:05 | 显示全部楼层
原帖由 bini 于 2008-6-17 11:33 发表
) v* {. q" u# L9 ?% `& {, V是为了debug EC的话,就用WINIO吧,WINIO在VISTA下可用。记得好象需要重新用DDK(for 2003 server?)编译一下。还有一个地方是在64位CPU上需要修改一个地方...嘿嘿...这是Owen的密秘。 ...

0 t' @1 }9 _" w3 N8 {$ c0 e" D$ E+ M4 o) X5 V2 a. r6 l8 X1 c
WINIO读 IO port使用了几个Undocument的API,只能在i386下使用,X64不再支持这些API了,要在64位上用,恐怕不是修改一个地方的问题吧。我是自己写了一个驱动,不但读取IO,memory,顺便读MSR,PMC,TSC之类的~~~~
回复

使用道具 举报

发表于 2008-10-22 09:40:55 | 显示全部楼层
WINIO的驱动很小,可以用IDA看看,东西不是很多。% W5 b4 ^- F( Q

: y6 p+ b7 ?5 y8 h3 p" f4 d4 B用Winio读Acpi table很方便,我已经实现了一个
回复

使用道具 举报

发表于 2008-11-26 16:13:25 | 显示全部楼层
一些WMI的东西,见:BIOS点滴Follow Bini系列之---WMI ACPI 7 G* Z/ I( J# B& G1 l
http://www.ufoit.com/bbs/thread-420-1-1.html
回复

使用道具 举报

发表于 2009-9-4 17:49:57 | 显示全部楼层
太强了   。。。。。。。。
回复

使用道具 举报

发表于 2010-10-22 09:36:21 | 显示全部楼层
原帖由 bini 于 2008-6-17 09:07 发表 9 _0 z( ~! H/ M  z
那你的问题,说起来,跟ACPI是没多少关系,但用ACPI的方法,也是会让系统最稳定,也是最适合用acpi windows程序开发,如低难度的就是WMI ACPI,见DDK中带的WMI-ACPI白皮书。API可以获取电池,CPU,等相关信息的。驱动,你可以建立自己的p ...

% h$ T/ R( c& x" [1 i3 B! A' n0 y3 Y8 a0 G5 i9 y
既然可以用IO方式訪問全部,為什么還存在wmi interface的訪問方式呢?( r9 k" k' I$ _* v* K
EC 3rd IO 可以在windowns可以訪問EC全部資料嗎?EC 3rd IO 是指68/6C 端口嗎?如果要通過EC 3rd IO為什么IBF、OBF為什么一直通不過?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入计匠网

本版积分规则

Archiver|手机版|小黑屋|计匠网

GMT+8, 2026-1-12 05:40 , Processed in 0.068914 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表