我所知道的EC====>Battery
! N" j5 f" t$ k5 [* G8 G8 @; t: [* F# Q8 r: r- N' N7 l0 c& ^
5 O! u5 ?/ \% H; u1 j, D' ?% U1.Battery Information
' p" o1 e, ^( q* K. k% G
. n( x) ?9 ^1 Q$ x) v! e9 p, K, o
- g- k/ Z% t9 V1 ]8 `5 X 探测Battery的信息是EC一个重要的工作,OS也要通过读取ECRAM中的内容获取电池电量、温度、电压、充、放电电流、Battery是否存在的信息。那么EC如何获得这些信息呢?Battery通常是一个smbus device所以它会接在EC的一组smbus上,而Battery的spec上会给出Battery的smbus的地址以及读取Battery信息相关的命令。EC通过向smbus上送Battery的address,cmd然后就会取得相应的信息了。 6 o, x+ y. [ t5 [5 [/ Y4 f
. i& o2 h+ ^7 B% w7 M
7 z: |" _& H. @3 a+ Z/ ]2.Battery Charge&Discharge Algorithm
2 j& y( t. z2 w( l' n! O
1 a* }- M4 y* u+ b
: n7 _( w2 _# @" ^4 m4 _# l3 D1)Charge / H8 R' [: B' ~; E( e) I( `- P
充电的过程是这样的,AC in 的状态下Battery插入,这时EC会进入precharge mode进行小电流充电。如果precharge时间过长(通常是指超过一个小时)EC就会停止充电并且认为Battery dead,送给host一个Battery Fail的Event。在precharge mode如果充电电流增大到特定的数值后EC就会进入fastcharge mode快速充电。Battery 充满后停止充电。在这个过程中如果电池温度异常EC也会进行一些处理。这就充电的简单过程。
1 N. I! X4 i/ F Q- Q9 q2)Discharge
. e t- {8 o6 J) @7 s% B+ A. L AC out & Battery in这时Battery开始放电,在放电过程中如果电量小Critical Low,系统处于S0, EC会发Critical Event给host,然后OS紧急关机。系统处S3,EC将会唤醒OS。如果电量小于BattLowLowled将会被点亮(Battery Low Policy会详述)。另外放电温度也会被检测,如果温度过高将会做降频动作等。
0 m7 t7 m' j- v7 E
% Y4 q9 T( O" u- s4 w! f6 x9 E) L, c7 f- ?. t* _- X) N
- M k% y/ g$ x3 v- J K: f1 M- X3.LowLed Policy0 Q1 v! Z# I$ a, B8 E$ W+ d/ V
( ?( t& c1 P# X/ t; C G& Y( [
7 p; G& A5 J. @% M# y9 Q i" d1 \) T& v I6 i! p6 f
经常使用NB的话,大家可能会发现有一个led很有趣。插入AC充电时会看到一个黄色的led被点亮,电池没电了会看到一个红色的led亮,有时还会一闪一闪的。其实这就是EC导入的一个Function。黄色的led其实跟这个Function无关,它是充电指示灯,不过它和LowLed摆在一个位置。那么这个红色的LowLed什么时候会恒亮,什么时候会闪烁呢?当Battery的电量很低的时候也就是小于BattLow时,LowLed就会恒亮。当Battery Dead时LowLed就会闪烁,导致Battery Dead的原因有Prechage时间太长温度过高或过低。
- ~$ ]9 o: R y% [1 Q3 W' ?1 ^8 O' {6 L d) a" W
0 w6 k: A: l) N+ @
4.Battery Event9 r8 i, U2 a' H8 j- s O& d
; T0 z, S Q& B+ Y
& I: q- y' v3 f/ x" r
: j; t3 d( F) m0 R) H Battery在充放电的过程中,因为电量、电流、温度等原因EC需要向host端发送SCI Event,用于host在特定情况下采取相应的补救措施。
: ^5 N: `- t9 O u) r8 h& \
2 g$ ^' v' ~) P1)BattChgEvent
% K2 A5 x( h# N4 N- Y2 ~/ C/ I 当Battery插入或者拔出时EC会发送BattChgEvent通知Host,这时Host会读取ECRAM获得Battery是否存在的信息并更新系统端的显示。
# y5 t( v4 N' u; {. k$ \9 T1 _; M/ {; }; U$ z
2)BattWarnEvent
8 W% Q5 T/ w& _( I9 A 当Battery的剩余电量到达Battery Warning Level时,EC会发送BattWarnEvent通知Host,Host端收到后会给出提示信息。
7 D _ g( _" g9 I, h/ h8 M2 z6 G# g2 X* C
3)BattLowEvent
' x% w, g% ~8 l9 ?4 S 当Battery的剩余电量到达Battery Low Level时,EC会发送BattLowEvent通知Host,而且这时LowLed会恒亮。
2 q: Q [7 k+ I9 I- Z3 z% x5 d( n4)BattCrtEvent
. J5 t k2 B7 Q4 L" n" ` 当Battery的剩余电量接近0%时,EC会发送BattCrtEvent通知Host,Host收到后做shutdown动作。如果在很长的一段时间里(几十秒),Host还
0 g( m5 F; F0 v6 d3 C没有shutdown,那么EC将会Emergency Shutdown。# }& |3 `# w1 y& ?) H9 O/ u5 y
+ Z. {/ b: z4 Q; j3 A6 A2 j+ |% Y9 @7 Y( E
& D: |3 D7 C/ D7 h * h7 r8 O! d" F' a
6 F' v: X v1 o) I* | 6 m9 Q% o" d Z" Q7 N! \7 H9 {5 v
5.How to Debug Battery?- ~7 h$ b3 i9 H! p
5 g5 T3 O% Q& Y/ K
* Q4 \2 m5 o( V) N
3 ]; k) B) q; H1 T) F1 r* S& Z- ? EC通过smbus不断的获取电池信息, 所以电池信息在不断的变化之中。有些时候为了澄清问题,或者为了增加新的Function该如何Debu呢?我的做法是使用debug tool将smbus停掉,然后将一些符合条件的值通debug tool写入ECRAM中,然后验证相关的Function是否生效。另外如果是需要给BIOS发SCI Event,我会直接将Event填入SCI queue。然后驱动SCI,让SCI Event被发送出去。
) e4 E" c# e2 i' h( d5 {/ P2 B0 `$ ~0 X, S: }) }
" H2 g( V- w, M: EPeter |