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

如何从ec中读取cpu温度?

[复制链接]
发表于 2009-3-10 17:29:26 | 显示全部楼层 |阅读模式
char read_ec_ram(char ec_index)
* M0 O+ f- r  T9 S{  // Input ec_index = EC RAM Index/ r* X# o/ y4 P3 m, T2 z! L
  __asm{7 T, ^' }; E. a- Z! x
                .486- ~1 b; d# V  P
    mov al, ec_index0 `* _- i5 V5 ]0 }8 Z
    out 0B3h, al
" g# T9 I! k' `. c; `    mov al, 0E4h! t5 B# P' s: h$ `. T1 T% x
    out 0B2h, al         // Call S/W SMI to read EC RAM* A5 u, T1 e/ H, x+ t% J( l
    in  al, 0B3h        // Read data store to I/O port 0B3h+ `7 P6 b" i+ R( o. A0 _
    mov ec_index, al        // Save read data to ec_index.' P* t- G; k, z/ Z1 ~- X
  }
% F2 }& B+ B0 A! g% q; t        return ec_index&0xff;
4 i3 `% w( l: L}# Z8 a6 W# H% F* ]
南狼老师能否帮忙解释一下上面的代码,我只知道是通过bios读取ec的内容。
发表于 2009-3-10 18:05:59 | 显示全部楼层
  1. char read_ec_ram(char ec_index) 6 D- H8 l* {& U5 f9 [" B$ n
  2. { // Input ec_index = EC RAM Index! L/ r+ F( d7 ^+ q3 b" X3 @
  3.   __asm{
    & ^1 t/ {0 t. {
  4.     .486 // 使用486指令集
    ' r6 p/ v1 d7 t) {/ v" ~. A
  5.     mov al, ec_index    // EC对应的SW SMI No.
    6 |8 K* ~! _+ u: J( ~+ n* @
  6.     out 0B3h, al        // 送到 S/W SMI data 寄存器5 \$ W$ u( w$ z4 Z
  7.     mov al, 0E4h        // 触发 S/W SMI, No. 0E4h
    : }8 I. R; l. I7 a/ J
  8.     out 0B2h, al        // Call S/W SMI to read EC RAM
    ; D% g3 b6 M" o/ d2 a
  9.     in  al, 0B3h        // Read data store to I/O port 0B3h
    / E& Y8 @4 L: s9 ^* W" r- p
  10.     mov ec_index, al    // Save read data to ec_index9 z, s2 D* v$ k2 y! J( ^1 J3 ?3 x
  11.   }
    1 J  p. [9 B9 d. T9 ]: |" ~
  12.   return ec_index&0xff;$ Y& t2 K& G' p* l) W. G6 I" D4 t
  13. }
复制代码
上面就是调用BIOS的S/W SMI读取的,这里什么都看不到,
6 S8 G, g6 L; c6 l9 p3 x, o+ I除了知道S/W SMI 0E4h的ec_index值对应的是读CPU温度的功能.
$ D/ o* u: ]. |: s8 R0 Q, b7 \6 U# Q( \
猜的.6 n  Q& x9 c: Q6 V4 e2 E

* Z$ \, Y  ^' p- G[ 本帖最后由 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的特定位置。; V; I! ~, O: y3 v+ X) r
比如100ms读一次,这样cpu的温度就能及时的更新。BIOS 通过out 80 command 1 _4 @1 k5 F, |
到66 port读取EC Ram信息,这样就可以得到cpu温度了。
4 j8 }0 Z- }( K: H$ g8 d6 D" L# v  e$ C* K0 Q
你的code的原理应该是:: m$ c* h. L  Y
通过一个sw smi call BIOS的code,BIOS在smi handler中下command 读取EC 1 X9 |8 b( A' n5 k- T
Ram获得CPU温度。
2 ?! R" Z1 w$ N0 k) o, z/ {: c. o  N. \6 y3 B8 Z5 d+ w
[ 本帖最后由 peterhu 于 2009-3-12 15:04 编辑 ]
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-9-1 17:43 , Processed in 0.061416 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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