|
|
|
--易祝兵 2007-12-7
2 |# v/ j2 m3 R" N0 n在BIOS初始化platform PM寄存器后,支持ACPI的操作系统会开启ACPI模式,一般同时开启SCI事件的响应。
( D" z& y2 q) ]" @& ?0 q
* Z w- e6 c( K' h什么是SCI?什么是SMI?/ l& K+ i; E% x
这里如您不知道,我只大致解释一下:
3 _' g g- o- u; D qSCI:系统控制中断,会由产生一个IRQ x(此x号码,一般可由平台的寄存器设定)中断请求,操作系统的ACPI驱动会响应此中断。) M# ?! x9 g1 n+ V
SMI:系统管理中断,由各设备或软件需要SMM服务时,下拉CPU的SMI Pin所产生,系统不论在做什么,都会挂起现执行的操作,跳至一个特殊的模式,叫系统管理模式(SMM)(当然是比操作系统有更高的优先权啦,才不管你0/3 level什么的。)
0 n# c/ Z, z- W$ J' l2 M4 V/ C8 w( H! o! A1 R' L1 G5 f
当你配置了一个GPIO产生events后,又打开了ACPI和SCI。那么系统在此GPIO Status发生变化的时候,ACPI驱动就会捕捉到。即:一般就执行一个ACPI里_GPE()内的一个方法。这是普通的。
5 g7 i8 s/ S% e7 A* V1 F* {) N6 ~; f, f6 s2 ~- n* y) O0 m
ICH7 GPIO Status的寄存器如下:
6 i7 j" o- L" e6 ~* |$ g$ _$ u( N
- d! f6 V$ C8 g; P) W. p
* h6 @' K9 R k9 d0 V+ c j
让GPIO产生SCI或SMI的Switch寄存器:! j) S8 F% p6 u
7 |6 ?0 a2 f6 v' X8 Z2 L" v
' M: I+ Z( G; W0 p" k. P7 Z. ^一种机器所用到的的GPIO:0 N! W7 c+ C* h; R0 Z
* h+ K- X4 B+ ^2 }8 E2 n( r0 b
5 z2 I% A' M& f6 {处理这些事件的方法如下:5 C/ k7 i' P c) B
8 ]2 ~& c( h. \* C: T- @) \注意上面,的_L04是指你GPEx_STS的PM寄存器的第4个bit位发生变化时,所执行的ACPI事件方法,并不一定是指第4个GPIO所生产的方法,各平台有各平台的Chipset手册,注意看好。( u. j4 }9 i* q3 `% i* O, L
7 Y& f6 t! k$ U
那什么是Q方法?$ E2 E, a; ]* @. y! Z& B
当你的平台定义了ACPI嵌入式控制器(EC,PNPID:PNP0C09[PNPID的文档,见本站内的贴子:http://www.ufoit.com/bbs/thread-97-1-1.html]),并指定了EC所使用的GPIO,那么,此GPIO的事件(状态发生变化)产生时,就会产生一个Q事件,处理此事件的,就叫Q方法,可以有从0到FF个,即: _Q00() ~ Q255()。. }9 e2 M% K$ w4 y1 x
4 i7 k$ [" [: b) W5 s( R* V既然有256个,哪如何区分Q事件呢?
) {8 V: r' t0 S! T. X5 ^当Q事件产生时,OSPM会向ACPI EC发出一个命令去查询此Q事件的号码。EC会响应并回复一个号码给OSPM,然后OSPM就会执行ACPI里的某个Q方法。5 G/ o9 x3 t+ V( x/ T: \7 b
+ I) }4 D/ M, ^/ K3 q0 ^1 A
如EC发现温度发生变化,就会向ACPI Thermal驱动发出通知,更新ACPI Thermal,以便系统按要求处理散热方案,如下图:
$ r& I8 y+ H( [5 N- a6 oMethod(_Q34) { // embedded controller event for thermal Notify
# g, U3 l1 x' N1 |# P (\_SB.TZ0.THM1, 0x80)
2 U, _* [6 g2 D+ E}
& I# R1 M$ _+ x; i/ N- @3 p$ m) Q
详见文档: ACPI 3.0b -> 5.6.2.2.3 Queuing the Matching Control Method for Execution.' s5 ~( [4 W* f0 E1 `, h
如找不到ACPI 3.0b请到:http://www.ufoit.com/bbs/thread-7-1-1.html 处或 http://www.acpi.info 下载。 |
|