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

如何从ec中读取cpu温度?

[复制链接]
发表于 2009-3-10 17:29:26 | 显示全部楼层 |阅读模式
char read_ec_ram(char ec_index) 8 ^( r. {' U9 e
{  // Input ec_index = EC RAM Index8 Q3 z' ^: @8 f+ w5 q
  __asm{- K/ n, ~3 O' v% @" s/ ?0 b8 k
                .486( R6 f1 t" Y; [, S
    mov al, ec_index
6 e( {2 Y0 @5 |    out 0B3h, al2 B2 p/ F$ b. g
    mov al, 0E4h
9 z7 r& }( \9 d    out 0B2h, al         // Call S/W SMI to read EC RAM
! x6 q# w& v" j- J* x, r! y3 _    in  al, 0B3h        // Read data store to I/O port 0B3h
% M( |) [  I5 W: h1 ]    mov ec_index, al        // Save read data to ec_index.
" N# }& W& F9 b$ x2 H  } ! x. T0 G9 x- y1 {1 M' a" A7 \0 |+ i
        return ec_index&0xff;
8 j" Y+ ?. M0 R7 S8 h}: N( L! x- S/ R' W8 _  f
南狼老师能否帮忙解释一下上面的代码,我只知道是通过bios读取ec的内容。
发表于 2009-3-10 18:05:59 | 显示全部楼层
  1. char read_ec_ram(char ec_index)
    * B0 s1 f) y2 L" A; {% c2 d
  2. { // Input ec_index = EC RAM Index+ ?) g1 R# m# l) h
  3.   __asm{
    * z- K& |0 b- Z6 M* u  o/ X
  4.     .486 // 使用486指令集0 O) \/ B) r% J! i$ ]
  5.     mov al, ec_index    // EC对应的SW SMI No.9 z# E1 B* O3 ?, f2 v/ N
  6.     out 0B3h, al        // 送到 S/W SMI data 寄存器4 ]% r0 `: y! T- r8 K
  7.     mov al, 0E4h        // 触发 S/W SMI, No. 0E4h
    1 P7 |5 ~8 \- @; o! n
  8.     out 0B2h, al        // Call S/W SMI to read EC RAM
    ! i; B, i( g3 t
  9.     in  al, 0B3h        // Read data store to I/O port 0B3h$ m" z% h- [9 s7 M" W3 z+ [
  10.     mov ec_index, al    // Save read data to ec_index2 ?; F+ c8 \* W! g
  11.   }
    5 A7 T! m4 D6 t8 N. h# N( P
  12.   return ec_index&0xff;
    + d) o: a; }+ x& n( t
  13. }
复制代码
上面就是调用BIOS的S/W SMI读取的,这里什么都看不到," ?1 n1 c: K) a. b" S5 P+ E
除了知道S/W SMI 0E4h的ec_index值对应的是读CPU温度的功能.
/ M% J2 L! t2 y5 `* M* n
/ K/ O0 V& k. p# t' p7 ?3 J猜的.7 \0 \4 G1 p" w

* j: G" p" V* Q6 F3 ?; 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的特定位置。
6 l; I! h% o* j比如100ms读一次,这样cpu的温度就能及时的更新。BIOS 通过out 80 command
! P/ o4 y0 O" m: I到66 port读取EC Ram信息,这样就可以得到cpu温度了。+ Y7 M, X. j/ M3 |1 l/ K
2 w: t: e/ t' p, D4 o
你的code的原理应该是:& l+ @% a$ n$ B! T! o, m  ]1 Y1 @+ n
通过一个sw smi call BIOS的code,BIOS在smi handler中下command 读取EC
% S% f6 i+ ]7 l0 E! YRam获得CPU温度。2 {" e) V! e$ ~8 v; J0 g
2 H7 `8 K' |& N
[ 本帖最后由 peterhu 于 2009-3-12 15:04 编辑 ]
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-7-19 20:42 , Processed in 0.143586 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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