|
|
|
--易祝兵 2007-12-7
, n2 h0 F2 k; V6 o9 A在BIOS初始化platform PM寄存器后,支持ACPI的操作系统会开启ACPI模式,一般同时开启SCI事件的响应。$ D5 D: {3 z, K) [/ a
7 n+ Y3 z4 ^# a* W+ \
什么是SCI?什么是SMI?
% R* ]7 b8 l5 T9 a& q这里如您不知道,我只大致解释一下:
1 |; g# K, @. {% ^SCI:系统控制中断,会由产生一个IRQ x(此x号码,一般可由平台的寄存器设定)中断请求,操作系统的ACPI驱动会响应此中断。
. W2 t+ k$ w9 o* P ~9 ZSMI:系统管理中断,由各设备或软件需要SMM服务时,下拉CPU的SMI Pin所产生,系统不论在做什么,都会挂起现执行的操作,跳至一个特殊的模式,叫系统管理模式(SMM)(当然是比操作系统有更高的优先权啦,才不管你0/3 level什么的。), y3 K% u( |1 f
2 s; s2 ^' P( h) S) ?: V
当你配置了一个GPIO产生events后,又打开了ACPI和SCI。那么系统在此GPIO Status发生变化的时候,ACPI驱动就会捕捉到。即:一般就执行一个ACPI里_GPE()内的一个方法。这是普通的。
2 \- h1 k, P3 G. j! ~
: i/ R* u- S# i$ a! Z3 oICH7 GPIO Status的寄存器如下:
& m" G# f. V# U M y. m
1 X" V6 l, a# D! I; w& u. ~( N$ u# h! l
' t0 J$ {+ T2 S @让GPIO产生SCI或SMI的Switch寄存器:
, x3 M! ?( m( C2 A1 `
5 Z' |' r: s' C5 I! ?( X0 s+ Y: t% [7 X. J/ E( V0 F
一种机器所用到的的GPIO:% W+ Z f) c* v; T
0 }! M# n( `) o$ o/ C p+ S$ }" N) p; Y _" Z
处理这些事件的方法如下:
8 {' f! p0 ^6 F2 H F* M' n0 ]0 o
* ?' n O& K% e5 L+ F; W+ ?
注意上面,的_L04是指你GPEx_STS的PM寄存器的第4个bit位发生变化时,所执行的ACPI事件方法,并不一定是指第4个GPIO所生产的方法,各平台有各平台的Chipset手册,注意看好。
% ]7 Z) W; F! X. c3 Y" q, Y6 d5 U! u, `2 {" x, K
那什么是Q方法?9 }+ D6 D8 f/ W1 ?4 j
当你的平台定义了ACPI嵌入式控制器(EC,PNPID:PNP0C09[PNPID的文档,见本站内的贴子:http://www.ufoit.com/bbs/thread-97-1-1.html]),并指定了EC所使用的GPIO,那么,此GPIO的事件(状态发生变化)产生时,就会产生一个Q事件,处理此事件的,就叫Q方法,可以有从0到FF个,即: _Q00() ~ Q255()。
/ [" E) ~; R5 s" @% v5 n( ]# \+ g" C* I- L( ?+ S
既然有256个,哪如何区分Q事件呢?
. w9 H# {" I" I当Q事件产生时,OSPM会向ACPI EC发出一个命令去查询此Q事件的号码。EC会响应并回复一个号码给OSPM,然后OSPM就会执行ACPI里的某个Q方法。
0 J' m0 q( ~3 Q' s( x6 ^# \* m
0 |# l! B, x5 f) r* ]2 Y; O! S如EC发现温度发生变化,就会向ACPI Thermal驱动发出通知,更新ACPI Thermal,以便系统按要求处理散热方案,如下图:
1 g, C& ]- B, a' M2 GMethod(_Q34) { // embedded controller event for thermal Notify
[: b/ d+ ] w% l( {* n6 Y (\_SB.TZ0.THM1, 0x80) . {9 ~4 @! j2 ^0 x
}+ w# V3 Y' {' c, ?% d
6 H3 V' D, m. H! ^: I9 T
详见文档: ACPI 3.0b -> 5.6.2.2.3 Queuing the Matching Control Method for Execution.
# m( g D* D2 b/ U+ u% q8 _# u如找不到ACPI 3.0b请到:http://www.ufoit.com/bbs/thread-7-1-1.html 处或 http://www.acpi.info 下载。 |
|