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

如何从ec中读取cpu温度?

[复制链接]
发表于 2009-3-10 17:29:26 | 显示全部楼层 |阅读模式
char read_ec_ram(char ec_index)
0 u) a- Y5 z& @1 f6 G{  // Input ec_index = EC RAM Index
. a- D1 d3 N+ \& s6 L  __asm{/ f* B1 @* y3 G: H. h; e+ k
                .486
# _& t- P+ {/ x/ V+ k: [0 L    mov al, ec_index
' U. F+ R% h- e& k9 X5 Q$ z4 U    out 0B3h, al' R. x. c# T/ Y  ]! z% _
    mov al, 0E4h
3 H: @3 L4 z3 e; i, y    out 0B2h, al         // Call S/W SMI to read EC RAM
" ^' u! A$ k0 E3 e! |    in  al, 0B3h        // Read data store to I/O port 0B3h: E& c7 G: \- J* R7 t/ V; |- d
    mov ec_index, al        // Save read data to ec_index.
; a# H9 ?  _/ j5 ^+ z  }
5 o) d+ M; \) ?  h" N  G- S" r        return ec_index&0xff;
; P$ I. R7 t! v- K2 K. T}" x* m. \" ~! ?# R& w
南狼老师能否帮忙解释一下上面的代码,我只知道是通过bios读取ec的内容。
发表于 2009-3-10 18:05:59 | 显示全部楼层
  1. char read_ec_ram(char ec_index) % v& @# |% J: s" ?( ^8 l
  2. { // Input ec_index = EC RAM Index$ C8 T" U/ w# @1 l4 a
  3.   __asm{
    4 ^! e& I( u6 _7 l
  4.     .486 // 使用486指令集
    % g& @0 K6 z( i2 E# r2 i- `
  5.     mov al, ec_index    // EC对应的SW SMI No.
    . O0 [+ G+ }. F5 `
  6.     out 0B3h, al        // 送到 S/W SMI data 寄存器
    & i5 Q9 b9 p6 |' a! i/ \  B
  7.     mov al, 0E4h        // 触发 S/W SMI, No. 0E4h
    8 ?6 r* w- f8 s$ R
  8.     out 0B2h, al        // Call S/W SMI to read EC RAM/ S+ r/ Y' f7 [6 b' q
  9.     in  al, 0B3h        // Read data store to I/O port 0B3h! N' C) Q# p" Y5 L+ a
  10.     mov ec_index, al    // Save read data to ec_index3 O- i; U6 n; M, z3 R( I
  11.   }: z/ r# \$ l; ?$ }" T" K
  12.   return ec_index&0xff;
    : ~( I# \7 m2 r9 @2 T+ `( k  b
  13. }
复制代码
上面就是调用BIOS的S/W SMI读取的,这里什么都看不到,
: A' y' j6 c5 S除了知道S/W SMI 0E4h的ec_index值对应的是读CPU温度的功能.4 q, Z% ]( a# j: T% g
$ k  K" k1 x+ ^% T" [, W5 C* R
猜的.
! p$ \" U# f7 ]
3 Z) Z* g! v* W3 }" \[ 本帖最后由 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的特定位置。
) H1 _- x% G7 p# m( |, w) ~比如100ms读一次,这样cpu的温度就能及时的更新。BIOS 通过out 80 command + t) B1 {' Z) D. H6 m4 D8 E
到66 port读取EC Ram信息,这样就可以得到cpu温度了。* N+ r1 C: ^# ^7 }4 y  {/ I

! Q1 s1 O1 ^" ?( e: B! p8 Y你的code的原理应该是:5 _" d. ]0 Q4 Q8 I
通过一个sw smi call BIOS的code,BIOS在smi handler中下command 读取EC " k# _. B# |. C" L2 [7 I
Ram获得CPU温度。- j* O% E% [9 d

' i8 U; {+ X5 L5 Y# t8 t[ 本帖最后由 peterhu 于 2009-3-12 15:04 编辑 ]
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-1 12:04 , Processed in 0.267868 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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