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

如何从ec中读取cpu温度?

[复制链接]
发表于 2009-3-10 17:29:26 | 显示全部楼层 |阅读模式
char read_ec_ram(char ec_index) 7 Q9 p0 N5 b) a& i. M0 c( ], n
{  // Input ec_index = EC RAM Index
6 o. n, P, l" n* M8 Y  __asm{
6 }6 C" M- q  V) ^2 L. }# i8 |                .4864 u' y* Y2 C! q3 ]: `  [" N
    mov al, ec_index
4 b( E9 `! y* T) N    out 0B3h, al/ _' l& U4 G6 {, Z
    mov al, 0E4h
9 Q9 o6 r: f3 F4 @, C" S* B$ R    out 0B2h, al         // Call S/W SMI to read EC RAM
, {& G- v8 `7 S  [4 Y    in  al, 0B3h        // Read data store to I/O port 0B3h: `1 j0 v! f& _, h4 I
    mov ec_index, al        // Save read data to ec_index.
& d7 W$ ?! \6 B# o3 [  }
% T6 C, l: K' t5 P: M; C, \        return ec_index&0xff;
- f+ u+ V5 ]2 H  s}+ k/ k" h3 C6 S* ^) i6 Z" c" L
南狼老师能否帮忙解释一下上面的代码,我只知道是通过bios读取ec的内容。
发表于 2009-3-10 18:05:59 | 显示全部楼层
  1. char read_ec_ram(char ec_index)
    5 c9 s* a% A% Y- \/ F5 m+ i$ F
  2. { // Input ec_index = EC RAM Index
    # B- `  ]2 L: }
  3.   __asm{9 o/ O* D5 C7 g, E$ E* X. [* N
  4.     .486 // 使用486指令集
    0 L4 W/ d/ B. \2 Y3 v% C" I4 m
  5.     mov al, ec_index    // EC对应的SW SMI No." V% J. n" |! Z/ f
  6.     out 0B3h, al        // 送到 S/W SMI data 寄存器* b4 Y8 q, w. _. c
  7.     mov al, 0E4h        // 触发 S/W SMI, No. 0E4h; X4 O) W0 ~; H' P. B$ {
  8.     out 0B2h, al        // Call S/W SMI to read EC RAM
    8 q2 ?, g; g9 a! M$ Q3 w
  9.     in  al, 0B3h        // Read data store to I/O port 0B3h
    # ?' M) W% `1 E; n
  10.     mov ec_index, al    // Save read data to ec_index
    ; T- v! c5 |; S2 K- N  M  y, M$ T) C3 b
  11.   }; y  v) b' O2 }* j( l! {$ N2 u$ b& S
  12.   return ec_index&0xff;. c2 g- Z* ^4 {- b
  13. }
复制代码
上面就是调用BIOS的S/W SMI读取的,这里什么都看不到,
: u6 p9 n7 X$ E1 P% S! d. v& x) H除了知道S/W SMI 0E4h的ec_index值对应的是读CPU温度的功能.
$ [5 M& L$ Y( S5 H! F% Y% D& g5 |) _! R
猜的.% ~1 _/ o; j0 L( J2 U6 e% g

/ ^" q( p7 d* A0 H[ 本帖最后由 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的特定位置。/ N8 x4 I' B+ Z& q+ q
比如100ms读一次,这样cpu的温度就能及时的更新。BIOS 通过out 80 command
2 m3 Q" ]' x- m到66 port读取EC Ram信息,这样就可以得到cpu温度了。* b# n3 U/ \  @2 G8 m4 F2 |. R
5 F$ }  j/ ~  L7 [
你的code的原理应该是:: b; b; l+ C& S
通过一个sw smi call BIOS的code,BIOS在smi handler中下command 读取EC + h" c+ @4 g5 z
Ram获得CPU温度。2 V  W: Z; [2 m; H5 ^9 H& T4 c' n" |

3 P! L  E: C; _1 g  k2 b; O" w[ 本帖最后由 peterhu 于 2009-3-12 15:04 编辑 ]
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-10-12 07:27 , Processed in 3.751116 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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