|
--易祝兵 2007-12-7 8 @0 O& J8 o5 n7 @
在BIOS初始化platform PM寄存器后,支持ACPI的操作系统会开启ACPI模式,一般同时开启SCI事件的响应。
0 z9 A& ]+ q2 Z2 I% x# d5 D5 z7 F- x# ?. [% t
什么是SCI?什么是SMI?- V# v- t2 @/ k9 w
这里如您不知道,我只大致解释一下:
3 ]0 @% O+ U1 i* S8 G! hSCI:系统控制中断,会由产生一个IRQ x(此x号码,一般可由平台的寄存器设定)中断请求,操作系统的ACPI驱动会响应此中断。4 D" w, R* x) b+ W' y+ {( V- c- }
SMI:系统管理中断,由各设备或软件需要SMM服务时,下拉CPU的SMI Pin所产生,系统不论在做什么,都会挂起现执行的操作,跳至一个特殊的模式,叫系统管理模式(SMM)(当然是比操作系统有更高的优先权啦,才不管你0/3 level什么的。)
" Z% ]6 I: ]/ [ T! L' E
% d9 T6 v B2 t* J0 U) Q# O当你配置了一个GPIO产生events后,又打开了ACPI和SCI。那么系统在此GPIO Status发生变化的时候,ACPI驱动就会捕捉到。即:一般就执行一个ACPI里_GPE()内的一个方法。这是普通的。! E$ V" t0 z( J
+ h4 m6 G! n* z5 |, `
ICH7 GPIO Status的寄存器如下:6 _6 G8 O# Y" F: e9 Q: w5 S
7 @ _9 A; p, D4 [8 r1 o1 f# v+ K% q4 ^5 P B/ I' C
让GPIO产生SCI或SMI的Switch寄存器:
+ V6 U# r4 I# b6 F5 U. h8 |/ J
; v) J, a4 X0 t6 J
5 q- L: X q) i一种机器所用到的的GPIO:5 n% }5 n" e; J( n) K0 T8 ]* t, v
1 Q5 C9 L. G+ w( I) s
" ~4 t0 ^. b* X; G* k% ~
处理这些事件的方法如下:
& J3 U' a! E5 Y0 L6 a
$ ]2 N4 u# I3 w9 |
注意上面,的_L04是指你GPEx_STS的PM寄存器的第4个bit位发生变化时,所执行的ACPI事件方法,并不一定是指第4个GPIO所生产的方法,各平台有各平台的Chipset手册,注意看好。0 F* l# p( y- q1 b( m+ p" k0 h
; P1 M/ \1 h7 z) G
那什么是Q方法?
) m$ ^& D1 P7 I+ D) C当你的平台定义了ACPI嵌入式控制器(EC,PNPID:PNP0C09[PNPID的文档,见本站内的贴子:http://www.ufoit.com/bbs/thread-97-1-1.html]),并指定了EC所使用的GPIO,那么,此GPIO的事件(状态发生变化)产生时,就会产生一个Q事件,处理此事件的,就叫Q方法,可以有从0到FF个,即: _Q00() ~ Q255()。; J' j9 b. {4 G) t; Q! ]8 a0 R
$ y2 G- o( | [; _9 F
既然有256个,哪如何区分Q事件呢?( u7 g! e: Y6 S' k9 F+ p ^
当Q事件产生时,OSPM会向ACPI EC发出一个命令去查询此Q事件的号码。EC会响应并回复一个号码给OSPM,然后OSPM就会执行ACPI里的某个Q方法。' ^ J- i3 g. @5 L# c
N3 M, D9 q' o2 v/ N
如EC发现温度发生变化,就会向ACPI Thermal驱动发出通知,更新ACPI Thermal,以便系统按要求处理散热方案,如下图:
/ K+ Q; J) H# O/ q, |) IMethod(_Q34) { // embedded controller event for thermal Notify6 d/ X/ w! B2 L6 a; ]4 R5 g' ~! V
(\_SB.TZ0.THM1, 0x80)
5 H# {, j' Y6 @, a}5 [4 E" ?) t% N$ Z5 c' x. Q
; f4 l" O8 P$ N0 H. c6 B
详见文档: ACPI 3.0b -> 5.6.2.2.3 Queuing the Matching Control Method for Execution.
9 @) b- D- X m. s如找不到ACPI 3.0b请到:http://www.ufoit.com/bbs/thread-7-1-1.html 处或 http://www.acpi.info 下载。 |
|