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

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

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

% C- ]' @* C6 S" t; e& ]/ e1. Introduction3 R+ X/ J4 ?' O: N8 ~

1 B" l- X3 W1 p+ A% W. F0 fSCI是指系统控制中断, 为支持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

% s# f3 X+ l* X' `9 S0 o; s1 h; F( ]9 W3 s
2. KBSMI#' ^' S" _- l& s- \9 T' c: K4 L
其实EC很少用到SMI,除了少数测试项比如DOS Fn+F2下切屏等。不过KBSMI#的实现原理还是很有趣的。它的原理是这样的:EC将一pin接在SB上,而SBGPIO有些具有multi function,可以配置成具有SMI/SCI的功能。BIOS code在初始化时将这个信息宣告给SMI Table。一旦EC发了一个SMI,EC接在SB上面这根pin
' V* ~2 @1 _5 G; R/ L7 Qstatus就会被置位,SB检测到以后通过拉接在cpuSMI pin产生一SMIcpu切换到SMM mode然后就会通过之前宣告的那些pinstatus identify smi Owner,这时就可以认出是ECSMI,随后通过下commandEC读取SMI event id,并通过该id去调用相关的method4 u8 ]* K" B+ k8 Y- T

/ i9 N, x. O/ z$ F3. KBSCI# * [* J- f9 g3 r8 E- Q  F" t
ØQ_EVENT
! q6 B# U, \5 k8 v1 W所谓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 ...! ^) J* f, K9 J( K" {" X, ~/ X

$ B1 i* V9 i/ `" z2 \$ t// AC Status Changed# [( r4 r( ?( e; e% Q4 N- L
$ F, h# {& q8 o
Method(_Q83)
9 X& Q! @" M2 Y9 {* H+ a
9 j1 u0 k, U/ h+ V, j$ E8 D! d
{

, }9 ~* m+ }* K1 }2 }4 s& _% Y, e. j3 M* J& a0 j5 d8 M; n
Store(0x83, DBG8)
6 E  L; i" t0 b, s. |
. l* R$ i& c6 J  w2 `0 [
- c# P9 d) Y0 T  y0 V5 k% j+ _
Store(0x00, Local0)

# y2 \; E( x6 p. Z% }5 c
& c1 y$ I4 p8 h& B* UStore(POWS, Local0)

7 V2 _6 i% i( b* x8 u! W' G7 K2 n! U' F$ N7 O! a, b! j( I) Y
If(LEqual(Local0,1))! Q3 |8 F/ D1 i. P
2 c& w; A/ O. m

( R+ g: F. r5 I8 p# O; q{

+ b1 Q( {, b+ E! B7 K" V& A/ a1 @
+ q7 C( G3 A* s. r8 rStore(1,\_SB.PCI0.SBRG.EC.ADP1.ACP)

- C4 `$ e/ P1 r3 Z5 }
& U9 m/ ?6 X2 [+ D- l& `0 C/ B}
/ y+ R9 p. }, o8 h# r) [3 T) D

. l6 R7 N- |' Y0 R/ y" g! ~: ielse
( S2 L! f* l: }1 K

* n9 J6 \# C! g: W{
$ @8 c- r& a5 d4 M+ |+ p' R- ^

3 q! _* c1 ?& N& X/ i. JStore(0,\_SB.PCI0.SBRG.EC.ADP1.ACP)
. a; P7 m( B/ _
; s$ f9 a4 N+ Y. W1 h+ C
}

$ i) L6 t* t! Z" v+ r3 G$ F1 J+ D2 x. n0 E0 L6 W
Notify(\_SB.PCI0.SBRG.EC.ADP1,0x80)

2 g5 Q  a0 w" f$ j0 \9 b/ \$ b0 s3 O0 e
Notify(\_PR.P001,0x80)

/ C: E7 \( _) z" S; f8 N# a+ S# e6 V
Notify(\_PR.P002,0x80)

6 x2 T: d: L1 a: r4 O& o
& \7 V2 M1 e! }7 t}

: |# d( y- K$ L' `7 B. r那么又有一个问题,那就是OS怎么知道这个SCIEC的呢?请看下面的asl code你就会明白了J( Z! q- ~# S3 k. W; ~. J& ^% H
Device(EC)
, a3 N' {6 E+ h" Y* r{
* |. t' j9 j# [1 t" i" A2 P5 V/ Q2 B3 Z% P) G- r& {6 r
Name(_HID,EISAID("PNP0C09"))
# L/ W" O1 J# C5 T. `! [& g. L
$ o- h0 ]6 E8 B! r2 O5 g5 \: t0 z
Name(_GPE,0x06). x/ |8 h+ t' x. ^5 f; P
// KB_SCI

8 t; _" E( c3 M) K9 `9 r
) _; F7 C: C! S3 A4 V! M...

  ~1 D' @9 ^* y  P}
( H, J; I. A" n$ `Device EC里面宣告了ECKB_SCI接在了SB的哪个pin上,这样OS识别EC SCI的过程就和前面的SMI异曲同工了。最后一个问题OS如何检测到SCI产生了呢?前面SMI已经说过SB有一根SMI pin接到CPU,可以让CPU产生SMI,可是SCI并没有这样的pin,那么CPU怎么知道SCI产生的呢?我想到了两种可能:0 t0 g: T3 ~4 P  e
a.OS polling GPE register status bit1 ?! q6 V3 E+ ~) Q1 Z6 `+ ]
b.SCI通过8259或者APIC,产生IRQ/ z3 r' ~# D3 h/ A
Chipset spec印证了我的想法,SCI可以配置成通过8259/APIC的方式产生中断,而且中断向量也是可配置的如下图1所示:
; C2 h. J$ W1 m            
7 e: K7 A* Q: Z" L, [1 T8 Z; O$ d- D4 v% A

9 g; c& Y9 F: }$ {1 p  Y" ~, \, ?1 x. A: `- l/ w

; M; p6 _& V1 M6 f4 m
6 k9 A9 r( o# N& P* y8 ]7 n* }, a
8 T$ I% M- `, P5 t! Q
1
2 }# H1 L% r& ]6 X+ x' h
BIOS在设置好该寄存器后会将SCI INT信息存入ACPI FADT中,这样OS就可以通过FADT获得SCI使用的中断号码,从而能够在SCI产生时处理该中断,这部分请参考ACPI SPEC FADT部分。下图2是使用ACPIVIEW看到我的工作机的FADT dump,如图2所示我的机器ACPI使用APIC INT 9$ J# L8 F7 I% b8 Y
6 `) p3 z) B; o) W2 p0 [; s, i

+ X4 h1 x( @. l, ], O9 A9 [& H

1 t' o. X2 q7 Q6 \1 m$ T: D

# F* u* o2 l6 R9 K
2

8 }; L. m, c" \. Y2 r* |
5 m2 \# f. C* c4 r( y8 `+ ?Ø9 F0 m6 z- H9 P" G; c+ h
GPE
5 E9 a. g. F$ ?3 J
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(),就会被调用了。. E: c1 }' |2 I

; i  p6 B. k# Q1 I- ]% xThat’s all!
  H6 ]- c* d  D8 n4 |# N7 c

* B( N) f: k, z6 s1 zPeter

本帖子中包含更多资源

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

×
发表于 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 | 显示全部楼层
学习了。。
: b  F, z1 z: U( H9 q! E, w* J- f请问一下,1.热键 FN+Fx (F3)按下后,EC会发SCI通知OSPM吗?
9 n/ ~' t& q$ w/ m2.以ITE 8502为例,当FN+F3按下后,EC对应代码为:
: t8 e  z: P4 @( h3 ~# nHotKey_Fn_F3. j6 @3 R" T+ A4 R
{
$ s- Z  }  I" g. i    if ( event == MAKE_EVENT )5 r. U% H! {4 ~& Z$ H! d
    {
) T3 M5 H5 t( O# }" z0 ?        WriteSCI_QueryValue(_EVENT_HOYKEY_FN_F3);
) g% V; ^6 }3 ?. J( ^( _    }5 f$ w, A! R! J. ?9 j+ D6 W+ I
}
% d1 L( l' D+ T. D//#define _EVENT_HOYKEY_FN_F3         0x03 0 O2 M1 r* K- K# i0 s
这个 _EVENT_HOYKEY_FN_F3 是 _Qxx命令所指的ID吗?
回复

使用道具 举报

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

使用道具 举报

发表于 2009-9-24 16:59:22 | 显示全部楼层
建議將EC與其他周圍的設備通信的內容整一下~~如:EC&BIOS, EC&SB ~~~
; d4 J3 w# _: H+ H$ [3 `; \, z   對這部份比較懵懂~~
1 l5 G( z4 a- ?- c& }4 C# i7 b0 }2 J' B
多謝
回复

使用道具 举报

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

sci

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-5-16 06:52 , Processed in 0.256147 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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