|
|
|
我所知道的EC====>KBSMI&KBSCI 9 N) P3 A% R0 j
% C- ]' @* C6 S" t; e& ]/ e1. Introduction3 R+ X/ J4 ?' O: N8 ~
1 B" l- X3 W1 p+ A% W. F0 fSCI是指系统控制中断, 为支持ACPI的操作系统提供系统管理,客制化功能。SMI是指系统管理中断,由设备或者软件需要呼叫SMM功能产生,使CPU进入SMM mode。基本上进入ACPI mode以后SMI就很少用到了,对于EC来讲SCI和SMI则是互斥的,一旦进入ACPI mode EC 就只会发SCI。通常EC会有两根pin KBSMI&KBSCI连接到SB,EC可以配置这两根pin的属性,决定使用何种方式产生中断,比如level trig,edge trig,pulse trig,我做的案子常常配置成64us低电平的pulse trig。
% s# f3 X+ l* X' `9 S0 o; s1 h; F( ]9 W3 s
2. KBSMI#' ^' S" _- l& s- \9 T' c: K4 L
其实EC很少用到SMI,除了少数测试项比如DOS下 Fn+F2下切屏等。不过KBSMI#的实现原理还是很有趣的。它的原理是这样的:EC将一根pin接在SB上,而SB的GPIO有些具有multi function,可以配置成具有SMI/SCI的功能。BIOS code在初始化时将这个信息宣告给SMI Table。一旦EC发了一个SMI,EC接在SB上面这根pin的
' V* ~2 @1 _5 G; R/ L7 Qstatus就会被置位,SB检测到以后通过拉接在cpu上SMI pin产生一个SMI,cpu切换到SMM mode然后就会通过之前宣告的那些pin的status identify smi Owner,这时就可以认出是EC的SMI,随后通过下command给EC读取SMI event id,并通过该id去调用相关的method。4 u8 ]* K" B+ k8 Y- T
/ i9 N, x. O/ z$ F3. KBSCI# * [* J- f9 g3 r8 E- Q F" t
ØQ_EVENT
! q6 B# U, \5 k8 v1 W所谓Q_EVENT指的是OS收到EC的SCI后,OS通过发84hcommand 给EC读取EC Ram中的值,这个值被称为Q_EVENT id。这也是Q_EVENT得名的原因(Q是Query的缩写,而84h就是Query Embedded Controller)。然后OS中的asl code会根据该id去调用_QXX()如下面的code所示,这里的XX指的就是EVENT id。那么EC什么时候会发Q_EVENT呢?当AC、Battery in/out,LID open/close ...! ^) J* f, K9 J( K" {" X, ~/ X
$ B1 i* V9 i/ `" z2 \$ t// AC Status Changed# [( r4 r( ?( e; e% Q4 N- L
$ F, h# {& q8 o
Method(_Q83)9 X& Q! @" M2 Y9 {* H+ a
9 j1 u0 k, U/ h+ V, j$ E8 D! d
{
, }9 ~* m+ }* K1 }2 }4 s& _% Y, e. j3 M* J& a0 j5 d8 M; n
Store(0x83, DBG8)6 E L; i" t0 b, s. |
. l* R$ i& c6 J w2 `0 [
- c# P9 d) Y0 T y0 V5 k% j+ _
Store(0x00, Local0)
# y2 \; E( x6 p. Z% }5 c
& c1 y$ I4 p8 h& B* UStore(POWS, Local0)
7 V2 _6 i% i( b* x8 u! W' G7 K2 n! U' F$ N7 O! a, b! j( I) Y
If(LEqual(Local0,1))! Q3 |8 F/ D1 i. P
2 c& w; A/ O. m
( R+ g: F. r5 I8 p# O; q{
+ b1 Q( {, b+ E! B7 K" V& A/ a1 @
+ q7 C( G3 A* s. r8 rStore(1,\_SB.PCI0.SBRG.EC.ADP1.ACP)
- C4 `$ e/ P1 r3 Z5 }
& U9 m/ ?6 X2 [+ D- l& `0 C/ B}/ y+ R9 p. }, o8 h# r) [3 T) D
. l6 R7 N- |' Y0 R/ y" g! ~: ielse( S2 L! f* l: }1 K
* n9 J6 \# C! g: W{$ @8 c- r& a5 d4 M+ |+ p' R- ^
3 q! _* c1 ?& N& X/ i. JStore(0,\_SB.PCI0.SBRG.EC.ADP1.ACP). a; P7 m( B/ _
; s$ f9 a4 N+ Y. W1 h+ C
}
$ i) L6 t* t! Z" v+ r3 G$ F1 J+ D2 x. n0 E0 L6 W
Notify(\_SB.PCI0.SBRG.EC.ADP1,0x80)
2 g5 Q a0 w" f$ j0 \9 b/ \$ b0 s3 O0 e
Notify(\_PR.P001,0x80)
/ C: E7 \( _) z" S; f8 N# a+ S# e6 V
Notify(\_PR.P002,0x80)
6 x2 T: d: L1 a: r4 O& o
& \7 V2 M1 e! }7 t}
: |# d( y- K$ L' `7 B. r那么又有一个问题,那就是OS怎么知道这个SCI是EC的呢?请看下面的asl code你就会明白了J( Z! q- ~# S3 k. W; ~. J& ^% H
Device(EC)
, a3 N' {6 E+ h" Y* r{
* |. t' j9 j# [1 t" i" A2 P5 V/ Q2 B3 Z% P) G- r& {6 r
Name(_HID,EISAID("PNP0C09"))# L/ W" O1 J# C5 T. `! [& g. L
$ o- h0 ]6 E8 B! r2 O5 g5 \: t0 z
Name(_GPE,0x06). x/ |8 h+ t' x. ^5 f; P
// KB_SCI
8 t; _" E( c3 M) K9 `9 r
) _; F7 C: C! S3 A4 V! M...
~1 D' @9 ^* y P}
( H, J; I. A" n$ `在Device EC里面宣告了EC的KB_SCI接在了SB的哪个pin上,这样OS识别EC SCI的过程就和前面的SMI异曲同工了。最后一个问题OS如何检测到SCI产生了呢?前面SMI已经说过SB有一根SMI pin接到CPU,可以让CPU产生SMI,可是SCI并没有这样的pin,那么CPU怎么知道SCI产生的呢?我想到了两种可能:0 t0 g: T3 ~4 P e
a.OS polling GPE register status bit。1 ?! q6 V3 E+ ~) Q1 Z6 `+ ]
b.SCI通过8259或者APIC,产生IRQ。/ z3 r' ~# D3 h/ A
Chipset spec印证了我的想法,SCI可以配置成通过8259/APIC的方式产生中断,而且中断向量也是可配置的如下图1所示:
; C2 h. J$ W1 m
7 e: K7 A* Q: Z" L, [1 T8 Z; O$ d- D4 v% A
9 g; c& Y9 F: }$ {1 p Y" ~, \, ?1 x. A: `- l/ w
; M; p6 _& V1 M6 f4 m
6 k9 A9 r( o# N& P* y8 ]7 n* }, a8 T$ I% M- `, P5 t! Q
图 1 2 }# H1 L% r& ]6 X+ x' h
BIOS在设置好该寄存器后会将SCI INT信息存入ACPI FADT中,这样OS就可以通过FADT获得SCI使用的中断号码,从而能够在SCI产生时处理该中断,这部分请参考ACPI SPEC FADT部分。下图2是使用ACPIVIEW看到我的工作机的FADT dump,如图2所示我的机器ACPI使用APIC INT 9。$ J# L8 F7 I% b8 Y
6 `) p3 z) B; o) W2 p0 [; s, i
+ X4 h1 x( @. l, ], O9 A9 [& H
1 t' o. X2 q7 Q6 \1 m$ T: D
# F* u* o2 l6 R9 K图 2
8 }; L. m, c" \. Y2 r* |
5 m2 \# f. C* c4 r( y8 `+ ?Ø9 F0 m6 z- H9 P" G; c+ h
GPE5 E9 a. g. F$ ?3 J
GPE其实是属于BIOS的范畴了(当然Q_EVENT也是GPE的一种),其他部分跟EC并没有多少关系,不过既然讲了SCI,就顺便提提GPE。所谓GPE指的是ACPI定义的一个general-purpose event namespace 与SB中的GP registers相对应。GPE register 包括GPE_STS和GPE_EN两个部分对应该GPIO的status和enable Event的触发分Level和edge两种,分别对应ACPI Method _LXX(),_EXX(),XX分别代表具体的GPIO pin。所以当系统在S0一旦相关的GPIO status有变化并且SCI enable了,那么就触发SCI,于是形如_LXX(),_EXX(),就会被调用了。. E: c1 }' |2 I
; i p6 B. k# Q1 I- ]% xThat’s all! H6 ]- c* d D8 n4 |# N7 c
* B( N) f: k, z6 s1 zPeter |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入计匠网
×
|