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

如何从ec中读取cpu温度?

[复制链接]
发表于 2009-3-10 17:29:26 | 显示全部楼层 |阅读模式
char read_ec_ram(char ec_index)
5 \% K" c3 v+ }' V) R$ L3 `4 u{  // Input ec_index = EC RAM Index$ F' Q9 C  E6 ^' Q% ^) Z; ?" [
  __asm{
% o+ _" h/ H; V* @3 M+ d/ k" [- O                .486
! I0 [6 i  Y% D! y4 S    mov al, ec_index/ m' m1 O# {) H0 @
    out 0B3h, al
+ o$ H. _. m8 k/ R% u/ V1 A    mov al, 0E4h) g' A4 S9 r$ s1 q/ F
    out 0B2h, al         // Call S/W SMI to read EC RAM7 \; U# B5 A/ Z( ?' i+ `) W2 Y) v
    in  al, 0B3h        // Read data store to I/O port 0B3h
. _: n4 [& N9 y6 ?# n+ d, |8 z/ b    mov ec_index, al        // Save read data to ec_index.) }/ F* k: e0 U0 E! K4 k
  } * W% |3 ~; V6 W( U9 M: T- O7 i5 f* I
        return ec_index&0xff;& ?) C6 ^4 N7 j9 Y
}
4 E. `9 c; q  w$ d/ A2 S4 |南狼老师能否帮忙解释一下上面的代码,我只知道是通过bios读取ec的内容。
发表于 2009-3-10 18:05:59 | 显示全部楼层
  1. char read_ec_ram(char ec_index) % c, Z& A- o+ ]9 H
  2. { // Input ec_index = EC RAM Index6 }# s  {& `8 K* j9 V) o
  3.   __asm{
    ) O) D$ Z5 a9 S/ m$ _. k0 I9 s3 [0 R
  4.     .486 // 使用486指令集/ N9 V6 e( H) a3 m6 p3 {" w
  5.     mov al, ec_index    // EC对应的SW SMI No.
    ! n; m4 C3 {# N4 j. G
  6.     out 0B3h, al        // 送到 S/W SMI data 寄存器/ I8 A# s, o" _* c2 Y5 S# r
  7.     mov al, 0E4h        // 触发 S/W SMI, No. 0E4h! h( l: d3 v9 o. F
  8.     out 0B2h, al        // Call S/W SMI to read EC RAM% T/ t% S( W# t8 d
  9.     in  al, 0B3h        // Read data store to I/O port 0B3h$ F% o# o$ D% k% H. t
  10.     mov ec_index, al    // Save read data to ec_index
    ; w; N) R4 u9 K! S
  11.   }9 u  ?2 B8 R" g; X7 M
  12.   return ec_index&0xff;
    7 u; E. {% j, |# q- R; q
  13. }
复制代码
上面就是调用BIOS的S/W SMI读取的,这里什么都看不到,
; U' o% S* P& Q" C7 o除了知道S/W SMI 0E4h的ec_index值对应的是读CPU温度的功能.
! }' t# U/ {/ c: J& ^# s2 ~# K, ^
猜的.4 }/ {% C* V* M5 y' V. {

. K" r8 M8 w; L; g% j[ 本帖最后由 xtdumpling 于 2009-3-10 18:10 编辑 ]
回复

使用道具 举报

 楼主| 发表于 2009-3-11 08:19:23 | 显示全部楼层
不管怎样,谢谢楼上的了!实际上我是不知如何通过BIOS SMI 去读取EC的内容,能否帮忙详细解释一下原理?多谢了!
回复

使用道具 举报

发表于 2009-3-11 10:14:47 | 显示全部楼层
CPU的温度被放在EC RAM中的一个位置,BIOS如果需要CPU的温度就直接从那个位置读取就可以了.
回复

使用道具 举报

 楼主| 发表于 2009-3-11 10:27:21 | 显示全部楼层
嗯,但我不知道具体实现的过程和原理,既然放在ec ram 中,那应该需要ec code事先读取cpu 温度。
回复

使用道具 举报

发表于 2009-3-12 10:28:37 | 显示全部楼层
EC 通过smbus定时读取thermal sensor获取cpu的温度,存在EC Ram的特定位置。/ i3 L; U$ }3 U4 W9 v" }9 l( I. j( U
比如100ms读一次,这样cpu的温度就能及时的更新。BIOS 通过out 80 command
: L9 y5 o4 W/ b0 d3 n到66 port读取EC Ram信息,这样就可以得到cpu温度了。+ Q. f6 ]9 u* d$ A

2 v3 i# I+ E* h$ N8 t  \7 E你的code的原理应该是:
9 y/ I1 Q/ j8 h4 e; s通过一个sw smi call BIOS的code,BIOS在smi handler中下command 读取EC " ?/ S/ \7 B4 _$ G: w/ R
Ram获得CPU温度。
* m; j5 u0 D- m$ j' v& ~. V
3 T  ?& o4 j7 X, x[ 本帖最后由 peterhu 于 2009-3-12 15:04 编辑 ]
回复

使用道具 举报

 楼主| 发表于 2009-3-12 12:19:46 | 显示全部楼层
谢谢peterhu的解释!看来要想完全了解整个过程,需要先打打基础!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-12 06:55 , Processed in 0.023905 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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