|
我所知道的EC====>KBSMI&KBSCI ; u/ r7 K) { q8 a6 z4 k
0 Z6 H+ t; i' V! J1. Introduction
8 H- X: Q! c5 x P3 ~; f3 L+ V0 C2 y
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 I5 B* {* g% H+ _
4 {# E$ a9 ]2 G" N3 U1 C2. KBSMI#
( O, L! s$ C0 Q其实EC很少用到SMI,除了少数测试项比如DOS下 Fn+F2下切屏等。不过KBSMI#的实现原理还是很有趣的。它的原理是这样的:EC将一根pin接在SB上,而SB的GPIO有些具有multi function,可以配置成具有SMI/SCI的功能。BIOS code在初始化时将这个信息宣告给SMI Table。一旦EC发了一个SMI,EC接在SB上面这根pin的
; J1 ]8 [0 z8 d- c- W' _status就会被置位,SB检测到以后通过拉接在cpu上SMI pin产生一个SMI,cpu切换到SMM mode然后就会通过之前宣告的那些pin的status identify smi Owner,这时就可以认出是EC的SMI,随后通过下command给EC读取SMI event id,并通过该id去调用相关的method。
& c5 d7 z5 D0 Q
- `: [9 i- F" F, q+ [& c! k3 l3. KBSCI# 2 b; @1 ^! U, Q
ØQ_EVENT
! V# p+ @ T3 @" ?所谓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 ...$ y/ T: N" F. ^3 Q
. r- y+ v: f }) r% }2 h$ h- X
// AC Status Changed% E: p) z! L4 q) k$ }8 G% q) N) P& H$ h
+ W' V% r9 ?" }Method(_Q83)5 W( c7 c8 o6 L1 K7 q
# j# g. _" k i. x% ~{ b% r2 ]8 o$ |$ |* M& u( @
( b& J3 L+ k( B2 {9 k/ \+ w ZStore(0x83, DBG8)
5 Z1 Y4 w `3 H! g, F
9 r4 w' V+ B- Z) ^ k& y+ r( U+ y3 F& [" v" `5 a2 e1 u) g! ^
Store(0x00, Local0): n4 Q; g z9 B* L: k- v' G3 C
# l$ y, _( [1 q
Store(POWS, Local0)$ \3 n. n. S4 R
V A. L+ o6 G7 X
If(LEqual(Local0,1))/ M% M7 t) A u& S# B5 x
0 i$ {9 U* l8 P, Y
: F1 ]% o# \9 e" B, O( e4 l# W! y{
# d8 K; M; j2 {& c( [5 I( \2 w' G- y, C K) w3 |2 T$ c
Store(1,\_SB.PCI0.SBRG.EC.ADP1.ACP)
4 X( K' u J0 b' A4 o% c, r5 }6 O# ~7 B/ f2 v! [0 v( b
}
: Z4 C v# g1 O7 ]$ w9 K/ M( c! b1 o8 @- B5 x, {4 H
else
9 P) A6 [5 v' I t" f2 D; D$ f9 m5 H+ J7 S5 B
{
% C3 I9 q6 }2 B$ Y7 p! U# ` J
9 K7 c+ c2 F# h, d( d+ d, l* ^( z+ LStore(0,\_SB.PCI0.SBRG.EC.ADP1.ACP)
( q, S) H5 c$ I! O
* p* d2 S: P; n& Q}6 Z# d9 W5 c5 r: Q
3 v4 f! ?" \" A+ C- g7 ~, L1 zNotify(\_SB.PCI0.SBRG.EC.ADP1,0x80)
7 E L( p$ S0 E4 N6 S% } D( m* n% s5 I
Notify(\_PR.P001,0x80) E8 S9 W& h* y) I
* B% T) C* { J* Y1 S
Notify(\_PR.P002,0x80)
( m# H/ ~, C8 C) S- n( p/ T1 Q$ q& E1 m! N- c! U
}
, z0 l, {7 y7 F; E- x! ]- F那么又有一个问题,那就是OS怎么知道这个SCI是EC的呢?请看下面的asl code你就会明白了J
2 {2 l$ Y* K4 s: N+ A7 XDevice(EC)
( G' I4 l, U# B6 |{1 v% b" R* b# H
) t; Y7 v) |' }7 b+ }* `- U- s+ i
Name(_HID,EISAID("PNP0C09"))
7 ?+ L3 u8 x/ }$ v. f; G
9 ?. r* }- n9 y7 CName(_GPE,0x06), B* [$ D/ q& c; A1 \
// KB_SCI
) v' E5 ~# J6 J" b& P" T5 e4 ?6 W# L' }% C
...
* p& E7 W% b- `" `) u1 R6 s3 u}
. c0 }/ ?6 H( @, A在Device EC里面宣告了EC的KB_SCI接在了SB的哪个pin上,这样OS识别EC SCI的过程就和前面的SMI异曲同工了。最后一个问题OS如何检测到SCI产生了呢?前面SMI已经说过SB有一根SMI pin接到CPU,可以让CPU产生SMI,可是SCI并没有这样的pin,那么CPU怎么知道SCI产生的呢?我想到了两种可能:6 x0 c, }4 i. k$ Z1 b8 C
a.OS polling GPE register status bit。
% h8 c& U; x: Z* C# E# Nb.SCI通过8259或者APIC,产生IRQ。& s( F# }, n4 ^8 F# [
Chipset spec印证了我的想法,SCI可以配置成通过8259/APIC的方式产生中断,而且中断向量也是可配置的如下图1所示:
~/ G, {% S+ l, u, i0 H ; f9 Z' F+ {6 Z$ v
8 i& q% v }* q u# I4 |
9 n' z8 e, O- ?$ R) A8 J$ \ I. k
+ i# T9 t; v) R9 b+ K. ~! S6 ^( s
( ]5 T+ V% U- n7 Z% ~6 \
6 t$ P6 N, [9 }图 1 . [+ H, \# Y9 x2 O; R
BIOS在设置好该寄存器后会将SCI INT信息存入ACPI FADT中,这样OS就可以通过FADT获得SCI使用的中断号码,从而能够在SCI产生时处理该中断,这部分请参考ACPI SPEC FADT部分。下图2是使用ACPIVIEW看到我的工作机的FADT dump,如图2所示我的机器ACPI使用APIC INT 9。& F) x3 q7 e4 c1 `4 R2 q9 t
0 c' R4 L6 w+ z) u5 H1 {9 Q
3 N0 b0 D d f7 U9 B/ k
! A/ b5 G f2 k2 i0 ?
7 t% U6 B: Y2 C3 u+ m3 J r图 2
+ S/ y) F0 u- U) B8 G
1 b- j5 X$ ]; Z9 g5 NØ
) d2 j9 [ h/ b% v" gGPE
# r0 o, p9 v, m! aGPE其实是属于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(),就会被调用了。" ^) j4 a$ w& V0 V l7 {1 O
# S/ \* o8 F5 ]
That’s all!. g0 q% I( \- [- B
f$ P3 Y9 L8 \' N1 _7 y3 n& [, }+ S
Peter |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入计匠网
×
|