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

如何从ec中读取cpu温度?

[复制链接]
发表于 2009-3-10 17:29:26 | 显示全部楼层 |阅读模式
char read_ec_ram(char ec_index) & P; ]$ n: i9 r' N1 z& b. O
{  // Input ec_index = EC RAM Index
/ k6 l" L& N  S# O- n8 e0 k) x  __asm{. J6 Y+ b6 O$ X1 a! r! b
                .486
# d4 g" s, J/ A  W    mov al, ec_index
6 d% v$ S& N1 |0 W3 i    out 0B3h, al
6 z* l! x1 O4 Z6 D& d* J    mov al, 0E4h5 w' w( q  Z  e% N+ X3 e) _" C
    out 0B2h, al         // Call S/W SMI to read EC RAM( q/ o8 G8 U1 i% _# v
    in  al, 0B3h        // Read data store to I/O port 0B3h$ Y2 d) j1 `- j- U5 |$ u
    mov ec_index, al        // Save read data to ec_index.
( N0 q- C9 R# D' u3 \  }
- ~1 q1 }) U% h% S# B2 l        return ec_index&0xff;
4 G* {$ L  _" Q' E}1 J/ _7 I( d5 Y0 `+ ?0 o' l
南狼老师能否帮忙解释一下上面的代码,我只知道是通过bios读取ec的内容。
发表于 2009-3-10 18:05:59 | 显示全部楼层
  1. char read_ec_ram(char ec_index)
    * t+ D/ O7 |% H8 N. `1 @9 M
  2. { // Input ec_index = EC RAM Index3 w8 F/ R& r$ A, S( Z
  3.   __asm{
    5 R: p' ?" C; U% P
  4.     .486 // 使用486指令集
    + n6 L% h8 x. K% m! N+ b
  5.     mov al, ec_index    // EC对应的SW SMI No.3 B6 ]/ f& V8 N" J1 X( C9 t
  6.     out 0B3h, al        // 送到 S/W SMI data 寄存器
    : y$ D1 l0 C0 J+ r0 `
  7.     mov al, 0E4h        // 触发 S/W SMI, No. 0E4h7 T' b! t4 \. O7 v( B
  8.     out 0B2h, al        // Call S/W SMI to read EC RAM; e) v: o+ u* t+ z9 h- q6 E
  9.     in  al, 0B3h        // Read data store to I/O port 0B3h
    0 n# @! i% n1 n$ ]
  10.     mov ec_index, al    // Save read data to ec_index7 F/ {1 J/ B& Y. }8 J8 E, ?  i
  11.   }; C! G' C: C  A
  12.   return ec_index&0xff;/ o/ \6 v5 u# c: ^% ?
  13. }
复制代码
上面就是调用BIOS的S/W SMI读取的,这里什么都看不到,
% O& N3 g+ C! P; q# N6 e除了知道S/W SMI 0E4h的ec_index值对应的是读CPU温度的功能.
. r6 v* \$ D$ w# ]+ M# x8 O. P1 J, x6 t+ J* W0 n+ |
猜的.# Y; G2 g$ `( C" e4 R5 p+ Q

8 ^; K8 O1 T% L5 l; c4 y! f$ p[ 本帖最后由 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的特定位置。
# m3 R8 d1 ~- I% y& v' ]7 E3 v8 C2 S比如100ms读一次,这样cpu的温度就能及时的更新。BIOS 通过out 80 command & e# k  J$ d5 v: h6 y4 {$ q+ G1 v
到66 port读取EC Ram信息,这样就可以得到cpu温度了。
! l$ ?* c8 b- W2 |5 }9 I& p8 f; x0 @
你的code的原理应该是:0 p& a5 c3 P, r5 C" H7 G  k2 R
通过一个sw smi call BIOS的code,BIOS在smi handler中下command 读取EC
; E0 r& h- W1 ?Ram获得CPU温度。( R7 ?! q7 v! v/ y2 h/ @/ \$ _$ Y0 [
8 X; `* @. H4 N) w
[ 本帖最后由 peterhu 于 2009-3-12 15:04 编辑 ]
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-3-15 06:50 , Processed in 0.564466 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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