|
我所知道的EC====>KBSMI&KBSCI
- V6 L9 ^# \2 x+ e3 M+ h
1 W' C" _- Q p5 _5 P* z5 ]5 N1. Introduction" h$ y: D/ Q- I z _
6 I% [9 a, s3 {7 kSCI是指系统控制中断, 为支持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。. _: }) Q& e" i) o, {/ K
9 X1 [9 ]$ y* p1 E9 s$ B/ {2. KBSMI#. g6 i% v! n% ^3 e
其实EC很少用到SMI,除了少数测试项比如DOS下 Fn+F2下切屏等。不过KBSMI#的实现原理还是很有趣的。它的原理是这样的:EC将一根pin接在SB上,而SB的GPIO有些具有multi function,可以配置成具有SMI/SCI的功能。BIOS code在初始化时将这个信息宣告给SMI Table。一旦EC发了一个SMI,EC接在SB上面这根pin的( ]! h; V) i1 b1 \. d, l) e
status就会被置位,SB检测到以后通过拉接在cpu上SMI pin产生一个SMI,cpu切换到SMM mode然后就会通过之前宣告的那些pin的status identify smi Owner,这时就可以认出是EC的SMI,随后通过下command给EC读取SMI event id,并通过该id去调用相关的method。7 D( `+ }! k' _6 m2 k0 b: O
) l+ ], E) _( ~9 S: V, }
3. KBSCI#
9 D- C+ z: A, I' b7 `7 ^ØQ_EVENT2 t" A* }/ I3 b! h v, M+ p- ]
所谓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 ...* z7 E7 C, t" }* T6 N8 G
6 Q7 A( E+ |$ e, v+ A* U f
// AC Status Changed
/ G; w u# s* F3 M& E/ e: T; E" B0 {) m
9 `1 }+ R9 F* m) l6 w, nMethod(_Q83)% j# Q3 r( z& q2 o& q& M) C
- I6 E. e$ u& X: r6 B: ?2 ? y
{
4 x3 X3 z# j5 ^$ r% n+ ?$ q& j' a* U1 o& W/ y# V
Store(0x83, DBG8)- U( S" I! D/ A
* ]5 X/ T8 L, D& z
; \5 b' V+ R2 |9 fStore(0x00, Local0)- m' ^) e; k" w2 ~
" e, v8 k4 q8 `+ O, ]
Store(POWS, Local0)
" w5 n* i/ p" ]" j8 b! K$ l% Q$ Y' d# I
If(LEqual(Local0,1))
3 ~" _+ O2 ]3 A/ _* {$ E# h P% q6 [# y2 q. {
) m. d/ g7 Q6 D% r5 w0 y; q1 s{
2 h5 _7 l0 F4 w- N0 l9 j
' m# ] A& @; k% W3 GStore(1,\_SB.PCI0.SBRG.EC.ADP1.ACP)
/ J, @4 k5 j, ]2 _, [- f
5 W ] W; p8 ^2 h8 O}9 k% d( E; s2 y( T0 n. w7 C! @
( T8 x6 [. [" ]& y8 T6 n6 g
else$ A" p% p& ?" O' C, @5 \0 S1 C
$ f n# ]/ ]$ W& _1 i
{. I# [! z( V- t4 Y4 O2 S$ i
5 B, E1 n9 v( j# g5 u4 {
Store(0,\_SB.PCI0.SBRG.EC.ADP1.ACP)& U6 Z9 B1 U- Z2 R6 I# Y L/ r4 V
$ e1 k1 U ?/ f/ Y
}
8 p* m( F" ^6 B
7 ]1 d" z# o: L( D% R1 ~, g# a' |Notify(\_SB.PCI0.SBRG.EC.ADP1,0x80)' x: t8 T5 k& E& F, R0 s) S
4 N( h% T! \2 C. s" u! xNotify(\_PR.P001,0x80)( q9 L3 b1 H7 K+ w. E/ M5 s/ I& e
4 \1 u0 ~, G, k- j9 o8 m
Notify(\_PR.P002,0x80)/ X. n2 t/ B$ E- p: q
- q; J; Z$ X' x5 e0 P2 _' n0 d
}) x7 M: A* W1 k+ u& r( t, H) C$ e
那么又有一个问题,那就是OS怎么知道这个SCI是EC的呢?请看下面的asl code你就会明白了J o/ D6 A& M! p- _( D
Device(EC)$ g8 g9 e& ^% ~3 E
{ q6 Y+ ?) J U: z2 g+ c
1 A& C' `# B# Q3 U4 v* E. [+ [$ D/ n
Name(_HID,EISAID("PNP0C09"))* _3 a2 K- r7 G; Q/ D% m
! k8 e7 h& E0 ]
Name(_GPE,0x06)+ a" Q2 `1 ]. ?! D$ S3 V
// KB_SCI $ c9 O/ y' A% [2 m* c
8 J6 x# \2 x+ b3 q) T...
X% l9 h$ d( R+ m}
2 u9 ]" d" V1 t; c9 D" W' m在Device EC里面宣告了EC的KB_SCI接在了SB的哪个pin上,这样OS识别EC SCI的过程就和前面的SMI异曲同工了。最后一个问题OS如何检测到SCI产生了呢?前面SMI已经说过SB有一根SMI pin接到CPU,可以让CPU产生SMI,可是SCI并没有这样的pin,那么CPU怎么知道SCI产生的呢?我想到了两种可能:( M7 Y9 D7 M: v
a.OS polling GPE register status bit。
. O; W0 G, O' [, ]6 Qb.SCI通过8259或者APIC,产生IRQ。
3 q* b( y# y, `( dChipset spec印证了我的想法,SCI可以配置成通过8259/APIC的方式产生中断,而且中断向量也是可配置的如下图1所示:
) _4 Y) p1 L& `* k $ ]) V8 P: B ~8 x8 U- l- w
) h4 m( S( I+ N
7 \0 o. E2 E' v$ M7 D* P1 o- B
# x+ @7 M2 T4 A' R0 o. b9 o8 Y! D3 F& y% ^; v" Y/ n" E0 k* x9 @+ r
2 P" l& h0 {( A+ U" T: |, \% P9 N# k* ~7 S) v( j
图 1
$ i% b5 ?. k5 H5 s. |BIOS在设置好该寄存器后会将SCI INT信息存入ACPI FADT中,这样OS就可以通过FADT获得SCI使用的中断号码,从而能够在SCI产生时处理该中断,这部分请参考ACPI SPEC FADT部分。下图2是使用ACPIVIEW看到我的工作机的FADT dump,如图2所示我的机器ACPI使用APIC INT 9。
) J A' n" P) x6 |( e! y5 `
0 @7 w) I$ L$ P9 Z5 t! e0 M3 U6 N* `# Y
+ B3 c* `* l: P# u y
8 s! `( K% X/ V' Z% g1 i- _6 I0 w图 2 0 c4 q7 x1 O. s8 }- a7 w, m
J+ r3 k7 _4 o6 |/ g% IØ- I( Y+ c5 c5 Z5 B) _( T
GPE
2 f3 c: O$ F" [3 z0 V) `7 E m% E. ZGPE其实是属于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(),就会被调用了。6 t# ~, I6 Q7 p, O! d3 T
; f/ t& L7 H! v7 x# xThat’s all!) H- {) i+ u! d) d5 f; j: J: J
7 K7 v6 I$ ]! J6 f" IPeter |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入计匠网
×
|