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

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

[复制链接]
发表于 2009-5-6 13:45:15 | 显示全部楼层 |阅读模式
我所知道的EC====>KBSMI&KBSCI
, O, X1 B. j! p

4 ?" R2 C& D9 \( f1. Introduction  o$ u$ S7 f* q) |2 J: P* q% N
7 F4 g2 S- Q# X1 y# j. C
SCI是指系统控制中断, 为支持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

9 ^8 |- K7 k4 W7 f" r
' o: y" x% E1 B% S- a6 }2. KBSMI#$ e2 I2 M& X$ D
其实EC很少用到SMI,除了少数测试项比如DOS Fn+F2下切屏等。不过KBSMI#的实现原理还是很有趣的。它的原理是这样的:EC将一pin接在SB上,而SBGPIO有些具有multi function,可以配置成具有SMI/SCI的功能。BIOS code在初始化时将这个信息宣告给SMI Table。一旦EC发了一个SMI,EC接在SB上面这根pin
& P8 z4 q/ S+ b' p/ p3 _9 l% b8 kstatus就会被置位,SB检测到以后通过拉接在cpuSMI pin产生一SMIcpu切换到SMM mode然后就会通过之前宣告的那些pinstatus identify smi Owner,这时就可以认出是ECSMI,随后通过下commandEC读取SMI event id,并通过该id去调用相关的method5 b. v# ~+ z* U  J; j7 O! E! X% U) J
6 d- T% H. F6 m/ L. Y: W
3. KBSCI#
9 o0 X, F: g, @# I7 r; DØQ_EVENT
& S- {  s2 n' v8 H; D所谓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 ...4 T6 u  P! m8 @6 E5 B  \9 Q+ i% O+ b

' x9 u: l! j- K+ W1 a+ _8 M; p+ V7 h  H// AC Status Changed
' T  b$ h! r# m
( s# E9 j% ~! i, wMethod(_Q83)

5 }, u: F% m6 E  {' T5 s9 T) H) D+ r. y
{

& ?3 k6 z+ W9 S$ X* ^6 f& k* m, T$ v/ o; L" V
Store(0x83, DBG8)

  h9 U) i( A+ X
* e' z# |1 z% @8 {" D# p+ U( c
  c! ^7 _; z! B: o: J$ l: rStore(0x00, Local0)

# ]& g6 E+ W. y  n2 U- R2 Z; x% W0 A* Q: V# X* `2 @0 w9 {
Store(POWS, Local0)
* ]* O0 W5 R9 Z. S) W2 {

9 O  }& S' [$ }If(LEqual(Local0,1))1 b: F1 d1 }: S. ^2 h8 N: r3 j. ?

3 X8 _1 F: s7 G* d, n
/ c) o' O: V) N2 S- `& Y$ {) l{

2 G1 e' B; d6 k6 P; x6 X8 f* [7 }9 o; L/ h/ Q6 {' k
Store(1,\_SB.PCI0.SBRG.EC.ADP1.ACP)

2 g# B- h1 n  _# V! a* h1 ~: U3 Z7 {, R3 Y; W2 B
}

6 a7 y/ l3 L* k6 K9 Q7 o# v7 M- t0 S& F3 u+ R5 O# e' m. j& W8 T
else
  p3 x" s* C5 g( K$ x
! Z4 Q% _5 N) K1 v
{

* n8 }7 `' e0 n7 p$ S
, n" u) u1 o0 Z% R5 K1 |Store(0,\_SB.PCI0.SBRG.EC.ADP1.ACP)
$ Y8 }1 \$ {+ z" H) l/ X

4 M: H5 t' |8 A0 m! f' G}
( i( P  @0 e3 N
1 [: \, Q2 n" D& b, K  a, v
Notify(\_SB.PCI0.SBRG.EC.ADP1,0x80)

! o  P* z% X2 k- d$ E4 u7 U7 I" Z2 p9 W. Z, ], |
Notify(\_PR.P001,0x80)
) i! `( b$ P& w+ p% x

% P1 T1 d. t) R4 p  UNotify(\_PR.P002,0x80)
- G7 G2 w$ m! r$ l' o, ?& u; J% s
7 T3 w' {. [9 F. t  R% p0 {5 T
}

' n( e% D! ~3 l那么又有一个问题,那就是OS怎么知道这个SCIEC的呢?请看下面的asl code你就会明白了J
0 Z. `# N$ x# h3 ~8 ?& v& [Device(EC)5 J* ^9 Q' ]( s, k' H1 D2 ?
{  ]8 m  e# N+ ~8 @8 I1 h. a

( b5 \* Q* L1 y0 c7 h1 l; ?; XName(_HID,EISAID("PNP0C09"))

9 z" t' M; Q; \9 b: D+ h+ h2 b5 F; d3 R
Name(_GPE,0x06)
# z7 [, |& `5 ^: I* Q7 m7 P// KB_SCI
# M3 i1 w! A7 K' _$ U2 d
& H; t- z8 N6 i6 l8 b5 i! I
...

& Q  ?' Z0 A0 h# X- j}
' p/ }* N+ g" y/ a# U0 HDevice EC里面宣告了ECKB_SCI接在了SB的哪个pin上,这样OS识别EC SCI的过程就和前面的SMI异曲同工了。最后一个问题OS如何检测到SCI产生了呢?前面SMI已经说过SB有一根SMI pin接到CPU,可以让CPU产生SMI,可是SCI并没有这样的pin,那么CPU怎么知道SCI产生的呢?我想到了两种可能:1 a) e' `* L& V' U( {. w0 T  h3 Y
a.OS polling GPE register status bit
/ W/ ^" T* a! e$ Eb.SCI通过8259或者APIC,产生IRQ
/ T! j* H2 w( L+ yChipset spec印证了我的想法,SCI可以配置成通过8259/APIC的方式产生中断,而且中断向量也是可配置的如下图1所示:& l% x  M+ N6 x& l+ M& p8 x6 T4 w, C
            , q  d8 T" a2 t# b0 I7 E
1 T/ P4 K( K0 {3 m+ ^

. g+ I$ @& y1 a/ T& j. l. b0 v4 \$ R9 d2 {' z1 x0 N
5 g+ e" Z' \6 H0 y5 I
2 q7 \. R5 U: C/ \% H
8 D; ~/ I* I  r
1
) u" g0 i1 J$ b; m$ f
BIOS在设置好该寄存器后会将SCI INT信息存入ACPI FADT中,这样OS就可以通过FADT获得SCI使用的中断号码,从而能够在SCI产生时处理该中断,这部分请参考ACPI SPEC FADT部分。下图2是使用ACPIVIEW看到我的工作机的FADT dump,如图2所示我的机器ACPI使用APIC INT 9
! i- R2 _8 T) `2 r' Y0 K
, q5 V4 B  q9 i$ W  X
( q3 W$ `% d& G' ~) w5 ]2 p

2 Z9 M+ B6 P$ e( E/ p) z

2 U4 L- X. u9 V7 Y, Q; r+ Q2 V* h
2

, p/ L/ ~. K9 k2 Z& C; I, \# X
" S0 _* X3 ]5 ?3 }* M+ u; CØ
( `2 i/ |2 a+ P( s) O  Y
GPE
+ b! j: H0 i. I% b# s9 \1 g
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(),就会被调用了。0 Z; g4 w3 K+ |9 C. g

9 T. t+ Q& B. A$ E* j/ f  V- ]That’s all!
2 q- k- N  ^" H, t9 I

) Y! q) v1 ~8 q% R# LPeter

本帖子中包含更多资源

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

×
发表于 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 | 显示全部楼层
学习了。。- c3 R" ~; l  s4 [: Z* l7 t) Y7 y
请问一下,1.热键 FN+Fx (F3)按下后,EC会发SCI通知OSPM吗?" Q5 ]  R: N+ J) Q/ m  x
2.以ITE 8502为例,当FN+F3按下后,EC对应代码为:
, S5 X3 M4 E8 V% c! Z- u9 Z# NHotKey_Fn_F33 L! {- [% ^# r9 k- e
{
$ j4 X$ [4 e. F+ c0 G4 N    if ( event == MAKE_EVENT )
' l- V& b3 e. s: V& j  {' ~5 S    {
) C5 B+ N: q/ E% G# v* K' F        WriteSCI_QueryValue(_EVENT_HOYKEY_FN_F3);
* q" u0 w7 o" O1 b  D2 C    }! b, [/ |# r/ q( m2 V
}0 Y) ?; e  I8 ]# I) `* M9 f. N
//#define _EVENT_HOYKEY_FN_F3         0x03 # B( e) p- `) o4 X# U
这个 _EVENT_HOYKEY_FN_F3 是 _Qxx命令所指的ID吗?
回复

使用道具 举报

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

使用道具 举报

发表于 2009-9-24 16:59:22 | 显示全部楼层
建議將EC與其他周圍的設備通信的內容整一下~~如:EC&BIOS, EC&SB ~~~" U$ b1 r9 O' G3 U
   對這部份比較懵懂~~: c+ ]( T& {+ r

- ^) x1 o+ W' \' m. H8 e( v8 J多謝
回复

使用道具 举报

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

sci

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-23 21:13 , Processed in 0.036945 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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