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

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

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

. Q- L* A  G0 B' x  n" z& l
$ P# G$ G$ e8 J. i" u( ~5 x1 C1. Introduction
3 ]" V3 ^& o4 A9 a* H, {. c9 K( _0 w' I0 D, \
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
/ P! L" G4 @8 H
( m/ ?% A/ A9 U* I4 r, h  H- m- s, d
2. KBSMI#
7 t" ]/ Z" G+ R5 x& B8 l其实EC很少用到SMI,除了少数测试项比如DOS Fn+F2下切屏等。不过KBSMI#的实现原理还是很有趣的。它的原理是这样的:EC将一pin接在SB上,而SBGPIO有些具有multi function,可以配置成具有SMI/SCI的功能。BIOS code在初始化时将这个信息宣告给SMI Table。一旦EC发了一个SMI,EC接在SB上面这根pin
6 q; d2 \  d, x4 D4 f3 }2 W3 k% Ostatus就会被置位,SB检测到以后通过拉接在cpuSMI pin产生一SMIcpu切换到SMM mode然后就会通过之前宣告的那些pinstatus identify smi Owner,这时就可以认出是ECSMI,随后通过下commandEC读取SMI event id,并通过该id去调用相关的method) w0 k8 C2 k8 t& W5 ^

$ w2 D' a; j  L5 ?' w- p3. KBSCI#
. h& M/ R7 C7 |" S+ ~! O; b8 c3 z9 SØQ_EVENT0 k! G4 X  W% a1 @6 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 ...2 T  e! d3 m4 g* m7 h4 T; ?. d0 S) V
: w  t1 T6 K- |% W7 |
// AC Status Changed
8 R8 ^7 d3 s4 M5 R# |  F  \) U) k! }1 p, S* Q6 [% B9 `
Method(_Q83)
% ~9 Z  W, x5 K1 |0 I& m

/ d: L2 w( E5 Z' P{

8 l" R: K/ _- v# y' {+ i
: r! R3 M! f& q$ O8 T6 j) i; sStore(0x83, DBG8)

7 }6 u  k2 }; \3 U! {- T. w# a# \! a. h& K( O

% U+ e0 n) _. NStore(0x00, Local0)

2 w/ {5 ~; [% P) E/ f4 Z" ^2 H7 [
4 `  P( i: a' O% `8 nStore(POWS, Local0)

8 [# C8 M0 {6 Z8 _) [- I0 B9 F8 O+ J8 `! s$ J2 n/ x  z5 q
If(LEqual(Local0,1))3 i' P3 t/ p( A- f' B# Q
; N1 I$ ?" i! o3 y. D

( f) j' K6 V. t5 o9 y, G{
4 X8 c$ b4 ]/ m' Z* ]. B2 z6 g1 _  B
9 ^  N9 k% w6 `  l
Store(1,\_SB.PCI0.SBRG.EC.ADP1.ACP)

  g3 {- y5 V: ~5 z
' O( X, |  Y, D4 c}

5 C; |0 ]; R' n; B4 h) {
# ~1 ]) r. c! p( y: relse

2 s% Q7 c+ p; e! s, t$ D( s7 q6 ^: ]! @) R
{
5 |% ]) ]: e1 W  Y$ L

) u  m$ H" G. W' B7 dStore(0,\_SB.PCI0.SBRG.EC.ADP1.ACP)

+ Q4 I$ ]* D) Y  C6 [
+ ?% E5 O  E7 H! G}

- c% Q( v: N5 ?+ r+ p' I6 E' i2 C
/ q  i+ l  T5 Z" s# o. oNotify(\_SB.PCI0.SBRG.EC.ADP1,0x80)
3 N8 k" i7 K- x- s
2 f' c1 \/ z7 Z& y" t
Notify(\_PR.P001,0x80)
% Q' \( w9 ~6 u8 N
( N4 c' h2 U$ p. \  j2 M* g
Notify(\_PR.P002,0x80)
& ]% y( L* R& x: E7 M2 z' W7 |

3 ]$ \# ]7 R1 S7 ?}
& A# B: `* O( ~1 Q! H% w0 E. u, C* F
那么又有一个问题,那就是OS怎么知道这个SCIEC的呢?请看下面的asl code你就会明白了J9 {. J9 Y& Q$ _# I7 f0 k' e
Device(EC)
: Q0 D$ G, h% [  l% o# o, e# e{
5 R& Z7 y  z( o4 q# Q- J3 f0 i$ D7 N" o& }; J3 ]4 H8 F/ A% j
Name(_HID,EISAID("PNP0C09"))

, O! R$ M$ Q: ?' I( G( q
9 E5 L. m! b) U( h6 X4 lName(_GPE,0x06)
- a( A! E8 ?% b: ~0 \// KB_SCI

4 E5 j$ O6 D% D% s7 L- d8 |- P% f6 j# H6 d
...

1 f* z% o' V  F$ s( S; t}1 W7 K8 L* e! ]. V3 q* |1 G
Device EC里面宣告了ECKB_SCI接在了SB的哪个pin上,这样OS识别EC SCI的过程就和前面的SMI异曲同工了。最后一个问题OS如何检测到SCI产生了呢?前面SMI已经说过SB有一根SMI pin接到CPU,可以让CPU产生SMI,可是SCI并没有这样的pin,那么CPU怎么知道SCI产生的呢?我想到了两种可能:+ n5 \# v6 ?5 Q# i* n0 p0 T9 h+ n
a.OS polling GPE register status bit
4 U" {, O* M% ?1 C& X8 H( C# ~4 s) Vb.SCI通过8259或者APIC,产生IRQ) T, u8 {# X2 F0 g' I
Chipset spec印证了我的想法,SCI可以配置成通过8259/APIC的方式产生中断,而且中断向量也是可配置的如下图1所示:
# X0 U2 a, r' w% |7 a8 t- d9 _( F            
. ?$ h4 v  V" T4 E  g  }4 d: r3 [: i) w- ^7 v; z
; D, P4 ~" w1 i

$ Q; E4 q" d6 F

+ m( p$ {; i# d9 E
, ~5 w' i+ g2 K7 z: B4 L" u; y
9 P$ V0 t  h$ b& I" T
1
( E' Z% }, X7 I
BIOS在设置好该寄存器后会将SCI INT信息存入ACPI FADT中,这样OS就可以通过FADT获得SCI使用的中断号码,从而能够在SCI产生时处理该中断,这部分请参考ACPI SPEC FADT部分。下图2是使用ACPIVIEW看到我的工作机的FADT dump,如图2所示我的机器ACPI使用APIC INT 9
& G, J; F" v( x: u% h- V( B% f: @
: f& u# A2 K' Y; z2 K) v; p

# E6 l3 i. R2 j
5 ]. c9 V8 z1 ~( C' t' k

  A' j$ V( H1 q
2
5 l' l, \/ z/ v! X

4 Q2 a7 X. l) a% nØ
7 d5 d, G- ^: z- X, h4 i
GPE

% s2 O4 ?9 O. B$ F7 DGPE其实是属于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(),就会被调用了。
) g% N. n* x: Q7 [; `% J& Y/ ?+ J0 W" T9 I
That’s all!
$ a0 p1 D/ f, S$ K

2 k2 h) h0 x) S1 C9 z9 a$ tPeter

本帖子中包含更多资源

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

×
发表于 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 | 显示全部楼层
学习了。。' u0 w3 t4 X9 T: B, ?6 M
请问一下,1.热键 FN+Fx (F3)按下后,EC会发SCI通知OSPM吗?
+ e  x- {6 p1 g1 t1 S) |) s2.以ITE 8502为例,当FN+F3按下后,EC对应代码为:
2 n! I* y7 Q' {7 Q" ~6 EHotKey_Fn_F3
/ E' M' ~+ D, P3 o' K; W" J{  ]% \" B& m6 `2 e
    if ( event == MAKE_EVENT )
, J" @9 @# R1 a( X9 g    {: Y, G8 t' j, _  c% z
        WriteSCI_QueryValue(_EVENT_HOYKEY_FN_F3);
/ y" m1 X$ E+ z3 U6 _; C    }8 ~7 T/ f7 N, g3 \
}$ H' [. m. p6 K9 ]: E) `
//#define _EVENT_HOYKEY_FN_F3         0x03
; q+ q0 D  [% @% W! w! X5 _这个 _EVENT_HOYKEY_FN_F3 是 _Qxx命令所指的ID吗?
回复

使用道具 举报

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

使用道具 举报

发表于 2009-9-24 16:59:22 | 显示全部楼层
建議將EC與其他周圍的設備通信的內容整一下~~如:EC&BIOS, EC&SB ~~~
! l- D& Q8 t- t3 }   對這部份比較懵懂~~
' m+ M# L$ A8 n8 p% @& B
% P+ G, z- g3 X5 q. h. G, h0 o多謝
回复

使用道具 举报

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

sci

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-12 00:47 , Processed in 0.438497 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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