|
|
|
--易祝兵 2007-12-7
4 F; e2 n9 J, {1 g5 o/ @7 P在BIOS初始化platform PM寄存器后,支持ACPI的操作系统会开启ACPI模式,一般同时开启SCI事件的响应。* p6 U! U- _. w2 M% M7 g
" m8 Y: B$ @% p9 w
什么是SCI?什么是SMI?4 F! q% }6 Y- Z, }
这里如您不知道,我只大致解释一下:, K9 p/ D& M1 F. p t5 m2 R# K) {7 W
SCI:系统控制中断,会由产生一个IRQ x(此x号码,一般可由平台的寄存器设定)中断请求,操作系统的ACPI驱动会响应此中断。
/ p1 [8 \, N7 B( P# LSMI:系统管理中断,由各设备或软件需要SMM服务时,下拉CPU的SMI Pin所产生,系统不论在做什么,都会挂起现执行的操作,跳至一个特殊的模式,叫系统管理模式(SMM)(当然是比操作系统有更高的优先权啦,才不管你0/3 level什么的。), d' L' x) I' S
. m4 \; [ s; @3 |! g当你配置了一个GPIO产生events后,又打开了ACPI和SCI。那么系统在此GPIO Status发生变化的时候,ACPI驱动就会捕捉到。即:一般就执行一个ACPI里_GPE()内的一个方法。这是普通的。5 F' l; p1 X7 l9 b+ ^% C0 E
) Y# U1 H' o: X
ICH7 GPIO Status的寄存器如下:0 `$ M" k/ @( G$ k3 y
0 A0 f* U7 O+ X* J+ h, P- d
) H F" d+ S* E) g% \让GPIO产生SCI或SMI的Switch寄存器:
$ r8 e& V. V4 l. n* J( @
/ ~8 i9 ?/ V# ^' Y1 c
/ @7 ]: r6 g8 F: k7 N: y! ^! h一种机器所用到的的GPIO:
2 G& h6 d# O' V- x& s1 q
- L+ M3 `( y; T
|, R7 M% o* I/ W处理这些事件的方法如下:
: k& z& H" a4 z W% L' B T
# H, Y$ m% T; Y- @% C
注意上面,的_L04是指你GPEx_STS的PM寄存器的第4个bit位发生变化时,所执行的ACPI事件方法,并不一定是指第4个GPIO所生产的方法,各平台有各平台的Chipset手册,注意看好。
9 B4 ]" }2 h: Z& J) {7 ~$ b. R
" D$ G( C& w! @8 s) X5 R% t那什么是Q方法?
& v* x5 ^' C: ]& B' y2 Q当你的平台定义了ACPI嵌入式控制器(EC,PNPID:PNP0C09[PNPID的文档,见本站内的贴子:http://www.ufoit.com/bbs/thread-97-1-1.html]),并指定了EC所使用的GPIO,那么,此GPIO的事件(状态发生变化)产生时,就会产生一个Q事件,处理此事件的,就叫Q方法,可以有从0到FF个,即: _Q00() ~ Q255()。
- P" ]7 m I6 G7 L: w0 W/ z
. d6 p `* w3 o2 t" V6 \既然有256个,哪如何区分Q事件呢?$ b! O0 e, c6 n. z7 @) }+ S$ }; o
当Q事件产生时,OSPM会向ACPI EC发出一个命令去查询此Q事件的号码。EC会响应并回复一个号码给OSPM,然后OSPM就会执行ACPI里的某个Q方法。4 w0 p# L4 F; F4 B5 Y% E6 \
/ s9 B) `' ~& G! y
如EC发现温度发生变化,就会向ACPI Thermal驱动发出通知,更新ACPI Thermal,以便系统按要求处理散热方案,如下图:
/ ]7 \4 x* z' P* M5 ^Method(_Q34) { // embedded controller event for thermal Notify
5 O2 i/ i- _; A' A (\_SB.TZ0.THM1, 0x80) " ?+ O- ?& m4 D7 Q
}
5 S, k9 K$ s: X4 B7 v
' u+ ~" Y% e; W; P1 j- _详见文档: ACPI 3.0b -> 5.6.2.2.3 Queuing the Matching Control Method for Execution.
' T/ H8 R4 h' n s, Q如找不到ACPI 3.0b请到:http://www.ufoit.com/bbs/thread-7-1-1.html 处或 http://www.acpi.info 下载。 |
|