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

如何从ec中读取cpu温度?

[复制链接]
发表于 2009-3-10 17:29:26 | 显示全部楼层 |阅读模式
char read_ec_ram(char ec_index)
5 _) `2 K6 [* y7 e) z& n+ ~{  // Input ec_index = EC RAM Index: E: Y) r/ s3 @2 e$ N
  __asm{
* L5 G" L* E0 A                .4861 I( E" y5 j- U
    mov al, ec_index
7 e# C" l; I, ]7 H4 F    out 0B3h, al% ]0 q: y7 t" ?4 w% [! x, C/ c) G
    mov al, 0E4h- p# |& c0 a: a- G/ x$ o
    out 0B2h, al         // Call S/W SMI to read EC RAM
4 W% Z  K9 Q6 S8 n/ o  J+ s5 f    in  al, 0B3h        // Read data store to I/O port 0B3h: g$ P: W# `3 k- L! K" f
    mov ec_index, al        // Save read data to ec_index.
4 J0 Z$ U; p6 t  k3 ~2 q. O* G  } ! k2 c  r) i' H1 t- ?" ~& V8 ?
        return ec_index&0xff;
/ N4 U! N8 a4 h+ f& }}
, |: `* \6 |; R, L  N7 Q  e6 Q9 _南狼老师能否帮忙解释一下上面的代码,我只知道是通过bios读取ec的内容。
发表于 2009-3-10 18:05:59 | 显示全部楼层
  1. char read_ec_ram(char ec_index) ) D  B; S  W5 p% j. y
  2. { // Input ec_index = EC RAM Index
    9 h) l( ?. e# e4 |6 E# p
  3.   __asm{
    2 F0 l- B6 S% H7 t1 p
  4.     .486 // 使用486指令集  N% ?$ M3 e0 ^! c  o, ?0 N  X6 T7 `/ J9 v
  5.     mov al, ec_index    // EC对应的SW SMI No.
    1 {" F3 O- v4 o! s! E$ f5 |
  6.     out 0B3h, al        // 送到 S/W SMI data 寄存器) _: v3 w7 S# z+ y
  7.     mov al, 0E4h        // 触发 S/W SMI, No. 0E4h# z5 e1 ~3 M0 ~$ j5 P1 k+ ]0 R
  8.     out 0B2h, al        // Call S/W SMI to read EC RAM. m/ z  G( J9 x8 s/ B
  9.     in  al, 0B3h        // Read data store to I/O port 0B3h) \4 N4 \  \/ s0 m- B/ n
  10.     mov ec_index, al    // Save read data to ec_index
    - l" a" T+ [1 U3 q9 V" }
  11.   }8 Q. H5 e; x8 v) n& q. o% Q1 O
  12.   return ec_index&0xff;* K  `+ m3 C. U. [' Q6 k1 U
  13. }
复制代码
上面就是调用BIOS的S/W SMI读取的,这里什么都看不到,! c4 {; J- ]4 _) O; O5 l0 t
除了知道S/W SMI 0E4h的ec_index值对应的是读CPU温度的功能.
& [& V- J6 i+ g# Q  W4 [- X7 j5 M
) u& D* @: n2 i& X9 P% w* w3 q猜的.. X% S! X) ~( R

# t. I) I+ I  z) B[ 本帖最后由 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的特定位置。
, @4 K8 @  [- j比如100ms读一次,这样cpu的温度就能及时的更新。BIOS 通过out 80 command
- E' i9 G& E; A3 w! u" x到66 port读取EC Ram信息,这样就可以得到cpu温度了。
1 x: V: q6 G% v, T" j
# x  d4 W* i2 |你的code的原理应该是:: J3 o2 c$ K5 [
通过一个sw smi call BIOS的code,BIOS在smi handler中下command 读取EC ; D2 D7 Y, v' P/ E: q( B8 l
Ram获得CPU温度。
4 D5 `. k- A* A3 ~) c8 ?1 [
( s* K0 }8 L' G/ Z) ]: y3 _/ R[ 本帖最后由 peterhu 于 2009-3-12 15:04 编辑 ]
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-10-20 10:22 , Processed in 0.141802 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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