我所知道的EC====>Battery - b# ?, E6 p0 w' Q8 z, V% B' R
! t( k! f5 |2 `$ p5 r: i' E. G
i/ J/ G; q1 s- K6 J4 N1.Battery Information
1 G t- y5 p5 Y, T! L6 Z# G
. K$ R8 G( j: r" q6 S: F9 c' l( _+ X# f# D* f6 {3 O0 t
& I! ~$ Q B& B3 T( t# a 探测Battery的信息是EC一个重要的工作,OS也要通过读取ECRAM中的内容获取电池电量、温度、电压、充、放电电流、Battery是否存在的信息。那么EC如何获得这些信息呢?Battery通常是一个smbus device所以它会接在EC的一组smbus上,而Battery的spec上会给出Battery的smbus的地址以及读取Battery信息相关的命令。EC通过向smbus上送Battery的address,cmd然后就会取得相应的信息了。
7 L; ^8 f* r( I6 V4 h
8 s( `; J- c4 ^ f" Y, \3 j& V d" I 9 Y8 |% {7 E. u9 S7 O1 N6 F+ |& X
2.Battery Charge&Discharge Algorithm 2 K1 A; {* @2 @% f
7 Y0 h# ^: x$ E6 N2 A5 s
% w" Z3 ]* w# H G1)Charge ) p4 h4 A- _2 W# A5 N
充电的过程是这样的,AC in 的状态下Battery插入,这时EC会进入precharge mode进行小电流充电。如果precharge时间过长(通常是指超过一个小时)EC就会停止充电并且认为Battery dead,送给host一个Battery Fail的Event。在precharge mode如果充电电流增大到特定的数值后EC就会进入fastcharge mode快速充电。Battery 充满后停止充电。在这个过程中如果电池温度异常EC也会进行一些处理。这就充电的简单过程。 5 U2 D) F6 _' C) O
2)Discharge
( C) ]! {* c( u7 }' y# B' J/ F$ C AC out & Battery in这时Battery开始放电,在放电过程中如果电量小Critical Low,系统处于S0, EC会发Critical Event给host,然后OS紧急关机。系统处S3,EC将会唤醒OS。如果电量小于BattLowLowled将会被点亮(Battery Low Policy会详述)。另外放电温度也会被检测,如果温度过高将会做降频动作等。
4 r$ a. B" J' u& R8 A
. |* B" Q; \! B+ c+ H' x' V {0 P8 N. z$ v
* g- t) l: C0 U6 \) T* }3.LowLed Policy
6 j1 w& t/ w6 m% n1 D, L+ s ' m- R; y' W4 {9 o( Q- W
' e. g9 z0 b' J- t4 [* ~; m) ~
' V- d* `9 ^! r7 q1 u6 y; p 经常使用NB的话,大家可能会发现有一个led很有趣。插入AC充电时会看到一个黄色的led被点亮,电池没电了会看到一个红色的led亮,有时还会一闪一闪的。其实这就是EC导入的一个Function。黄色的led其实跟这个Function无关,它是充电指示灯,不过它和LowLed摆在一个位置。那么这个红色的LowLed什么时候会恒亮,什么时候会闪烁呢?当Battery的电量很低的时候也就是小于BattLow时,LowLed就会恒亮。当Battery Dead时LowLed就会闪烁,导致Battery Dead的原因有Prechage时间太长温度过高或过低。 5 n7 a: \ s" S( s3 \
j: _) C4 e( l3 l* ~
! z& _0 B3 R- ^+ K4.Battery Event
# ?6 G7 }% C) y3 n * u7 P1 y7 M# `6 @9 u! d
8 I) i2 C" m+ X+ ^* c% f4 | f+ B0 ?3 y# z% r
Battery在充放电的过程中,因为电量、电流、温度等原因EC需要向host端发送SCI Event,用于host在特定情况下采取相应的补救措施。 + o+ B U2 [0 `4 K6 }
( g0 F* y1 Y% z! v
1)BattChgEvent ( O0 Q2 @4 s4 q
当Battery插入或者拔出时EC会发送BattChgEvent通知Host,这时Host会读取ECRAM获得Battery是否存在的信息并更新系统端的显示。
. ?$ }" y: e4 w$ P( A* @6 C/ J+ @. n8 c/ b
2)BattWarnEvent % T6 K8 b& h; R0 @1 {- p1 n
当Battery的剩余电量到达Battery Warning Level时,EC会发送BattWarnEvent通知Host,Host端收到后会给出提示信息。
7 f7 E( K: K8 @1 v$ K5 l. B) i/ _3 v) u# v7 N. w
3)BattLowEvent
) c4 h( G7 L& |+ D8 n# T2 } 当Battery的剩余电量到达Battery Low Level时,EC会发送BattLowEvent通知Host,而且这时LowLed会恒亮。
8 t9 o2 \: U9 ]; i4)BattCrtEvent
' d& U3 O" C7 j: {+ k8 k 当Battery的剩余电量接近0%时,EC会发送BattCrtEvent通知Host,Host收到后做shutdown动作。如果在很长的一段时间里(几十秒),Host还5 {* @3 P, \7 |2 q' }
没有shutdown,那么EC将会Emergency Shutdown。
. x$ d8 G; S2 l2 X$ \
$ W3 o) W) j& D
4 q3 s, N) i) ~2 x6 J0 k: G - E8 f9 F0 M- w; _
& K) u$ e5 f+ t8 T/ y! [1 k* D+ c$ }( S( T4 n" U4 D
" V/ N# e- L- k4 G! ]- [5.How to Debug Battery?9 j9 D. \ I2 I) {1 g
7 x5 M) [# \+ o6 q: Z
; ~& h8 A9 x3 K+ }
4 {3 m6 A# G& q8 S6 d+ [# D) Q EC通过smbus不断的获取电池信息, 所以电池信息在不断的变化之中。有些时候为了澄清问题,或者为了增加新的Function该如何Debu呢?我的做法是使用debug tool将smbus停掉,然后将一些符合条件的值通debug tool写入ECRAM中,然后验证相关的Function是否生效。另外如果是需要给BIOS发SCI Event,我会直接将Event填入SCI queue。然后驱动SCI,让SCI Event被发送出去。
! P% C/ t* C3 Y$ j* [9 z& m w5 c3 s% X4 ~( S6 i4 B
% R! \6 t" i' `, k
Peter |