|
我所知道的EC====>Battery # V% z% R' B4 d
9 S4 w% P2 s( \4 q# E5 Y# M) x
' h/ C2 l y( G* O
1.Battery Information
6 ]! ^& [+ a# w) F# c
: F4 q; y" B7 E: v/ e% G& I# v) C6 N3 S# E. r! d; v' k. h6 I& n* g; u
6 K6 g$ B' d3 C- ^1 k0 j, T& I7 }, I
探测Battery的信息是EC一个重要的工作,OS也要通过读取ECRAM中的内容获取电池电量、温度、电压、充、放电电流、Battery是否存在的信息。那么EC如何获得这些信息呢?Battery通常是一个smbus device所以它会接在EC的一组smbus上,而Battery的spec上会给出Battery的smbus的地址以及读取Battery信息相关的命令。EC通过向smbus上送Battery的address,cmd然后就会取得相应的信息了。
. w( F9 X% q: {# g
: x2 }9 R' w; S + m; v Q, ]7 {( r1 x! `* B' v
2.Battery Charge&Discharge Algorithm : e7 K: q6 |. D- d3 @
! P: r- e' G) {
! A7 N+ L8 B) V) d2 H1)Charge
. ~# F# C: i4 A 充电的过程是这样的,AC in 的状态下Battery插入,这时EC会进入precharge mode进行小电流充电。如果precharge时间过长(通常是指超过一个小时)EC就会停止充电并且认为Battery dead,送给host一个Battery Fail的Event。在precharge mode如果充电电流增大到特定的数值后EC就会进入fastcharge mode快速充电。Battery 充满后停止充电。在这个过程中如果电池温度异常EC也会进行一些处理。这就充电的简单过程。 6 \9 X9 j l0 k' w! M3 X, z
2)Discharge
9 n4 m6 A( r1 v L AC out & Battery in这时Battery开始放电,在放电过程中如果电量小Critical Low,系统处于S0, EC会发Critical Event给host,然后OS紧急关机。系统处S3,EC将会唤醒OS。如果电量小于BattLowLowled将会被点亮(Battery Low Policy会详述)。另外放电温度也会被检测,如果温度过高将会做降频动作等。
; |0 S! V3 I& c! e$ M, p/ U8 \; F4 W! q+ ~& E6 }
7 X9 a, z/ @1 h- t
( [$ A3 r% F7 v& `* |
3.LowLed Policy
6 s; Q) {' U* |4 o; l9 T0 i % z) X( y+ J3 s+ j* l" n
$ q, n4 d D a+ G# e
3 U8 v' X1 A+ w8 a/ W
经常使用NB的话,大家可能会发现有一个led很有趣。插入AC充电时会看到一个黄色的led被点亮,电池没电了会看到一个红色的led亮,有时还会一闪一闪的。其实这就是EC导入的一个Function。黄色的led其实跟这个Function无关,它是充电指示灯,不过它和LowLed摆在一个位置。那么这个红色的LowLed什么时候会恒亮,什么时候会闪烁呢?当Battery的电量很低的时候也就是小于BattLow时,LowLed就会恒亮。当Battery Dead时LowLed就会闪烁,导致Battery Dead的原因有Prechage时间太长温度过高或过低。
1 w0 F) A9 z9 }* ~: c9 a
0 d1 w2 c! L t6 L
! c! }, T! ]7 k% b( b1 C4.Battery Event. u: H% q! ?1 N4 ^0 {9 E2 `
+ E s2 E) z& n
N) B3 t7 ]8 C: z7 J; _/ Y* U- x' J4 f* H" G* V. f
Battery在充放电的过程中,因为电量、电流、温度等原因EC需要向host端发送SCI Event,用于host在特定情况下采取相应的补救措施。 % d& ~: i3 H" Q! X, Y
5 X+ {, ~" h! L* Y" o* k4 M5 W- Y+ j
1)BattChgEvent " v5 J, z8 B2 Z y n/ \1 x
当Battery插入或者拔出时EC会发送BattChgEvent通知Host,这时Host会读取ECRAM获得Battery是否存在的信息并更新系统端的显示。 8 ?# N9 Y" p9 q9 o- n! T
2 d. k& e9 b) j6 }: H
2)BattWarnEvent : d, q: W7 k# ?
当Battery的剩余电量到达Battery Warning Level时,EC会发送BattWarnEvent通知Host,Host端收到后会给出提示信息。 1 b# F R9 ^! W; w
1 g3 |( q' o+ [9 W2 \3)BattLowEvent
, q: n/ m/ }; M# X! j0 F2 {+ X, [ 当Battery的剩余电量到达Battery Low Level时,EC会发送BattLowEvent通知Host,而且这时LowLed会恒亮。
, ^+ q- @) p( u. v+ i$ |6 ?4)BattCrtEvent
* V( ] y% @! s9 v3 ]+ d1 y 当Battery的剩余电量接近0%时,EC会发送BattCrtEvent通知Host,Host收到后做shutdown动作。如果在很长的一段时间里(几十秒),Host还
, s3 F8 Y$ M: n! s没有shutdown,那么EC将会Emergency Shutdown。7 ]) n) \! K+ H& h P! Z& d
* |' G% q2 `4 p* f% a5 P& Y2 M
; r! T; B3 R0 b
( L/ y2 F$ F3 A$ _ : E$ A9 R8 ? \* S
; z2 K8 }7 O% y6 S, H4 u
/ }+ B# F; I! T( [ u, p7 Y% `
5.How to Debug Battery?
" r2 `( o1 f% _+ {% ~, } . F. v+ S. Z: [
# x! J2 `9 `+ R
, v/ K8 p' g9 l
EC通过smbus不断的获取电池信息, 所以电池信息在不断的变化之中。有些时候为了澄清问题,或者为了增加新的Function该如何Debu呢?我的做法是使用debug tool将smbus停掉,然后将一些符合条件的值通debug tool写入ECRAM中,然后验证相关的Function是否生效。另外如果是需要给BIOS发SCI Event,我会直接将Event填入SCI queue。然后驱动SCI,让SCI Event被发送出去。
$ k5 r, k* B2 _0 v0 x, M5 }0 V
) d! D" c" m; V/ ]; C/ K
5 }/ E, F! X- P. K; X( b- f* oPeter |