找回密码
 加入计匠网
搜索
热搜: BIOS ACPI CPU Windows
查看: 26132|回复: 9

[原创]我所知道的EC====>KBSMI&KBSCI

[复制链接]
发表于 2009-5-6 13:45:15 | 显示全部楼层 |阅读模式
我所知道的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来讲SCISMI则是互斥的,一旦进入ACPI mode EC 就只会发SCI。通常EC会有两根pin KBSMI&KBSCI连接到SBEC可以配置这两根pin的属性,决定使用何种方式产生中断,比如level trigedge trigpulse 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上,而SBGPIO有些具有multi function,可以配置成具有SMI/SCI的功能。BIOS code在初始化时将这个信息宣告给SMI Table。一旦EC发了一个SMI,EC接在SB上面这根pin; N4 Z8 |8 M4 }3 D% F0 a
status就会被置位,SB检测到以后通过拉接在cpuSMI pin产生一SMIcpu切换到SMM mode然后就会通过之前宣告的那些pinstatus identify smi Owner,这时就可以认出是ECSMI,随后通过下commandEC读取SMI event id,并通过该id去调用相关的method8 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收到ECSCI后,OS通过发84hcommand EC读取EC Ram中的值,这个值被称为Q_EVENT id。这也是Q_EVENT得名的原因(QQuery的缩写,而84h就是Query Embedded Controller)。然后OS中的asl code会根据该id去调用_QXX()如下面的code所示,这里的XX指的就是EVENT id。那么EC什么时候会发Q_EVENT呢?当ACBattery in/outLID 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怎么知道这个SCIEC的呢?请看下面的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# `; fDevice EC里面宣告了ECKB_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/ v
3 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 Q
GPE
, 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_STSGPE_EN两个部分对应该GPIOstatusenable Event的触发分Leveledge两种,分别对应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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入计匠网

×
发表于 2009-5-22 21:46:35 | 显示全部楼层
感谢版主,受益匪浅~~~~~~~
回复

使用道具 举报

发表于 2009-6-9 08:31:59 | 显示全部楼层
peter是位好人啊,技術方面也很全面,向你學習了
回复

使用道具 举报

发表于 2009-6-9 11:37:51 | 显示全部楼层
偶像,学习ing~~~
回复

使用道具 举报

发表于 2009-7-7 19:48:18 | 显示全部楼层
学习了。。$ h7 j/ ?6 Y: d4 J1 k7 G. b
请问一下,1.热键 FN+Fx (F3)按下后,EC会发SCI通知OSPM吗?- c' f( a/ z3 _* q5 e0 l
2.以ITE 8502为例,当FN+F3按下后,EC对应代码为:
$ b% T& m" r3 y4 H1 O( Q  C: ]HotKey_Fn_F3
) f+ y) S/ O1 x) \4 w) L% B: [{
! M9 I" L0 N+ _, r    if ( event == MAKE_EVENT )% P. b2 _0 r: W4 `+ ]6 r
    {& g6 S! c* h( u6 [8 c/ R5 K$ B
        WriteSCI_QueryValue(_EVENT_HOYKEY_FN_F3); 7 t6 Q/ e( D# {1 ^: l/ D$ Y
    }1 k+ m2 t! g! P4 r4 D$ E
}
: X* G2 e% d8 y7 z$ C//#define _EVENT_HOYKEY_FN_F3         0x03
! P3 y, t7 _& D% ?3 S这个 _EVENT_HOYKEY_FN_F3 是 _Qxx命令所指的ID吗?
回复

使用道具 举报

 楼主| 发表于 2009-7-8 13:17:04 | 显示全部楼层
应该是的
回复

使用道具 举报

发表于 2009-9-24 16:59:22 | 显示全部楼层
建議將EC與其他周圍的設備通信的內容整一下~~如:EC&BIOS, EC&SB ~~~
" g5 [+ p: {3 R) m   對這部份比較懵懂~~
& o% H. X0 B2 S) j- K% V
) ]3 @0 D+ g( H) P: |多謝
回复

使用道具 举报

发表于 2009-12-1 14:25:31 | 显示全部楼层

sci

学习了,看了之后明白了以前没明白的
回复

使用道具 举报

发表于 2012-3-19 17:26:53 | 显示全部楼层
非常感谢分享,将的很通俗易懂,再次谢谢
回复

使用道具 举报

发表于 2012-3-28 11:22:18 | 显示全部楼层
不错。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入计匠网

本版积分规则

Archiver|手机版|小黑屋|计匠网

GMT+8, 2026-4-4 18:26 , Processed in 0.083889 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表