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

如何从ec中读取cpu温度?

[复制链接]
发表于 2009-3-10 17:29:26 | 显示全部楼层 |阅读模式
char read_ec_ram(char ec_index) $ k3 q+ s5 `$ v% @* t& {" R
{  // Input ec_index = EC RAM Index
1 R1 Z  k) S) t* ]1 @5 l; l  __asm{8 k4 y5 R! f  {! D8 @0 _
                .486
) z8 h: G% y$ p, i" |    mov al, ec_index
3 x3 {% T9 |1 k6 z    out 0B3h, al5 j7 c- [( a9 R& {& P
    mov al, 0E4h& d2 U8 H; ~! L5 b! a
    out 0B2h, al         // Call S/W SMI to read EC RAM* f" D9 c: \, D% m9 ]! z, s: L
    in  al, 0B3h        // Read data store to I/O port 0B3h1 O8 A$ T- V7 y7 g& T. M
    mov ec_index, al        // Save read data to ec_index.
' |1 z* |5 M. u  } + o# O! ^9 p+ \/ d5 ]4 W
        return ec_index&0xff;( E* c9 H3 b+ s9 [
}
8 K+ |% T  v2 t2 z1 ]! j  w南狼老师能否帮忙解释一下上面的代码,我只知道是通过bios读取ec的内容。
发表于 2009-3-10 18:05:59 | 显示全部楼层
  1. char read_ec_ram(char ec_index) ' R4 ~5 E5 g4 h( R8 M
  2. { // Input ec_index = EC RAM Index
    ' g6 J  L4 G- N, o- e
  3.   __asm{" Q- P$ }" N* ]: [
  4.     .486 // 使用486指令集
    ' b6 a; {: q1 [, }+ Y/ V( P
  5.     mov al, ec_index    // EC对应的SW SMI No.
    ) T+ }. g' ?3 }) r& R
  6.     out 0B3h, al        // 送到 S/W SMI data 寄存器
    + [3 N, v) H2 u. `6 i+ F
  7.     mov al, 0E4h        // 触发 S/W SMI, No. 0E4h
    3 t8 V' V: g" x& ^; R1 U! N) T( a
  8.     out 0B2h, al        // Call S/W SMI to read EC RAM
    & r- {. e, `- w  k+ ~2 u6 z8 Q
  9.     in  al, 0B3h        // Read data store to I/O port 0B3h
    ) p2 W: o- c9 }
  10.     mov ec_index, al    // Save read data to ec_index
    ( p8 f9 P; Z7 U! Q8 n) u4 r6 N
  11.   }
      X5 R9 o( u! `+ |* |6 Y* L
  12.   return ec_index&0xff;
    3 E" \& c, K, ?9 @" O
  13. }
复制代码
上面就是调用BIOS的S/W SMI读取的,这里什么都看不到,
% h* X+ S' C( e  E3 @7 G除了知道S/W SMI 0E4h的ec_index值对应的是读CPU温度的功能.
2 C1 _0 L6 t( l5 a
  Z+ t; y1 L5 S* s; D( j$ w: M猜的.
  S9 Q: @1 L% m/ ]3 l' Z+ R1 D/ O5 |) M4 p2 u
[ 本帖最后由 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的特定位置。
8 v0 R* c5 M, z8 V比如100ms读一次,这样cpu的温度就能及时的更新。BIOS 通过out 80 command   d7 D1 E) x, ?8 V- z' G' D
到66 port读取EC Ram信息,这样就可以得到cpu温度了。
, q( s3 A% h  y6 H1 z. B( S) E* M9 E
你的code的原理应该是:
% w" O, f. X2 W1 c9 e通过一个sw smi call BIOS的code,BIOS在smi handler中下command 读取EC
9 k' _. T: n( j8 QRam获得CPU温度。- A; I% l- a4 U  \& E3 R

7 G3 l: }( J% L' y8 I" L7 _% y[ 本帖最后由 peterhu 于 2009-3-12 15:04 编辑 ]
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-9-21 22:27 , Processed in 0.303352 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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