|
我所知道的EC====>KBSMI&KBSCI 2 g5 P& J3 p0 W$ L
}' x0 r4 z; G" Q1. Introduction
4 t: U, Z" s% L+ H, [1 j* w2 l3 X
3 s7 R' n: H0 d6 g6 `SCI是指系统控制中断, 为支持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。4 v8 i8 ^- r/ j/ b
( R* k' A5 v) `" C# C) v& i2. KBSMI#- |. Q2 `4 a7 W" p$ h
其实EC很少用到SMI,除了少数测试项比如DOS下 Fn+F2下切屏等。不过KBSMI#的实现原理还是很有趣的。它的原理是这样的:EC将一根pin接在SB上,而SB的GPIO有些具有multi function,可以配置成具有SMI/SCI的功能。BIOS code在初始化时将这个信息宣告给SMI Table。一旦EC发了一个SMI,EC接在SB上面这根pin的
8 q' T2 i+ P' s) E, R2 `! K& h c; Gstatus就会被置位,SB检测到以后通过拉接在cpu上SMI pin产生一个SMI,cpu切换到SMM mode然后就会通过之前宣告的那些pin的status identify smi Owner,这时就可以认出是EC的SMI,随后通过下command给EC读取SMI event id,并通过该id去调用相关的method。
$ e; Y+ e" y- X% D ~0 C
1 O' \( c/ A5 i: C3. KBSCI# # H$ w K! l+ [! `- v6 j1 H0 |
ØQ_EVENT
. E4 ~0 B% ^7 P: }& |! `* J所谓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 ...
' k9 l% Y6 ?8 T4 I
& x: U$ r3 t# I/ ^// AC Status Changed% l7 I z5 w1 m( {( l" d& X& I
: L5 o5 t1 Q2 T9 V
Method(_Q83)
# P- s' x" r" e Y: H) i, V! w- j2 y2 p: b, W9 ]
{
5 x2 Z9 y) s) H2 s8 X) z3 w+ N) {- j
Store(0x83, DBG8)0 F6 u/ P2 G0 A! `) A8 [
" k( W5 R, {/ y e
1 C4 _* o: ]) j/ yStore(0x00, Local0)
+ a; U7 d2 K4 a2 u0 {9 [+ ~# w( U
$ m2 N, f* I0 }* g9 E, kStore(POWS, Local0)
1 A; j' r0 L$ s* E3 B8 E8 i# v0 @5 o/ _3 Q* ^: G
If(LEqual(Local0,1))/ T( Z9 A- F& d, S( ?% y! [
3 I: W" p$ g# B3 |) H: @
' t% ^" X& u9 B( B4 I+ O{
" M5 K' w+ h/ v9 D
; D/ V) v! ~" N7 v$ Q0 T1 A/ l4 V6 e" CStore(1,\_SB.PCI0.SBRG.EC.ADP1.ACP)3 a7 k5 Q7 d$ N4 P- ~/ B( O
& ]6 t9 ?' X: i; U' `}
( U5 }3 O. A9 a0 R4 I9 G
# K- }6 f% | Z1 {0 Welse+ I' F* h6 D2 c& c' R
- J, B! o# I, T5 n2 T/ E& H7 c4 o
{
9 M: l" W1 D. `( i
* g2 ?- \9 l" @' B. j, DStore(0,\_SB.PCI0.SBRG.EC.ADP1.ACP)
6 X! p2 c: B& k ^6 R' ]; |& u( E4 B$ n" d- ]
}$ R$ ~ K' k) B3 G; v/ p( O/ E
+ N: O& Z& l d2 U V6 ANotify(\_SB.PCI0.SBRG.EC.ADP1,0x80); E- v! K$ P' F9 L' O' X
# t% c. @! o, G) V( Q, F
Notify(\_PR.P001,0x80)
& T, i/ C2 S- H7 N
2 J' f* ` h" T9 w6 l/ UNotify(\_PR.P002,0x80)+ j3 E' H: b5 ?$ c( @% R1 p3 [
) L% N k# y& }* f: t" ^* l j! z
}8 ?5 D; L7 `, H/ X0 ]. j
那么又有一个问题,那就是OS怎么知道这个SCI是EC的呢?请看下面的asl code你就会明白了J2 E. P8 x" p5 x7 Y% \% J
Device(EC)
9 E& r) r; G8 `- F2 j% U- z{* l$ b& s% J( S- j) _( l' M
: W m, x T: E" f u/ E
Name(_HID,EISAID("PNP0C09"))6 v+ P4 j+ r& i% u3 D
( f% d+ V; n2 X$ U2 _
Name(_GPE,0x06)
! H4 Z [4 }3 m! e e+ E! R// KB_SCI d! `# r7 @' K, B0 y/ B
' U3 [; T: v, B+ Q: K
...
7 u1 W! V# ]% v, D- R}
; P- Q' R3 J' Z: A$ M, s8 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产生的呢?我想到了两种可能:% |5 _& z3 L7 ^, }: T
a.OS polling GPE register status bit。) Y$ ^% ^" V6 y* O" o: ~) P7 K9 c
b.SCI通过8259或者APIC,产生IRQ。
; q' r8 T* O/ e: q9 JChipset spec印证了我的想法,SCI可以配置成通过8259/APIC的方式产生中断,而且中断向量也是可配置的如下图1所示:( B+ n4 N6 E2 m1 M
* ^; E m* u1 f" d: }/ I
6 e w5 y6 f f& G& B, {
+ w- I2 C/ r2 J# J. }7 B
2 `; D8 W! F/ F% c Q" j
1 y) ] l; y9 g4 k2 `( V" B& S' R# ]$ g( d3 M( T; r
: G; O: A& ?! h3 h图 1 - _+ y5 g- K- x( A
BIOS在设置好该寄存器后会将SCI INT信息存入ACPI FADT中,这样OS就可以通过FADT获得SCI使用的中断号码,从而能够在SCI产生时处理该中断,这部分请参考ACPI SPEC FADT部分。下图2是使用ACPIVIEW看到我的工作机的FADT dump,如图2所示我的机器ACPI使用APIC INT 9。
7 [$ |$ _* A- ]6 B( J+ ?9 e; _$ x# o1 z" r+ Z
. N. N) A( N6 ~2 |
1 _+ n* c- b. e6 ^" `) ~
) M. G% |* g7 p( E) o图 2
/ v! ~( ^9 b1 G( s! Y4 N6 _3 ?- Y& g. ~6 u4 `( J* _
Ø
0 y" M( E( X6 P* cGPE# ~) G) N7 o/ I# A8 N
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(),就会被调用了。0 ^& m: @" D! _7 m, U0 k3 A
) J; z5 i, a1 r6 N" E% X1 nThat’s all!0 W* t& D3 a( G2 e$ M( _/ }6 L$ h
* @8 M" ^% f6 W6 |, m
Peter |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入计匠网
×
|