我所知道的EC====>IDLE & RESET MODE
4 d4 F; L1 g# b, ]+ s8 `4 Q" e
- w$ ~ Y4 ?5 ~3 j' |* u) R4 h1. What’s this?; u' `6 K2 H, k9 n; l7 Y
6 c5 E4 d& F7 l3 A! i2 e! z
IDLE & RESET是EC的两种工作模式,从字面上看IDLE是空闲的意思而RESET则是复位的意思。他们的使用场景各有不同,IDLE主要是用在BIOS更新NVRAM区域,RESET则是用于flash bios的时候。2 ], M) t0 M; e2 x _' e
' i0 n. O3 R( e
2. Why & How?, y/ m8 g& ~1 h( [3 _; c9 d
# e% e8 ?4 z1 v- h$ Z0 o5 G$ ~0 N3 ?, G3 z, t2 x- f
ØIDLE Mode
- b5 }. \; q5 y" V+ W1 m2 z% D g9 U6 R' t4 z- j/ B& B, ?# T$ j8 |
BIOS在post过程中会多次进入IDLE Mode,用于保存一些系统$ T% N" a0 p* z/ t( F" t$ i
设置,以及保存硬件资源供OS获取。那么这些操作跟EC有什么关系呢?原因是NVRAM包含多个区域,有些部分保存在CMOS之中,可是还有很多信息保存在ROM之中,很多时候BIOS和EC code 放在一颗ROM之中,那么这时就非常有必要让EC进入IDLE mode。另外BIOS在更新NVRAM的时候,EC端有可能通过KBSMI/KBSCI以及其他一些接在SB上的pin影响到BIOS(这部分纯属猜测J)。IDLE Mode的实现过程是这样的,当BIOS需要跟新NVRAM时,它发命令告诉EC,EC收到命令后关掉LPC(假设EC通过LPC连到SB)的write protection,然后EC保存寄存器的内容,关掉中断只保留一个唤醒源(如EC host command wake up),然后回给BIOS “FA”表示进入IDLE,最后一步停掉8051 clock真正进入IDLE。那么为什么要先回”FA”然后再进IDLE呢,因为进IDLE以后8051 clock停掉了,EC无法跑code了,这样也造成了一个隐患,有时BIOS收到”FA”就开始更新NVRAM了,可是这时EC还没有进入IDLE mode(EC的速度和host没法比)那就惨了,系统可能会hang住,我就遇到过这样的bugL,所以BIOS收到”FA”最好delay一段时间。BIOS更新完成后给66port随便送个command,EC就会从IDLE恢复了。1 @9 I7 b0 Y2 a* G. Y, ^
" a! n0 p7 H) `3 ]% y
ØRESET MODE
9 ] d8 U$ y7 Q$ r5 W) p1 x. C5 o; g0 Q. C5 o* h6 ~5 `. I- @5 c
在flash bios的时候,BIOS会发命令让EC进入RESET mode,只所以称之为RESET,是由于ROM更新以后EC要重新开始跑code,所以有一个RESET的动作。RESET mode的做法是EC停掉sustain fetch,也就是说EC不去预取指令了,需要跑一条指令才会去抓一条。然后EC关掉所有中断并关掉Write Protection,让风扇全速转(因为刷BIOS时能耗比较大温度会很高),回给BIOS ”FA”,接下来EC就会进入死循环。BIOS通过backdoor修改EC register让8051 pc停在0地址处。然后BIOS开始flash,flash完成后BIOS将会通过back door修改EC register 让8051 reset pc复位,这时EC就会重新加载新的code开始run。
' i$ p3 ?% s( D, Q( H4 e, V/ Y- r! q" ?6 t
$ E" H# Q0 z% r* ~( Y. ~
以上就是IDLE &RESET Mode的完整过程。. e7 N+ P9 S0 p3 v& u) ?, @" z
p2 j9 g0 B7 W8 r. K4 Q1 A
+ x6 w( X% [; y; W# e: [0 G8 w( h4 ?8 R) _! b6 l/ o h8 C
Peter |