|
我所知道的EC====>Battery
- |& y, U) i- {4 X$ q6 {1 p
* [; {7 W2 K! h2 \4 |
1 k: r$ D+ b* \+ `# ]: \; j; |1.Battery Information4 N# i: @7 c1 U; Z9 t9 n
" c4 _& `0 J7 I8 o0 }6 a& Q% W, N
( U4 ^( b( y: ~( ?4 t* y
- i# i4 b# Q& V2 @" T9 d! S 探测Battery的信息是EC一个重要的工作,OS也要通过读取ECRAM中的内容获取电池电量、温度、电压、充、放电电流、Battery是否存在的信息。那么EC如何获得这些信息呢?Battery通常是一个smbus device所以它会接在EC的一组smbus上,而Battery的spec上会给出Battery的smbus的地址以及读取Battery信息相关的命令。EC通过向smbus上送Battery的address,cmd然后就会取得相应的信息了。 F$ ^4 T/ O# v8 m; M5 l4 J1 V
0 P9 h/ _: J, I u% W1 _. r
& W8 |$ m# p) p: F- _ P; u& c
2.Battery Charge&Discharge Algorithm
% j* |1 {. X8 |% D " g, \5 |- Y3 ]1 J
1 `) Z/ N& `& v5 i# v
1)Charge
: {& z, W6 R s* M3 W 充电的过程是这样的,AC in 的状态下Battery插入,这时EC会进入precharge mode进行小电流充电。如果precharge时间过长(通常是指超过一个小时)EC就会停止充电并且认为Battery dead,送给host一个Battery Fail的Event。在precharge mode如果充电电流增大到特定的数值后EC就会进入fastcharge mode快速充电。Battery 充满后停止充电。在这个过程中如果电池温度异常EC也会进行一些处理。这就充电的简单过程。
$ ~! K+ V6 A3 _' A2)Discharge
! G1 R; ^/ ?: v3 Y AC out & Battery in这时Battery开始放电,在放电过程中如果电量小Critical Low,系统处于S0, EC会发Critical Event给host,然后OS紧急关机。系统处S3,EC将会唤醒OS。如果电量小于BattLowLowled将会被点亮(Battery Low Policy会详述)。另外放电温度也会被检测,如果温度过高将会做降频动作等。 - D8 h* A% t8 M* v6 C, `) k+ G/ w. ]
0 a; O# j) C5 j/ T E
, f6 G. a* G- r+ h' T% K2 |
4 a) f, ] J/ N2 e6 d3.LowLed Policy! `. b9 p' J: h" M' I6 f# _4 a# `
9 I/ V# S5 d, _* S# V! x0 R
7 Y( m0 y0 d0 S% z0 d' f2 N
) ~0 {) _( O! J8 p5 _* R8 p
经常使用NB的话,大家可能会发现有一个led很有趣。插入AC充电时会看到一个黄色的led被点亮,电池没电了会看到一个红色的led亮,有时还会一闪一闪的。其实这就是EC导入的一个Function。黄色的led其实跟这个Function无关,它是充电指示灯,不过它和LowLed摆在一个位置。那么这个红色的LowLed什么时候会恒亮,什么时候会闪烁呢?当Battery的电量很低的时候也就是小于BattLow时,LowLed就会恒亮。当Battery Dead时LowLed就会闪烁,导致Battery Dead的原因有Prechage时间太长温度过高或过低。
% b& a, U$ \4 }% z/ D! L o
5 w. R: [! ], c' p$ w 6 d; [! J; V. J4 B; q, R
4.Battery Event
! G, ?" N0 X% s/ I* b0 U3 ^: t 9 G6 ^ ~" R% Z# W% @
; H" I5 O7 W3 p9 A# k3 D3 f. G7 L9 v" r! k4 l+ t3 r4 _' i
Battery在充放电的过程中,因为电量、电流、温度等原因EC需要向host端发送SCI Event,用于host在特定情况下采取相应的补救措施。
4 C1 M6 E1 L6 b" r" r8 q7 R8 U6 n& V1 `+ p2 h
1)BattChgEvent + t* i, T- K2 s
当Battery插入或者拔出时EC会发送BattChgEvent通知Host,这时Host会读取ECRAM获得Battery是否存在的信息并更新系统端的显示。 # n# s v+ f) l, D* j8 ]5 a( ~1 j8 n
/ n ]; O8 O0 b- N; P" A& |) w2)BattWarnEvent
9 U' \- [ d3 B: {+ z 当Battery的剩余电量到达Battery Warning Level时,EC会发送BattWarnEvent通知Host,Host端收到后会给出提示信息。
0 j y$ w, B" E8 t; G {+ Q5 w
+ r9 p0 V+ |4 ?) \& z6 q. A3)BattLowEvent ) U! F! O8 }4 ]% W* E
当Battery的剩余电量到达Battery Low Level时,EC会发送BattLowEvent通知Host,而且这时LowLed会恒亮。 ' k6 a( |# o) i9 J* M( ]- D
4)BattCrtEvent
; B+ V4 V- K5 l. l$ f6 N' \: M 当Battery的剩余电量接近0%时,EC会发送BattCrtEvent通知Host,Host收到后做shutdown动作。如果在很长的一段时间里(几十秒),Host还
5 Y' \ h8 U7 q0 t& i没有shutdown,那么EC将会Emergency Shutdown。
2 a4 C& j5 p3 M
6 u& }3 Z" @- k
" T. h- J; m) M7 R P
3 b; \& M6 ^$ F- g# |9 U # X& A& m; G& J- X
3 g2 |4 Y0 U7 [$ @7 n
! r+ [- k9 s7 G4 s' C0 k5.How to Debug Battery?
3 ]5 f$ @5 ~7 g% K2 L v1 K L
) W) S/ E+ R$ X3 }
0 C: K, q) _4 k: G9 |& H; T1 X( T, W i+ \5 c2 a# n
EC通过smbus不断的获取电池信息, 所以电池信息在不断的变化之中。有些时候为了澄清问题,或者为了增加新的Function该如何Debu呢?我的做法是使用debug tool将smbus停掉,然后将一些符合条件的值通debug tool写入ECRAM中,然后验证相关的Function是否生效。另外如果是需要给BIOS发SCI Event,我会直接将Event填入SCI queue。然后驱动SCI,让SCI Event被发送出去。 ; X" b$ i8 c* d; R9 D7 d& w
8 S- ` |& x8 O
( T+ d, e5 |) k; A1 m; t% [2 hPeter |