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

如何从ec中读取cpu温度?

[复制链接]
发表于 2009-3-10 17:29:26 | 显示全部楼层 |阅读模式
char read_ec_ram(char ec_index)
( D& l1 I: m7 Z3 C2 @3 v{  // Input ec_index = EC RAM Index8 y$ j2 C0 d$ Q; ]" y
  __asm{
2 b5 o9 ]' B2 `4 U' k7 u- u; z( W                .486
2 @. c  m3 d3 S2 e$ M+ w+ U    mov al, ec_index
( K: w7 e  V% F+ V; U; ]# T    out 0B3h, al
( t/ y# X% m( b8 X* [$ Q    mov al, 0E4h" V5 H, Q( y3 r
    out 0B2h, al         // Call S/W SMI to read EC RAM+ G2 x& @- k+ k2 |4 X; b0 |
    in  al, 0B3h        // Read data store to I/O port 0B3h& e+ p  A+ k! O/ ]% j9 u
    mov ec_index, al        // Save read data to ec_index.7 I7 a3 r4 r/ r' @+ Q' ?6 r+ n
  } ' x, \* y# b' [
        return ec_index&0xff;
% L. e+ h7 C8 l! e* f7 T0 ]5 {}
/ Y% g6 O3 X, Z/ Z南狼老师能否帮忙解释一下上面的代码,我只知道是通过bios读取ec的内容。
发表于 2009-3-10 18:05:59 | 显示全部楼层
  1. char read_ec_ram(char ec_index)
    1 T* K% b& x8 w  Q# b
  2. { // Input ec_index = EC RAM Index3 M0 y- V9 q! }
  3.   __asm{/ d/ r; m/ h: C" E9 [% ]) h8 j; r
  4.     .486 // 使用486指令集  X9 H" p: r& M
  5.     mov al, ec_index    // EC对应的SW SMI No.
    1 \8 s! t7 b* z
  6.     out 0B3h, al        // 送到 S/W SMI data 寄存器$ e0 P8 ?) r4 w+ f: X
  7.     mov al, 0E4h        // 触发 S/W SMI, No. 0E4h
    ( K8 E% B; X& T4 C
  8.     out 0B2h, al        // Call S/W SMI to read EC RAM
    / I8 t8 l4 k3 h" ^% Z; b. q0 v5 S
  9.     in  al, 0B3h        // Read data store to I/O port 0B3h
    ( N7 q  A1 _  P- ~2 z9 y
  10.     mov ec_index, al    // Save read data to ec_index
    ; D5 B1 k5 E+ A. M) B7 @
  11.   }
    * r& L+ \; E; ]
  12.   return ec_index&0xff;+ q- _2 E$ g% ^/ h, K
  13. }
复制代码
上面就是调用BIOS的S/W SMI读取的,这里什么都看不到,& V" h1 ]- V$ g9 G1 d0 |8 y
除了知道S/W SMI 0E4h的ec_index值对应的是读CPU温度的功能.8 G8 h  l3 A- i2 B% t; Q) x
  x) @: l8 h* W2 R4 N6 `6 l: ~
猜的.
4 `# x& @& C  r6 k& P6 j; m, @& f
3 d* Z# A- M( Q6 F9 c[ 本帖最后由 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的特定位置。& Q0 x& F( X- J
比如100ms读一次,这样cpu的温度就能及时的更新。BIOS 通过out 80 command
( N7 a+ c$ B5 D  h到66 port读取EC Ram信息,这样就可以得到cpu温度了。
" s1 Y+ o" Y2 J9 X7 }% P  k7 B. _8 l3 p! g: B& m* t
你的code的原理应该是:
! w2 ]8 W' [  z6 i% N' U6 u通过一个sw smi call BIOS的code,BIOS在smi handler中下command 读取EC
0 L3 d5 z# m2 Y$ O5 R; Y" e5 hRam获得CPU温度。5 t  T# T7 E7 Y) N' i) B

. Q* E" G# ^4 R9 J$ H3 B) C[ 本帖最后由 peterhu 于 2009-3-12 15:04 编辑 ]
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-10-20 08:33 , Processed in 0.130394 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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