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

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

[复制链接]
发表于 2009-5-6 13:45:15 | 显示全部楼层 |阅读模式
我所知道的EC====>KBSMI&KBSCI
; u/ r7 K) {  q8 a6 z4 k

0 Z6 H+ t; i' V! J1. Introduction
8 H- X: Q! c5 x  P3 ~; f3 L+ V0 C2 y
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 I5 B* {* g% H+ _

4 {# E$ a9 ]2 G" N3 U1 C2. KBSMI#
( O, L! s$ C0 Q其实EC很少用到SMI,除了少数测试项比如DOS Fn+F2下切屏等。不过KBSMI#的实现原理还是很有趣的。它的原理是这样的:EC将一pin接在SB上,而SBGPIO有些具有multi function,可以配置成具有SMI/SCI的功能。BIOS code在初始化时将这个信息宣告给SMI Table。一旦EC发了一个SMI,EC接在SB上面这根pin
; J1 ]8 [0 z8 d- c- W' _status就会被置位,SB检测到以后通过拉接在cpuSMI pin产生一SMIcpu切换到SMM mode然后就会通过之前宣告的那些pinstatus identify smi Owner,这时就可以认出是ECSMI,随后通过下commandEC读取SMI event id,并通过该id去调用相关的method
& c5 d7 z5 D0 Q
- `: [9 i- F" F, q+ [& c! k3 l3. KBSCI# 2 b; @1 ^! U, Q
ØQ_EVENT
! V# p+ @  T3 @" ?所谓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 ...$ y/ T: N" F. ^3 Q
. r- y+ v: f  }) r% }2 h$ h- X
// AC Status Changed% E: p) z! L4 q) k$ }8 G% q) N) P& H$ h

+ W' V% r9 ?" }Method(_Q83)
5 W( c7 c8 o6 L1 K7 q

# j# g. _" k  i. x% ~{
  b% r2 ]8 o$ |$ |* M& u( @

( b& J3 L+ k( B2 {9 k/ \+ w  ZStore(0x83, DBG8)

5 Z1 Y4 w  `3 H! g, F
9 r4 w' V+ B- Z) ^  k& y+ r( U+ y3 F& [" v" `5 a2 e1 u) g! ^
Store(0x00, Local0)
: n4 Q; g  z9 B* L: k- v' G3 C
# l$ y, _( [1 q
Store(POWS, Local0)
$ \3 n. n. S4 R
  V  A. L+ o6 G7 X
If(LEqual(Local0,1))/ M% M7 t) A  u& S# B5 x
0 i$ {9 U* l8 P, Y

: F1 ]% o# \9 e" B, O( e4 l# W! y{

# d8 K; M; j2 {& c( [5 I( \2 w' G- y, C  K) w3 |2 T$ c
Store(1,\_SB.PCI0.SBRG.EC.ADP1.ACP)

4 X( K' u  J0 b' A4 o% c, r5 }6 O# ~7 B/ f2 v! [0 v( b
}

: Z4 C  v# g1 O7 ]$ w9 K/ M( c! b1 o8 @- B5 x, {4 H
else

9 P) A6 [5 v' I  t" f2 D; D$ f9 m5 H+ J7 S5 B
{

% C3 I9 q6 }2 B$ Y7 p! U# `  J
9 K7 c+ c2 F# h, d( d+ d, l* ^( z+ LStore(0,\_SB.PCI0.SBRG.EC.ADP1.ACP)

( q, S) H5 c$ I! O
* p* d2 S: P; n& Q}
6 Z# d9 W5 c5 r: Q

3 v4 f! ?" \" A+ C- g7 ~, L1 zNotify(\_SB.PCI0.SBRG.EC.ADP1,0x80)

7 E  L( p$ S0 E4 N6 S% }  D( m* n% s5 I
Notify(\_PR.P001,0x80)
  E8 S9 W& h* y) I
* B% T) C* {  J* Y1 S
Notify(\_PR.P002,0x80)

( m# H/ ~, C8 C) S- n( p/ T1 Q$ q& E1 m! N- c! U
}

, z0 l, {7 y7 F; E- x! ]- F那么又有一个问题,那就是OS怎么知道这个SCIEC的呢?请看下面的asl code你就会明白了J
2 {2 l$ Y* K4 s: N+ A7 XDevice(EC)
( G' I4 l, U# B6 |{1 v% b" R* b# H
) t; Y7 v) |' }7 b+ }* `- U- s+ i
Name(_HID,EISAID("PNP0C09"))

7 ?+ L3 u8 x/ }$ v. f; G
9 ?. r* }- n9 y7 CName(_GPE,0x06), B* [$ D/ q& c; A1 \
// KB_SCI

) v' E5 ~# J6 J" b& P" T5 e4 ?6 W# L' }% C
...

* p& E7 W% b- `" `) u1 R6 s3 u}
. c0 }/ ?6 H( @, ADevice EC里面宣告了ECKB_SCI接在了SB的哪个pin上,这样OS识别EC SCI的过程就和前面的SMI异曲同工了。最后一个问题OS如何检测到SCI产生了呢?前面SMI已经说过SB有一根SMI pin接到CPU,可以让CPU产生SMI,可是SCI并没有这样的pin,那么CPU怎么知道SCI产生的呢?我想到了两种可能:6 x0 c, }4 i. k$ Z1 b8 C
a.OS polling GPE register status bit
% h8 c& U; x: Z* C# E# Nb.SCI通过8259或者APIC,产生IRQ& s( F# }, n4 ^8 F# [
Chipset spec印证了我的想法,SCI可以配置成通过8259/APIC的方式产生中断,而且中断向量也是可配置的如下图1所示:
  ~/ G, {% S+ l, u, i0 H            ; f9 Z' F+ {6 Z$ v
8 i& q% v  }* q  u# I4 |

9 n' z8 e, O- ?$ R) A8 J$ \  I. k
+ i# T9 t; v) R9 b+ K. ~! S6 ^( s
( ]5 T+ V% U- n7 Z% ~6 \

6 t$ P6 N, [9 }
1
. [+ H, \# Y9 x2 O; R
BIOS在设置好该寄存器后会将SCI INT信息存入ACPI FADT中,这样OS就可以通过FADT获得SCI使用的中断号码,从而能够在SCI产生时处理该中断,这部分请参考ACPI SPEC FADT部分。下图2是使用ACPIVIEW看到我的工作机的FADT dump,如图2所示我的机器ACPI使用APIC INT 9& F) x3 q7 e4 c1 `4 R2 q9 t

0 c' R4 L6 w+ z) u5 H1 {9 Q

3 N0 b0 D  d  f7 U9 B/ k

! A/ b5 G  f2 k2 i0 ?

7 t% U6 B: Y2 C3 u+ m3 J  r
2

+ S/ y) F0 u- U) B8 G
1 b- j5 X$ ]; Z9 g5 NØ
) d2 j9 [  h/ b% v" g
GPE

# r0 o, p9 v, m! aGPE其实是属于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(),就会被调用了。" ^) j4 a$ w& V0 V  l7 {1 O
# S/ \* o8 F5 ]
That’s all!
. g0 q% I( \- [- B
  f$ P3 Y9 L8 \' N1 _7 y3 n& [, }+ S
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 | 显示全部楼层
学习了。。& N5 o/ y3 H3 V) D
请问一下,1.热键 FN+Fx (F3)按下后,EC会发SCI通知OSPM吗?
! e, L1 A& W( A& r6 ^, E2.以ITE 8502为例,当FN+F3按下后,EC对应代码为:* S/ \1 \3 I: w& T& e
HotKey_Fn_F3
6 h( q8 C- ^- k5 n" u1 B/ N{
) e5 l2 |  U0 P+ J: j    if ( event == MAKE_EVENT )
. w* [  }& H, |" w  `* {! `8 d    {) B4 o  m4 L1 g/ v# j6 V
        WriteSCI_QueryValue(_EVENT_HOYKEY_FN_F3); ; `6 v% [  u$ u3 X$ H9 F4 T
    }' s0 Y% ]2 A( g5 f
}
9 z$ o" _. G' z* M+ `1 i  T: w//#define _EVENT_HOYKEY_FN_F3         0x03
+ W9 f  P: _9 Z3 n这个 _EVENT_HOYKEY_FN_F3 是 _Qxx命令所指的ID吗?
回复

使用道具 举报

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

使用道具 举报

发表于 2009-9-24 16:59:22 | 显示全部楼层
建議將EC與其他周圍的設備通信的內容整一下~~如:EC&BIOS, EC&SB ~~~6 e+ V# x* F2 ^3 X! h( L! n  L
   對這部份比較懵懂~~
3 K" c7 s- e4 Z1 e, k+ `
0 I5 x% _2 [7 M+ P% D* 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 10:57 , Processed in 0.030175 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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