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

如何从ec中读取cpu温度?

[复制链接]
发表于 2009-3-10 17:29:26 | 显示全部楼层 |阅读模式
char read_ec_ram(char ec_index)
5 Y9 O1 F# ]  n! U/ e  F{  // Input ec_index = EC RAM Index1 Z& r0 W+ V3 u/ f) }
  __asm{
- v( J; z- c4 ~: o6 @                .486
0 c9 M; ^3 N( O    mov al, ec_index
9 |5 O4 q+ s- |! h5 ^0 m4 M9 |% X! V9 C# C    out 0B3h, al
5 m+ [4 Y" {$ ]    mov al, 0E4h- h5 _3 y1 K1 w6 H% P
    out 0B2h, al         // Call S/W SMI to read EC RAM
2 e) J' ^# u* B% U1 N" p) T    in  al, 0B3h        // Read data store to I/O port 0B3h
% l9 l! B: f3 h& ~2 ]: S! z! ?    mov ec_index, al        // Save read data to ec_index.
" Q0 e0 X. a% O7 b" Q  }
5 r. N6 |5 @9 n. p        return ec_index&0xff;1 g+ l3 V# T1 Z2 A: Y: W5 i" V
}/ c2 G" E; u7 x5 a. q+ c
南狼老师能否帮忙解释一下上面的代码,我只知道是通过bios读取ec的内容。
发表于 2009-3-10 18:05:59 | 显示全部楼层
  1. char read_ec_ram(char ec_index) 9 f( ?0 B4 F1 e
  2. { // Input ec_index = EC RAM Index
    + M- [# h4 D( A7 N6 E; J
  3.   __asm{9 O( g: a& I( B( N7 L) A% D( J
  4.     .486 // 使用486指令集/ o5 W5 `5 H* g5 A
  5.     mov al, ec_index    // EC对应的SW SMI No.3 E3 G. B2 L; J: Z# U
  6.     out 0B3h, al        // 送到 S/W SMI data 寄存器" \. S, c) ]: K: U3 O
  7.     mov al, 0E4h        // 触发 S/W SMI, No. 0E4h) |0 }  @* x' c% Y* \: W
  8.     out 0B2h, al        // Call S/W SMI to read EC RAM
    9 B+ X( P' U( H0 n& y# q
  9.     in  al, 0B3h        // Read data store to I/O port 0B3h
    , l0 v  u! l! k  q$ T* S
  10.     mov ec_index, al    // Save read data to ec_index6 r/ r) F) j, k% n5 q
  11.   }
    1 O! b$ T6 Q3 r
  12.   return ec_index&0xff;
    ; R' m7 S3 j0 ^8 C; C& b
  13. }
复制代码
上面就是调用BIOS的S/W SMI读取的,这里什么都看不到,
1 [$ _3 I2 G, _3 w9 w2 k2 c除了知道S/W SMI 0E4h的ec_index值对应的是读CPU温度的功能.4 T6 t+ G4 F$ g, z# W; H5 t' w! f
6 g' Z! \' p- [$ m$ c
猜的.
. B: c1 |+ B" [/ t* h- H7 D5 n3 W: \- h) d4 f# }
[ 本帖最后由 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的特定位置。) g! a, t. b9 e4 J8 t$ A; S6 z
比如100ms读一次,这样cpu的温度就能及时的更新。BIOS 通过out 80 command
4 g; I- o5 [4 B. D. |; v) a$ l. i- ~到66 port读取EC Ram信息,这样就可以得到cpu温度了。
& C3 ?3 r7 r* n! b
' p8 d' Q! h6 A( f/ V1 C你的code的原理应该是:  @! h' J: P  I* c, z+ B
通过一个sw smi call BIOS的code,BIOS在smi handler中下command 读取EC
3 x2 ^3 e4 R! R. j5 S) a" m+ IRam获得CPU温度。
; c, Y$ H5 K/ V2 v; o8 ?# m8 i8 R+ t0 I& y$ u
[ 本帖最后由 peterhu 于 2009-3-12 15:04 编辑 ]
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-14 21:48 , Processed in 0.024214 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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