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

如何从ec中读取cpu温度?

[复制链接]
发表于 2009-3-10 17:29:26 | 显示全部楼层 |阅读模式
char read_ec_ram(char ec_index)
1 M1 \! a6 k( X{  // Input ec_index = EC RAM Index
3 ]4 I/ I. w- x  __asm{- n% S; [# h$ b* T! n4 s1 z
                .486/ o! K9 B* Y7 i* t3 H/ e
    mov al, ec_index8 S# |8 G  a% E" V- u9 z) Q% w7 \
    out 0B3h, al
3 i' |5 v+ B+ [; p3 W  E8 H  G    mov al, 0E4h
  `8 E2 ~9 {5 n& e9 J/ [1 t    out 0B2h, al         // Call S/W SMI to read EC RAM% a  {  A; i, S* y4 s, X
    in  al, 0B3h        // Read data store to I/O port 0B3h
7 S7 [. K, d9 Y, b  d- o    mov ec_index, al        // Save read data to ec_index.
3 S# J& q& Y( u  } 8 O, ~+ t* S  S) @% ^
        return ec_index&0xff;& |! B  T6 G- G9 V6 m. H: B; I
}: n0 H) ?8 j  k7 T$ H4 T
南狼老师能否帮忙解释一下上面的代码,我只知道是通过bios读取ec的内容。
发表于 2009-3-10 18:05:59 | 显示全部楼层
  1. char read_ec_ram(char ec_index) % w1 @" h9 J& L7 J* F# y/ G
  2. { // Input ec_index = EC RAM Index
    9 a/ B0 {+ L# C( |# ]* i- q
  3.   __asm{! R. l$ N/ J$ |! k$ F
  4.     .486 // 使用486指令集
    0 d7 n+ z1 U& v# {
  5.     mov al, ec_index    // EC对应的SW SMI No.3 Q/ a; G$ m) O  [6 r7 F
  6.     out 0B3h, al        // 送到 S/W SMI data 寄存器
    ) a8 l; O% P7 Z" ^
  7.     mov al, 0E4h        // 触发 S/W SMI, No. 0E4h* ~4 x" X2 S4 y3 Q. }& F' a; J. m" U
  8.     out 0B2h, al        // Call S/W SMI to read EC RAM& [( D. v5 n/ {( z' z+ t, r
  9.     in  al, 0B3h        // Read data store to I/O port 0B3h+ H9 e0 k1 v, n" L+ m" T7 w
  10.     mov ec_index, al    // Save read data to ec_index! y2 r# E/ B1 O: N1 E: M# F
  11.   }: ^  `# \, `3 x2 s: a8 |
  12.   return ec_index&0xff;
    ; {! b1 X- R7 y8 w% E& W
  13. }
复制代码
上面就是调用BIOS的S/W SMI读取的,这里什么都看不到,
2 w0 S% e6 `  i, B8 A) F0 ^7 [除了知道S/W SMI 0E4h的ec_index值对应的是读CPU温度的功能.2 \* i5 l8 c" O' z/ z/ |

4 }- A, S/ [! V. g6 Y6 J" j猜的.
& i- a% R6 `. j0 ?8 l% j7 Z+ F5 [0 B* k! Y
[ 本帖最后由 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的特定位置。
& S8 c1 S" H4 I% o2 h$ T比如100ms读一次,这样cpu的温度就能及时的更新。BIOS 通过out 80 command * B8 e" p8 S! M0 p9 {& T& E
到66 port读取EC Ram信息,这样就可以得到cpu温度了。$ Z( m* S$ a; y/ L) s3 Y
* k7 W$ i9 Y2 E" \8 x1 s
你的code的原理应该是:0 l; J# E1 m" m; Y' L( U$ [
通过一个sw smi call BIOS的code,BIOS在smi handler中下command 读取EC 1 _+ p  w. {; d2 t
Ram获得CPU温度。1 _' `+ _7 j+ M% G) y& i
. G, Y3 j7 D5 t8 V/ ]9 }
[ 本帖最后由 peterhu 于 2009-3-12 15:04 编辑 ]
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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