本文转载自:http://www.voidcn.com/blog/yanleizhouqing/article/p-6051912.html
上一篇主要讲电池相关的一些知识,上节忘记讲了,电池一般分为电量计电池和非电流计电池,电量计电池,就不需要用pmu8916的IC,当然这只是只,不需要BMS来计算soc,而jni层也需要读取电流计的电池相关属性。
这一节主要是根据代码进行相关的分析。
1. 先看probe的代码:
static int qpnp_vm_bms_probe(struct spmi_device *spmi)
{
...........
..........
...........
..........
//这里把电池的配置文件dtsi的读出来,并存到当前的结构体。
rc = set_battery_data(chip);
rc = config_battery_data(chip->batt_data);
..........
..........
//这个是核心的工作,一个线程,BMS的主要内容在此
INIT_DELAYED_WORK(&chip->monitor_soc_work, monitor_soc_work);
..........
..........
//电池一些常规的检测,主要从PMIC上读到的相关信息
battery_insertion_check(chip);
battery_status_check(chip);
/* character device to pass data to the userspace */
rc = register_bms_char_device(chip);
if (rc) {
pr_err("Unable to regiter '/dev/vm_bms' rc=%d\n", rc);
goto fail_bms_device;
}
the_chip = chip;
//这个也很重要,我们从上节知道,初值last_ocv_soc是非常重要的,决定着后面的soc估值算法
calculate_initial_soc(chip);
//设置和注册电池的power supply
/* setup & register the ba