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

如何从ec中读取cpu温度?

[复制链接]
发表于 2009-3-10 17:29:26 | 显示全部楼层 |阅读模式
char read_ec_ram(char ec_index) 9 u6 q7 [2 M" J+ E) |
{  // Input ec_index = EC RAM Index9 O7 p' b) |! f; {! T% G1 X
  __asm{: T5 }  R& H( l9 Z9 B7 E9 S
                .486' p* P$ ^$ b. `& b; O. i. q
    mov al, ec_index( x( {8 N, k! N* K4 j/ x% e& y
    out 0B3h, al
. ^  j7 Z4 d9 Y+ b3 Q    mov al, 0E4h# [) J2 g! ?9 s  k6 _! D
    out 0B2h, al         // Call S/W SMI to read EC RAM& b% Y  y4 B* w; Z4 o0 h
    in  al, 0B3h        // Read data store to I/O port 0B3h
1 q. F& r6 h0 z# L/ R9 q& s    mov ec_index, al        // Save read data to ec_index.
' k" x3 O/ P3 B% u7 i9 q0 ^  } 8 P  P( `! g. S7 {6 W0 a! C/ I
        return ec_index&0xff;
3 C8 `, |- }0 h# `}( d" V* W; n5 v# f3 h
南狼老师能否帮忙解释一下上面的代码,我只知道是通过bios读取ec的内容。
发表于 2009-3-10 18:05:59 | 显示全部楼层
  1. char read_ec_ram(char ec_index) $ M9 U. M7 [* j5 L" }! p5 ^+ I
  2. { // Input ec_index = EC RAM Index
    5 L! J: P; m3 T- N
  3.   __asm{
    & \& f% c9 M# A6 M
  4.     .486 // 使用486指令集: W0 G% s" p; Z; Z' V/ a
  5.     mov al, ec_index    // EC对应的SW SMI No.* L7 n  O8 Q% \/ H  j
  6.     out 0B3h, al        // 送到 S/W SMI data 寄存器
    ) g0 u1 f9 d" J, @% K% g. G
  7.     mov al, 0E4h        // 触发 S/W SMI, No. 0E4h
    9 G5 `4 {- u9 O( L
  8.     out 0B2h, al        // Call S/W SMI to read EC RAM1 U9 ^7 {  i( M! S, C  Z
  9.     in  al, 0B3h        // Read data store to I/O port 0B3h1 g2 }% B1 N! j  y3 k
  10.     mov ec_index, al    // Save read data to ec_index
    " H8 I4 z6 t+ N( H! j
  11.   }+ m, I0 T8 l2 d) u2 V4 d8 `, J
  12.   return ec_index&0xff;: f7 T8 z1 U- M& Y4 q! g1 @
  13. }
复制代码
上面就是调用BIOS的S/W SMI读取的,这里什么都看不到,
: I! s8 |5 k# I, H8 P除了知道S/W SMI 0E4h的ec_index值对应的是读CPU温度的功能.
) {6 ]5 ?8 K7 Z0 g0 \: A# P- H9 N* t! T0 w7 X' O
猜的.# j, f* F; n- n8 J5 A- J* q* D4 P$ L

- s2 z: \6 g1 p# o[ 本帖最后由 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的特定位置。
4 ?9 |1 n* u; f- `9 v9 C6 D2 k比如100ms读一次,这样cpu的温度就能及时的更新。BIOS 通过out 80 command $ s7 y- m  D6 ?+ }* z) o0 R2 @# H2 i
到66 port读取EC Ram信息,这样就可以得到cpu温度了。
+ k* x; Q2 N( V6 j9 C. [# A6 F# i+ s& _, R
你的code的原理应该是:* M( j* Z, I: f& R& v/ s4 E
通过一个sw smi call BIOS的code,BIOS在smi handler中下command 读取EC
- x3 r: `0 [: ?' ORam获得CPU温度。* H" ?2 }( J  ^4 z: q% ]5 w* K* G

% S) P3 s& b$ e% s* Z[ 本帖最后由 peterhu 于 2009-3-12 15:04 编辑 ]
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-7-21 14:25 , Processed in 0.073933 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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