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

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

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

9 |- ~3 A9 {' _, V  d) x% a+ r1 j4 \0 v8 o2 w
1. Introduction
; v8 u% q$ J' F  A7 w
+ ~) Q* }! O: W" H. z( KSCI是指系统控制中断, 为支持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  `% V& I6 F2 ]( O8 E/ [$ v5 z
5 f' a" I: u! X% H# Y' o# E2. KBSMI#  q/ V2 G& K1 R+ g6 C1 t$ L  ?
其实EC很少用到SMI,除了少数测试项比如DOS Fn+F2下切屏等。不过KBSMI#的实现原理还是很有趣的。它的原理是这样的:EC将一pin接在SB上,而SBGPIO有些具有multi function,可以配置成具有SMI/SCI的功能。BIOS code在初始化时将这个信息宣告给SMI Table。一旦EC发了一个SMI,EC接在SB上面这根pin
3 A3 K( o1 j2 a1 Ystatus就会被置位,SB检测到以后通过拉接在cpuSMI pin产生一SMIcpu切换到SMM mode然后就会通过之前宣告的那些pinstatus identify smi Owner,这时就可以认出是ECSMI,随后通过下commandEC读取SMI event id,并通过该id去调用相关的method
8 a& n6 @' y$ _, ~' f: r6 `) t/ H. `, O7 F8 }% }% C
3. KBSCI#
/ B6 L& l( l+ sØQ_EVENT' V: W" E* x3 p: N2 |2 O
所谓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 ...
& @, C$ H" T" m% b; Z+ I7 k2 c4 C5 l0 F5 L6 R6 }
// AC Status Changed6 a$ W+ |/ c# @

) u" N) V# z' p5 JMethod(_Q83)

$ L2 G0 R" n& B
2 J4 z, P0 K+ y! |8 C8 m0 e8 }{

. I: n- g; Q: ?% i9 D: P4 \, y6 I6 ?+ u3 t- m' q% @
Store(0x83, DBG8)
/ u6 v0 y1 D) V% ~$ b

, |' @0 B2 W& Z, _* ^3 ]
, q0 ]5 F0 {2 Z4 h5 t" cStore(0x00, Local0)
: m- l7 q$ O. z- O3 L

" ?" L: g2 q+ \6 R7 ]4 _5 i% LStore(POWS, Local0)
' C4 Q& G; o7 E% F

7 Q0 L  r2 _% h' [3 P: kIf(LEqual(Local0,1))
! G8 X% h: [, n4 X/ K+ W

; r4 L& S' R4 f3 N& j- J) F+ J- j8 {5 @0 U# K+ c5 T
{
. V3 z; _1 A& V; ?6 q

. M5 d9 y6 u: Q" c) |6 yStore(1,\_SB.PCI0.SBRG.EC.ADP1.ACP)
4 D) v% e& D! c6 Q2 W. @, m" K

6 ^9 P( ?0 `! y9 i( A; o& K}
4 }0 o2 r& w" N, Q: Y1 [% Y6 j& O6 ]

3 C% j8 M% Y$ k9 A5 uelse
9 J  g' ^7 f1 u% F' @  `
" w/ o3 o  O$ O7 j$ A
{
& j+ ?* D5 W; W& i

  j" }! r$ L! t  EStore(0,\_SB.PCI0.SBRG.EC.ADP1.ACP)
7 j7 V$ t3 C, g; h3 c( m

1 t, [7 ~! T" v" i( @+ V  C}
( r) |5 F* |* @, r  O8 v, N
, E0 h$ E8 g3 I$ n2 m$ }5 s
Notify(\_SB.PCI0.SBRG.EC.ADP1,0x80)

3 P+ l7 u. T& V( t  s# M, J
1 E+ S. K# p/ ^8 b, bNotify(\_PR.P001,0x80)
1 J+ |' n" _9 Z% T/ x$ p2 r
5 C2 s. s4 A% A1 V# {9 p; z4 W
Notify(\_PR.P002,0x80)

1 L; p2 ?, _; R* x2 `( a# w) e( a+ K4 j6 F
}

3 O* v/ {' K8 n5 i- U$ D那么又有一个问题,那就是OS怎么知道这个SCIEC的呢?请看下面的asl code你就会明白了J' O5 U' P( h1 x6 e" \7 z
Device(EC)
7 N! T1 L6 D2 D{& s$ I  ~" ?8 l; n1 u' r
1 j; k; T# P, }; Y
Name(_HID,EISAID("PNP0C09"))

, N) v3 J4 y) s6 B
; {. x4 r) O+ M! \# T5 e. L) ~Name(_GPE,0x06)6 G2 D. O, Z  z% v4 m: U$ E$ S' Z
// KB_SCI

, k# T0 t  M, s" o! d4 D3 M/ B
# F6 M! z8 f3 M3 w# J& A: f  X...

  ^" c  a' G. j2 w( \* |& c: p}
. ^! ?% f  F( Y- |& u2 ?Device EC里面宣告了ECKB_SCI接在了SB的哪个pin上,这样OS识别EC SCI的过程就和前面的SMI异曲同工了。最后一个问题OS如何检测到SCI产生了呢?前面SMI已经说过SB有一根SMI pin接到CPU,可以让CPU产生SMI,可是SCI并没有这样的pin,那么CPU怎么知道SCI产生的呢?我想到了两种可能:7 E  D+ Y5 }0 D* f; l* Z
a.OS polling GPE register status bit
( i8 l6 v; g$ x; b/ p9 _3 ob.SCI通过8259或者APIC,产生IRQ. \8 U% ], C6 {& j( c
Chipset spec印证了我的想法,SCI可以配置成通过8259/APIC的方式产生中断,而且中断向量也是可配置的如下图1所示:: M  U7 \0 s+ S; l
            
0 c& Y% T3 ]- x7 `
. a+ @) D9 w4 H/ o, s

, N2 r& I- H! d" f8 h
1 E  z. y' n1 `
  d9 O( h3 g( ~( H0 k

; \' U. V4 r: K) h

1 V$ p( C# Q) h+ B
1

6 }  f  ~0 d8 @, W  C1 p! @- ^" uBIOS在设置好该寄存器后会将SCI INT信息存入ACPI FADT中,这样OS就可以通过FADT获得SCI使用的中断号码,从而能够在SCI产生时处理该中断,这部分请参考ACPI SPEC FADT部分。下图2是使用ACPIVIEW看到我的工作机的FADT dump,如图2所示我的机器ACPI使用APIC INT 9, p: A5 a7 ]5 @4 U# Q; S( u( x

6 k6 x! `' C' W( H

, k+ t9 \( r' n0 |- o
, u2 a8 h9 y- Q& E" y5 j

4 q( X+ |6 o* Z6 k( Q# C4 y: ?
2
) B8 {9 R% e* [8 l; T

8 Q" G$ z( ]; I% @$ eØ) d( G: v4 k8 `' H, v
GPE

; s% p' ?$ D0 a  p; Z  @6 uGPE其实是属于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(),就会被调用了。7 p* v* J% V; z1 w9 t: o

' _! u' V' S) N5 ]" VThat’s all!
, R- W& G: f5 }% e" Z

6 N& E1 h/ n1 {6 C( t' w- NPeter

本帖子中包含更多资源

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

×
发表于 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 | 显示全部楼层
学习了。。2 {- b! x, {+ }& F
请问一下,1.热键 FN+Fx (F3)按下后,EC会发SCI通知OSPM吗?' E9 K0 T+ q: u
2.以ITE 8502为例,当FN+F3按下后,EC对应代码为:; B7 {- B6 v, m. Y* A9 O
HotKey_Fn_F32 a4 ^7 c& k, ?- G9 l  {
{
. H1 T$ I  G% j1 Y0 I, J0 |8 w4 p) g    if ( event == MAKE_EVENT )
6 i3 e' m4 U) T( p% S    {
0 O& P6 R7 t% i3 D( P8 k/ |6 d        WriteSCI_QueryValue(_EVENT_HOYKEY_FN_F3);
; T$ T) k! R1 e" R    }9 v% W( ~0 V7 K9 d. d1 m
}
( @! s; U4 G- B& [. \. Z//#define _EVENT_HOYKEY_FN_F3         0x03
, ^5 Z, g! n" d0 E* F9 I这个 _EVENT_HOYKEY_FN_F3 是 _Qxx命令所指的ID吗?
回复

使用道具 举报

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

使用道具 举报

发表于 2009-9-24 16:59:22 | 显示全部楼层
建議將EC與其他周圍的設備通信的內容整一下~~如:EC&BIOS, EC&SB ~~~) w2 v" I4 P, t% T# \8 D
   對這部份比較懵懂~~. [8 c* |; g3 @$ r( j: y
; N+ o$ w- l  [' H/ J: ^: v: d7 V7 k
多謝
回复

使用道具 举报

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

sci

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-2 11:17 , Processed in 0.079764 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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