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

如何从ec中读取cpu温度?

[复制链接]
发表于 2009-3-10 17:29:26 | 显示全部楼层 |阅读模式
char read_ec_ram(char ec_index)
9 \8 d- g, k; ^{  // Input ec_index = EC RAM Index
# k+ d9 D, S" M7 o  P: f# p3 d  __asm{
$ l. x- q6 z! D1 W, V2 S8 D2 J/ \0 i" X                .486
6 D/ E. @( h2 h# B    mov al, ec_index7 G. M2 {4 G+ a* V
    out 0B3h, al, l+ q6 _% f$ H
    mov al, 0E4h
! c2 p  P) l; \- v. U3 ?    out 0B2h, al         // Call S/W SMI to read EC RAM0 {  Z4 l( i1 M) r
    in  al, 0B3h        // Read data store to I/O port 0B3h4 l4 E4 h" P* e# G2 r( Y
    mov ec_index, al        // Save read data to ec_index.
- _5 l, g8 Y# c) l' J- [$ A  } - e' b" _# }; M, a3 U* R
        return ec_index&0xff;( N8 a7 Y  N* d: h1 p% @" x
}
! s2 j1 n" [9 C- R1 F+ h4 [4 j* w  O南狼老师能否帮忙解释一下上面的代码,我只知道是通过bios读取ec的内容。
发表于 2009-3-10 18:05:59 | 显示全部楼层
  1. char read_ec_ram(char ec_index) + [1 V6 W3 j! p8 b
  2. { // Input ec_index = EC RAM Index" B* F! `& n, Z- F' U
  3.   __asm{
    2 d$ l3 g$ W$ u
  4.     .486 // 使用486指令集. r! ?3 }+ k. Q7 U5 z* ?2 S
  5.     mov al, ec_index    // EC对应的SW SMI No.! w5 K" C. `) z- N
  6.     out 0B3h, al        // 送到 S/W SMI data 寄存器6 M. K# e( o# ~( m8 P0 L9 j
  7.     mov al, 0E4h        // 触发 S/W SMI, No. 0E4h
    3 o( P: t  [" m3 W( J  F+ v
  8.     out 0B2h, al        // Call S/W SMI to read EC RAM6 a: J) [: }1 b+ z4 Q
  9.     in  al, 0B3h        // Read data store to I/O port 0B3h! a2 i7 Z$ c+ x. z* w: h# D
  10.     mov ec_index, al    // Save read data to ec_index/ ]7 f% H* g2 q
  11.   }
    1 l5 t3 l/ a: v$ d: p9 `
  12.   return ec_index&0xff;, S3 w; P/ L; L/ D. d
  13. }
复制代码
上面就是调用BIOS的S/W SMI读取的,这里什么都看不到,
0 r  s8 r7 [: `; Y( ?  s* b; x5 n7 z除了知道S/W SMI 0E4h的ec_index值对应的是读CPU温度的功能.! l6 P- Z. ?5 {
" B4 |1 a$ V7 m' ?. i4 f
猜的.
8 O3 I( [# g  m" y6 R% _! Z  H4 U$ F' ^$ V% o) Q" v& U7 X  \! A$ g
[ 本帖最后由 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的特定位置。
7 U- y$ b( ^" b4 o, m; P比如100ms读一次,这样cpu的温度就能及时的更新。BIOS 通过out 80 command
& m* ~* q( |$ j) d, I+ F( S$ V5 x3 {到66 port读取EC Ram信息,这样就可以得到cpu温度了。
1 v+ {* j0 l! t! `& O+ W& x. |; H" K. j3 u: u, U: D
你的code的原理应该是:
* x5 Q" q% J; K通过一个sw smi call BIOS的code,BIOS在smi handler中下command 读取EC 7 N2 i* k3 @" u, g; R" ?
Ram获得CPU温度。7 Q, o: D( @; s) R& m6 @4 V0 [
! A3 X% A( c# F1 D. W8 O( j
[ 本帖最后由 peterhu 于 2009-3-12 15:04 编辑 ]
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-23 23:15 , Processed in 0.028875 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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