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

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

[复制链接]
发表于 2009-5-6 13:45:15 | 显示全部楼层 |阅读模式
我所知道的EC====>KBSMI&KBSCI
5 h7 m- f3 U& p
& `# d4 V. _0 z0 R6 ?- B
1. Introduction
% D& Q6 n' E- s  _$ d9 a+ U4 H8 {. P, E/ `" |; u
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。

2 ^5 E7 P; d* S1 N6 h
. o0 ]1 p: H. k" Y2 c* T8 Q9 ]5 J! U- w3 x2. KBSMI#
/ r  ?. g" |1 h( D6 X' E9 e8 e$ D其实EC很少用到SMI,除了少数测试项比如DOS下 Fn+F2下切屏等。不过KBSMI#的实现原理还是很有趣的。它的原理是这样的:EC将一根pin接在SB上,而SB的GPIO有些具有multi function,可以配置成具有SMI/SCI的功能。BIOS code在初始化时将这个信息宣告给SMI Table。一旦EC发了一个SMI,EC接在SB上面这根pin的( v9 r: I: T* s: T' d
status就会被置位,SB检测到以后通过拉接在cpu上SMI pin产生一个SMI,cpu切换到SMM mode然后就会通过之前宣告的那些pin的status identify smi Owner,这时就可以认出是EC的SMI,随后通过下command给EC读取SMI event id,并通过该id去调用相关的method。
6 x% l# \" J+ e3 G7 n5 J4 z9 A6 ]2 ~- u" H
3. KBSCI# - d  t9 X6 V1 J/ c  D* ?0 F8 L
ØQ_EVENT
! y% @, M4 ~. l% w3 ?2 w所谓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 c+ T2 A+ d; n8 n

: ?( Q/ U/ L) T: q// AC Status Changed
: e! c9 L) j, h7 ~; A$ @# Q9 N, x' s. S+ P
Method(_Q83)

# u" @9 [; ?+ d+ m3 a5 O* k2 K6 F9 I0 n# \
{
3 ]$ e- ^' f: D# q0 |7 z8 |+ J

6 R+ K9 A) b/ F4 h- s3 TStore(0x83, DBG8)

  m0 y) a( p- A  e5 K6 O
' ?, X8 _' \( j. ]. R5 ]% l% k& N, l' V& H/ O4 a
Store(0x00, Local0)

7 v7 H# C: F; y! s2 T5 c6 _
, C( I1 t, O; H4 L/ O3 ZStore(POWS, Local0)

' F3 p+ k( N% a8 m6 F2 a' }3 \3 f" v3 M5 m5 `* G9 W
If(LEqual(Local0,1))4 S/ B# |- O5 ~
6 P$ L  r7 N. a: J
( L6 z) H7 f$ [: ~  Q% N3 T
{

$ B+ v; H  m: j' R, T5 w: Z, b5 y$ r# M, J, Y2 Y# |* E+ f
Store(1,\_SB.PCI0.SBRG.EC.ADP1.ACP)

: p3 U4 N" F, D  @" n+ W% ]7 L5 S8 h! t1 Y2 ^6 P$ p1 ~  L
}

, P- b6 c0 A3 I4 A
" b" y8 f9 S" a5 Belse

/ }5 d! n( D, w/ _' f/ ^( n& H( k
{
' U4 l% m# k- E, N" o5 n

; v  C1 m) Y. [7 |  t$ VStore(0,\_SB.PCI0.SBRG.EC.ADP1.ACP)

! n7 ]; Q; N' o) a% L$ \+ S) L0 G2 `/ }
}

9 z. g4 V( F- D9 L! d" q6 M9 [
* e. d) ^  r4 |1 |Notify(\_SB.PCI0.SBRG.EC.ADP1,0x80)

8 g$ h, U' |5 F0 \, [9 ?' k4 F5 C# r- `; j
Notify(\_PR.P001,0x80)
* {7 V9 I- m, }" d( @% m
3 B; s; w, b( a: v6 C# B
Notify(\_PR.P002,0x80)
  w4 T* U2 h9 W; M" L: A" w

1 m: z4 U; C! `6 I$ |. z3 ^}
2 K8 \  Y2 X- e
那么又有一个问题,那就是OS怎么知道这个SCI是EC的呢?请看下面的asl code你就会明白了J: O' ?3 G: m4 E" L2 j! I
Device(EC)+ `* |7 l9 X* \; Q% w! t
{! d2 W2 t8 n7 C3 Y  l
* s* Z$ G8 M# ?. A+ s$ s
Name(_HID,EISAID("PNP0C09"))

. f, y" ?* m/ r. N8 `! e; s/ z, x; C  }' K5 L6 O* Q
Name(_GPE,0x06)! F$ L6 p% Y7 Q% O
// KB_SCI
# n) {! A7 n0 |5 t! U8 S' A
2 H% Y, E9 W2 R+ b. b( j) ^5 g
...
8 t7 W# \; c" C6 W: N( Q! a) o
}
$ c1 X# x# C. ^在Device EC里面宣告了EC的KB_SCI接在了SB的哪个pin上,这样OS识别EC SCI的过程就和前面的SMI异曲同工了。最后一个问题OS如何检测到SCI产生了呢?前面SMI已经说过SB有一根SMI pin接到CPU,可以让CPU产生SMI,可是SCI并没有这样的pin,那么CPU怎么知道SCI产生的呢?我想到了两种可能:  d* S+ z# a0 K+ C; h
a.OS polling GPE register status bit。
7 R& @' f; |% ~& U# sb.SCI通过8259或者APIC,产生IRQ。
) @9 Z, t- \; W2 D/ D$ HChipset spec印证了我的想法,SCI可以配置成通过8259/APIC的方式产生中断,而且中断向量也是可配置的如下图1所示:" a- ^. }' ^( w9 b
            
/ l. N+ @2 n1 S. o! r! H2 u* h4 o! d' Q  A6 r

* p) F( {6 B# |0 H( f
$ z! |) J; V& [2 I1 @

' Y. Y6 Q; s4 ]$ S. r: E4 o
  A4 P$ c( s. N; X9 |% D6 C

- `5 u* W; A6 w4 q8 U9 o
图 1

" x1 c. s7 {, R0 }* b/ \$ e% dBIOS在设置好该寄存器后会将SCI INT信息存入ACPI FADT中,这样OS就可以通过FADT获得SCI使用的中断号码,从而能够在SCI产生时处理该中断,这部分请参考ACPI SPEC FADT部分。下图2是使用ACPIVIEW看到我的工作机的FADT dump,如图2所示我的机器ACPI使用APIC INT 9。7 O9 M( y, q( _

/ J4 I- G" W' r  ]; e. b& k/ _

9 _2 Z+ {- B% w/ H
  z2 N5 K0 u$ v' B8 I

# o- v, R; L% N. ^
图 2
3 N4 v2 _/ I5 c
) v) `8 I0 o9 g' ?1 z
Ø
! b3 Q5 h0 {& u0 r6 W* o# E
GPE

1 {' U9 J* a# t  [3 lGPE其实是属于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(),就会被调用了。
) p# o- q4 q: n' G
' l! \2 _& d. C" m$ c) M# m7 }That’s all!

1 d( ]: Z2 S! f4 Y6 s8 T

8 w5 n" Q! U. pPeter

本帖子中包含更多资源

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

×
发表于 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 | 显示全部楼层
学习了。。
1 i& L2 u9 `5 R) E请问一下,1.热键 FN+Fx (F3)按下后,EC会发SCI通知OSPM吗?
0 t5 o+ a) F- \8 [! Q+ ]3 W2.以ITE 8502为例,当FN+F3按下后,EC对应代码为:; A/ J- V, u* _- N5 {- O* w2 O" n1 O
HotKey_Fn_F3% ]: N1 i3 g4 G% T
{  }4 [2 i/ G: _5 g# R; V/ Q* H
    if ( event == MAKE_EVENT )3 V  E2 p  K9 s  d7 ]
    {! k+ z1 T! a" G" C2 [4 f0 j
        WriteSCI_QueryValue(_EVENT_HOYKEY_FN_F3);
/ g. t* g9 b8 B9 b; U! p5 Q    }
' O. F0 K3 k& G' Q- i, x* J}6 j0 K; I) Y* W# P
//#define _EVENT_HOYKEY_FN_F3         0x03
, F- d! r0 `- V" M这个 _EVENT_HOYKEY_FN_F3 是 _Qxx命令所指的ID吗?
回复

使用道具 举报

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

使用道具 举报

发表于 2009-9-24 16:59:22 | 显示全部楼层
建議將EC與其他周圍的設備通信的內容整一下~~如:EC&BIOS, EC&SB ~~~
+ Y$ V) H7 J7 u   對這部份比較懵懂~~
- H7 j. K( s* z4 x
) j8 t9 F3 x3 ~多謝
回复

使用道具 举报

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

sci

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-11-1 19:38 , Processed in 6.958619 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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