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

如何从ec中读取cpu温度?

[复制链接]
发表于 2009-3-10 17:29:26 | 显示全部楼层 |阅读模式
char read_ec_ram(char ec_index) ( l" n3 [- }0 y) d
{  // Input ec_index = EC RAM Index
0 m7 s6 n& A& C# }# A$ G- M  __asm{* ^; \6 n0 @% Q' A" s$ b
                .4867 R, U' f) z0 R8 `
    mov al, ec_index( M# J0 U2 a4 g4 ]2 B* H. L
    out 0B3h, al
( T$ a. Q; M6 S# C  S    mov al, 0E4h) f; B1 u& L3 a5 x2 r+ ?
    out 0B2h, al         // Call S/W SMI to read EC RAM
) K, \) p% V4 ]# k  ]$ s    in  al, 0B3h        // Read data store to I/O port 0B3h
+ j/ r' C" |( H: A9 ^    mov ec_index, al        // Save read data to ec_index.
- Z5 [& d* _- Y# [8 l) d+ a  }
; Q* z' `$ q! h0 z2 g        return ec_index&0xff;
- D2 X, T: Y/ T6 X+ M, b}" g6 l. Q" E) s3 E* U4 m: K5 ~' x
南狼老师能否帮忙解释一下上面的代码,我只知道是通过bios读取ec的内容。
发表于 2009-3-10 18:05:59 | 显示全部楼层
  1. char read_ec_ram(char ec_index)
    $ k" j6 a: s( n- Z1 i. V! c
  2. { // Input ec_index = EC RAM Index
    ( Y6 }! u2 S" Y
  3.   __asm{) X' t/ x: c' f& Y2 W3 D& v2 L& _
  4.     .486 // 使用486指令集. o+ i- Y2 s/ B6 |7 H- i; }
  5.     mov al, ec_index    // EC对应的SW SMI No.4 v5 z4 L* o" Z. ~" W9 `1 y
  6.     out 0B3h, al        // 送到 S/W SMI data 寄存器
    # d- p) X) k% z7 Q: Z% V
  7.     mov al, 0E4h        // 触发 S/W SMI, No. 0E4h
    ; K* P; U3 g& i. Q. C
  8.     out 0B2h, al        // Call S/W SMI to read EC RAM
    ! \& o1 {' u% f5 ?% i# d# t6 S0 q" p
  9.     in  al, 0B3h        // Read data store to I/O port 0B3h1 h; R  d0 ]) S8 N8 u1 ?5 R
  10.     mov ec_index, al    // Save read data to ec_index
    * `& M2 \- F# l
  11.   }
    $ n; U' u: b. e9 \/ P+ }
  12.   return ec_index&0xff;
    4 Z; y" G) z1 g! f. C4 K' o, e, e( H
  13. }
复制代码
上面就是调用BIOS的S/W SMI读取的,这里什么都看不到,9 q; N% W+ o& q2 u
除了知道S/W SMI 0E4h的ec_index值对应的是读CPU温度的功能.$ a0 {4 n5 j/ P0 w
# J6 a! G9 w5 v6 C7 ~( h& A
猜的.
" s. I# \) Q- i' {0 w- J3 V
" B2 v1 U: k8 _. j[ 本帖最后由 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的特定位置。/ {% |. |. h/ |9 Q% y
比如100ms读一次,这样cpu的温度就能及时的更新。BIOS 通过out 80 command 4 p( }8 ~) u' b5 l
到66 port读取EC Ram信息,这样就可以得到cpu温度了。
3 T' C& J8 l- @
4 N. e: l/ c; e8 G  K; q7 V你的code的原理应该是:  G; r* U. d' _$ S2 I! ~
通过一个sw smi call BIOS的code,BIOS在smi handler中下command 读取EC
+ |+ n6 [- z" I& ]/ j) U% N) i% GRam获得CPU温度。
7 O7 L( R' K8 N  z
! z7 v5 P5 n; W7 u5 x. m  z6 y2 e- @[ 本帖最后由 peterhu 于 2009-3-12 15:04 编辑 ]
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-4-20 01:37 , Processed in 0.084080 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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