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

如何从ec中读取cpu温度?

[复制链接]
发表于 2009-3-10 17:29:26 | 显示全部楼层 |阅读模式
char read_ec_ram(char ec_index) ; x) q$ r7 K, ?+ [$ J4 d, h* [
{  // Input ec_index = EC RAM Index$ }% j7 }, t+ Z3 w# t/ u7 ^% p+ @
  __asm{
. b/ a- `" T2 `+ p) p$ c                .486; f5 q8 D2 |; N& Y9 z0 [9 p- R
    mov al, ec_index& V' z* W# O7 L) Y5 @) E! n  G" E
    out 0B3h, al
; F6 d6 Q' Y% Z2 v/ t( W* w    mov al, 0E4h
6 V% Q- p* ?" l6 r7 g& }    out 0B2h, al         // Call S/W SMI to read EC RAM
; m. P3 i$ y3 D" Y5 W1 _# b    in  al, 0B3h        // Read data store to I/O port 0B3h
5 e  `  N* g, o7 x    mov ec_index, al        // Save read data to ec_index.
2 [' L& Q+ I! c/ }  } 5 `# p9 X$ w7 ]  G
        return ec_index&0xff;
, S- K7 C- S+ |, y, N& L}
" o" f" y3 m1 ]6 z; H南狼老师能否帮忙解释一下上面的代码,我只知道是通过bios读取ec的内容。
发表于 2009-3-10 18:05:59 | 显示全部楼层
  1. char read_ec_ram(char ec_index) # @5 I; v( I; Y# F9 y
  2. { // Input ec_index = EC RAM Index
    * h" o7 F9 N% t8 J2 M. `& T+ j9 a
  3.   __asm{+ ?3 q; ^7 ?) B! k3 t& ~
  4.     .486 // 使用486指令集
    & H. W1 J* i0 A% [3 t
  5.     mov al, ec_index    // EC对应的SW SMI No.5 |1 ~+ F6 \! k7 b
  6.     out 0B3h, al        // 送到 S/W SMI data 寄存器
    ! t' d) x( T4 v
  7.     mov al, 0E4h        // 触发 S/W SMI, No. 0E4h0 D3 g- N9 T0 |& g4 o, P, i2 R
  8.     out 0B2h, al        // Call S/W SMI to read EC RAM0 o: ^" L( |) h1 w) O% f
  9.     in  al, 0B3h        // Read data store to I/O port 0B3h
    9 I( u6 z( `8 w0 f
  10.     mov ec_index, al    // Save read data to ec_index
      W- E! y1 x1 h! Y  _  ]
  11.   }
    ' O3 ?! u$ i1 {7 q) D
  12.   return ec_index&0xff;$ a' T0 @0 Q0 f) B% H4 {# R
  13. }
复制代码
上面就是调用BIOS的S/W SMI读取的,这里什么都看不到,2 Q$ H+ H. d, [2 d
除了知道S/W SMI 0E4h的ec_index值对应的是读CPU温度的功能.3 V$ q% y* j3 R! A5 `+ A

* r& a8 _8 R: c; y5 d& S猜的.
9 V( e: d$ u: h1 q) m# f
7 F1 U$ p! l) e5 m0 g7 o[ 本帖最后由 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的特定位置。9 X8 d3 S6 ^% b1 s: m/ e
比如100ms读一次,这样cpu的温度就能及时的更新。BIOS 通过out 80 command
6 P- y. q4 V5 P7 z到66 port读取EC Ram信息,这样就可以得到cpu温度了。3 D; e0 B  u' \9 r2 D; W
" ~  {) o/ a+ c7 b! b& R2 J
你的code的原理应该是:
4 q- I- b, y( y' l; s& U通过一个sw smi call BIOS的code,BIOS在smi handler中下command 读取EC 9 i' ~- j, e: Z0 O
Ram获得CPU温度。
# Z" [; G. i3 o" `5 E  B/ L6 L4 G1 w" W7 h/ |/ y1 ]3 z3 D
[ 本帖最后由 peterhu 于 2009-3-12 15:04 编辑 ]
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-9-21 23:30 , Processed in 0.138902 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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