android 电源/充电/库仑

2019-07-14 01:13发布

        最近,一直在负责公司所有产品的电源/充电/库仑这块,先说说库仑,它是集成在电池里面的一个芯片,用来准确的返回电池的信息的,因为一般的电池的信息是通过adc返回的数据,这样的数据不是很精确,为了做到对电池的信息的精确处理,所以公司的大多产品都用到了库仑计,底层页就是通过I2C读取寄存器的数据实现的。       1:有库仑计和一般电池的区别             有库仑计的电池,一共有6个脚,而一般的电池只有三个脚;             有库仑计的电池,读取到的数据比没库仑计的电池读取到的电池信息更精确。        先贴图:              如图中看到的,通过SCL和SDA读取6B地址处的数据,就可以精确拿到电池的信息。        
         通过下面的bq27541_level()读取电池的电量等级,也就是百分数,而通过bq7541_vol()读取到的即是电池的电量,其实最底层就是通过i2c_smbus_xfer实现的。
  int bq27541_level(void)
{
    int ret;
    short data;
    ret = i2c_smbus_read_word_data(chip->client, bq27541CMD_SOC_LSB);
    if (ret >= 0) {
        data = (short)ret;
        //printk("level:%d ",data);
        bq27541_debug(chip, "POWER_SUPPLY_PROP_CAPACITY = %d ", data);
    } else {
        pr_info("get bat_info POWER_SUPPLY_PROP_CAPACITY on bq27541CMD_SOC_LSB error ");
        return -1;
    }
    return data;
}

int bq27541_vol(void)
{
    int ret;
    short data;
    
    ret = i2c_smbus_read_word_data(chip->client, bq27541CMD_VOLT_LSB);
    if (ret >= 0) {
        data = (short)ret;
        //printk("vol:%d ",data);
        bq27541_debug(chip, "POWER_SUPPLY_PROP_VOLTAGE_NOW = %dmV ", data);
    } else {
        pr_info("get bat_info POWER_SUPPLY_PROP_VOLTAGE_NOW on bq27541CMD_VOLT_LSB error ");
        return -1;
    }
    return data;
} 下面这个图,就是在备电电量低的时候,用来给备电充电的,在备电电量低的时候(会有一个中断)或者usb或者AC充电的时候,会给AUXBAT_CHGEN这个引脚一个高电平,来启动备电充电,XEINT4-AuxBATCHG_DET这个引脚是备电满标志,平时会因为上拉电阻,而呈现高电平,在充电的过程中,会保持低电平,而备电满以后,这个引脚会由低变高。在变高的同时会清除AUXBAT_CHGEN这个引脚为低电平。