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

如何从ec中读取cpu温度?

[复制链接]
发表于 2009-3-10 17:29:26 | 显示全部楼层 |阅读模式
char read_ec_ram(char ec_index) " y3 A9 b! K( I
{  // Input ec_index = EC RAM Index
4 S/ h3 O7 @; Q  __asm{. u) q; h! P6 s  M0 _2 X" K
                .486  r/ F$ o! }+ M+ u0 i& ]7 x, H
    mov al, ec_index
9 p, T" |9 U- E9 z9 p    out 0B3h, al
& @6 e) E, C4 R# ]0 s    mov al, 0E4h
) N  a- N" U0 r/ U$ @, p    out 0B2h, al         // Call S/W SMI to read EC RAM
. y! ?2 S: A3 R    in  al, 0B3h        // Read data store to I/O port 0B3h
( _5 ^. u# b2 _  K    mov ec_index, al        // Save read data to ec_index., E+ h) D- x! S6 J; X: E* \; T
  } 5 v. d4 d$ Z1 X" F5 R( k% _8 p" Z" q' G
        return ec_index&0xff;
' z  ^. u6 F- H* r/ Y# w}
3 _9 k; w$ E$ w7 s4 C  F8 d南狼老师能否帮忙解释一下上面的代码,我只知道是通过bios读取ec的内容。
发表于 2009-3-10 18:05:59 | 显示全部楼层
  1. char read_ec_ram(char ec_index) & q0 D# u% Q4 a( T7 ~% C
  2. { // Input ec_index = EC RAM Index
    ( S, u2 b- ~( \9 ?# A4 |6 g3 j
  3.   __asm{
    " ~, }+ \3 j$ v( H# ^3 a7 [, N
  4.     .486 // 使用486指令集
    % ~4 {( p9 ~4 z5 ]9 s9 a! l4 i6 A
  5.     mov al, ec_index    // EC对应的SW SMI No.
    # O7 i4 R/ V' h; [7 U7 c3 a# w
  6.     out 0B3h, al        // 送到 S/W SMI data 寄存器
    2 D. J4 P' ~) w8 _! ]/ R9 a
  7.     mov al, 0E4h        // 触发 S/W SMI, No. 0E4h
    , D  b4 H: P- c% t% p1 o3 z
  8.     out 0B2h, al        // Call S/W SMI to read EC RAM8 h9 I( @$ X' s; E0 K
  9.     in  al, 0B3h        // Read data store to I/O port 0B3h
    2 A& O( l* m# D0 z8 L# i$ Q
  10.     mov ec_index, al    // Save read data to ec_index, s1 v9 c! f: R" B5 @2 T
  11.   }
    . E5 c/ r! r, V9 r( f" }
  12.   return ec_index&0xff;8 Q$ w$ R& F5 W, s  {6 Y$ f( b. m. d
  13. }
复制代码
上面就是调用BIOS的S/W SMI读取的,这里什么都看不到,
" V3 W- f3 s' X5 q; z4 d除了知道S/W SMI 0E4h的ec_index值对应的是读CPU温度的功能.1 F! b3 \! `& F2 t6 E0 `# ?
: Z+ }: A# d& `5 n
猜的.+ D; Y7 q$ T! K
/ N1 q3 P0 q+ N. ^
[ 本帖最后由 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的特定位置。
1 S) H: W! u  s8 I比如100ms读一次,这样cpu的温度就能及时的更新。BIOS 通过out 80 command ' |6 g: Z* c: M5 I! H( }
到66 port读取EC Ram信息,这样就可以得到cpu温度了。
4 A/ Z) e0 g1 ]& b- u; @  g% L5 ~+ R# K8 ^* H" Q0 ?; P4 o
你的code的原理应该是:- m* O" Z/ N7 X5 B! j6 j& f4 s
通过一个sw smi call BIOS的code,BIOS在smi handler中下command 读取EC
6 v1 X% B+ \6 l5 r. d, JRam获得CPU温度。1 D+ k2 N* _: B+ S2 S( W8 c( c0 K
; U3 p: R, n- G& h& g' I3 P
[ 本帖最后由 peterhu 于 2009-3-12 15:04 编辑 ]
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-9-4 15:47 , Processed in 0.144601 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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