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

如何从ec中读取cpu温度?

[复制链接]
发表于 2009-3-10 17:29:26 | 显示全部楼层 |阅读模式
char read_ec_ram(char ec_index)
* B. G1 O! v3 h* z5 K7 y& P{  // Input ec_index = EC RAM Index
- C  W) q9 C0 T0 e% X. l" L  __asm{+ _3 y! Q3 _1 K& f) B, c* }
                .486
( b8 J; w1 C9 r    mov al, ec_index$ V  F2 C. `6 ?5 B. x
    out 0B3h, al
& f1 Z" a" O% ^) M% o5 B    mov al, 0E4h
! u& H! [2 i1 X% y    out 0B2h, al         // Call S/W SMI to read EC RAM* G1 `6 P$ f+ G' e
    in  al, 0B3h        // Read data store to I/O port 0B3h
/ @. q. m( o- p, z2 P# \    mov ec_index, al        // Save read data to ec_index.9 D: K2 J) u, |6 c
  } 6 a; t( l$ O% E% f1 u
        return ec_index&0xff;" w2 P0 p  x. f
}
2 [+ b" u; K* `0 Y南狼老师能否帮忙解释一下上面的代码,我只知道是通过bios读取ec的内容。
发表于 2009-3-10 18:05:59 | 显示全部楼层
  1. char read_ec_ram(char ec_index) 8 Z1 O5 |; e: x
  2. { // Input ec_index = EC RAM Index! T: O3 t" s8 |. [9 _, v6 N; g1 k
  3.   __asm{
    8 K# t4 {9 {: b; O
  4.     .486 // 使用486指令集
    * B0 x: x0 x) \6 L$ E
  5.     mov al, ec_index    // EC对应的SW SMI No.
    ( {" P3 r" @7 C7 \3 H
  6.     out 0B3h, al        // 送到 S/W SMI data 寄存器7 I5 x3 @" O+ |, u* A: c- X4 g
  7.     mov al, 0E4h        // 触发 S/W SMI, No. 0E4h
    , ]' u5 b/ q, |' m: i. z9 l
  8.     out 0B2h, al        // Call S/W SMI to read EC RAM
    * F- S; N3 K/ g7 [  W' C
  9.     in  al, 0B3h        // Read data store to I/O port 0B3h" n9 X4 u$ C3 f5 L4 n0 ?% X/ x
  10.     mov ec_index, al    // Save read data to ec_index
    6 H" `) y4 ?$ F3 I
  11.   }
    % F' |7 T, C) n& v. [
  12.   return ec_index&0xff;$ Y8 ?9 @5 u5 w' ?2 E
  13. }
复制代码
上面就是调用BIOS的S/W SMI读取的,这里什么都看不到,
: X  _8 [6 ?$ [/ _除了知道S/W SMI 0E4h的ec_index值对应的是读CPU温度的功能.* @& c, t5 u5 N  P3 i
  z& k" `: h8 b5 x4 d* M. j
猜的.
* Z( H) i; [7 ?, p* g$ \2 @( g/ @$ R( a7 |: Y. A% E
[ 本帖最后由 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的特定位置。& _  S5 B, ^4 n; _6 ?7 z; n! D
比如100ms读一次,这样cpu的温度就能及时的更新。BIOS 通过out 80 command
" |! K; ]7 t5 c& w0 X- s0 N到66 port读取EC Ram信息,这样就可以得到cpu温度了。# q# j$ G) o5 o* O- j
0 k. P# _. n* C6 @, ~+ j9 _- y
你的code的原理应该是:7 ]9 y$ I5 e: K4 u
通过一个sw smi call BIOS的code,BIOS在smi handler中下command 读取EC
& _  d2 \% y# X. S( uRam获得CPU温度。
3 G; o9 n9 d. _( K& [0 p. y, p; E6 L0 p4 q0 S! s5 s/ e/ C
[ 本帖最后由 peterhu 于 2009-3-12 15:04 编辑 ]
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-6-4 13:30 , Processed in 1.053152 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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