公司的电池又出问题了。对于电池,只是解决问题的话,不会困难。但将整个电池的知识点串连起来,却不是件轻松的事。
电池部分可以分成二块来看待:
1,ECBIOS读取电池,并处理
2,SYSTEMBIOS写ASL代码,提供给驱动
附:驱动和EC沟通,报给内核
嵌入式BIOS部分
嵌入式BIOS工程师做电池,手边的事情一般有:
1,侦测电池插拔动作
一般有两种方式来作这个功能:
(1)通过一根GPIO PIN的电平高低来检测,需要提前去抖;
(2)通过ADC控制器来侦测电池温度,其实在软件的眼中,不管温度还是阻值或者其它什么东西,都是电压。我们可以通过电压是否在一定的范围内来确定电池是否存在。
2,获取电池信息
EC获取电池信息,要通过读SMART BATTERY IC的寄存器来获取。比较重要的寄存器有:
BatteryCurrent |
电池电流 |
BatteryVoltage |
电池电压 |
DesignCapacity |
电池设计容量 |
RemainingCapacity |
电池现有容量 |
FullChargeCapacity |
电池满充容量 |
RSOC |
电池现有容量百分比 |
CycleCount |
电池跑的CYCLE数 |
BatteryStatus |
电池状态 |
CycleCount的值代表了电池使用的程度;RemainingCapacity和FullChargeCapacity的比值就是WINDOWS显示的百分比,由于算法的原因,可能和RSOC不一致;而电池剩余时间可以通过BatteryCurrent和RemainingCapacity的比值得到。
读取这些寄存器需要遵循SMBUS协议。
3,电池充放电
(1)当AC和电池均存在,而batteryStatus的FULLY_CHARGED位没置1时,要充电。充电IC一般接受DAC或SMBUS的通信方式。
(2)其余情况下,不应充电。
(3)电池充放电过程中,要点亮一些指示灯给终端用户使用。
4,通知ACPI驱动更新电池信息
电池信息的传递需要通过62/66端口来实现。EC代码的一般做法是用256 BYTE的内存来作为ECRAM或ECSpace,HOST端驱动或应用会通过约定的时序来读取。
当电池拔出时,我们应该将ECRAM有关电池部分清0,然后通过SCI中断发送Q事件号来通知电池驱动来读取电池信息。
当电池插入时,我们不应立