|
|
|
我所知道的EC====>KBSMI&KBSCI
# D* P1 H) `0 X9 s/ L; {
\3 C& A& h# k, y1. Introduction
+ W+ C' M4 H; [5 ~$ e+ u& `6 I4 m. S& M; j
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。
5 O' h& J& A% b. v3 S- r) b5 s
( L1 }. h- t, a% g! z1 A2. KBSMI#" P0 i' _" k }) g! v0 E) d) V( \
其实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) ?& l a- a* r8 V6 q R
status就会被置位,SB检测到以后通过拉接在cpu上SMI pin产生一个SMI,cpu切换到SMM mode然后就会通过之前宣告的那些pin的status identify smi Owner,这时就可以认出是EC的SMI,随后通过下command给EC读取SMI event id,并通过该id去调用相关的method。) [; H+ r! R. G: K. y8 j
0 @& `+ `4 B( @; V7 W
3. KBSCI# 2 G! P+ [! B" v6 M U" r
ØQ_EVENT- |# K1 ? G& I( {: S! u6 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 ...
2 O; i. E5 M7 U9 c
- ]" r3 C+ A4 |' G// AC Status Changed
' k$ i, n/ S' X4 V0 g+ ^, S' m$ l# a- o/ t& r2 i* @, B8 C3 l% C/ Z
Method(_Q83)
b7 I' S4 R9 ^ a6 ~- Y
6 _+ A" s# Y; e0 @# D1 f{
W, {3 B; z1 `! z
& [. v2 ?9 L8 B0 I GStore(0x83, DBG8)! k4 p4 h* v' N& C+ Y# e
/ ]% }4 t J0 w; w- `( n/ {/ ^3 N( Q, H6 k# X
Store(0x00, Local0)
! L) T. d6 y' Q) A7 B) w# h. R C# F' ]7 n9 @- |3 m6 s. D
Store(POWS, Local0)
5 g$ b K4 e0 q8 v8 C! F1 t3 l$ K" e' w, s( E0 E9 T
If(LEqual(Local0,1))
( m0 o, E Y( y: _; i+ W: A% t" s/ U) {: n2 @
9 {, U7 O( P" L1 s9 t
{
* t% O+ V5 J- z; d/ w
3 `7 P1 B- v2 S' X& h0 fStore(1,\_SB.PCI0.SBRG.EC.ADP1.ACP)2 v# a! }* I! W& U' b' b
' P# [8 V& s' N}0 x& D/ c$ f/ w- I1 i. K! t
4 a0 n- M' r) [4 C( Zelse
+ F% \1 ^. y6 K% ^7 l3 z' p: ]* s: S4 ]4 F1 H6 W
{
# J6 ]# m, @1 D u4 `/ d- O4 r- J, l- N, O3 [7 q
Store(0,\_SB.PCI0.SBRG.EC.ADP1.ACP)/ f3 Q/ y5 C- W
" z& c. N3 q, m8 k: A7 M) ^6 d; M
}
# G! x3 [$ M8 e* I
6 P0 J, }1 o4 y L1 O. ANotify(\_SB.PCI0.SBRG.EC.ADP1,0x80)
, P8 m: l. v( H. L* [& |
3 E) O$ h, U: f% D) yNotify(\_PR.P001,0x80) j" D" q4 |* Q$ |8 |% ~. N
# \ F, B; p/ }; y
Notify(\_PR.P002,0x80); _; e' _ s d0 Q" b( n
! U: A6 f! Y* s+ u5 Y
}) N' O# _& H) ^. q& }4 g
那么又有一个问题,那就是OS怎么知道这个SCI是EC的呢?请看下面的asl code你就会明白了J1 i4 J, }: T/ D+ m
Device(EC)
* U! v' y0 u, W- Y1 e) u5 g) N' y! j{
1 q, u; _% G- Z. Y6 N: X+ u: {% A3 x1 `; v1 E
Name(_HID,EISAID("PNP0C09"))
: o" n6 F4 z& [' c2 e0 `9 B+ j3 v9 ~4 q( A- j4 V
Name(_GPE,0x06): v- I; Z" H0 w& X3 L+ I# J
// KB_SCI ) p+ f3 a4 T. r% y
~9 x, D0 ? @
...
5 Y8 f; u+ N C/ L1 `+ s/ |" ?}
, }* y/ N' U5 ]$ }) \在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 y" z( q& C9 T% Ka.OS polling GPE register status bit。
3 i) v2 M' V! [6 |b.SCI通过8259或者APIC,产生IRQ。% q7 `1 G9 a% Q3 C9 ^
Chipset spec印证了我的想法,SCI可以配置成通过8259/APIC的方式产生中断,而且中断向量也是可配置的如下图1所示:$ g" T. Y7 Q& Z- @5 g$ W
+ K7 g. ?6 \1 I' L; Z
* L, k0 L" A( T: V! X' N1 j
9 k( M H4 C% K
0 v- Q% u% l$ h. t8 ~2 W/ H
) } z" Y7 h4 J I
; X5 ?* Z. P1 P4 r7 l/ W7 u
D2 d' [" Q, O, [# e' a+ r5 Q4 C图 1
7 l( G8 B4 u9 k; U- [$ ~$ ]6 \BIOS在设置好该寄存器后会将SCI INT信息存入ACPI FADT中,这样OS就可以通过FADT获得SCI使用的中断号码,从而能够在SCI产生时处理该中断,这部分请参考ACPI SPEC FADT部分。下图2是使用ACPIVIEW看到我的工作机的FADT dump,如图2所示我的机器ACPI使用APIC INT 9。% O% ^. {) Q" ~5 T& |) C1 C o% i
( J- E0 k y) x; k% L
4 Y! m* F2 ~3 I
) C$ m2 I4 E r# M' G
; z: n3 X. ~( L图 2
0 j# B0 j; K* j
) `; e& H ?! }1 MØ% {' B( C" o! Q7 p( e
GPE4 d( E, i7 U+ s1 z. W! `6 b
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(),就会被调用了。' A9 z. V# y" h0 T
O# r$ _% F1 M' [" t) w$ @' G7 sThat’s all!" n; t {0 U3 Q6 W
/ O i$ @7 [8 f0 M% N0 P% W& s: zPeter |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入计匠网
×
|