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

如何从ec中读取cpu温度?

[复制链接]
发表于 2009-3-10 17:29:26 | 显示全部楼层 |阅读模式
char read_ec_ram(char ec_index) 3 O  o- R  \, M3 m: h. x& |
{  // Input ec_index = EC RAM Index
( P" M4 M: ^6 l1 d  __asm{
8 I! L9 o: B4 i1 L* ^. u                .486
/ f6 b3 {: ^' F    mov al, ec_index' E, a6 [% Q8 Y9 r
    out 0B3h, al- v- X5 Q& j+ w* o( H% G
    mov al, 0E4h* L9 I! x; \5 t. q; l7 t
    out 0B2h, al         // Call S/W SMI to read EC RAM1 u1 U1 r8 j* B* d0 G
    in  al, 0B3h        // Read data store to I/O port 0B3h( B. o5 d, a5 I7 U
    mov ec_index, al        // Save read data to ec_index.
7 C/ s/ O* R! Q  }
- m/ K- x  j& L# K        return ec_index&0xff;
1 y6 A  O2 }/ ?}0 X3 `# d6 d8 D2 |2 `
南狼老师能否帮忙解释一下上面的代码,我只知道是通过bios读取ec的内容。
发表于 2009-3-10 18:05:59 | 显示全部楼层
  1. char read_ec_ram(char ec_index) " A' F9 J! i& \( }
  2. { // Input ec_index = EC RAM Index* |/ l4 d9 i/ \% L5 g- B
  3.   __asm{4 s: o8 J8 m3 M8 w3 F4 P5 A3 s
  4.     .486 // 使用486指令集( B3 T& z9 \$ Y$ q3 }6 e+ e1 i
  5.     mov al, ec_index    // EC对应的SW SMI No.
    / X0 y/ h, x5 @1 k
  6.     out 0B3h, al        // 送到 S/W SMI data 寄存器
    ' S6 ~* h9 o1 _; N0 E& {
  7.     mov al, 0E4h        // 触发 S/W SMI, No. 0E4h1 h, G' w/ ?0 [
  8.     out 0B2h, al        // Call S/W SMI to read EC RAM
    # u) y. d  v2 ^" j/ U
  9.     in  al, 0B3h        // Read data store to I/O port 0B3h; N2 t& d4 |1 _5 _
  10.     mov ec_index, al    // Save read data to ec_index0 e, u# w# ?2 K0 q6 ]( K
  11.   }- f  }( |$ f) @9 k0 M. o
  12.   return ec_index&0xff;( i7 o2 ~7 H6 i$ U& e5 a; `! k
  13. }
复制代码
上面就是调用BIOS的S/W SMI读取的,这里什么都看不到,8 ?1 s- G) m/ D+ R) o# n0 g
除了知道S/W SMI 0E4h的ec_index值对应的是读CPU温度的功能.
; b; J- j, \+ U! A2 l* m% t$ P+ c: o; |% @% A3 _
猜的.: L$ S0 D, D8 i; a9 q. T5 `0 y, @

, j9 m# J9 w' ~- Y) a( I% 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的特定位置。! ?* {9 O% d* a" ^% y
比如100ms读一次,这样cpu的温度就能及时的更新。BIOS 通过out 80 command
& l( F! J$ l0 r. [9 E2 u到66 port读取EC Ram信息,这样就可以得到cpu温度了。# K# [% Y; E, I" l. w0 Z
, i* G9 e( e1 o% Y+ H
你的code的原理应该是:
) b4 e0 h6 \2 _$ O8 L0 _0 l通过一个sw smi call BIOS的code,BIOS在smi handler中下command 读取EC # C8 O+ c# o: s) G) s+ b1 ~
Ram获得CPU温度。
7 [$ I2 ?4 L" \  F' T1 }2 H& j% h: _6 s# m& y8 b, q
[ 本帖最后由 peterhu 于 2009-3-12 15:04 编辑 ]
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-6-4 19:01 , Processed in 0.041933 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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