|
我所知道的EC====>Battery 9 G- @0 Y- ~& d
4 Y c' m8 ~; P3 ?9 ?. \ # i2 S, T, Z3 @/ q. n* H
1.Battery Information
; O+ h0 o: O5 @# m6 [& r' _" p " s: k/ {5 E1 ~6 }/ J, x& W* \; {
. S1 A$ o% F2 H# `4 h6 G
* N) J) M% M) l- G& y+ [. e 探测Battery的信息是EC一个重要的工作,OS也要通过读取ECRAM中的内容获取电池电量、温度、电压、充、放电电流、Battery是否存在的信息。那么EC如何获得这些信息呢?Battery通常是一个smbus device所以它会接在EC的一组smbus上,而Battery的spec上会给出Battery的smbus的地址以及读取Battery信息相关的命令。EC通过向smbus上送Battery的address,cmd然后就会取得相应的信息了。
. i% h( C" u/ o+ t+ O% k `* {* |, b
3 Z3 c+ T' B k' [, A# M3 v4 A
2.Battery Charge&Discharge Algorithm
# I1 j, O8 o# W1 i+ H' @. k ' [. s# x+ @1 t% Z% Z( h
3 t* @8 R1 Z0 r9 T1)Charge C# ^: |) `8 Y: K$ M3 z
充电的过程是这样的,AC in 的状态下Battery插入,这时EC会进入precharge mode进行小电流充电。如果precharge时间过长(通常是指超过一个小时)EC就会停止充电并且认为Battery dead,送给host一个Battery Fail的Event。在precharge mode如果充电电流增大到特定的数值后EC就会进入fastcharge mode快速充电。Battery 充满后停止充电。在这个过程中如果电池温度异常EC也会进行一些处理。这就充电的简单过程。
* Q5 B+ w% n: o9 A! i% k' F: I' U" H" z2)Discharge
: U6 y3 B- n* Y: \0 k AC out & Battery in这时Battery开始放电,在放电过程中如果电量小Critical Low,系统处于S0, EC会发Critical Event给host,然后OS紧急关机。系统处S3,EC将会唤醒OS。如果电量小于BattLowLowled将会被点亮(Battery Low Policy会详述)。另外放电温度也会被检测,如果温度过高将会做降频动作等。
H( V! b- K1 l1 e+ T, K! ` ^# w/ d' E) W
5 A7 R0 s" V& x) s6 X , A3 a, {: \3 k0 U0 L: j( P
3.LowLed Policy* Z& r6 h. i! G! ^) {) w& M
" _3 F4 C @: Y, O. _8 m: m# U. }5 x( }% p" [7 l6 b' {
( J) d8 A5 y) O 经常使用NB的话,大家可能会发现有一个led很有趣。插入AC充电时会看到一个黄色的led被点亮,电池没电了会看到一个红色的led亮,有时还会一闪一闪的。其实这就是EC导入的一个Function。黄色的led其实跟这个Function无关,它是充电指示灯,不过它和LowLed摆在一个位置。那么这个红色的LowLed什么时候会恒亮,什么时候会闪烁呢?当Battery的电量很低的时候也就是小于BattLow时,LowLed就会恒亮。当Battery Dead时LowLed就会闪烁,导致Battery Dead的原因有Prechage时间太长温度过高或过低。 2 a) {) } c! ?2 S- z, |: E7 T
8 N9 u; l3 n( X& f2 C' |
, r: l! s' {* F ], E4.Battery Event" r7 d9 u$ T1 o4 i, s' e
! o& \# N" J2 U, b" O5 E/ \; M6 K
! J7 A4 m( T8 T9 t
U9 }" n$ G; @; }# K Battery在充放电的过程中,因为电量、电流、温度等原因EC需要向host端发送SCI Event,用于host在特定情况下采取相应的补救措施。
8 N n9 m+ _$ b: C' {- R2 k( S9 l
" T( E/ j7 Q4 l1)BattChgEvent
& l! L m0 j( _/ t* x/ Q 当Battery插入或者拔出时EC会发送BattChgEvent通知Host,这时Host会读取ECRAM获得Battery是否存在的信息并更新系统端的显示。 8 J; f& ^& R3 j3 @$ b( d$ I
; e; ]: i) v+ [5 J6 B; T
2)BattWarnEvent . }# n! G+ R& K
当Battery的剩余电量到达Battery Warning Level时,EC会发送BattWarnEvent通知Host,Host端收到后会给出提示信息。 % M1 n" B! t* }( P3 m! h0 e6 x( y
$ H: i' P, d) ^) n3)BattLowEvent ) V, @% W- D, X4 R* O
当Battery的剩余电量到达Battery Low Level时,EC会发送BattLowEvent通知Host,而且这时LowLed会恒亮。
, e: t. z! e; w1 A9 u& e$ s( [4)BattCrtEvent ! P% |0 g' X3 o0 H' b5 c
当Battery的剩余电量接近0%时,EC会发送BattCrtEvent通知Host,Host收到后做shutdown动作。如果在很长的一段时间里(几十秒),Host还
( w0 [7 ~3 P4 H1 T没有shutdown,那么EC将会Emergency Shutdown。
/ X& E7 n6 p& ]5 J % {4 v2 [6 ^) R8 ?* p: Y
" J6 Q& Q& d. D/ f
4 m6 P. c! `1 M7 P1 M" X! H H. B3 D & p+ X. }3 a, E6 k Z( o8 V
+ S$ t& O# a* Y0 d! T2 s$ p$ ?
% G, ]8 L; X1 A Q( H2 X& `; q7 ~5.How to Debug Battery?
3 w3 ~: O; e) a3 u* W 2 l; d* K8 I- `8 r1 V
5 _$ f1 o" ] j8 j2 P: H# I$ r- n9 m5 S& u3 s- c' f3 L K X$ e- H; o
EC通过smbus不断的获取电池信息, 所以电池信息在不断的变化之中。有些时候为了澄清问题,或者为了增加新的Function该如何Debu呢?我的做法是使用debug tool将smbus停掉,然后将一些符合条件的值通debug tool写入ECRAM中,然后验证相关的Function是否生效。另外如果是需要给BIOS发SCI Event,我会直接将Event填入SCI queue。然后驱动SCI,让SCI Event被发送出去。
& ^* ]: i4 k( x1 Z
4 G I [. O3 ?
2 m! |8 o6 x6 |% G8 \$ K: aPeter |