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

如何从ec中读取cpu温度?

[复制链接]
发表于 2009-3-10 17:29:26 | 显示全部楼层 |阅读模式
char read_ec_ram(char ec_index)
* v* n; T1 \0 M, i' N0 I{  // Input ec_index = EC RAM Index# A8 |/ k5 l1 ^- x/ y
  __asm{" C4 f( ]3 S3 a* Q
                .486
7 w4 l' p+ d$ i3 O0 {8 C4 B: T6 C    mov al, ec_index
2 o7 {! H* l( u0 k* _    out 0B3h, al: |% N$ h4 U+ i
    mov al, 0E4h
0 X' q! s$ S2 [+ C8 ?- u% R    out 0B2h, al         // Call S/W SMI to read EC RAM
- \0 D0 N7 ^- O# t7 ]2 x    in  al, 0B3h        // Read data store to I/O port 0B3h
/ x9 [8 ~5 |: h" S8 A    mov ec_index, al        // Save read data to ec_index.( ~, E1 h. t# p0 x3 _
  }
8 r) J# Y3 _7 c% ^2 H        return ec_index&0xff;
# C% }4 @; H3 G) V0 l}2 i6 M  U, B1 T  |9 o5 q* E5 d+ ?
南狼老师能否帮忙解释一下上面的代码,我只知道是通过bios读取ec的内容。
发表于 2009-3-10 18:05:59 | 显示全部楼层
  1. char read_ec_ram(char ec_index) 4 H- R: g- u8 @. C, c, ?' d: i1 o
  2. { // Input ec_index = EC RAM Index
    $ [8 q6 V+ O( f8 H9 d
  3.   __asm{: W1 H; E$ h+ X( F$ e1 U, q7 ^2 z
  4.     .486 // 使用486指令集
    5 D* k  s! }. V1 |; c# D
  5.     mov al, ec_index    // EC对应的SW SMI No.
    & s; b8 Z6 A0 q0 H
  6.     out 0B3h, al        // 送到 S/W SMI data 寄存器% `$ ^6 Q9 @+ H
  7.     mov al, 0E4h        // 触发 S/W SMI, No. 0E4h2 S3 V. ~, c: _  z- y6 b
  8.     out 0B2h, al        // Call S/W SMI to read EC RAM" `( m, K5 [" }/ @
  9.     in  al, 0B3h        // Read data store to I/O port 0B3h5 {$ ~& ^% ]# p3 G. I& l) G
  10.     mov ec_index, al    // Save read data to ec_index/ m7 f. l: S% W$ G& }) m
  11.   }* S( p5 a0 O; `5 e1 m3 I2 W8 s
  12.   return ec_index&0xff;. n. T2 E+ s3 q3 e
  13. }
复制代码
上面就是调用BIOS的S/W SMI读取的,这里什么都看不到,1 M  D4 m5 A6 G( \0 s. g8 G* n( @' \
除了知道S/W SMI 0E4h的ec_index值对应的是读CPU温度的功能.
+ U' V# s5 ^/ u0 F
" K+ W) ]# r( O" U5 e3 g6 Z4 F猜的.
5 S* d+ a4 W6 p# _
7 p8 l& |' w3 R) h2 w[ 本帖最后由 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的特定位置。5 n4 B# V5 b' H6 ^
比如100ms读一次,这样cpu的温度就能及时的更新。BIOS 通过out 80 command
3 v( e, q; ^& Y( u3 l- a% h  ^1 F5 n' m到66 port读取EC Ram信息,这样就可以得到cpu温度了。
( C8 I# \4 ]2 e+ E1 O0 ^1 Z. M% a% [
0 ]+ g% t) S0 J; m5 _8 y你的code的原理应该是:9 s5 u7 _& F- q  H0 a: z- @: n$ [
通过一个sw smi call BIOS的code,BIOS在smi handler中下command 读取EC
+ c( z+ A1 K; q) }: B+ f! [Ram获得CPU温度。! E( p2 f  o+ m- J! L. q
; u: w7 w3 r7 d. `" i: v
[ 本帖最后由 peterhu 于 2009-3-12 15:04 编辑 ]
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-6-8 08:22 , Processed in 0.099477 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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