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

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

[复制链接]
发表于 2009-5-6 13:45:15 | 显示全部楼层 |阅读模式
我所知道的EC====>KBSMI&KBSCI
2 g5 P& J3 p0 W$ L

  }' x0 r4 z; G" Q1. Introduction
4 t: U, Z" s% L+ H, [1 j* w2 l3 X
3 s7 R' n: H0 d6 g6 `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
4 v8 i8 ^- r/ j/ b

( R* k' A5 v) `" C# C) v& i2. KBSMI#- |. Q2 `4 a7 W" p$ h
其实EC很少用到SMI,除了少数测试项比如DOS Fn+F2下切屏等。不过KBSMI#的实现原理还是很有趣的。它的原理是这样的:EC将一pin接在SB上,而SBGPIO有些具有multi function,可以配置成具有SMI/SCI的功能。BIOS code在初始化时将这个信息宣告给SMI Table。一旦EC发了一个SMI,EC接在SB上面这根pin
8 q' T2 i+ P' s) E, R2 `! K& h  c; Gstatus就会被置位,SB检测到以后通过拉接在cpuSMI pin产生一SMIcpu切换到SMM mode然后就会通过之前宣告的那些pinstatus identify smi Owner,这时就可以认出是ECSMI,随后通过下commandEC读取SMI event id,并通过该id去调用相关的method
$ e; Y+ e" y- X% D  ~0 C
1 O' \( c/ A5 i: C3. KBSCI# # H$ w  K! l+ [! `- v6 j1 H0 |
ØQ_EVENT
. E4 ~0 B% ^7 P: }& |! `* J所谓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 ...
' k9 l% Y6 ?8 T4 I
& x: U$ r3 t# I/ ^// AC Status Changed% l7 I  z5 w1 m( {( l" d& X& I
: L5 o5 t1 Q2 T9 V
Method(_Q83)

# P- s' x" r" e  Y: H) i, V! w- j2 y2 p: b, W9 ]
{

5 x2 Z9 y) s) H2 s8 X) z3 w+ N) {- j
Store(0x83, DBG8)
0 F6 u/ P2 G0 A! `) A8 [
" k( W5 R, {/ y  e

1 C4 _* o: ]) j/ yStore(0x00, Local0)

+ a; U7 d2 K4 a2 u0 {9 [+ ~# w( U
$ m2 N, f* I0 }* g9 E, kStore(POWS, Local0)

1 A; j' r0 L$ s* E3 B8 E8 i# v0 @5 o/ _3 Q* ^: G
If(LEqual(Local0,1))/ T( Z9 A- F& d, S( ?% y! [
3 I: W" p$ g# B3 |) H: @

' t% ^" X& u9 B( B4 I+ O{

" M5 K' w+ h/ v9 D
; D/ V) v! ~" N7 v$ Q0 T1 A/ l4 V6 e" CStore(1,\_SB.PCI0.SBRG.EC.ADP1.ACP)
3 a7 k5 Q7 d$ N4 P- ~/ B( O

& ]6 t9 ?' X: i; U' `}

( U5 }3 O. A9 a0 R4 I9 G
# K- }6 f% |  Z1 {0 Welse
+ I' F* h6 D2 c& c' R
- J, B! o# I, T5 n2 T/ E& H7 c4 o
{

9 M: l" W1 D. `( i
* g2 ?- \9 l" @' B. j, DStore(0,\_SB.PCI0.SBRG.EC.ADP1.ACP)

6 X! p2 c: B& k  ^6 R' ]; |& u( E4 B$ n" d- ]
}
$ R$ ~  K' k) B3 G; v/ p( O/ E

+ N: O& Z& l  d2 U  V6 ANotify(\_SB.PCI0.SBRG.EC.ADP1,0x80)
; E- v! K$ P' F9 L' O' X
# t% c. @! o, G) V( Q, F
Notify(\_PR.P001,0x80)

& T, i/ C2 S- H7 N
2 J' f* `  h" T9 w6 l/ UNotify(\_PR.P002,0x80)
+ j3 E' H: b5 ?$ c( @% R1 p3 [
) L% N  k# y& }* f: t" ^* l  j! z
}
8 ?5 D; L7 `, H/ X0 ]. j
那么又有一个问题,那就是OS怎么知道这个SCIEC的呢?请看下面的asl code你就会明白了J2 E. P8 x" p5 x7 Y% \% J
Device(EC)
9 E& r) r; G8 `- F2 j% U- z{* l$ b& s% J( S- j) _( l' M
: W  m, x  T: E" f  u/ E
Name(_HID,EISAID("PNP0C09"))
6 v+ P4 j+ r& i% u3 D
( f% d+ V; n2 X$ U2 _
Name(_GPE,0x06)
! H4 Z  [4 }3 m! e  e+ E! R// KB_SCI
  d! `# r7 @' K, B0 y/ B
' U3 [; T: v, B+ Q: K
...

7 u1 W! V# ]% v, D- R}
; P- Q' R3 J' Z: A$ M, s8 NDevice EC里面宣告了ECKB_SCI接在了SB的哪个pin上,这样OS识别EC SCI的过程就和前面的SMI异曲同工了。最后一个问题OS如何检测到SCI产生了呢?前面SMI已经说过SB有一根SMI pin接到CPU,可以让CPU产生SMI,可是SCI并没有这样的pin,那么CPU怎么知道SCI产生的呢?我想到了两种可能:% |5 _& z3 L7 ^, }: T
a.OS polling GPE register status bit) Y$ ^% ^" V6 y* O" o: ~) P7 K9 c
b.SCI通过8259或者APIC,产生IRQ
; q' r8 T* O/ e: q9 JChipset spec印证了我的想法,SCI可以配置成通过8259/APIC的方式产生中断,而且中断向量也是可配置的如下图1所示:( B+ n4 N6 E2 m1 M
            * ^; E  m* u1 f" d: }/ I

6 e  w5 y6 f  f& G& B, {

+ w- I2 C/ r2 J# J. }7 B
2 `; D8 W! F/ F% c  Q" j

1 y) ]  l; y9 g4 k2 `( V" B& S' R# ]$ g( d3 M( T; r

: G; O: A& ?! h3 h
1
- _+ y5 g- K- x( A
BIOS在设置好该寄存器后会将SCI INT信息存入ACPI FADT中,这样OS就可以通过FADT获得SCI使用的中断号码,从而能够在SCI产生时处理该中断,这部分请参考ACPI SPEC FADT部分。下图2是使用ACPIVIEW看到我的工作机的FADT dump,如图2所示我的机器ACPI使用APIC INT 9
7 [$ |$ _* A- ]6 B( J+ ?9 e; _$ x# o1 z" r+ Z
. N. N) A( N6 ~2 |

1 _+ n* c- b. e6 ^" `) ~

) M. G% |* g7 p( E) o
2

/ v! ~( ^9 b1 G( s! Y4 N6 _3 ?- Y& g. ~6 u4 `( J* _
Ø
0 y" M( E( X6 P* c
GPE
# ~) G) N7 o/ I# A8 N
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 ^& m: @" D! _7 m, U0 k3 A

) J; z5 i, a1 r6 N" E% X1 nThat’s all!
0 W* t& D3 a( G2 e$ M( _/ }6 L$ h
* @8 M" ^% f6 W6 |, m
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 | 显示全部楼层
学习了。。' K% @0 p: ^$ j2 m3 Y+ o
请问一下,1.热键 FN+Fx (F3)按下后,EC会发SCI通知OSPM吗?  s; b3 O1 L- e/ X
2.以ITE 8502为例,当FN+F3按下后,EC对应代码为:
" g# {1 p5 e5 c) e! v  m, C, vHotKey_Fn_F3! M' V, C, D  ~9 |9 h
{
7 u0 x. {) w. f% g    if ( event == MAKE_EVENT )5 {& t  p1 [1 h: @
    {3 r: ?5 r$ |" j: V$ M3 N& x0 [
        WriteSCI_QueryValue(_EVENT_HOYKEY_FN_F3);
" R' ~4 ^- B( G9 q    }. w# z3 r) |; o- g+ A) I
}3 j2 w6 [6 v% D( G/ v% {3 N
//#define _EVENT_HOYKEY_FN_F3         0x03
$ d& {8 P4 r" E+ c, Q& A这个 _EVENT_HOYKEY_FN_F3 是 _Qxx命令所指的ID吗?
回复

使用道具 举报

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

使用道具 举报

发表于 2009-9-24 16:59:22 | 显示全部楼层
建議將EC與其他周圍的設備通信的內容整一下~~如:EC&BIOS, EC&SB ~~~
  d* M% ?. C  l4 P   對這部份比較懵懂~~( k) g' v# L( l3 s

9 f& [' u3 P7 k- |* y! ~% c多謝
回复

使用道具 举报

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

sci

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-20 12:58 , Processed in 0.028033 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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