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

如何从ec中读取cpu温度?

[复制链接]
发表于 2009-3-10 17:29:26 | 显示全部楼层 |阅读模式
char read_ec_ram(char ec_index)
0 P) |8 ?( T3 w. J{  // Input ec_index = EC RAM Index; k. X2 i4 X! A' k& Y" y# I
  __asm{: o. o  u+ Y9 n5 ~/ D& c$ S) y5 j
                .486+ X! m: W% y5 y1 x- ~
    mov al, ec_index3 P( f4 H! x* C! o# e2 O/ x3 i
    out 0B3h, al+ r$ R. z1 |3 [& _4 g% ^( x
    mov al, 0E4h* E: i2 M- \4 F) @
    out 0B2h, al         // Call S/W SMI to read EC RAM
& h, @) C( V6 c! ]& a$ l1 f    in  al, 0B3h        // Read data store to I/O port 0B3h
( U3 B$ W# v2 D- j' s  B' Q; {# u% E    mov ec_index, al        // Save read data to ec_index.
8 h7 H  I+ e" ?  }
2 ~/ ?4 k6 C( o& Q        return ec_index&0xff;4 E7 N6 G( }5 a3 D. M6 V. v2 W
}7 C: \. b7 u/ H2 `6 `# @5 d
南狼老师能否帮忙解释一下上面的代码,我只知道是通过bios读取ec的内容。
发表于 2009-3-10 18:05:59 | 显示全部楼层
  1. char read_ec_ram(char ec_index) * y, @  O; P5 b8 R- J
  2. { // Input ec_index = EC RAM Index8 {2 K# b. g8 S8 H% O3 @
  3.   __asm{
    / g5 _1 n* ^; s5 f4 T6 i- h
  4.     .486 // 使用486指令集
    , p7 {$ z; e' q; C8 B: x/ q
  5.     mov al, ec_index    // EC对应的SW SMI No.
    : g$ [0 B" W7 [
  6.     out 0B3h, al        // 送到 S/W SMI data 寄存器2 L+ J# ?! d9 u2 }
  7.     mov al, 0E4h        // 触发 S/W SMI, No. 0E4h; i0 i5 a5 r/ ]
  8.     out 0B2h, al        // Call S/W SMI to read EC RAM' N( R0 K3 y5 F- x; Y
  9.     in  al, 0B3h        // Read data store to I/O port 0B3h
    % C0 S: w1 I. I1 u9 N  A8 H
  10.     mov ec_index, al    // Save read data to ec_index+ ^4 [1 n4 w( \( Y
  11.   }: X% x0 \6 O7 I. ~6 C* k9 F8 C
  12.   return ec_index&0xff;
    ' P+ A2 q+ ~6 I% H
  13. }
复制代码
上面就是调用BIOS的S/W SMI读取的,这里什么都看不到,7 E  _+ w3 p+ G; k
除了知道S/W SMI 0E4h的ec_index值对应的是读CPU温度的功能.% k5 R  v- j& c  O5 m7 |
5 c. w& r. G& ~, P. g
猜的.9 O1 M; W0 P" K' V4 t/ I- p  _
2 Z( z  ~! o) }
[ 本帖最后由 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的特定位置。
! D6 j' W, O- N9 l1 [' d' M6 U2 Y1 e3 C比如100ms读一次,这样cpu的温度就能及时的更新。BIOS 通过out 80 command
5 ^6 W+ Y  n9 C( I% K3 n5 Q到66 port读取EC Ram信息,这样就可以得到cpu温度了。2 x, P; ?, @9 u% z2 L1 a6 J
/ T& |! D1 i7 z; F
你的code的原理应该是:3 O: _: a$ {- ]# l$ d
通过一个sw smi call BIOS的code,BIOS在smi handler中下command 读取EC
9 t* j; O* Y6 c6 JRam获得CPU温度。
+ a- \8 q# Q& ~8 @) g& M7 Z4 L9 l" g8 x) k
[ 本帖最后由 peterhu 于 2009-3-12 15:04 编辑 ]
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-6-29 04:06 , Processed in 0.085312 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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