|
我所知道的EC====>Battery
+ M3 L# c" F) J% }: H8 h! @) ?( Y- R) G N, D
& F! y; W* O5 f; p' h- K1.Battery Information
8 @" N. K6 i* {8 N" a0 X1 b # U5 h9 v; |$ C+ y1 N
. ?6 _+ C! E4 q+ F3 s, k% B: J3 y: \: {: R- r0 _( F9 @9 \
探测Battery的信息是EC一个重要的工作,OS也要通过读取ECRAM中的内容获取电池电量、温度、电压、充、放电电流、Battery是否存在的信息。那么EC如何获得这些信息呢?Battery通常是一个smbus device所以它会接在EC的一组smbus上,而Battery的spec上会给出Battery的smbus的地址以及读取Battery信息相关的命令。EC通过向smbus上送Battery的address,cmd然后就会取得相应的信息了。 6 e( O& E- t, j
/ g( C, o5 L& P6 [4 _ ! C* r3 q- q) k; ]; k7 b+ `
2.Battery Charge&Discharge Algorithm
+ n# G. S P- A( A) ^ y; y/ H+ c- h
! g' g- @4 S# J+ w" f/ E; L& S `( I2 @* m+ _; m
1)Charge 6 a$ f7 K) A6 t% {
充电的过程是这样的,AC in 的状态下Battery插入,这时EC会进入precharge mode进行小电流充电。如果precharge时间过长(通常是指超过一个小时)EC就会停止充电并且认为Battery dead,送给host一个Battery Fail的Event。在precharge mode如果充电电流增大到特定的数值后EC就会进入fastcharge mode快速充电。Battery 充满后停止充电。在这个过程中如果电池温度异常EC也会进行一些处理。这就充电的简单过程。 ) P5 ~$ K8 u) z* W0 {" V
2)Discharge 7 c5 N* x1 u" p! C# `( J6 f
AC out & Battery in这时Battery开始放电,在放电过程中如果电量小Critical Low,系统处于S0, EC会发Critical Event给host,然后OS紧急关机。系统处S3,EC将会唤醒OS。如果电量小于BattLowLowled将会被点亮(Battery Low Policy会详述)。另外放电温度也会被检测,如果温度过高将会做降频动作等。
+ H% o( V$ k1 i0 K4 Q% O! G
" Q# K9 F7 A8 `) Q$ }8 q3 t( [+ o8 L0 Z+ T/ e! N
1 i+ g6 q$ J9 |' X1 @; L8 Q) ?8 b3.LowLed Policy; \: Y2 D4 k: o0 J
9 r9 c% B. Y- U, S$ C; \
* p2 N5 S" n* R Q. Q. f# ~7 I- B' J3 l! J6 h/ V
经常使用NB的话,大家可能会发现有一个led很有趣。插入AC充电时会看到一个黄色的led被点亮,电池没电了会看到一个红色的led亮,有时还会一闪一闪的。其实这就是EC导入的一个Function。黄色的led其实跟这个Function无关,它是充电指示灯,不过它和LowLed摆在一个位置。那么这个红色的LowLed什么时候会恒亮,什么时候会闪烁呢?当Battery的电量很低的时候也就是小于BattLow时,LowLed就会恒亮。当Battery Dead时LowLed就会闪烁,导致Battery Dead的原因有Prechage时间太长温度过高或过低。
4 T; d: p" Q* Y6 \5 m# `) a+ d+ y0 U- q; a9 e/ I& L/ B |
' o- G7 H1 F7 \ f4.Battery Event
# B ]5 O5 ~# A5 }* w ' p. \( u4 a8 c$ c2 a1 l( u
- }+ O+ y5 S: M3 e1 S% R6 u0 }3 T& m' ^9 K, u8 \( o
Battery在充放电的过程中,因为电量、电流、温度等原因EC需要向host端发送SCI Event,用于host在特定情况下采取相应的补救措施。 0 \) P# F9 ], p6 }7 s# l3 d
6 H* I- i1 R, n B* b& s7 X- @
1)BattChgEvent
4 D! Y* U" \; Y8 O 当Battery插入或者拔出时EC会发送BattChgEvent通知Host,这时Host会读取ECRAM获得Battery是否存在的信息并更新系统端的显示。
* ?$ ?/ i/ T, I# M1 l$ @) K/ ^$ @- l+ D
2)BattWarnEvent
9 M/ a7 S$ U( S3 |! f 当Battery的剩余电量到达Battery Warning Level时,EC会发送BattWarnEvent通知Host,Host端收到后会给出提示信息。
: O* w4 ]0 L a% C# l f+ S( T
! b% }4 m% ^. z- `3)BattLowEvent 9 E/ j, H/ N, N, r
当Battery的剩余电量到达Battery Low Level时,EC会发送BattLowEvent通知Host,而且这时LowLed会恒亮。 1 q; R& Y) j& Z, ~+ |
4)BattCrtEvent 4 ]* b. f( \4 d8 Q* y7 s% G I
当Battery的剩余电量接近0%时,EC会发送BattCrtEvent通知Host,Host收到后做shutdown动作。如果在很长的一段时间里(几十秒),Host还
2 T! q( J/ c' g- K% Z& [8 a没有shutdown,那么EC将会Emergency Shutdown。2 d' |$ s9 P( s
" `% l4 T0 F: o" c7 W D Y1 O3 k. ]6 G9 {( t4 N5 R
$ [. f8 i7 W' f% U1 k2 P& z
; X6 ?: e5 M k1 J3 @+ Y
- u" R m& o! x& M # H; k# l4 ^8 h4 j) X/ F5 \3 i
5.How to Debug Battery?% b l6 k9 c) z
/ p8 C+ `8 H5 Q% J* Y; M6 p# \* J3 G/ `: S+ ?2 X, y
; f# ^8 b8 v* X; o: V8 T% \
EC通过smbus不断的获取电池信息, 所以电池信息在不断的变化之中。有些时候为了澄清问题,或者为了增加新的Function该如何Debu呢?我的做法是使用debug tool将smbus停掉,然后将一些符合条件的值通debug tool写入ECRAM中,然后验证相关的Function是否生效。另外如果是需要给BIOS发SCI Event,我会直接将Event填入SCI queue。然后驱动SCI,让SCI Event被发送出去。 . U3 z- {2 Z: B/ J
0 J8 V- k6 p% x6 }; u) l: I
0 S; a) x8 d9 ?% a; VPeter |