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

如何从ec中读取cpu温度?

[复制链接]
发表于 2009-3-10 17:29:26 | 显示全部楼层 |阅读模式
char read_ec_ram(char ec_index) 9 m9 C0 }3 k' Y. E8 h& c
{  // Input ec_index = EC RAM Index
  a. b1 S$ ~5 e& Q7 w4 [  __asm{
  P8 ^' Z- _/ s/ d. Q                .486
. L5 x3 j# u0 s* P6 b3 I  r% @6 {    mov al, ec_index
- T9 r: n% x: ?# o" X- t2 s2 _7 s0 I    out 0B3h, al) p$ n& |3 E6 Q: }' {" c% V
    mov al, 0E4h
$ {6 e& Z3 J( L) U& e3 k    out 0B2h, al         // Call S/W SMI to read EC RAM4 q( ~0 j* `9 }3 s
    in  al, 0B3h        // Read data store to I/O port 0B3h
; c5 E% V* h% h& }    mov ec_index, al        // Save read data to ec_index.
( z( H* y& c8 a4 ~: j: a8 z  } - E; [9 V" ?( r9 O4 {4 G% Q5 g4 R( }- f
        return ec_index&0xff;
) ^* i3 L0 K1 ^2 T1 d, l}+ O7 J; P" @( n; t
南狼老师能否帮忙解释一下上面的代码,我只知道是通过bios读取ec的内容。
发表于 2009-3-10 18:05:59 | 显示全部楼层
  1. char read_ec_ram(char ec_index)
    0 P, L" ?6 Z: c' f) L+ C2 W2 W
  2. { // Input ec_index = EC RAM Index
    5 Z0 l* `' N' c% a3 F1 G( e4 F
  3.   __asm{. P, c, Q7 V6 h% `/ u
  4.     .486 // 使用486指令集$ N: Y! {4 `7 M6 v% L7 X' m
  5.     mov al, ec_index    // EC对应的SW SMI No.9 [* Z6 }; D. g
  6.     out 0B3h, al        // 送到 S/W SMI data 寄存器
    6 R3 u+ B- c" ?) O: ~' r( Y
  7.     mov al, 0E4h        // 触发 S/W SMI, No. 0E4h
    ( m4 F  {- K2 h- Q& O
  8.     out 0B2h, al        // Call S/W SMI to read EC RAM
      ^4 S" N6 b8 x2 p. y
  9.     in  al, 0B3h        // Read data store to I/O port 0B3h
    6 [& b9 v8 Z$ x) R
  10.     mov ec_index, al    // Save read data to ec_index1 m# U" J$ ?  ~5 v9 s8 F3 [
  11.   }
    0 h8 s  I& Z7 Z7 F! I
  12.   return ec_index&0xff;: c! t+ D9 i6 ^# X( Y1 _
  13. }
复制代码
上面就是调用BIOS的S/W SMI读取的,这里什么都看不到,* X2 G5 L- g' e) O, h2 h/ U
除了知道S/W SMI 0E4h的ec_index值对应的是读CPU温度的功能.
# A; w' B3 `, G+ K* {2 ]1 a0 f$ o: z3 w0 E1 b/ r2 p1 o9 E
猜的.
- c) R6 w9 ?1 C0 A" v& L+ j4 n$ V. P9 W: \
[ 本帖最后由 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的特定位置。% _0 ]8 Q, x0 E4 \
比如100ms读一次,这样cpu的温度就能及时的更新。BIOS 通过out 80 command
  |# i$ M$ v0 S" H  f% B到66 port读取EC Ram信息,这样就可以得到cpu温度了。
+ X% a* O; ]. `. B/ y1 z: M% s; ~6 [" c
你的code的原理应该是:8 O. q/ k* g. q7 |; u( r
通过一个sw smi call BIOS的code,BIOS在smi handler中下command 读取EC
( z& R) e7 S/ d2 W( XRam获得CPU温度。' [& f0 |6 m; I; X! ]& Y0 c

5 w& v: D4 L: q+ M# b[ 本帖最后由 peterhu 于 2009-3-12 15:04 编辑 ]
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-13 14:05 , Processed in 0.090338 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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