|
|
|
--易祝兵 2007-12-7 $ ]% a0 G/ K7 |0 W+ J6 Y
在BIOS初始化platform PM寄存器后,支持ACPI的操作系统会开启ACPI模式,一般同时开启SCI事件的响应。
# L5 E) T# Y; ~4 k0 v6 p) O, D. P
什么是SCI?什么是SMI?
6 @. a- l& D" j) j$ F8 }/ J这里如您不知道,我只大致解释一下:) g$ _$ c7 P3 n! S
SCI:系统控制中断,会由产生一个IRQ x(此x号码,一般可由平台的寄存器设定)中断请求,操作系统的ACPI驱动会响应此中断。
( Q( [' ^' J" kSMI:系统管理中断,由各设备或软件需要SMM服务时,下拉CPU的SMI Pin所产生,系统不论在做什么,都会挂起现执行的操作,跳至一个特殊的模式,叫系统管理模式(SMM)(当然是比操作系统有更高的优先权啦,才不管你0/3 level什么的。)2 z6 e$ Y) L# o6 ?
! {" X5 { D2 v5 f) F当你配置了一个GPIO产生events后,又打开了ACPI和SCI。那么系统在此GPIO Status发生变化的时候,ACPI驱动就会捕捉到。即:一般就执行一个ACPI里_GPE()内的一个方法。这是普通的。
5 h1 A% Q: h. Z, K8 [
1 S9 u( B X/ ^" N0 Y3 s# ~0 q$ {' rICH7 GPIO Status的寄存器如下:" e' x, x" K2 `* w9 c! G. W) _
# | e. g9 z5 K* F; n
$ r6 A* l4 u8 {! N$ E, J2 y让GPIO产生SCI或SMI的Switch寄存器:
" ]8 t' i) Y9 u2 _
1 L8 d* l9 r( c' ~. A
7 G, {; i( d& Y4 E8 x( z9 Z
一种机器所用到的的GPIO:
, b; v9 ~& w' y! y
3 B% C5 N. s3 o. k6 [+ N
- \0 j4 \3 I" N* m m. [5 R$ O处理这些事件的方法如下:: V9 S0 I z% ~* W
$ [: v8 C/ M. B0 N6 ^$ J( ~# ^注意上面,的_L04是指你GPEx_STS的PM寄存器的第4个bit位发生变化时,所执行的ACPI事件方法,并不一定是指第4个GPIO所生产的方法,各平台有各平台的Chipset手册,注意看好。
& b7 C5 f) o" g+ |; V. {( Z; U, _
( C8 F9 b- M" o f V4 W. t- _6 K/ L那什么是Q方法?& F# {: S- U' u, {" N
当你的平台定义了ACPI嵌入式控制器(EC,PNPID:PNP0C09[PNPID的文档,见本站内的贴子:http://www.ufoit.com/bbs/thread-97-1-1.html]),并指定了EC所使用的GPIO,那么,此GPIO的事件(状态发生变化)产生时,就会产生一个Q事件,处理此事件的,就叫Q方法,可以有从0到FF个,即: _Q00() ~ Q255()。; ~/ k/ w! |7 a' B" q D+ ^0 F8 |
p( m% Y+ S" p7 l3 G既然有256个,哪如何区分Q事件呢?
. `# ~% D7 V+ j$ U& ~0 \当Q事件产生时,OSPM会向ACPI EC发出一个命令去查询此Q事件的号码。EC会响应并回复一个号码给OSPM,然后OSPM就会执行ACPI里的某个Q方法。+ M, {& X7 V- r, `
( {% H2 d3 O- d- v9 E如EC发现温度发生变化,就会向ACPI Thermal驱动发出通知,更新ACPI Thermal,以便系统按要求处理散热方案,如下图:
- h7 T: Z, u6 S# J1 V# W7 cMethod(_Q34) { // embedded controller event for thermal Notify
k0 S _9 J# l9 [- e (\_SB.TZ0.THM1, 0x80) ! |* \" z, ~$ R/ h
}7 w" |6 ?$ ?+ O# K0 l! Z5 y" u
. g+ x8 x6 g2 Q4 \详见文档: ACPI 3.0b -> 5.6.2.2.3 Queuing the Matching Control Method for Execution.& {+ D9 N$ D3 p: S
如找不到ACPI 3.0b请到:http://www.ufoit.com/bbs/thread-7-1-1.html 处或 http://www.acpi.info 下载。 |
|