|
|
|
--易祝兵 2007-12-7
4 ~' n( H$ d5 L3 a; r在BIOS初始化platform PM寄存器后,支持ACPI的操作系统会开启ACPI模式,一般同时开启SCI事件的响应。
4 ~. g1 [5 n- i2 l) |( @, a, E9 C- s
/ T1 v, P2 t: C; n% p什么是SCI?什么是SMI?
! s6 c! M6 f r/ Y! E; c7 h这里如您不知道,我只大致解释一下:% U. j' X0 r) I4 n2 B Q2 B
SCI:系统控制中断,会由产生一个IRQ x(此x号码,一般可由平台的寄存器设定)中断请求,操作系统的ACPI驱动会响应此中断。
0 F4 ^# R+ } }3 n1 c( FSMI:系统管理中断,由各设备或软件需要SMM服务时,下拉CPU的SMI Pin所产生,系统不论在做什么,都会挂起现执行的操作,跳至一个特殊的模式,叫系统管理模式(SMM)(当然是比操作系统有更高的优先权啦,才不管你0/3 level什么的。)$ t7 B% S9 _* a+ N* I3 g1 U
& P# d; }% E& H+ J6 v& A
当你配置了一个GPIO产生events后,又打开了ACPI和SCI。那么系统在此GPIO Status发生变化的时候,ACPI驱动就会捕捉到。即:一般就执行一个ACPI里_GPE()内的一个方法。这是普通的。
4 g/ ]2 V2 {" |' D. @* c' O% _5 t7 K W: q0 S; O# E1 y
ICH7 GPIO Status的寄存器如下:
# W; X( ~% h {: ]
W1 [1 q4 M$ q' @# E8 V! n+ ^. B, K5 p$ ` ?" y
让GPIO产生SCI或SMI的Switch寄存器:
4 ]; C, Z: a0 D, g
3 }- ?! d4 [* O$ b' P
! V4 b: h7 o4 J
一种机器所用到的的GPIO:& ~; y' D+ S. Z6 F, u
; `& s* b0 V$ i z r* c- b
- T2 Z. M. o6 [# U- f
处理这些事件的方法如下:7 J$ N7 H' z2 M: {6 f- o
/ [, U+ o/ l1 w- b
注意上面,的_L04是指你GPEx_STS的PM寄存器的第4个bit位发生变化时,所执行的ACPI事件方法,并不一定是指第4个GPIO所生产的方法,各平台有各平台的Chipset手册,注意看好。
# `* a- |9 F/ {
7 l8 ?4 k& r2 I1 A那什么是Q方法?
+ H6 `' |( [2 m; T) ?! N. E当你的平台定义了ACPI嵌入式控制器(EC,PNPID:PNP0C09[PNPID的文档,见本站内的贴子:http://www.ufoit.com/bbs/thread-97-1-1.html]),并指定了EC所使用的GPIO,那么,此GPIO的事件(状态发生变化)产生时,就会产生一个Q事件,处理此事件的,就叫Q方法,可以有从0到FF个,即: _Q00() ~ Q255()。
2 Q( E) m% J( q Y
' g2 v1 C) o' L4 ^既然有256个,哪如何区分Q事件呢?
7 ^9 W! _; j: R- h8 N9 C' T. ]当Q事件产生时,OSPM会向ACPI EC发出一个命令去查询此Q事件的号码。EC会响应并回复一个号码给OSPM,然后OSPM就会执行ACPI里的某个Q方法。$ p" w5 A5 G. x; [' b' {3 D
5 R! l* b1 c2 R
如EC发现温度发生变化,就会向ACPI Thermal驱动发出通知,更新ACPI Thermal,以便系统按要求处理散热方案,如下图:
( \$ A, R% ^9 \1 _8 b/ SMethod(_Q34) { // embedded controller event for thermal Notify) ]7 h: N' h: h( G* O4 A
(\_SB.TZ0.THM1, 0x80)
# o5 m6 x! Y( S) M; ]+ Q+ c- P/ D}
' g0 N6 v6 m& B3 g- y5 u7 j' Z( C% k$ x5 {( H: o
详见文档: ACPI 3.0b -> 5.6.2.2.3 Queuing the Matching Control Method for Execution.+ X/ T7 s4 d( W9 D# h+ [/ b
如找不到ACPI 3.0b请到:http://www.ufoit.com/bbs/thread-7-1-1.html 处或 http://www.acpi.info 下载。 |
|