|
|
|
我所知道的EC====>KBSMI&KBSCI
4 I" F; x1 P5 [4 C! d- \ U( j7 \$ e4 |# ]: p, u1 f
1. Introduction! b: ] }2 _; P/ H/ {: q. L
% m. d* Q9 x# _" M+ i7 bSCI是指系统控制中断, 为支持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。
& [- {8 q+ O- G0 z x! I4 ~: A* S- |
2. KBSMI#
& P/ ?: c( U) @* z9 [5 h" j其实EC很少用到SMI,除了少数测试项比如DOS下 Fn+F2下切屏等。不过KBSMI#的实现原理还是很有趣的。它的原理是这样的:EC将一根pin接在SB上,而SB的GPIO有些具有multi function,可以配置成具有SMI/SCI的功能。BIOS code在初始化时将这个信息宣告给SMI Table。一旦EC发了一个SMI,EC接在SB上面这根pin的; N4 Z8 |8 M4 }3 D% F0 a
status就会被置位,SB检测到以后通过拉接在cpu上SMI pin产生一个SMI,cpu切换到SMM mode然后就会通过之前宣告的那些pin的status identify smi Owner,这时就可以认出是EC的SMI,随后通过下command给EC读取SMI event id,并通过该id去调用相关的method。8 s/ N0 ~, @4 K6 T- l2 p
8 R% t% \4 S/ a) Z
3. KBSCI#
, O8 i/ c- [# _5 eØQ_EVENT
% X! [) \3 c" A: X6 ]& F所谓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 ...
' u( S4 m2 C5 @6 ?! y- Z- B4 x3 ]' \' X7 M0 K7 a0 r3 N: Y, I
// AC Status Changed6 d" e# X+ l- f3 ]3 D/ \$ f
, x) {8 Z6 Z# O+ l! M! T3 M
Method(_Q83)) [% l" V5 I' e+ y3 D
1 B: C3 Z0 t I+ Q{" G! j1 T7 b- U8 Z* s5 t
6 _/ P$ t( ^7 Y* y
Store(0x83, DBG8)
0 b/ l1 f# Z1 E5 X4 F3 t0 I9 n/ U9 M# ^8 Y0 a
! p1 n+ A6 z( D: z3 h2 W s/ }3 i$ y
Store(0x00, Local0)5 ]& A9 P. |: ?- z
) t* W" ?! ?: h# r7 g2 f7 QStore(POWS, Local0)
1 F% S* F8 c1 a. o3 k/ C% G! N; A/ G' {+ f0 s4 L( V
If(LEqual(Local0,1))2 P3 ~. P0 l; h# u7 C' f
' P2 M8 @+ B W! o5 H
! a4 ~$ X$ k3 y$ C9 ]{
9 E- `0 F7 \4 F( V& _- }; S& a- I7 T) v' {* ^+ A$ \, [
Store(1,\_SB.PCI0.SBRG.EC.ADP1.ACP)6 a. [. v% w5 F
* y# m Q0 y$ _* X+ E# k3 Y
}
, |% r, _1 l8 l7 ~" ^6 V* T8 R: i9 g2 E4 a! G x
else; o$ Y2 F/ L7 G! S) z3 `( {1 y
7 w/ u* X. _2 n1 }' ]{% y7 _! H: _& P
6 `/ _$ E# t% D9 _- ~
Store(0,\_SB.PCI0.SBRG.EC.ADP1.ACP)7 u3 c$ {+ t1 U
+ ]9 P! m8 ~$ R$ Z+ F3 t; h) r
}
0 ] L0 f4 B7 r7 [1 }1 [# n) C$ b Y& p- M& K
Notify(\_SB.PCI0.SBRG.EC.ADP1,0x80). t$ S* P# w) O2 |' V7 j- M& T6 V
* k9 b7 W" @" h# V& C4 J2 GNotify(\_PR.P001,0x80)5 q. g) H% R: U6 e$ T
* I- T* H" Y4 @+ J, I5 A# n8 o! z
Notify(\_PR.P002,0x80)
! v# t+ S7 l8 g I) s" m/ ~4 C( \4 W0 k
}0 J. z$ e8 t7 _ C5 U
那么又有一个问题,那就是OS怎么知道这个SCI是EC的呢?请看下面的asl code你就会明白了J
; L0 A8 z4 o% P$ kDevice(EC)& e' U# L) S9 [9 V8 I
{8 D7 S6 W7 n) U2 q) @
0 p1 i6 c) U. T2 {, YName(_HID,EISAID("PNP0C09"))& x4 y* ~* R/ |4 X; N2 x
* o$ y! ~4 |; `9 q& D- LName(_GPE,0x06)' V3 j0 k; @7 P/ W
// KB_SCI
, a5 z, \0 B5 s5 j4 i! _$ f
0 ^$ V% Y6 A8 @( o2 O5 }5 N. Y& W0 x- v...
$ Q7 w- Z1 H$ [/ u4 J+ s" Z}
& S) ?5 L) f5 y% j$ H% @8 w# `; f在Device EC里面宣告了EC的KB_SCI接在了SB的哪个pin上,这样OS识别EC SCI的过程就和前面的SMI异曲同工了。最后一个问题OS如何检测到SCI产生了呢?前面SMI已经说过SB有一根SMI pin接到CPU,可以让CPU产生SMI,可是SCI并没有这样的pin,那么CPU怎么知道SCI产生的呢?我想到了两种可能:) r! r! K2 m8 M6 U% t) i# R* y. F
a.OS polling GPE register status bit。
- j. o, `+ f1 n# m2 y2 Bb.SCI通过8259或者APIC,产生IRQ。
( G- N5 b* D2 F9 Y6 b' gChipset spec印证了我的想法,SCI可以配置成通过8259/APIC的方式产生中断,而且中断向量也是可配置的如下图1所示:4 Z3 m! B1 [' p/ c# o
# c2 Y+ M5 P" m
* P, K5 a5 j2 {* N7 a0 [8 K* d; q% G) d+ b4 E- O
$ Z0 a j% E+ n) O# U4 }
" ?- A+ Q1 |" E; y/ C5 u! P! b0 v) S. z2 E; N
7 |( K- Z @% s+ Q) ^: y图 1
8 _7 V# z( g% ?BIOS在设置好该寄存器后会将SCI INT信息存入ACPI FADT中,这样OS就可以通过FADT获得SCI使用的中断号码,从而能够在SCI产生时处理该中断,这部分请参考ACPI SPEC FADT部分。下图2是使用ACPIVIEW看到我的工作机的FADT dump,如图2所示我的机器ACPI使用APIC INT 9。
8 d. f+ ~; U9 b8 @
^5 g( T$ D' G& R2 O
7 p/ r$ f7 Y" Z# y) T3 Q/ v3 g" r3 U) v _8 H0 S6 \) Z, L
8 E- G: M0 ?% _1 p4 f+ ]图 2 ; x. T* h8 o5 a4 j
( O) G7 W0 d# g: O9 g4 QØ
4 ~: w- p8 ]- l. ]5 @4 QGPE, O. [! I3 V! G2 @- U
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(),就会被调用了。
) @' R* a3 t& W6 i8 L7 H
0 E7 D0 J% F L5 m: Y# ?* IThat’s all!
" ~$ L' {8 T7 T* B! ]9 Q" R ^ ~, p7 G( U2 d4 {
Peter |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入计匠网
×
|