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

如何从ec中读取cpu温度?

[复制链接]
发表于 2009-3-10 17:29:26 | 显示全部楼层 |阅读模式
char read_ec_ram(char ec_index)
5 d. k: c& D& b, P: S( ]( v{  // Input ec_index = EC RAM Index
& b: S0 u! f  U5 s6 E  __asm{
2 l* ~2 h9 k( ]% I& @' e                .4863 F' y0 X6 {+ ^3 a3 Z, }5 ]
    mov al, ec_index2 P- d; n' {# o1 d4 ~' F2 z! W$ w( O
    out 0B3h, al" i: p1 l4 l" E2 ~% D& l
    mov al, 0E4h
% r3 C/ \7 R# M  U  k; s- w$ `    out 0B2h, al         // Call S/W SMI to read EC RAM0 K- C2 W: K# W
    in  al, 0B3h        // Read data store to I/O port 0B3h  _  a1 p5 X! p4 T1 k" c. ~
    mov ec_index, al        // Save read data to ec_index.
0 o/ l, N% L7 q8 Q: E1 X  }
' n, D/ X0 Y1 i' T. j1 Y        return ec_index&0xff;
# E, ~. w- k/ }) t9 a}; Z( Q3 ?4 @! }" {" R
南狼老师能否帮忙解释一下上面的代码,我只知道是通过bios读取ec的内容。
发表于 2009-3-10 18:05:59 | 显示全部楼层
  1. char read_ec_ram(char ec_index)
    0 z' {( G. \' x5 Y
  2. { // Input ec_index = EC RAM Index
    . g/ h% R( c/ U6 D$ S; f4 h- Y! C
  3.   __asm{
    7 F. m3 L9 t! J# @# j
  4.     .486 // 使用486指令集3 X5 L! g7 y0 z) D. N& n
  5.     mov al, ec_index    // EC对应的SW SMI No.' j3 Q( a1 [  `6 o
  6.     out 0B3h, al        // 送到 S/W SMI data 寄存器6 \. m8 y* f' C: D+ G: I
  7.     mov al, 0E4h        // 触发 S/W SMI, No. 0E4h4 a5 y8 C2 l6 n  ?$ w* [
  8.     out 0B2h, al        // Call S/W SMI to read EC RAM
      b' E4 \/ ~  y" y- \+ e2 T' V5 M  e
  9.     in  al, 0B3h        // Read data store to I/O port 0B3h' P  m9 W. l2 i& [& g; b1 C7 v& G0 C
  10.     mov ec_index, al    // Save read data to ec_index* I, p! R  i, h1 f
  11.   }
    2 o( b; q1 x5 l; }2 A
  12.   return ec_index&0xff;3 ^( P, O9 _' g! ]
  13. }
复制代码
上面就是调用BIOS的S/W SMI读取的,这里什么都看不到,
9 C4 W/ U  l+ t* V6 d6 m除了知道S/W SMI 0E4h的ec_index值对应的是读CPU温度的功能., c5 K6 ~& \& [8 v8 [

/ t$ Q  \/ Y$ Y8 b! M5 M猜的.* l/ C5 ~' a; l/ Z0 X
; h6 _+ n  G; W% V" S
[ 本帖最后由 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的特定位置。
- j( ?7 Z; I- j. X) \比如100ms读一次,这样cpu的温度就能及时的更新。BIOS 通过out 80 command 7 w! e7 |' `; o) H6 L- L
到66 port读取EC Ram信息,这样就可以得到cpu温度了。7 `) N$ q$ I2 X" k; @

  P4 h8 q2 Y# v4 ?/ d* A你的code的原理应该是:' g. H; Y" ~1 B; Y' B. ^1 V
通过一个sw smi call BIOS的code,BIOS在smi handler中下command 读取EC
" I; i3 S7 d0 A, S! |/ bRam获得CPU温度。2 v8 a3 b7 v# y3 M) I
: L* w, `+ s! E
[ 本帖最后由 peterhu 于 2009-3-12 15:04 编辑 ]
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-17 13:53 , Processed in 0.096007 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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