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

如何从ec中读取cpu温度?

[复制链接]
发表于 2009-3-10 17:29:26 | 显示全部楼层 |阅读模式
char read_ec_ram(char ec_index)
! c0 {( C% l3 p9 B) m$ P{  // Input ec_index = EC RAM Index
+ {0 Y1 B& C! N  __asm{
5 p& L) p- R; Y* ^                .486
- l2 X# j2 E/ q" p    mov al, ec_index
% O5 ~, O; ~* Q2 ^+ E0 ]    out 0B3h, al
; w7 S; Q1 n3 ]  q( H    mov al, 0E4h
( V. \2 B5 G+ X7 p) Z    out 0B2h, al         // Call S/W SMI to read EC RAM. u0 x+ U" U# [6 w+ h' W/ t
    in  al, 0B3h        // Read data store to I/O port 0B3h
/ P: T/ V5 U: d# h7 ?0 l* _1 U    mov ec_index, al        // Save read data to ec_index.
; p* x: x8 {5 D+ X9 }  } 2 M+ S2 F/ _8 _8 l' r7 z. u
        return ec_index&0xff;
0 z6 {) C, l1 [# W% X}% @9 X/ w$ j2 Y. ^5 y
南狼老师能否帮忙解释一下上面的代码,我只知道是通过bios读取ec的内容。
发表于 2009-3-10 18:05:59 | 显示全部楼层
  1. char read_ec_ram(char ec_index) , O; R) H, ^; r) e# {. x
  2. { // Input ec_index = EC RAM Index
    # S6 z- [9 T4 i9 s
  3.   __asm{
    , x8 v' e6 G) F7 `. p" m
  4.     .486 // 使用486指令集
    . s, V* H6 A+ n7 W/ _; Z. k# c! n5 T
  5.     mov al, ec_index    // EC对应的SW SMI No.
    & n  j1 G' w  l( e* a1 v7 L1 q, H1 o
  6.     out 0B3h, al        // 送到 S/W SMI data 寄存器: I% w  Q7 z! ?" j
  7.     mov al, 0E4h        // 触发 S/W SMI, No. 0E4h
    5 v# o' K% }9 j) X
  8.     out 0B2h, al        // Call S/W SMI to read EC RAM
    ; a8 I: \/ H/ g/ z7 Z( V: Z5 F
  9.     in  al, 0B3h        // Read data store to I/O port 0B3h- X0 ^) m0 j5 Q
  10.     mov ec_index, al    // Save read data to ec_index4 F# ^! G8 U$ H* G
  11.   }3 Z, c, {8 S3 S2 h' [2 d
  12.   return ec_index&0xff;
    ' h6 N0 H# e6 H4 @  `' u7 l
  13. }
复制代码
上面就是调用BIOS的S/W SMI读取的,这里什么都看不到,7 f8 S; ]) K2 D$ \
除了知道S/W SMI 0E4h的ec_index值对应的是读CPU温度的功能.
" f8 `# ~0 @# Q5 S! @; i; m; H( o/ Q6 J. Y: p# L; m
猜的.
7 ~' |- z! w% z, S. g
' N+ l# h8 k  ?+ D( T! 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的特定位置。% f. B5 f5 {+ b8 A- ]: E( j& r
比如100ms读一次,这样cpu的温度就能及时的更新。BIOS 通过out 80 command
% @: \! ^& n  W; k4 K5 m到66 port读取EC Ram信息,这样就可以得到cpu温度了。' W; d8 L* x9 _* b% q* ?: X
% N, E; f, j& w; W: y. w, O) e
你的code的原理应该是:0 i; u) J- E6 y3 W' M+ a
通过一个sw smi call BIOS的code,BIOS在smi handler中下command 读取EC 8 q! }2 I" v3 R! H4 U
Ram获得CPU温度。
: i) Z+ l9 m5 [) P* j1 T
3 M$ U+ t& d* W" i[ 本帖最后由 peterhu 于 2009-3-12 15:04 编辑 ]
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-16 12:40 , Processed in 0.038913 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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