|
我所知道的EC====>Battery 6 A' M5 E$ d% B, d. Z8 e4 T- x, U k
Y }, H g- B" v$ s2 p. X
* k1 c% \ K' H
1.Battery Information" w2 v/ ^+ C; Q) d
1 k% G$ H# K O0 h; l
; d5 |+ y% ~4 c1 Q9 d; M: R9 Y H+ Z
探测Battery的信息是EC一个重要的工作,OS也要通过读取ECRAM中的内容获取电池电量、温度、电压、充、放电电流、Battery是否存在的信息。那么EC如何获得这些信息呢?Battery通常是一个smbus device所以它会接在EC的一组smbus上,而Battery的spec上会给出Battery的smbus的地址以及读取Battery信息相关的命令。EC通过向smbus上送Battery的address,cmd然后就会取得相应的信息了。
$ e9 X( i0 g2 N! ~6 ~0 m9 E0 y$ [# v! r2 q; J" H; E
* P4 W( p3 d1 Z0 x0 Y2.Battery Charge&Discharge Algorithm - w+ u e6 ~' E$ z6 ?3 k0 N
) K5 ^8 C# Z6 f& D0 z. a
# x5 {2 g l# _2 s G1 M2 k
1)Charge 1 ]3 v4 ]5 X' b7 q9 y! q
充电的过程是这样的,AC in 的状态下Battery插入,这时EC会进入precharge mode进行小电流充电。如果precharge时间过长(通常是指超过一个小时)EC就会停止充电并且认为Battery dead,送给host一个Battery Fail的Event。在precharge mode如果充电电流增大到特定的数值后EC就会进入fastcharge mode快速充电。Battery 充满后停止充电。在这个过程中如果电池温度异常EC也会进行一些处理。这就充电的简单过程。
4 `6 d2 F! V4 W3 m2)Discharge
9 o- B" |4 E8 U9 T7 [; q7 c$ X AC out & Battery in这时Battery开始放电,在放电过程中如果电量小Critical Low,系统处于S0, EC会发Critical Event给host,然后OS紧急关机。系统处S3,EC将会唤醒OS。如果电量小于BattLowLowled将会被点亮(Battery Low Policy会详述)。另外放电温度也会被检测,如果温度过高将会做降频动作等。
6 o; D( e7 Y$ r: |6 b) f; Y! W1 H1 w0 |4 ^. ]* g! o
* X( q7 D. Z9 U; o
4 |! ?9 A4 ], e9 w7 b$ p5 @+ L ~3.LowLed Policy% Q/ ^, I S% R( p2 K
9 a* c2 q$ O$ \* D' m
9 Z6 q% V3 y Q9 ^ d! w
: g: S$ U( D4 w5 j 经常使用NB的话,大家可能会发现有一个led很有趣。插入AC充电时会看到一个黄色的led被点亮,电池没电了会看到一个红色的led亮,有时还会一闪一闪的。其实这就是EC导入的一个Function。黄色的led其实跟这个Function无关,它是充电指示灯,不过它和LowLed摆在一个位置。那么这个红色的LowLed什么时候会恒亮,什么时候会闪烁呢?当Battery的电量很低的时候也就是小于BattLow时,LowLed就会恒亮。当Battery Dead时LowLed就会闪烁,导致Battery Dead的原因有Prechage时间太长温度过高或过低。 ; q) G+ M- F$ P# q8 f5 M" a
( v5 M4 O! s1 i$ f+ H/ L7 o
x5 Z7 X4 d9 M6 }9 d( z: u7 `
4.Battery Event( r- i% k) k" W" x; S
* g: G- H. ^! `) z5 a$ E
, z" ?1 b* v- I+ R/ E; S7 `; b0 _
% T4 {7 @+ d3 n+ n4 u Battery在充放电的过程中,因为电量、电流、温度等原因EC需要向host端发送SCI Event,用于host在特定情况下采取相应的补救措施。
1 ~* ?5 h; K" B# s1 T) {. ~
' `7 f' |0 p1 M2 `' X/ G( F
1)BattChgEvent
# H% ?) U9 Y" t! H( N1 h 当Battery插入或者拔出时EC会发送BattChgEvent通知Host,这时Host会读取ECRAM获得Battery是否存在的信息并更新系统端的显示。 ) G" X( ]0 `4 D2 p( w* {
( j/ ]& s6 p" W5 {& k# E6 d+ b2)BattWarnEvent
$ R6 [# B- {% J2 i6 A( P 当Battery的剩余电量到达Battery Warning Level时,EC会发送BattWarnEvent通知Host,Host端收到后会给出提示信息。
, F+ |7 v. a2 p7 _: B3 F. m. V# ?% o" V \2 Q) o* m0 z F
3)BattLowEvent
8 [3 ?+ N6 } s: e 当Battery的剩余电量到达Battery Low Level时,EC会发送BattLowEvent通知Host,而且这时LowLed会恒亮。 1 |: }- C) a( ?# { w. [% v) L$ w, Z; e
4)BattCrtEvent 8 T* l, W4 r- r$ {7 H, n; D
当Battery的剩余电量接近0%时,EC会发送BattCrtEvent通知Host,Host收到后做shutdown动作。如果在很长的一段时间里(几十秒),Host还
7 C; W7 B- K0 A没有shutdown,那么EC将会Emergency Shutdown。
! I, `9 i0 E% P9 Y9 l0 e
" d6 k0 N' W" l+ }- D' u2 _% R; v0 S# Q6 \$ Z
' |! @- X1 L3 Q& n( w
4 }. _5 Q$ X* F7 e3 E7 B/ V+ y
1 S0 W$ \! _: V3 C+ W
% s! Q4 N6 K1 y- Y& d( W5.How to Debug Battery?
?1 f6 W% R% u2 |. y8 c! P- u; x
5 N8 o0 u* _7 V" K k9 R7 w( e9 l3 |+ U; @& y' U' m+ o
1 S7 `- i4 O; l( G- l
EC通过smbus不断的获取电池信息, 所以电池信息在不断的变化之中。有些时候为了澄清问题,或者为了增加新的Function该如何Debu呢?我的做法是使用debug tool将smbus停掉,然后将一些符合条件的值通debug tool写入ECRAM中,然后验证相关的Function是否生效。另外如果是需要给BIOS发SCI Event,我会直接将Event填入SCI queue。然后驱动SCI,让SCI Event被发送出去。 # l$ @- `$ z" x0 p5 j7 h4 S- N8 q
+ e! x5 h8 D; |: B- k - p% d2 O% Q6 K( V4 @8 L
Peter |