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

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

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

- V6 L9 ^# \2 x+ e3 M+ h
1 W' C" _- Q  p5 _5 P* z5 ]5 N1. Introduction" h$ y: D/ Q- I  z  _

6 I% [9 a, s3 {7 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
. _: }) Q& e" i) o, {/ K

9 X1 [9 ]$ y* p1 E9 s$ B/ {2. KBSMI#. g6 i% v! n% ^3 e
其实EC很少用到SMI,除了少数测试项比如DOS Fn+F2下切屏等。不过KBSMI#的实现原理还是很有趣的。它的原理是这样的:EC将一pin接在SB上,而SBGPIO有些具有multi function,可以配置成具有SMI/SCI的功能。BIOS code在初始化时将这个信息宣告给SMI Table。一旦EC发了一个SMI,EC接在SB上面这根pin( ]! h; V) i1 b1 \. d, l) e
status就会被置位,SB检测到以后通过拉接在cpuSMI pin产生一SMIcpu切换到SMM mode然后就会通过之前宣告的那些pinstatus identify smi Owner,这时就可以认出是ECSMI,随后通过下commandEC读取SMI event id,并通过该id去调用相关的method7 D( `+ }! k' _6 m2 k0 b: O
) l+ ], E) _( ~9 S: V, }
3. KBSCI#
9 D- C+ z: A, I' b7 `7 ^ØQ_EVENT2 t" A* }/ I3 b! h  v, M+ p- ]
所谓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 ...* z7 E7 C, t" }* T6 N8 G
6 Q7 A( E+ |$ e, v+ A* U  f
// AC Status Changed
/ G; w  u# s* F3 M& E/ e: T; E" B0 {) m
9 `1 }+ R9 F* m) l6 w, nMethod(_Q83)
% j# Q3 r( z& q2 o& q& M) C
- I6 E. e$ u& X: r6 B: ?2 ?  y
{

4 x3 X3 z# j5 ^$ r% n+ ?$ q& j' a* U1 o& W/ y# V
Store(0x83, DBG8)
- U( S" I! D/ A

* ]5 X/ T8 L, D& z
; \5 b' V+ R2 |9 fStore(0x00, Local0)
- m' ^) e; k" w2 ~
" e, v8 k4 q8 `+ O, ]
Store(POWS, Local0)

" w5 n* i/ p" ]" j8 b! K$ l% Q$ Y' d# I
If(LEqual(Local0,1))
3 ~" _+ O2 ]3 A/ _
* {$ E# h  P% q6 [# y2 q. {

) m. d/ g7 Q6 D% r5 w0 y; q1 s{

2 h5 _7 l0 F4 w- N0 l9 j
' m# ]  A& @; k% W3 GStore(1,\_SB.PCI0.SBRG.EC.ADP1.ACP)

/ J, @4 k5 j, ]2 _, [- f
5 W  ]  W; p8 ^2 h8 O}
9 k% d( E; s2 y( T0 n. w7 C! @
( T8 x6 [. [" ]& y8 T6 n6 g
else
$ A" p% p& ?" O' C, @5 \0 S1 C
$ f  n# ]/ ]$ W& _1 i
{
. I# [! z( V- t4 Y4 O2 S$ i
5 B, E1 n9 v( j# g5 u4 {
Store(0,\_SB.PCI0.SBRG.EC.ADP1.ACP)
& U6 Z9 B1 U- Z2 R6 I# Y  L/ r4 V
$ e1 k1 U  ?/ f/ Y
}

8 p* m( F" ^6 B
7 ]1 d" z# o: L( D% R1 ~, g# a' |Notify(\_SB.PCI0.SBRG.EC.ADP1,0x80)
' x: t8 T5 k& E& F, R0 s) S

4 N( h% T! \2 C. s" u! xNotify(\_PR.P001,0x80)
( q9 L3 b1 H7 K+ w. E/ M5 s/ I& e
4 \1 u0 ~, G, k- j9 o8 m
Notify(\_PR.P002,0x80)
/ X. n2 t/ B$ E- p: q
- q; J; Z$ X' x5 e0 P2 _' n0 d
}
) x7 M: A* W1 k+ u& r( t, H) C$ e
那么又有一个问题,那就是OS怎么知道这个SCIEC的呢?请看下面的asl code你就会明白了J  o/ D6 A& M! p- _( D
Device(EC)$ g8 g9 e& ^% ~3 E
{  q6 Y+ ?) J  U: z2 g+ c
1 A& C' `# B# Q3 U4 v* E. [+ [$ D/ n
Name(_HID,EISAID("PNP0C09"))
* _3 a2 K- r7 G; Q/ D% m
! k8 e7 h& E0 ]
Name(_GPE,0x06)+ a" Q2 `1 ]. ?! D$ S3 V
// KB_SCI
$ c9 O/ y' A% [2 m* c

8 J6 x# \2 x+ b3 q) T...

  X% l9 h$ d( R+ m}
2 u9 ]" d" V1 t; c9 D" W' mDevice EC里面宣告了ECKB_SCI接在了SB的哪个pin上,这样OS识别EC SCI的过程就和前面的SMI异曲同工了。最后一个问题OS如何检测到SCI产生了呢?前面SMI已经说过SB有一根SMI pin接到CPU,可以让CPU产生SMI,可是SCI并没有这样的pin,那么CPU怎么知道SCI产生的呢?我想到了两种可能:( M7 Y9 D7 M: v
a.OS polling GPE register status bit
. O; W0 G, O' [, ]6 Qb.SCI通过8259或者APIC,产生IRQ
3 q* b( y# y, `( dChipset spec印证了我的想法,SCI可以配置成通过8259/APIC的方式产生中断,而且中断向量也是可配置的如下图1所示:
) _4 Y) p1 L& `* k            $ ]) V8 P: B  ~8 x8 U- l- w
) h4 m( S( I+ N

7 \0 o. E2 E' v$ M7 D* P1 o- B
# x+ @7 M2 T4 A' R0 o. b9 o8 Y! D3 F
& y% ^; v" Y/ n" E0 k* x9 @+ r

2 P" l& h0 {( A+ U" T: |, \
% P9 N# k* ~7 S) v( j
1

$ i% b5 ?. k5 H5 s. |BIOS在设置好该寄存器后会将SCI INT信息存入ACPI FADT中,这样OS就可以通过FADT获得SCI使用的中断号码,从而能够在SCI产生时处理该中断,这部分请参考ACPI SPEC FADT部分。下图2是使用ACPIVIEW看到我的工作机的FADT dump,如图2所示我的机器ACPI使用APIC INT 9
) J  A' n" P) x6 |( e! y5 `
0 @7 w) I$ L$ P9 Z5 t! e
0 M3 U6 N* `# Y

+ B3 c* `* l: P# u  y

8 s! `( K% X/ V' Z% g1 i- _6 I0 w
2
0 c4 q7 x1 O. s8 }- a7 w, m

  J+ r3 k7 _4 o6 |/ g% IØ- I( Y+ c5 c5 Z5 B) _( T
GPE

2 f3 c: O$ F" [3 z0 V) `7 E  m% E. ZGPE其实是属于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(),就会被调用了。6 t# ~, I6 Q7 p, O! d3 T

; f/ t& L7 H! v7 x# xThat’s all!
) H- {) i+ u! d) d5 f; j: J: J

7 K7 v6 I$ ]! J6 f" IPeter

本帖子中包含更多资源

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

×
发表于 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 | 显示全部楼层
学习了。。
4 W8 S/ [: I5 [2 c! N, |* ~' s0 S请问一下,1.热键 FN+Fx (F3)按下后,EC会发SCI通知OSPM吗?
& r5 q' p7 |& @- T2.以ITE 8502为例,当FN+F3按下后,EC对应代码为:1 m( o9 ^  \/ I2 \# ?0 a, H3 U
HotKey_Fn_F37 C$ R, r% {. c6 Y* e
{
  J# Z; P+ B, @5 D! B0 Q    if ( event == MAKE_EVENT )4 L( ?& ]5 y- r! ~) w6 T
    {
5 N- r4 i# e1 g& l0 q        WriteSCI_QueryValue(_EVENT_HOYKEY_FN_F3); 6 L$ E; L. F2 c. S9 G* q
    }1 t) C0 c9 b4 a2 {
}
0 g* M& J2 M! p9 k# @//#define _EVENT_HOYKEY_FN_F3         0x03
# L$ K$ d. b, ^! }这个 _EVENT_HOYKEY_FN_F3 是 _Qxx命令所指的ID吗?
回复

使用道具 举报

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

使用道具 举报

发表于 2009-9-24 16:59:22 | 显示全部楼层
建議將EC與其他周圍的設備通信的內容整一下~~如:EC&BIOS, EC&SB ~~~
9 p# v& U! ]5 t6 N+ Y/ M   對這部份比較懵懂~~0 P6 V/ O' ?6 a/ j) s- d

, z6 i" {, B* w9 H# [( h" \多謝
回复

使用道具 举报

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

sci

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-23 21:20 , Processed in 0.077516 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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