|
|
|
我所知道的EC====>KBSMI&KBSCI 7 Q% a4 Y5 P* P/ r( F A |
. f4 [0 R: S+ l7 z4 N: D1. Introduction
; u. j% T! n. L3 w
' x7 f& L% g5 [$ J4 ]( e1 xSCI是指系统控制中断, 为支持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。" u5 ]4 H% C7 n
* w$ p" P1 m; N; G
2. KBSMI#
: {$ T0 N0 t; Y" s6 Q6 G; ~9 Y o. j5 A. F/ o其实EC很少用到SMI,除了少数测试项比如DOS下 Fn+F2下切屏等。不过KBSMI#的实现原理还是很有趣的。它的原理是这样的:EC将一根pin接在SB上,而SB的GPIO有些具有multi function,可以配置成具有SMI/SCI的功能。BIOS code在初始化时将这个信息宣告给SMI Table。一旦EC发了一个SMI,EC接在SB上面这根pin的; w4 C' Q& B. y( `0 c
status就会被置位,SB检测到以后通过拉接在cpu上SMI pin产生一个SMI,cpu切换到SMM mode然后就会通过之前宣告的那些pin的status identify smi Owner,这时就可以认出是EC的SMI,随后通过下command给EC读取SMI event id,并通过该id去调用相关的method。
5 h! k% p6 c! }, {9 Z: O
$ M5 x( A' \( a8 [( n8 f( v3. KBSCI#
2 W5 w3 N7 o' H6 E4 ?# d5 OØQ_EVENT# ^/ b: E5 F" L1 C4 B
所谓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 ...$ @0 S' T3 _) F/ @6 m
+ _, g1 [' ?( [6 n E// AC Status Changed2 [6 K5 }: I' n* R$ s, a V4 k, ~
& Q3 l+ v" ?. L) K4 g( {5 X2 G# s. y
Method(_Q83)
' t% N+ ~ g, f; h, U: ?+ k8 |- _4 } L! _: M" ~5 m
{+ W) Q# \, i9 j8 v
5 ]+ H+ l) Q" ?4 V$ j/ ]/ V
Store(0x83, DBG8); Q9 a7 J( a! L! I% m! ~; |
. Z0 w6 E+ F# }( ]
" z- i/ w- w$ `! {8 nStore(0x00, Local0)" [6 p4 k' ^ l
+ _ ~8 y" G% x" s N: t _
Store(POWS, Local0)' ~' a" u" T: P
, b4 e* }( z" |! u) P
If(LEqual(Local0,1))
6 u/ }! P- n% u- m( E6 {/ r# f2 c& U) A% Y/ B* A' O1 V
0 P( J/ K/ f, @: x' A4 x. b
{# A- M6 U3 ^$ R1 D+ [$ X
* L; c% M; Y$ L. ^" R4 Z
Store(1,\_SB.PCI0.SBRG.EC.ADP1.ACP)* r1 l9 t$ M8 y9 s) f. |9 \- \
' `! Y1 H; y& g% k
}
, l2 K4 e& O) F! e g" `
5 z1 M7 z+ B- X( Q1 c: t/ nelse4 K1 b: y |) _+ r; n
3 \' V/ X- v+ h# k0 l9 y{( P8 }9 D7 X' L; n8 J# R
" {( f" l) `4 R0 G
Store(0,\_SB.PCI0.SBRG.EC.ADP1.ACP)+ }- Z9 w1 _, C, i, o/ ^
) |& g' d8 e$ N# V* I6 ]7 C% t! U
}
# I- W" ?% I7 b7 J2 i" ~7 P, b4 z' v( Z
Notify(\_SB.PCI0.SBRG.EC.ADP1,0x80)& G, p( h9 l& `* }$ s
$ x4 [5 V" O( x8 G2 P0 V
Notify(\_PR.P001,0x80)& M0 W m4 R4 z7 C3 o ^
6 W- g/ ~1 R. H6 ^" V
Notify(\_PR.P002,0x80)) O( {. J; y; A, G
6 R3 J" R; ]* P+ A0 r* z}+ X7 O7 Z' |6 j/ Z
那么又有一个问题,那就是OS怎么知道这个SCI是EC的呢?请看下面的asl code你就会明白了J) V, z$ C) b# d4 J' n$ X
Device(EC)0 R: z; u" @) z. X
{
) T/ B& e* M( ^- ^9 ^- z1 A* M
Name(_HID,EISAID("PNP0C09"))' I/ r" Y0 V) H. y
! y: W, L) x" Z$ y
Name(_GPE,0x06) r# u3 V7 c1 L+ k! O
// KB_SCI
6 E9 ?8 J: H6 Y" z0 q' P
+ [: Q2 k( s" A, J7 f6 w...' c N- g. Q" p/ U( C4 k. q
}
0 j( G& U& r d/ y* P! v在Device EC里面宣告了EC的KB_SCI接在了SB的哪个pin上,这样OS识别EC SCI的过程就和前面的SMI异曲同工了。最后一个问题OS如何检测到SCI产生了呢?前面SMI已经说过SB有一根SMI pin接到CPU,可以让CPU产生SMI,可是SCI并没有这样的pin,那么CPU怎么知道SCI产生的呢?我想到了两种可能:
& {9 E5 ~$ d2 s. v- ?' n, s. ?$ Y8 u Ra.OS polling GPE register status bit。* b! Q7 k9 X! a% N
b.SCI通过8259或者APIC,产生IRQ。, F) g- V8 Y+ ?/ j" y
Chipset spec印证了我的想法,SCI可以配置成通过8259/APIC的方式产生中断,而且中断向量也是可配置的如下图1所示:
& G0 B( k. _* {$ ^! j$ N, p, | & @2 H ]. w' m' b% C1 P
# m/ _" W, Z% z6 G9 ?" w4 W; g
4 \. ?6 k! w' i
& E4 W2 ^ f/ A
9 }4 r) H& \2 e0 }7 U
. I) X6 F. S. d8 @+ D; v4 W: x
: \2 p+ h: z1 m, I图 1
0 K) @3 I3 n0 T* L. K: k7 D# e7 qBIOS在设置好该寄存器后会将SCI INT信息存入ACPI FADT中,这样OS就可以通过FADT获得SCI使用的中断号码,从而能够在SCI产生时处理该中断,这部分请参考ACPI SPEC FADT部分。下图2是使用ACPIVIEW看到我的工作机的FADT dump,如图2所示我的机器ACPI使用APIC INT 9。! R3 _ \# r. N+ V' F- w
& J5 o, M/ C |! U. e9 `
# ^: e/ u" a6 N+ [+ E
n8 \8 F% @9 E) D# C + D) ]; [% r8 K; O8 t/ I
图 2 ' l" z3 |& H' @* b
. ^0 K* P' R5 n! t9 C+ @: v
Ø, P" z, d9 N' N6 b! Z6 P
GPE
: B& _ e9 \# C! {, j( mGPE其实是属于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(),就会被调用了。
1 o& I1 F% H# n5 h, R4 U, N# W. p# t3 L& V
That’s all!* C: y7 z0 [. M) P
- h o4 Z6 |) G o( N0 Z% g0 fPeter |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入计匠网
×
|