From 8a5368ff086a6dcd82ed0641a7eac71987cca150 Mon Sep 17 00:00:00 2001 From: liuyc20 Date: Wed, 11 Aug 2021 14:12:46 +0800 Subject: [PATCH] power: introduce sd77426 fuel gauge driver introduce SD77426 Fuel gauge driver. add makefile to build it to sd77426_fg_mmi.ko Change-Id: I12b0084b1b04a91e60ed7fb90e4985da71b98a9a Signed-off-by: liuyc20 Reviewed-on: https://gerrit.mot.com/2038654 SLTApproved: Slta Waiver SME-Granted: SME Approvals Granted Tested-by: Jira Key Reviewed-by: Huosheng Liao Submit-Approved: Jira Key --- drivers/power/sd77426_fg_mmi/Android.mk | 8 + drivers/power/sd77426_fg_mmi/Kbuild | 10 + drivers/power/sd77426_fg_mmi/Makefile | 11 + drivers/power/sd77426_fg_mmi/battery_config.h | 43 + drivers/power/sd77426_fg_mmi/bmulib.o | Bin 0 -> 411336 bytes drivers/power/sd77426_fg_mmi/oz8806_battery.c | 1633 +++++++++++++++++ drivers/power/sd77426_fg_mmi/oz8806_regdef.h | 95 + drivers/power/sd77426_fg_mmi/parameter.c | 164 ++ drivers/power/sd77426_fg_mmi/parameter.h | 335 ++++ drivers/power/sd77426_fg_mmi/table.c | 129 ++ drivers/power/sd77426_fg_mmi/table.h | 69 + 11 files changed, 2497 insertions(+) create mode 100644 drivers/power/sd77426_fg_mmi/Android.mk create mode 100644 drivers/power/sd77426_fg_mmi/Kbuild create mode 100644 drivers/power/sd77426_fg_mmi/Makefile create mode 100644 drivers/power/sd77426_fg_mmi/battery_config.h create mode 100644 drivers/power/sd77426_fg_mmi/bmulib.o create mode 100644 drivers/power/sd77426_fg_mmi/oz8806_battery.c create mode 100644 drivers/power/sd77426_fg_mmi/oz8806_regdef.h create mode 100644 drivers/power/sd77426_fg_mmi/parameter.c create mode 100644 drivers/power/sd77426_fg_mmi/parameter.h create mode 100644 drivers/power/sd77426_fg_mmi/table.c create mode 100644 drivers/power/sd77426_fg_mmi/table.h diff --git a/drivers/power/sd77426_fg_mmi/Android.mk b/drivers/power/sd77426_fg_mmi/Android.mk new file mode 100644 index 000000000000..b115b9f10768 --- /dev/null +++ b/drivers/power/sd77426_fg_mmi/Android.mk @@ -0,0 +1,8 @@ +DLKM_DIR := motorola/kernel/modules +LOCAL_PATH := $(call my-dir) + +include $(CLEAR_VARS) +LOCAL_MODULE := sd77426_fg_mmi.ko +LOCAL_MODULE_TAGS := optional +LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) +include $(DLKM_DIR)/AndroidKernelModule.mk diff --git a/drivers/power/sd77426_fg_mmi/Kbuild b/drivers/power/sd77426_fg_mmi/Kbuild new file mode 100644 index 000000000000..fe11c32b0770 --- /dev/null +++ b/drivers/power/sd77426_fg_mmi/Kbuild @@ -0,0 +1,10 @@ +# add -Wall to try to catch everything we can. +EXTRA_CFLAGS += -Wall +EXTRA_CFLAGS += -I$(ANDROID_BUILD_TOP)/motorola/kernel/modules/include +EXTRA_CFLAGS += -I$(ANDROID_BUILD_TOP)/motorola/kernel/drivers/power/sd77426_fg_mmi + +sd77426_fg_mmi-objs += oz8806_battery.o +sd77426_fg_mmi-objs += parameter.o +sd77426_fg_mmi-objs += table.o +sd77426_fg_mmi-objs += bmulib.o +obj-m += sd77426_fg_mmi.o diff --git a/drivers/power/sd77426_fg_mmi/Makefile b/drivers/power/sd77426_fg_mmi/Makefile new file mode 100644 index 000000000000..62a13fd28500 --- /dev/null +++ b/drivers/power/sd77426_fg_mmi/Makefile @@ -0,0 +1,11 @@ +KERNEL_SRC ?= /lib/modules/$(shell uname -r)/build + +all: + $(MAKE) -C $(KERNEL_SRC) M=$(shell pwd) modules $(KBUILD_OPTIONS) + +modules_install: + $(MAKE) INSTALL_MOD_STRIP=1 -C $(KERNEL_SRC) M=$(shell pwd) modules_install + +clean: + $(MAKE) -C $(KERNEL_SRC) M=$(PWD) clean + diff --git a/drivers/power/sd77426_fg_mmi/battery_config.h b/drivers/power/sd77426_fg_mmi/battery_config.h new file mode 100644 index 000000000000..63595b5f8f36 --- /dev/null +++ b/drivers/power/sd77426_fg_mmi/battery_config.h @@ -0,0 +1,43 @@ +/***************************************************************************** +* Copyright(c) O2Micro, 2019. All rights reserved. +* +* O2Micro [OZ8806] Source Code Reference Design +* File:[battery_config.h] +* +* This Source Code Reference Design for O2MICRO [OZ8806] access +* ("Reference Design") is solely for the use of PRODUCT INTEGRATION REFERENCE ONLY, +* and contains confidential and privileged information of O2Micro International +* Limited. O2Micro shall have no liability to any PARTY FOR THE RELIABILITY, +* SERVICEABILITY FOR THE RESULT OF PRODUCT INTEGRATION, or results from: (i) any +* modification or attempted modification of the Reference Design by any party, or +* (ii) the combination, operation or use of the Reference Design with non-O2Micro +* Reference Design. Use of the Reference Design is at user's discretion to qualify +* the final work result. +*****************************************************************************/ + +#ifndef __O2_BATTERY_CONFIG_H +#define __O2_BATTERY_CONFIG_H __FILE__ + + +#define OZ88106_I2C_NUM 2 + +//#define EXT_THERMAL_READ + +#define OZ8806_VOLTAGE 4350 +#define O2_CONFIG_CAPACITY 5158 +#define O2_CONFIG_RSENSE 20 +#define O2_CONFIG_EOC 200 +#define OZ8806_EOD 3400 +#define O2_CONFIG_BOARD_OFFSET 12 +#define O2_SOC_START_THRESHOLD_VOL 3700 +#define O2_CONFIG_RECHARGE 100 +#define O2_TEMP_PULL_UP_R 121000 //121K +#define O2_TEMP_REF_VOLTAGE 1800 //mv +#define BATTERY_WORK_INTERVAL 10 + +#define RPULL (68000) +#define RDOWN (5100) + +#define ENABLE_10MIN_END_CHARGE_FUN + +#endif diff --git a/drivers/power/sd77426_fg_mmi/bmulib.o b/drivers/power/sd77426_fg_mmi/bmulib.o new file mode 100644 index 0000000000000000000000000000000000000000..907a72a03a92e8d230a690dc6d7e442e1a27cbc0 GIT binary patch literal 411336 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 literal 0 HcmV?d00001 diff --git a/drivers/power/sd77426_fg_mmi/oz8806_battery.c b/drivers/power/sd77426_fg_mmi/oz8806_battery.c new file mode 100644 index 000000000000..0ab63a9bc164 --- /dev/null +++ b/drivers/power/sd77426_fg_mmi/oz8806_battery.c @@ -0,0 +1,1633 @@ +/***************************************************************************** +* Copyright(c) O2Micro, 2019. All rights reserved. +* +* O2Micro [OZ8806] Source Code Reference Design +* File:[oz8806_battery.c] +* +* This Source Code Reference Design for O2MICRO [OZ8806] access +* ("Reference Design") is solely for the use of PRODUCT INTEGRATION REFERENCE ONLY, +* and contains confidential and privileged information of O2Micro International +* Limited. O2Micro shall have no liability to any PARTY FOR THE RELIABILITY, +* SERVICEABILITY FOR THE RESULT OF PRODUCT INTEGRATION, or results from: (i) any +* modification or attempted modification of the Reference Design by any party, or +* (ii) the combination, operation or use of the Reference Design with non-O2Micro +* Reference Design. Use of the Reference Design is at user's discretion to qualify +* the final work result. +*****************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +//#include +#include + +//you must add these here for O2MICRO +#include "parameter.h" +#include "table.h" +#include "battery_config.h" +#include "oz8806_regdef.h" + +#define batt_dbg(fmt, args...) printk(KERN_ERR"[oz8806]:"pr_fmt(fmt)"\n", ## args) + +/***************************************************************************** +* static variables/functions section +****************************************************************************/ +static int fg_hw_init_done = 0; +static uint8_t bmu_init_done = 0; +static int oz8806_suspend = 0; +static DEFINE_MUTEX(update_mutex); +static bmu_data_t *batt_info_ptr = NULL; +static gas_gauge_t *gas_gauge_ptr = NULL; +static uint8_t charger_finish = 0; +static unsigned long ic_wakeup_time = 0; +static int init_soc = 0; +static void (*bmu_polling_loop_callback)(void) = NULL; +static void (*bmu_wake_up_chip_callback)(void) = NULL; +static void (*bmu_power_down_chip_callback)(void) = NULL; +static void (*bmu_charge_end_process_callback)(void) = NULL; +static void (*bmu_discharge_end_process_callback)(void) = NULL; +static int32_t (*oz8806_temp_read_callback)(int32_t *voltage) = NULL; +static int32_t (*oz8806_current_read_callback)(int32_t *voltage) = NULL; +static int32_t (*oz8806_voltage_read_callback)(int32_t *voltage) = NULL; + +static int oz8806_update_batt_info(struct oz8806_data *data); +static int oz8806_update_batt_temp(struct oz8806_data *data); +static int32_t oz8806_write_byte(struct oz8806_data *data, uint8_t index, uint8_t dat); +static int32_t oz8806_read_byte(struct oz8806_data *data, uint8_t index, uint8_t *dat); + +static struct oz8806_data *the_oz8806 = NULL; +static int8_t adapter_status = O2_CHARGER_BATTERY; +static int32_t rsoc_pre = 0; +#ifdef EXT_THERMAL_READ +static uint8_t ext_thermal_read = 1; +#else +static uint8_t ext_thermal_read = 0; +#endif +static int capacity_init_ok = 0; + +static int save_capacity = INIT_CAP; + +static enum power_supply_property oz8806_battery_props[] = { + POWER_SUPPLY_PROP_STATUS, + POWER_SUPPLY_PROP_PRESENT, + POWER_SUPPLY_PROP_VOLTAGE_NOW, + POWER_SUPPLY_PROP_CURRENT_NOW, + POWER_SUPPLY_PROP_CAPACITY, + POWER_SUPPLY_PROP_TECHNOLOGY, + POWER_SUPPLY_PROP_HEALTH, + POWER_SUPPLY_PROP_TEMP, + POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN, + POWER_SUPPLY_PROP_CHARGE_NOW, + POWER_SUPPLY_PROP_ENERGY_FULL_DESIGN, + POWER_SUPPLY_PROP_ENERGY_NOW, + //POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW, + //POWER_SUPPLY_PROP_TIME_TO_EMPTY_AVG, + //POWER_SUPPLY_PROP_TIME_TO_FULL_NOW, +}; + +/*-------------------------------------------------------------------------*/ +/***************************************************************************** +* Description: +* below function is linux power section +* Parameters: +* description for each argument, new argument starts at new line +* Return: +* what does this function returned? +*****************************************************************************/ +/*-------------------------------------------------------------------------*/ + +static int oz8806_battery_get_property(struct power_supply *psy, + enum power_supply_property psp, + union power_supply_propval *val) +{ + struct oz8806_data *data = (struct oz8806_data *)power_supply_get_drvdata(psy); + + switch (psp) { + + case POWER_SUPPLY_PROP_STATUS: + + if (adapter_status == O2_CHARGER_BATTERY) + { + val->intval = POWER_SUPPLY_STATUS_DISCHARGING; /*discharging*/ + } + else if(adapter_status == O2_CHARGER_USB || + adapter_status == O2_CHARGER_AC ) + { + if (data->batt_info.batt_soc == 100) + val->intval = POWER_SUPPLY_STATUS_FULL; + else + val->intval = POWER_SUPPLY_STATUS_CHARGING; /*charging*/ + + } + else + val->intval = POWER_SUPPLY_STATUS_DISCHARGING; + + break; + case POWER_SUPPLY_PROP_VOLTAGE_NOW: + val->intval = data->batt_info.batt_voltage * 1000; + break; + case POWER_SUPPLY_PROP_PRESENT: + val->intval = bmu_init_done; + break; + case POWER_SUPPLY_PROP_CURRENT_NOW: + val->intval = data->batt_info.batt_current * 1000; + break; + case POWER_SUPPLY_PROP_CAPACITY: + val->intval = data->batt_info.batt_soc; + break; + case POWER_SUPPLY_PROP_TECHNOLOGY: + val->intval = POWER_SUPPLY_TECHNOLOGY_LION; + break; + case POWER_SUPPLY_PROP_HEALTH: + val->intval = POWER_SUPPLY_HEALTH_GOOD; + break; + + case POWER_SUPPLY_PROP_TEMP: + val->intval = data->batt_info.batt_temp * 10; + break; + + case POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN: + val->intval = data->batt_info.batt_fcc_data; + break; + + case POWER_SUPPLY_PROP_CHARGE_NOW: + val->intval = data->batt_info.batt_capacity; + break; + + case POWER_SUPPLY_PROP_ENERGY_FULL_DESIGN: + val->intval = data->batt_info.batt_fcc_data; + break; + + case POWER_SUPPLY_PROP_ENERGY_NOW: + val->intval = data->batt_info.batt_capacity; + break; + + default: + return -EINVAL; + } + + return 0; +} + +static void oz8806_external_power_changed(struct power_supply *psy) +{ + struct oz8806_data *data = (struct oz8806_data *)power_supply_get_drvdata(psy); + + power_supply_changed(data->bat); + cancel_delayed_work(&data->work); + schedule_delayed_work(&data->work, 0); +} + +static void oz8806_powersupply_init(struct oz8806_data *data) +{ + + data->bat_desc.name = "battery"; + data->bat_desc.type = POWER_SUPPLY_TYPE_BATTERY; + data->bat_desc.properties = oz8806_battery_props; + data->bat_desc.num_properties = ARRAY_SIZE(oz8806_battery_props); + data->bat_desc.get_property = oz8806_battery_get_property; + data->bat_desc.external_power_changed = oz8806_external_power_changed; + data->bat_desc.no_thermal = 1; +} + +/***************************************************************************** + *write 0x20 into register 0x09 + *example:echo 0920 > /sys/class/i2c-dev/i2c-2/device/2-002f/registers + *****************************************************************************/ + +static ssize_t oz8806_register_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t _count) +{ + char data[num_3]; + uint8_t address; + uint8_t value = 0; + char *endp; + int len; + struct oz8806_data *oz8806; + + len = strlen(buf); + if(len < 5) + return -EINVAL; + + if (&(the_oz8806->myclient->dev) == dev) + oz8806 = dev_get_drvdata(dev); + else //this device is the private device of power supply + oz8806 = dev_get_drvdata(dev->parent); + + data[num_0] = buf[num_0]; + data[num_1] = buf[num_1]; + data[num_2] = num_0; + + address = simple_strtoul(data, &endp, 16); + + if (address != OZ8806_OP_PEC_CTRL + && address != OZ8806_OP_CTRL + && address != OZ8806_OP_CAR + && address != OZ8806_OP_CAR+1 + && address != OZ8806_OP_BOARD_OFFSET + && address != OZ8806_OP_BOARD_OFFSET+1) + { + pr_err("register[0x%.2x] is read-only\n", address); + return _count; + } + + data[num_0] = buf[num_2]; + data[num_1] = buf[num_3]; + data[num_2] = num_0; + + value = simple_strtoul(data, &endp, 16); + + oz8806_write_byte(oz8806, address, value); + + pr_err("write 0x%.2x into register[0x%.2x]\n", value, address); + + return _count; +} + +/* + example:cat /sys/class/i2c-dev/i2c-2/device/2-002f/registers +*/ +static ssize_t oz8806_register_show(struct device *dev, struct device_attribute *attr,char *buf) +{ + struct oz8806_data *oz8806; + u8 i = 0; + u8 data = 0; + int result = 0; + + if (&(the_oz8806->myclient->dev) == dev) + oz8806 = dev_get_drvdata(dev); + else //this device is the private device of power supply + oz8806 = dev_get_drvdata(dev->parent); + + //CHIP ID and Reversion + oz8806_read_byte(oz8806, OZ8806_OP_IDREV, &data); + result += sprintf(buf + result, "[0x%.2x] = 0x%.2x\n", OZ8806_OP_IDREV, data); + + //I2C config register + oz8806_read_byte(oz8806, OZ8806_OP_I2CCONFIG, &data); + result += sprintf(buf + result, "[0x%.2x] = 0x%.2x\n", OZ8806_OP_I2CCONFIG, data); + + for (i=0x00; i<=0x1a; i++) + { + oz8806_read_byte(oz8806, i, &data); + result += sprintf(buf + result, "[0x%.2x] = 0x%.2x\n", i, data); + } + + return result; +} + +// chip id: 0x38 +static ssize_t oz8806_chip_id_show(struct device *dev, struct device_attribute *attr,char *buf) +{ + struct oz8806_data *oz8806; + u8 data = 0; + int result = 0; + + if (&(the_oz8806->myclient->dev) == dev) + oz8806 = dev_get_drvdata(dev); + else //this device is the private device of power supply + oz8806 = dev_get_drvdata(dev->parent); + + //CHIP ID and Reversion + oz8806_read_byte(oz8806, OZ8806_OP_IDREV, &data); + result = sprintf(buf, "0x%.2x = 0x%.2x\n", OZ8806_OP_IDREV, data); + return result; +} + +static ssize_t oz8806_debug_show(struct device *dev, struct device_attribute *attr,char *buf) +{ + return sprintf(buf,"%d\n", config_data.debug); +} +/***************************************************************************** + * Description: + * oz8806_debug_store + * Parameters: + * write example: echo 1 > debug ---open debug + *****************************************************************************/ +static ssize_t oz8806_debug_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t _count) +{ + int val; + if (kstrtoint(buf, 10, &val)) + return -EINVAL; + + if(val == 1) + { + config_data.debug = 1; + pr_err("DEBUG ON \n"); + } + else if (val == 0) + { + config_data.debug = 0; + pr_err("DEBUG CLOSE \n"); + } + else + { + pr_err("invalid command\n"); + return -EINVAL; + } + + return _count; +} + +static ssize_t oz8806_bmu_init_done_show(struct device *dev, struct device_attribute *attr,char *buf) +{ + return sprintf(buf,"%d\n", bmu_init_done); +} +static ssize_t oz8806_bmu_init_done_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t _count) +{ + int val = 0; + if (kstrtoint(buf, 10, &val)) + return -EINVAL; + + bmu_init_done = 0; + ic_wakeup_time = jiffies; + + cancel_delayed_work(&the_oz8806->work); + msleep(1000); + + if(val == 1) + { + pr_err("reinit oz8806 from ocv\n"); + bmu_reinit(1);//bmu_init_done will be setted + } + else if (val == 0) + { + pr_err("reinit oz8806,just wakeup ic\n"); + bmu_reinit(0); + bmu_init_done = 1; + } + else + { + pr_err("invalid command\n"); + return -EINVAL; + } + schedule_delayed_work(&the_oz8806->work, 0); + return _count; +} +static ssize_t oz8806_save_capacity_show(struct device *dev, struct device_attribute *attr,char *buf) +{ + if (capacity_init_ok && gas_gauge_ptr && gas_gauge_ptr->stored_capacity) + return sprintf(buf,"%d\n", gas_gauge_ptr->stored_capacity); + + return sprintf(buf,"%d\n", save_capacity); +} +#ifdef USERSPACE_READ_SAVED_CAP +static ssize_t oz8806_save_capacity_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + int val; + struct oz8806_data *oz8806; + + if (&(the_oz8806->myclient->dev) == dev) + oz8806 = dev_get_drvdata(dev); + else //this device is the private device of power supply + oz8806 = dev_get_drvdata(dev->parent); + + if (kstrtoint(buf, 10, &val)) + return -EINVAL; + save_capacity = val; + batt_dbg("save_capacity:%d\n", save_capacity); + + if (oz8806 && !bmu_init_done) + { + cancel_delayed_work(&oz8806->work); + schedule_delayed_work(&oz8806->work, 0); + } + + return count; +} +#endif + +static DEVICE_ATTR(registers, S_IRUGO | (S_IWUSR|S_IWGRP), oz8806_register_show, oz8806_register_store); +static DEVICE_ATTR(chip_id, S_IRUGO, oz8806_chip_id_show, NULL); +static DEVICE_ATTR(debug, S_IRUGO | (S_IWUSR|S_IWGRP), oz8806_debug_show, oz8806_debug_store); +static DEVICE_ATTR(bmu_init_done, S_IRUGO| (S_IWUSR|S_IWGRP), oz8806_bmu_init_done_show, oz8806_bmu_init_done_store); + +#ifdef USERSPACE_READ_SAVED_CAP +static DEVICE_ATTR(save_capacity, S_IRUGO | (S_IWUSR|S_IWGRP), oz8806_save_capacity_show, oz8806_save_capacity_store); +#else +static DEVICE_ATTR(save_capacity, S_IRUGO, oz8806_save_capacity_show, NULL); +#endif + + +static struct attribute *oz8806_attributes[] = { + &dev_attr_registers.attr, + &dev_attr_chip_id.attr, + &dev_attr_debug.attr, + &dev_attr_bmu_init_done.attr, + &dev_attr_save_capacity.attr, + NULL, +}; + +static struct attribute_group oz8806_attribute_group = { + .attrs = oz8806_attributes, +}; + +static int oz8806_create_sys(struct device *dev, const struct attribute_group * grp) +{ + int err; + + batt_dbg("oz8806_create_sysfs"); + + if(NULL == dev){ + pr_err("[BATT]: failed to register battery\n"); + return -EINVAL; + } + + err = sysfs_create_group(&(dev->kobj), grp); + + if (!err) + { + batt_dbg("creat oz8806 sysfs group ok"); + } + else + { + pr_err("creat oz8806 sysfs group fail\n"); + return -EIO; + } + return err; +} + +static int32_t oz8806_read_byte(struct oz8806_data *data, uint8_t index, uint8_t *dat) +{ + int32_t ret; + uint8_t i; + struct i2c_client *client = data->myclient; + + for(i = 0; i < 4; i++){ + ret = i2c_smbus_read_byte_data(client, index); + + if(ret >= 0) break; + else + dev_err(&client->dev, "%s: err %d, %d times\n", __func__, ret, i); + } + if(i >= 4) + { + return ret; + } + *dat = (uint8_t)ret; + + return ret; +} + +static int32_t oz8806_write_byte(struct oz8806_data *data, uint8_t index, uint8_t dat) +{ + int32_t ret; + uint8_t i; + struct i2c_client *client = data->myclient; + + for(i = 0; i < 4; i++){ + ret = i2c_smbus_write_byte_data(client, index, dat); + if(ret >= 0) break; + else + dev_err(&client->dev, "%s: err %d, %d times\n", __func__, ret, i); + } + if(i >= 4) + { + return ret; + } + + return ret; +} + +static int32_t oz8806_update_bits(struct oz8806_data *data, uint8_t reg, uint8_t mask, uint8_t dat) +{ + int32_t ret; + uint8_t tmp; + + ret = oz8806_read_byte(data, reg, &tmp); + if (ret < 0) + return ret; + + if ((tmp & mask) != dat) + { + tmp &= ~mask; + tmp |= dat & mask; + return oz8806_write_byte(data, reg, tmp); + + } + else + return 0; +} +#if 0 +static int oz8806_check_battery_status(struct oz8806_data *data) +{ + uint8_t val; + int ret = 0; + + ret = oz8806_read_byte(data, OZ8806_OP_BATTERY_ID, &val); + + pr_err("battery ID: 0x%02x\n", val); + + return ret; +} +#endif +int oz8806_wakeup_full_power(void) +{ + uint8_t val = 0; + int32_t ret = 0; + struct oz8806_data *data = the_oz8806; + + ret = oz8806_read_byte(data, OZ8806_OP_CTRL, &val); + pr_err("OZ8806_OP_CTRL: 0x%02x\n", val); + + if ((val & SLEEP_MODE) != 0<<6) + { + ret = oz8806_update_bits(data, OZ8806_OP_CTRL, SLEEP_MODE, 0 << 6); + + ret = oz8806_read_byte(data, OZ8806_OP_CTRL, &val); + + pr_err("OZ8806_OP_CTRL: 0x%02x after writing\n", val); + + if ((val & SLEEP_MODE) != (0 << 6)) + pr_err("fail to wake up oz8806 to full power mode\n"); + else { + if (oz8806_get_boot_up_time() < 2000) + ic_wakeup_time = jiffies + msecs_to_jiffies(2000 - oz8806_get_boot_up_time()); + else + ic_wakeup_time = jiffies; + pr_err("wake up oz8806 to full power mode\n"); + } + } + pr_err("ic_wakeup_time %lu\n",ic_wakeup_time); + + return ret; +} +EXPORT_SYMBOL(oz8806_wakeup_full_power); + +static void discharge_end_fun(struct oz8806_data *data) +{ + //End discharge + //this may jump 2% + if (!gas_gauge_ptr || !batt_info_ptr) + return; + /* + if(batt_info_ptr->fCellTemp < -10) + config_data.discharge_end_voltage = OZ8806_EOD + 350; + else if (batt_info_ptr->fCellTemp < 0) + config_data.discharge_end_voltage = OZ8806_EOD + 300; + else if (batt_info_ptr->fCellTemp < 5) + config_data.discharge_end_voltage = OZ8806_EOD + 200; + else if (batt_info_ptr->fCellTemp < 10) + config_data.discharge_end_voltage = OZ8806_EOD + 100; + else + config_data.discharge_end_voltage = OZ8806_EOD; + +*/ + + if(batt_info_ptr->fVolt < (config_data.discharge_end_voltage - 100)) + { + + if(batt_info_ptr->fRSOC == 1) + { + batt_info_ptr->fRSOC = 0; + batt_info_ptr->sCaMAH = data->batt_info.batt_fcc_data / num_100 -1; + if (bmu_discharge_end_process_callback) + bmu_discharge_end_process_callback(); + } + else if(batt_info_ptr->fRSOC > 0){ + batt_info_ptr->sCaMAH = batt_info_ptr->fRSOC * data->batt_info.batt_fcc_data / num_100 - 1; + batt_info_ptr->fRSOC--; + } + } +} + +static int check_charger_full(void) +{ + int ret = 0; + +//from charge ic + return ret; +} + +static void charge_end_fun(void) +{ +#define CHG_END_PERIOD_MS (MSEC_PER_SEC * 60) //60 s = 1 minutes +#define FORCE_FULL_MS (MSEC_PER_SEC * 120) //120s = 2 minutes +#define CHG_END_PURSUE_STEP (MSEC_PER_SEC * 30) //30s + + static unsigned int time_accumulation; + static unsigned long start_jiffies; + int oz8806_eoc = 0; + static unsigned long chgr_full_soc_pursue_start; + static unsigned int chgr_full_soc_pursue_accumulation; + +#ifdef ENABLE_10MIN_END_CHARGE_FUN + static unsigned long start_record_jiffies; + static uint8_t start_record_flag = 0; +#endif + + if (!gas_gauge_ptr || !batt_info_ptr) + return; + + if (adapter_status != O2_CHARGER_BATTERY && check_charger_full()) + { + charger_finish = 1; + batt_dbg("charger is full, enter external charger finish"); + goto charger_full; + } + + if(adapter_status == O2_CHARGER_USB) + oz8806_eoc = 100; + else if(adapter_status == O2_CHARGER_AC) + oz8806_eoc = config_data.charge_end_current; + + if((adapter_status == O2_CHARGER_BATTERY) || + (batt_info_ptr->fCurr < DISCH_CURRENT_TH) || + (batt_info_ptr->fCurr > oz8806_eoc)) + { + charger_finish = 0; + time_accumulation = 0; + start_jiffies = 0; + chgr_full_soc_pursue_start = 0; +#ifdef ENABLE_10MIN_END_CHARGE_FUN + start_record_jiffies = 0; + start_record_flag = 0; +#endif + return; + } + /* + if(adapter_status == CHARGER_USB) + { + gas_gauge_ptr->fast_charge_step = 1; + } + else + { + gas_gauge_ptr->fast_charge_step = 2; + } + */ + + + + if((batt_info_ptr->fVolt >= (config_data.charge_cv_voltage - 50))&&(batt_info_ptr->fCurr >= DISCH_CURRENT_TH) && + (batt_info_ptr->fCurr < oz8806_eoc)&& (!gas_gauge_ptr->charge_end)) + { + if (!start_jiffies) + start_jiffies = jiffies; + + time_accumulation = jiffies_to_msecs(jiffies - start_jiffies); + + //time accumulation is over 5 minutes + if (time_accumulation >= CHG_END_PERIOD_MS) + { + charger_finish = 1; + batt_dbg("enter external charger finish"); + } + else + { + charger_finish = 0; + } + } + else + { + time_accumulation = 0; + start_jiffies = 0; + charger_finish = 0; + } + +charger_full: + batt_dbg("%s, time_accumulation:%d, charger_finish:%d", + __func__, time_accumulation, charger_finish); + + batt_dbg("voltage:%d, cv:%d, fcurr:%d, 8806 eoc:%d, gas_gauge_ptr->charge_end:%d", + batt_info_ptr->fVolt, config_data.charge_cv_voltage, + batt_info_ptr->fCurr, oz8806_eoc, gas_gauge_ptr->charge_end); + +#ifdef ENABLE_10MIN_END_CHARGE_FUN + if((batt_info_ptr->fRSOC == 99) &&(!start_record_flag) &&(batt_info_ptr->fCurr > oz8806_eoc)) + { + start_record_jiffies = jiffies; + start_record_flag = 1; + batt_dbg("start_record_flag: %d, at %d ms",start_record_flag, jiffies_to_msecs(jiffies)); + } + if((batt_info_ptr->fRSOC != 99) ||(batt_info_ptr->fCurr < oz8806_eoc)) + { + start_record_flag = 0; + } + + if((start_record_flag) && (batt_info_ptr->fCurr > oz8806_eoc)) + { + if(jiffies_to_msecs(jiffies - start_record_jiffies) > FORCE_FULL_MS) + { + batt_dbg("start_record_flag: %d, at %d ms",start_record_flag, jiffies_to_msecs(jiffies)); + charger_finish = 1; + start_record_flag = 0; + batt_dbg("enter charge timer finish"); + } + } +#endif + + if(charger_finish) + { + if(!gas_gauge_ptr->charge_end) + { + if(batt_info_ptr->fRSOC < 100) + { + static int32_t fRSOC_extern = 0; + + if(batt_info_ptr->fRSOC <= rsoc_pre){ + batt_dbg("fRSOC_extern:%d, soc:%d ",fRSOC_extern,batt_info_ptr->fRSOC); + + if (!chgr_full_soc_pursue_start || fRSOC_extern != batt_info_ptr->fRSOC) { + chgr_full_soc_pursue_start = jiffies; + fRSOC_extern = batt_info_ptr->fRSOC ; + } + + + chgr_full_soc_pursue_accumulation = + jiffies_to_msecs(jiffies - chgr_full_soc_pursue_start); + + if (chgr_full_soc_pursue_accumulation >= CHG_END_PURSUE_STEP){ + + chgr_full_soc_pursue_start = 0; + batt_info_ptr->fRSOC++; + batt_info_ptr->sCaMAH = batt_info_ptr->fRSOC * the_oz8806->batt_info.batt_fcc_data / num_100; + batt_info_ptr->sCaMAH += the_oz8806->batt_info.batt_fcc_data / 200; // + 0.5% + } + } + + if(batt_info_ptr->fRSOC > 100) { + batt_info_ptr->fRSOC = 100; + batt_info_ptr->sCaMAH = batt_info_ptr->fRSOC * the_oz8806->batt_info.batt_fcc_data / num_100; + batt_info_ptr->sCaMAH ++; + } + + //update fRSOC_extern + fRSOC_extern = batt_info_ptr->fRSOC ; + + batt_dbg("enter charger finsh update soc:%d",batt_info_ptr->fRSOC); + } + else + { + batt_dbg("enter charger charge end"); + gas_gauge_ptr->charge_end = 1; + + if (bmu_charge_end_process_callback) + bmu_charge_end_process_callback(); + + charger_finish = 0; + chgr_full_soc_pursue_start = 0; + } + + } + else { + charger_finish = 0; + chgr_full_soc_pursue_start = 0; + } + + } else chgr_full_soc_pursue_start = 0; + +} +static void oz8806_wakeup_event(struct oz8806_data *data) +{ + static int ws_active = 0; + + if (adapter_status == O2_CHARGER_BATTERY && ws_active) { + pm_relax(&data->myclient->dev); + ws_active = 0; + } + + if (adapter_status != O2_CHARGER_BATTERY && !ws_active) { + pm_stay_awake(&data->myclient->dev); + ws_active = 1; + } +} +//this is very important code customer need change +//customer should change charge discharge status according to your system +//O2micro +static void system_charge_discharge_status(struct oz8806_data *data) +{ + int8_t adapter_status_temp = O2_CHARGER_BATTERY; + + union power_supply_propval val_ac = {0}; + union power_supply_propval val_usb = {0}; + + if (!data->ac_psy) + data->ac_psy = power_supply_get_by_name ("ac"); + + if (!data->usb_psy) + data->usb_psy= power_supply_get_by_name ("usb"); + +//--------------------------------------------- +#ifdef QUALCOMM_MACH_SUPPORT + if (data->usb_psy) + { + if(0 == power_supply_get_property(data->usb_psy, POWER_SUPPLY_PROP_REAL_TYPE, &val_usb)) + { + if(POWER_SUPPLY_TYPE_USB_ACA == val_usb.intval|| POWER_SUPPLY_TYPE_USB_CDP == val_usb.intval|| POWER_SUPPLY_TYPE_USB_DCP == val_usb.intval) + adapter_status_temp = O2_CHARGER_AC; + else if(POWER_SUPPLY_TYPE_USB == val_usb.intval) + adapter_status_temp = O2_CHARGER_USB; + else + adapter_status_temp = O2_CHARGER_BATTERY; + } + } + +#else + if (data->usb_psy) + { + if(0 == power_supply_get_property(data->usb_psy, POWER_SUPPLY_PROP_ONLINE, &val_usb)) + { + if (val_usb.intval) + adapter_status_temp = O2_CHARGER_USB; + } + } + + if (data->ac_psy) + { + if(0 == power_supply_get_property(data->ac_psy, POWER_SUPPLY_PROP_ONLINE, &val_ac)) + { + if (val_ac.intval) + adapter_status_temp = O2_CHARGER_AC; + } + } + batt_dbg("val_ac.intval %d, val_usb.intval %d,adapter_status_temp %d",val_ac.intval,val_usb.intval,adapter_status_temp); +#endif + + adapter_status = adapter_status_temp; + batt_dbg("adapter_status:%d", adapter_status); +} + +static void oz8806_lock_soc(struct oz8806_data *data) +{ + unsigned long car = 0; + unsigned short temp = 0; + + //bmu ok + if(bmu_init_done) + { + pr_err("\n"); + if(rsoc_pre < 0) rsoc_pre = 0; + if(rsoc_pre > 100) rsoc_pre = 100; + + //adapter is online,and current > 0, lock to 0 or pre soc + if( (data->batt_info.batt_current > 0) && (O2_CHARGER_USB == adapter_status || O2_CHARGER_AC == adapter_status) ) + { + if(data->batt_info.batt_voltage <= O2_SOC_START_THRESHOLD_VOL) + { + pr_err("charge 1,lock soc to pre_soc,pre_soc=%d\n",rsoc_pre); + if(0 == rsoc_pre) + car = data->batt_info.batt_fcc_data / 100 -1; + else + car = rsoc_pre * data->batt_info.batt_fcc_data / 100; + + temp = (car * config_data.fRsense) / config_data.dbCARLSB; //transfer to CAR + + i2c_smbus_write_word_data(data->myclient, OZ8806_OP_CAR,(unsigned short)temp); + } + } + + //adapter is online,do not consider current, lock soc to 100 if voltage >= cv - recharge + if(O2_CHARGER_USB == adapter_status || O2_CHARGER_AC == adapter_status) + { + if( (100 == rsoc_pre) && (data->batt_info.batt_voltage >= (config_data.charge_cv_voltage - O2_CONFIG_RECHARGE)) ) + { + pr_err("charge 2,lock soc to pre_soc,pre_soc=%d\n",rsoc_pre); + car = 101 * data->batt_info.batt_fcc_data / 100 - 2; + batt_info_ptr->sCaMAH = car; + batt_info_ptr->fRC = car; + batt_info_ptr->fRCPrev = car; + temp = (car * config_data.fRsense) / config_data.dbCARLSB; //transfer to CAR + + i2c_smbus_write_word_data(data->myclient, OZ8806_OP_CAR,(unsigned short)temp); + } + } + } +} +static void oz8806_battery_func(struct oz8806_data *data) +{ + unsigned long time_since_last_update_ms = 0; + static unsigned long cur_jiffies = 0; + + if(0 == cur_jiffies) + cur_jiffies = jiffies; + + pr_err("%s: !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n", __func__); + time_since_last_update_ms = jiffies_to_msecs(jiffies - cur_jiffies); + cur_jiffies = jiffies; + + //get charging type: battery, AC, or USB + system_charge_discharge_status(data); + + rsoc_pre = data->batt_info.batt_soc; + + //you must add this code here for O2MICRO + //Notice: don't nest mutex +#ifdef EXT_THERMAL_READ + oz8806_update_batt_temp(data); +#endif + oz8806_lock_soc(data); + + /**************mutex_lock*********************/ + mutex_lock(&update_mutex); + if (bmu_polling_loop_callback && !oz8806_suspend) + bmu_polling_loop_callback(); + + oz8806_update_batt_info(data); + + charge_end_fun(); + + if(adapter_status == O2_CHARGER_BATTERY) + discharge_end_fun(data); + + mutex_unlock(&update_mutex); + /**************mutex_unlock*********************/ + + + oz8806_wakeup_event(data); + + batt_dbg("l=%d v=%d t=%d c=%d ch=%d", + data->batt_info.batt_soc, data->batt_info.batt_voltage, + data->batt_info.batt_temp, data->batt_info.batt_current, adapter_status); + + power_supply_changed(data->bat); + batt_dbg("since last batt update = %lu ms", time_since_last_update_ms); +} + +static void oz8806_battery_work(struct work_struct *work) +{ + struct oz8806_data *data = container_of(work, struct oz8806_data, work.work); + + oz8806_battery_func(data); + + if (!bmu_init_done) + { + // data->interval = 2000; + schedule_delayed_work(&data->work, msecs_to_jiffies(200)); + } + else + { + data->interval = BATTERY_WORK_INTERVAL * 1000; + schedule_delayed_work(&data->work, msecs_to_jiffies(data->interval)); + + } + batt_dbg("interval:%d ms", data->interval); +} + +int32_t is_battery_exchanged(void) +{ + return 0; +} +EXPORT_SYMBOL(is_battery_exchanged); + + + +static int oz8806_suspend_notifier(struct notifier_block *nb, + unsigned long event, + void *dummy) +{ + struct oz8806_data *data = container_of(nb, struct oz8806_data, pm_nb); + + switch (event) { + + case PM_SUSPEND_PREPARE: + pr_err("oz8806 PM_SUSPEND_PREPARE \n"); + cancel_delayed_work_sync(&data->work); + system_charge_discharge_status(data); + oz8806_suspend = 1; + return NOTIFY_OK; + case PM_POST_SUSPEND: + pr_err("oz8806 PM_POST_SUSPEND \n"); + + system_charge_discharge_status(data); + + mutex_lock(&update_mutex); + // if AC charge can't wake up every 1 min,you must remove the if. + if(adapter_status == O2_CHARGER_BATTERY) + if (bmu_wake_up_chip_callback) + bmu_wake_up_chip_callback(); + + oz8806_update_batt_info(data); + mutex_unlock(&update_mutex); + + schedule_delayed_work(&data->work, 0); + //this code must be here,very carefull. + if(adapter_status == O2_CHARGER_BATTERY) + { + if(data->batt_info.batt_current >= data->batt_info.discharge_current_th) + { + if (batt_info_ptr) batt_info_ptr->fCurr = -20; + + data->batt_info.batt_current = -20; + pr_err("drop current\n"); + } + } + + oz8806_suspend = 0; + + return NOTIFY_OK; + + default: + return NOTIFY_DONE; + } +} +static void oz8806_init_soc(struct oz8806_data *data) +{ + int32_t ret = 0; + int32_t temp = 0; + uint32_t i = 0; + + for(i=0; i<5; i++) + { + ret = i2c_smbus_read_word_data(data->myclient, OZ8806_OP_CAR); + if(ret >= 0) + break; + msleep(5); + } + if(i >= 5) + { + batt_dbg("%s failed, reg value %x\n",__func__,ret); + init_soc = 50; + return; + } + + temp = (int16_t)ret; + temp = temp * config_data.dbCARLSB; + temp = temp / config_data.fRsense; + if(temp > 5) + { + init_soc = temp * 100 / config_data.design_capacity - 1; + if(init_soc >= 100) + init_soc = 100; + if(init_soc <= 0) + init_soc = 0; + } + else + init_soc = 0; + + batt_dbg("%s succeed, init soc is %d",__func__,init_soc); +} +static int oz8806_init_batt_info(struct oz8806_data *data) +{ + data->batt_info.batt_soc = 50; + data->batt_info.batt_voltage = 3999; + data->batt_info.batt_current = -300; + data->batt_info.batt_temp = 27; + data->batt_info.batt_capacity = 4000; + + data->batt_info.batt_fcc_data = config_data.design_capacity; + data->batt_info.discharge_current_th = DISCH_CURRENT_TH; + data->batt_info.charge_end = 0; + oz8806_init_soc(data); + return 0; +} +static int oz8806_update_batt_info(struct oz8806_data *data) +{ + int ret = 0; + + //Notice: before call this function, use mutex_lock(&update_mutex) + //Notice: don't nest mutex + if (!batt_info_ptr || !gas_gauge_ptr) + { + ret = -EINVAL; + goto end; + } + + data->batt_info.batt_soc = batt_info_ptr->fRSOC; + if (data->batt_info.batt_soc > 100) + data->batt_info.batt_soc = 100; + + + data->batt_info.batt_voltage = batt_info_ptr->fVolt; + data->batt_info.batt_current = batt_info_ptr->fCurr; + data->batt_info.batt_capacity = batt_info_ptr->sCaMAH; + + data->batt_info.charge_end = gas_gauge_ptr->charge_end; + bmu_init_done = gas_gauge_ptr->bmu_init_ok; +#ifndef EXT_THERMAL_READ + oz8806_update_batt_temp(data); +#endif +end: + return ret; +} + +static int oz8806_update_batt_temp(struct oz8806_data *data) +{ + int ret = 0; + + if (!batt_info_ptr || !gas_gauge_ptr) + { + ret = -EINVAL; + goto end; + } + + data->batt_info.batt_temp = batt_info_ptr->fCellTemp; + if (batt_info_ptr->fCellTemp != data->batt_info.batt_temp) + batt_info_ptr->fCellTemp = data->batt_info.batt_temp; + +end: + return ret; +} + +int oz8806_get_remaincap(void) +{ + int ret = -1; + + mutex_lock(&update_mutex); + + if (batt_info_ptr) + ret = batt_info_ptr->sCaMAH; + + mutex_unlock(&update_mutex); + + return ret; +} +EXPORT_SYMBOL(oz8806_get_remaincap); + + +int oz8806_get_soc_from_ext(void) +{ + int ret = -1; + + return ret; +} +EXPORT_SYMBOL(oz8806_get_soc_from_ext); + +int oz8806_get_soc(void) +{ + int ret = -1; + + mutex_lock(&update_mutex); + + if (!bmu_init_done) + { + ret = init_soc; + } + else if (batt_info_ptr) + ret = batt_info_ptr->fRSOC; + + mutex_unlock(&update_mutex); + + return ret; +} +EXPORT_SYMBOL(oz8806_get_soc); + +int oz8806_get_battry_current(void) +{ + int ret = -1; + + if (!bmu_init_done) return -1; + + mutex_lock(&update_mutex); + + if (oz8806_current_read_callback && batt_info_ptr) + ret = oz8806_current_read_callback(&batt_info_ptr->fCurr); + + if (ret < 0) + { + ret = -1; + batt_dbg("%s:oz8806 current adc error", __func__); + } + + if (batt_info_ptr && ret >= 0) + ret = batt_info_ptr->fCurr; + + mutex_unlock(&update_mutex); + + return ret; +} +EXPORT_SYMBOL(oz8806_get_battry_current); + +int oz8806_get_battery_voltage(void) +{ + int ret = -1; + + if (!bmu_init_done) return -1; + + mutex_lock(&update_mutex); + + if (oz8806_voltage_read_callback && batt_info_ptr) + ret = oz8806_voltage_read_callback(&batt_info_ptr->fVolt); + + if (ret < 0) + { + ret = -1; + batt_dbg("%s:oz8806 voltage adc error", __func__); + } + + if (batt_info_ptr && ret >= 0) + ret = batt_info_ptr->fVolt; + + mutex_unlock(&update_mutex); + + return ret; +} +EXPORT_SYMBOL(oz8806_get_battery_voltage); + +int oz8806_get_battery_temp(void) +{ + int ret = -1; + + if (!bmu_init_done) return -1; + + mutex_lock(&update_mutex); + + if (batt_info_ptr) + ret = batt_info_ptr->fCellTemp; + + mutex_unlock(&update_mutex); + + return ret; +} +EXPORT_SYMBOL(oz8806_get_battery_temp); + +void oz8806_battery_update_data(void) +{ + batt_dbg("enter %s", __func__); + if (fg_hw_init_done && the_oz8806 && bmu_init_done) + oz8806_battery_func(the_oz8806); +} +EXPORT_SYMBOL(oz8806_battery_update_data); + +int32_t oz8806_vbus_voltage(void) +{ + int32_t vbus_voltage = 0; + int ret = -1; + + if (oz8806_temp_read_callback) + ret = oz8806_temp_read_callback(&vbus_voltage); + + if (ret < 0) + { + batt_dbg("%s:oz8806 temp adc error", __func__); + return ret; + } + + batt_dbg("voltage from oz8806:%d", vbus_voltage); + vbus_voltage = vbus_voltage * (RPULL + RDOWN) / RDOWN; + + return vbus_voltage; +} +EXPORT_SYMBOL(oz8806_vbus_voltage); + +int32_t oz8806_get_simulated_temp(void) +{ + return 25; +} +EXPORT_SYMBOL(oz8806_get_simulated_temp); + +int32_t oz8806_get_init_status(void) +{ + return bmu_init_done; +} +EXPORT_SYMBOL(oz8806_get_init_status); + +int32_t gauge_int_done(void) +{ + return fg_hw_init_done; +} +EXPORT_SYMBOL(gauge_int_done); + +struct i2c_client * oz8806_get_client(void) +{ + if (the_oz8806) + return the_oz8806->myclient; + else + { + pr_err("the_oz8806 is NULL, oz8806_probe didn't call\n"); + return NULL; + + } +} +EXPORT_SYMBOL(oz8806_get_client); + + +int8_t get_adapter_status(void) +{ + return adapter_status; +} +EXPORT_SYMBOL(get_adapter_status); + +void oz8806_register_bmu_callback(void *bmu_polling_loop_func, + void *bmu_wake_up_chip_func, + void *bmu_power_down_chip_func, + void *charge_end_process_func, + void *discharge_end_process_func, + void *oz8806_temp_read_func, + void *oz8806_current_read_func, + void *oz8806_voltage_read_func) +{ + mutex_lock(&update_mutex); + + bmu_polling_loop_callback = bmu_polling_loop_func; + bmu_wake_up_chip_callback = bmu_wake_up_chip_func; + bmu_power_down_chip_callback = bmu_power_down_chip_func; + bmu_charge_end_process_callback = charge_end_process_func; + bmu_discharge_end_process_callback = discharge_end_process_func; + + oz8806_temp_read_callback = oz8806_temp_read_func; + oz8806_current_read_callback = oz8806_current_read_func; + oz8806_voltage_read_callback = oz8806_voltage_read_func; + + if(bmu_polling_loop_callback) + bmu_polling_loop_callback(); + + mutex_unlock(&update_mutex); +} +EXPORT_SYMBOL(oz8806_register_bmu_callback); + +void unregister_bmu_callback(void) +{ + mutex_lock(&update_mutex); + + bmu_polling_loop_callback = NULL; + bmu_wake_up_chip_callback = NULL; + bmu_power_down_chip_callback = NULL; + bmu_charge_end_process_callback = NULL; + bmu_discharge_end_process_callback = NULL; + + oz8806_temp_read_callback = NULL; + oz8806_current_read_callback = NULL; + oz8806_voltage_read_callback = NULL; + + oz8806_init_batt_info(the_oz8806); + + batt_info_ptr = NULL; + gas_gauge_ptr = NULL; + + mutex_unlock(&update_mutex); +} +EXPORT_SYMBOL(unregister_bmu_callback); + +void oz8806_set_batt_info_ptr(bmu_data_t *batt_info) +{ + mutex_lock(&update_mutex); + + if (!batt_info) + { + pr_err("%s: batt_info NULL\n", __func__); + mutex_unlock(&update_mutex); + return; + } + + batt_info_ptr = batt_info; + + mutex_unlock(&update_mutex); +} +EXPORT_SYMBOL(oz8806_set_batt_info_ptr); + +void oz8806_set_gas_gauge(gas_gauge_t *gas_gauge) +{ + mutex_lock(&update_mutex); + + if (!gas_gauge) + { + pr_err("%s: gas_gauge NULL\n", __func__); + mutex_unlock(&update_mutex); + return; + } + + gas_gauge_ptr = gas_gauge; + + if (gas_gauge_ptr->fcc_data != 0) + the_oz8806->batt_info.batt_fcc_data = gas_gauge_ptr->fcc_data; + + if (gas_gauge_ptr->discharge_current_th != 0) + the_oz8806->batt_info.discharge_current_th = gas_gauge_ptr->discharge_current_th; + + batt_dbg("batt_fcc_data:%d, discharge_current_th:%d", + the_oz8806->batt_info.batt_fcc_data, the_oz8806->batt_info.discharge_current_th); + + gas_gauge_ptr->ext_temp_measure = ext_thermal_read; + + mutex_unlock(&update_mutex); +} +EXPORT_SYMBOL(oz8806_set_gas_gauge); + +int oz8806_get_save_capacity(void) +{ + return save_capacity; +} +EXPORT_SYMBOL(oz8806_get_save_capacity); + +unsigned long oz8806_get_boot_up_time(void) +{ + unsigned long long t; + struct timespec time; + ktime_get_ts(&time); + t = time.tv_sec * 1000 + time.tv_nsec / 1000000; + batt_dbg("boot up time: %lu ms", (unsigned long) t); + + return t; +} +EXPORT_SYMBOL(oz8806_get_boot_up_time); + +unsigned long oz8806_get_power_on_time(void) +{ + unsigned int t = 0; + pr_info("jiffies %lu,ic_wakeup_time %lu\n",jiffies,ic_wakeup_time); + t = jiffies_to_msecs(jiffies - ic_wakeup_time); + + pr_info("IC wakeup time: %u ms\n", t); + + return (unsigned long)t; +} +EXPORT_SYMBOL(oz8806_get_power_on_time); + +static int oz8806_probe(struct i2c_client *client,const struct i2c_device_id *id) +{ + int32_t ret = 0; + struct oz8806_data* data = NULL; + + struct power_supply_config psy_cfg = { + .of_node = client->dev.of_node, + }; + + pr_err("%s start\n",__func__); +/***************************************************************************** +* O2Micro Warning: +* bmulib_init 是非常重要的函数,芯片需要client来执行初始化以及自检校验等工作 +* 不允许因为读不到I2C信息而提前于这个函数返回,这将引起非常严重的错误问题。 +* 再次提醒,不允许因为读不到I2C信息而直接返回。 +*****************************************************************************/ + + data = devm_kzalloc(&client->dev, sizeof(struct oz8806_data), GFP_KERNEL); + if (!data) { + dev_err(&client->dev, "Can't alloc oz8806_data struct\n"); + return -ENOMEM; + } + + // Init real i2c_client + i2c_set_clientdata(client, data); + + the_oz8806 = data; + data->myclient = client; + //init battery information as soon as possible + oz8806_init_batt_info(data); + + INIT_DELAYED_WORK(&data->work, oz8806_battery_work); +/***************************************************************************** +* O2Micro Warning: This is a very important code here(bmulib_init). +* The chip needs i2c client processing opt mapping and self init first in bmulib_init. +* You must not return before this code even if you read i2c error. +* Remind you again that it will make serious mistake if you return before bmulib_init. +*****************************************************************************/ + if (oz8806_get_boot_up_time() < 2000) + ic_wakeup_time = jiffies + msecs_to_jiffies(2000 - oz8806_get_boot_up_time()); + else + ic_wakeup_time = jiffies;//msecs_to_jiffies(2000); + +#ifndef CONFIG_OZ8806_M + bmulib_init(); +#else + /* + * Wake up oz8806 to full power mode here. + * Then, after at least 2.5s, detection of current, voltage, and temperature can be stable + * + * when IC start with start-up mode, after at least 2s, IC can enter Full Power Mode. + */ + oz8806_wakeup_full_power(); +#endif + + data->interval = BATTERY_WORK_INTERVAL * 1000; + + oz8806_powersupply_init(data); + psy_cfg.drv_data = data, + data->bat = power_supply_register(&client->dev, &the_oz8806->bat_desc,&psy_cfg); + if (!data->bat) { + pr_err("failed to register power_supply battery\n"); + goto register_fail; + } + + /* + * /sys/class/i2c-dev/i2c-2/device/2-002f/ + */ + ret = oz8806_create_sys(&(client->dev), &oz8806_attribute_group); + if(ret){ + pr_err("[BATT]: Err failed to creat oz8806 attributes\n"); + goto bat_failed; + } + + //alternative suspend/resume method + data->pm_nb.notifier_call = oz8806_suspend_notifier; + register_pm_notifier(&data->pm_nb); + + ret = device_init_wakeup(&client->dev, true); + if (ret) + dev_err(&client->dev, "wakeup source init failed.\n"); + + fg_hw_init_done = 1; + + schedule_delayed_work(&data->work, 0); + + pr_err("%s end\n",__func__); + return 0; //return Ok +bat_failed: + power_supply_unregister(the_oz8806->bat); +register_fail: + pr_err("%s() fail: return %d\n", __func__, ret); + the_oz8806 = NULL; + return ret; +} + + +static int oz8806_remove(struct i2c_client *client) +{ + struct oz8806_data *data = i2c_get_clientdata(client); + + cancel_delayed_work(&data->work); + + sysfs_remove_group(&(data->myclient->dev.kobj), &oz8806_attribute_group); + + power_supply_unregister(data->bat); + + mutex_lock(&update_mutex); + + if (bmu_power_down_chip_callback) + { + //这里需要注意,在关机流程中,必须要调用关机回调,否则芯片可能没有正常休眠,导致下次开机容量异常 + //并且要小心回调之后,如果有work或者线程跑起来,可能会再次唤醒芯片,要避免这种情况。 + fg_hw_init_done = 0;//be carefull other thread call bmu_polling_loop_func and wake up chip again + bmu_power_down_chip_callback(); + } + + oz8806_update_batt_info(data); + + mutex_unlock(&update_mutex); +#ifndef CONFIG_OZ8806_M + bmulib_exit(); +#endif + + return 0; +} + +static void oz8806_shutdown(struct i2c_client *client) +{ + struct oz8806_data *data = i2c_get_clientdata(client); + pr_err("oz8806 shutdown\n"); + + cancel_delayed_work(&data->work); + + sysfs_remove_group(&(data->myclient->dev.kobj), &oz8806_attribute_group); + + mutex_lock(&update_mutex); + if (bmu_power_down_chip_callback) + { + //这里需要注意,在关机流程中,必须要调用关机回调,否则芯片可能没有正常休眠,导致下次开机容量异常 + //并且要小心回调之后,如果有work或者线程跑起来,可能会再次唤醒芯片,要避免这种情况。 + fg_hw_init_done = 0; + bmu_power_down_chip_callback(); + } + + oz8806_update_batt_info(data); + mutex_unlock(&update_mutex); +} +/*-------------------------------------------------------------------------*/ + +static const struct i2c_device_id oz8806_id[] = { + { MYDRIVER, 0 }, //string, id?? + { } +}; +MODULE_DEVICE_TABLE(i2c, oz8806_id); + +static const struct of_device_id oz8806_of_match[] = { + {.compatible = "o2micro,oz8806",}, + {}, +}; +MODULE_DEVICE_TABLE(of, oz8806_of_match); + + +static struct i2c_driver oz8806_driver = { + .driver = { + .name = MYDRIVER, + .of_match_table = oz8806_of_match, + }, + .probe = oz8806_probe, + .remove = oz8806_remove, + .shutdown = oz8806_shutdown, + .id_table = oz8806_id, +}; + + +static int __init oz8806_init(void) +{ + int ret = 0; + + ret = i2c_add_driver(&oz8806_driver); + + if(ret != 0) + pr_err("failed to register oz8806 i2c driver.\n"); + else + pr_err("Success to register oz8806 i2c driver.\n"); + + return ret; +} + +static void __exit oz8806_exit(void) +{ + pr_err("%s\n", __func__); + i2c_del_driver(&oz8806_driver); +} + +/*-------------------------------------------------------------------------*/ + +MODULE_DESCRIPTION("oz8806 Battery Monitor IC Driver"); +MODULE_LICENSE("GPL"); + +//subsys_initcall_sync(oz8806_init); +module_init(oz8806_init); +module_exit(oz8806_exit); diff --git a/drivers/power/sd77426_fg_mmi/oz8806_regdef.h b/drivers/power/sd77426_fg_mmi/oz8806_regdef.h new file mode 100644 index 000000000000..eba2e835589f --- /dev/null +++ b/drivers/power/sd77426_fg_mmi/oz8806_regdef.h @@ -0,0 +1,95 @@ +/***************************************************************************** +* Copyright(c) O2Micro, 2019. All rights reserved. +* +* O2Micro [OZ8806] Source Code Reference Design +* File:[oz8806_regdef.h] +* +* This Source Code Reference Design for O2MICRO [OZ8806] access +* ("Reference Design") is solely for the use of PRODUCT INTEGRATION REFERENCE ONLY, +* and contains confidential and privileged information of O2Micro International +* Limited. O2Micro shall have no liability to any PARTY FOR THE RELIABILITY, +* SERVICEABILITY FOR THE RESULT OF PRODUCT INTEGRATION, or results from: (i) any +* modification or attempted modification of the Reference Design by any party, or +* (ii) the combination, operation or use of the Reference Design with non-O2Micro +* Reference Design. Use of the Reference Design is at user's discretion to qualify +* the final work result. +*****************************************************************************/ + + #ifndef _OZ8806_REGDEF_H_ + #define _OZ8806_REGDEF_H_ + +/***************************************************************************** + * #include section + * add #include here + *****************************************************************************/ + + +/***************************************************************************** + * const section + * add const #define here + *****************************************************************************/ + +/* Operation register map define */ +#define OZ8806_OP_IDREV 0X00 //CHIP ID and Reversion + #define CHIP_ID_MASK 0xF8 //default CHIP_ID[7:3]=0x07 + #define CHIP_VER_MASK 0x07 //default CHIP_VER[2:0]=0x00 for 8806 + +#define OZ8806_OP_VD23 0x03 // + +#define OZ8806_OP_I2CCONFIG 0x04 //I2C config register + #define I2C_ADDRESS_MASK 0x0E //default 0X07 + +#define OZ8806_OP_PEC_CTRL 0x08 //PEC control register + #define PEC_EN 0x04 //PEC control register[2]: 1: PEC enable 0: PEC disable + +#define OZ8806_OP_CTRL 0x09 //Status control register + #define SOFT_RESET 0x80 //Status control register[7]: 1: reset + #define SLEEP_MODE 0x40 //Status control register[6]: 1: sleep 0:active + #define SLEEP_OCV_EN 0x20 + #define CHARGE_ON 0x10 + #define VME_SEL 0x0c + #define CHG_SEL 0x02 + #define BI_STATUS 0x01 + + +#define OZ8806_OP_VOLT_OFFSET 0X0A + #define VOLT_OFFSET_MASK 0xFC + +#define OZ8806_OP_BATTERY_ID 0x0B + +#define OZ8806_OP_CELL_TEMP 0x0C //cell temperature low byte,[7:4]->[3:0]of cell temp + #define CELL_TEMP_MASK 0x0FFF + +#define OZ8806_OP_CELL_TEMP_HIGH 0x0D //cell temperature high byte,[7:0]->[11:4]of cell temp + +#define OZ8806_OP_CELL_VOLT 0x0E //cell voltage low byte,[7:4]->[3:0]of cell volt + #define CELL_VOLT_MASK 0x0FFF + +#define OZ8806_OP_CELL_VOLT_HIGH 0x0f //cell voltage high byte,[7:0]->[11:4]of cell volt + +#define OZ8806_OP_OCV_LOW 0x10 //OCV low byte,[7:4]->[3:0]of OCV + #define OCV_LOW_MASK 0xF0 + #define SLEEP_OCV_FLAG 0X02 + #define POWER_OCV_FLAG 0X01 + +#define OZ8806_OP_OCV_HIGH 0x11 //OCV high byte,[7:0]->[11:4]of OCV + +#define OZ8806_OP_CURRENT 0x12 //CURRENT low byte,[7:1]->[5:0]of CURRENT + + +#define OZ8806_OP_CAR 0x14 //CAR low byte + +#define OZ8806_OP_BOARD_OFFSET 0x18 + + + +/***************************************************************************** + * function prototype section + * add function prototype here + *****************************************************************************/ + + + + +#endif + diff --git a/drivers/power/sd77426_fg_mmi/parameter.c b/drivers/power/sd77426_fg_mmi/parameter.c new file mode 100644 index 000000000000..58c22530a9ea --- /dev/null +++ b/drivers/power/sd77426_fg_mmi/parameter.c @@ -0,0 +1,164 @@ +/***************************************************************************** +* Copyright(c) O2Micro, 2019. All rights reserved. +* +* O2Micro [OZ8806] Source Code Reference Design +* File:[parameter.c] +* +* This Source Code Reference Design for O2MICRO [OZ8806] access +* ("Reference Design") is solely for the use of PRODUCT INTEGRATION REFERENCE ONLY, +* and contains confidential and privileged information of O2Micro International +* Limited. O2Micro shall have no liability to any PARTY FOR THE RELIABILITY, +* SERVICEABILITY FOR THE RESULT OF PRODUCT INTEGRATION, or results from: (i) any +* modification or attempted modification of the Reference Design by any party, or +* (ii) the combination, operation or use of the Reference Design with non-O2Micro +* Reference Design. Use of the Reference Design is at user's discretion to qualify +* the final work result. +*****************************************************************************/ + +#include +#include +#include +#include "parameter.h" +#include "table.h" +#include "battery_config.h" + + +one_latitude_data_t cell_temp_data[TEMPERATURE_DATA_NUM] = { + {681, 115}, {766, 113}, {865, 105}, + {980, 100}, {1113, 95}, {1266, 90}, + {1451, 85}, {1668, 80}, {1924, 75}, + {2228, 70}, {2588, 65}, {3020, 60}, + {3536, 55}, {4160, 50}, {4911, 45}, + {5827, 40}, {6940, 35}, {8313, 30}, + {10000, 25}, {12090, 20}, {14690, 15}, + {17960, 10}, {22050, 5}, {27280, 0}, + {33900, -5}, {42470, -10}, {53410, -15}, + {67770, -20}, +}; + + +config_data_t config_data = { + .fRsense = O2_CONFIG_RSENSE, + .temp_pull_up = O2_TEMP_PULL_UP_R, + .temp_ref_voltage = O2_TEMP_REF_VOLTAGE, + .dbCARLSB = 5, + .dbCurrLSB = 781 , + .fVoltLSB = 250, + + .design_capacity = O2_CONFIG_CAPACITY, + .charge_cv_voltage = OZ8806_VOLTAGE, + .charge_end_current = O2_CONFIG_EOC, + .discharge_end_voltage = OZ8806_EOD, + .board_offset = O2_CONFIG_BOARD_OFFSET, + .debug = 1, +}; + + +/***************************************************************************** + * bmu_init_parameter: + * this implements a interface for customer initiating bmu parameters + * Return: NULL + *****************************************************************************/ +void bmu_init_parameter(parameter_data_t *parameter_customer) +{ + //如果选用88106,并且prg pin拉低,这一标志可以清0.以避免i2c通讯问题。 + //如果prg pin拉高,则这个标志需要写1,否则会导致电量不更新。此标志在 + //库中,默认拉高。 +#ifdef CONFIG_OZ115_SUPPORT + check_chip_function = 1; +#else + check_chip_function = 0; +#endif + parameter_customer->config = &config_data; + parameter_customer->ocv = ocv_data; + parameter_customer->temperature = cell_temp_data; + parameter_customer->ocv_data_num = OCV_DATA_NUM; + parameter_customer->cell_temp_num = TEMPERATURE_DATA_NUM; + parameter_customer->charge_pursue_step = 10; + parameter_customer->discharge_pursue_step = 6; + parameter_customer->discharge_pursue_th = 10; + parameter_customer->wait_method = 2; + + //parameter_customer->BATT_CAPACITY = "/data/sCaMAH.dat"; + //parameter_customer->BATT_FCC = "/data/fcc.dat"; + //parameter_customer->OCV_FLAG = "/data/ocv_flag.dat"; + //parameter_customer->BATT_OFFSET = "/data/offset.dat"; + + parameter_customer->fix_car_init = 0; + parameter_customer->power_on_retry_times = 0; + + //if read/write file /data/sCaMAH.dat in userspace + //please enable "bmu_sys_rw_kernel = 0" +#ifdef USERSPACE_READ_SAVED_CAP + parameter_customer->bmu_sys_rw_kernel = 0; +#else + parameter_customer->bmu_sys_rw_kernel = 1; +#endif +} +EXPORT_SYMBOL(bmu_init_parameter); + + +/***************************************************************************** + * Description: + * bmu_init_gg + * Return: NULL + *****************************************************************************/ +void bmu_init_gg(gas_gauge_t *gas_gauge) +{ + //gas_gauge->charge_table_num = CHARGE_DATA_NUM; + gas_gauge->rc_x_num = XAxis; + gas_gauge->rc_y_num = YAxis; + gas_gauge->rc_z_num = ZAxis; + + gas_gauge->discharge_current_th = DISCH_CURRENT_TH; + gas_gauge->fcc_data = config_data.design_capacity; + + pr_err("AAAA battery_id is %s\n", battery_id[0]); + + gas_gauge->ri = 18; + gas_gauge->line_impedance = 10; + +#if 0 + //add this for oinom + gas_gauge->lower_capacity_reserve = 5; + gas_gauge->lower_capacity_soc_start =30; + + + //gas_gauge->percent_10_reserve = 66; +#endif +} +EXPORT_SYMBOL(bmu_init_gg); + + +#ifdef OZ8806_API + +#define BMU_INIT(x) \ +void bmu_init_##x(uint8_t *dest, uint32_t bytes)\ +{\ + memcpy(dest, (uint8_t *)x, bytes);\ +}\ +EXPORT_SYMBOL(bmu_init_##x);\ + +//BMU_INIT(charge_data) +BMU_INIT(XAxisElement) +BMU_INIT(YAxisElement) +BMU_INIT(ZAxisElement) +BMU_INIT(RCtable) + +#endif + +void bmu_init_table(int **x, int **y, int **z, int **rc) +{ + *x = (int *)((uint8_t *)XAxisElement); + *y = (int *)((uint8_t *)YAxisElement); + *z = (int *)((uint8_t *)ZAxisElement); + *rc = (int *)((uint8_t *)RCtable); +} +EXPORT_SYMBOL(bmu_init_table); + +const char * get_table_version(void) +{ + return table_version; +} +EXPORT_SYMBOL(get_table_version); + diff --git a/drivers/power/sd77426_fg_mmi/parameter.h b/drivers/power/sd77426_fg_mmi/parameter.h new file mode 100644 index 000000000000..2aa57fcce29d --- /dev/null +++ b/drivers/power/sd77426_fg_mmi/parameter.h @@ -0,0 +1,335 @@ +/***************************************************************************** +* Copyright(c) O2Micro, 2019. All rights reserved. +* +* O2Micro [OZ8806] Source Code Reference Design +* File:[parameter.h] +* +* This Source Code Reference Design for O2MICRO [OZ8806] access +* ("Reference Design") is solely for the use of PRODUCT INTEGRATION REFERENCE ONLY, +* and contains confidential and privileged information of O2Micro International +* Limited. O2Micro shall have no liability to any PARTY FOR THE RELIABILITY, +* SERVICEABILITY FOR THE RESULT OF PRODUCT INTEGRATION, or results from: (i) any +* modification or attempted modification of the Reference Design by any party, or +* (ii) the combination, operation or use of the Reference Design with non-O2Micro +* Reference Design. Use of the Reference Design is at user's discretion to qualify +* the final work result. +*****************************************************************************/ + +#ifndef _PARAMETER_H_ +#define _PARAMETER_H_ + +/**************************************************************************** +* #include section +* add #include here if any +***************************************************************************/ +#include "table.h" +#include +#include + + +/**************************************************************************** +* #define section +* add constant #define here if any +***************************************************************************/ +//#define MUTEX_TIMEOUT 5000 +#define MYDRIVER "oz8806" //"oz8806" + +#define DISCH_CURRENT_TH -10 +#define O2_OCV_100_VOLTAGE (xaxis_table[X_AXIS - 1]) +#define TEMPERATURE_DATA_NUM 28 + +#define num_0 0 +#define num_1 1 +#define num_32768 32768 +#define num_5 5 +#define num_0x2c 0x2c +#define num_0x40 0x40 +#define num_0x20 0x20 +#define num_1000 1000 +#define num_50 50 +#define num_100 100 +#define num_10 10 +#define num_7 7 +#define num_2 2 +#define num_1000 1000 +#define num_0x2f 0x2f +#define num_0x28 0x28 +#define num_0x07 0x07 +#define num_6 6 +#define num_10 10 +#define num_20 20 +#define num_9 9 +#define num_95 95 +#define num_0x4c 0x4c +#define num_0x40 0x40 +#define num_3 3 +#define num_99 99 +#define num_15 15 +#define num_25 25 +#define num_0x80 0x80 + +//#define PEC_CHECK + +#define INIT_CAP (-2) +#define NO_FILE (-1) + + +/**************************************************************************** +* Struct section +* add struct #define here if any +***************************************************************************/ + +enum charger_type_t { + O2_CHARGER_UNKNOWN = -1, + O2_CHARGER_BATTERY = 0, + O2_CHARGER_USB = 1, + O2_CHARGER_AC = 4, +}; + +struct batt_data { + + int32_t batt_soc;//Relative State Of Charged, present percentage of battery capacity + int32_t batt_voltage;//Voltage of battery, in mV + int32_t batt_current;//Current of battery, in mA; plus value means charging, minus value means discharging + + int32_t batt_temp;//Temperature of battery + int32_t batt_capacity;//adjusted residual capacity + int32_t batt_fcc_data; + int32_t discharge_current_th; + uint8_t charge_end; +}; + +struct oz8806_data +{ + struct power_supply *bat; + struct power_supply_desc bat_desc; + struct power_supply *ac_psy; + struct power_supply *usb_psy; + + struct delayed_work work; + unsigned int interval; + + struct i2c_client *myclient; + + struct notifier_block pm_nb; //alternative suspend/resume method + struct batt_data batt_info; + int status; +}; + + +typedef struct tag_config_data { + int32_t fRsense; //= 20; //Rsense value of chip, in mini ohm + int32_t temp_pull_up; //230000; + int32_t temp_ref_voltage; //1800;1.8v + int32_t dbCARLSB; //= 5.0; //LSB of CAR, comes from spec + int32_t dbCurrLSB; //781 (7.8 *100 uV); //LSB of Current, comes from spec + int32_t fVoltLSB; //250 (2.5*100 mV); //LSB of Voltage, comes from spec + + int32_t design_capacity; //= 7000; //design capacity of the battery + int32_t charge_cv_voltage; //= 4200; //CV Voltage at fully charged + int32_t charge_end_current; //= 100; //the current threshold of End of Charged + int32_t discharge_end_voltage; //= 3550; //mV + int32_t board_offset; //0; //mA, not more than caculate data + uint8_t debug; // enable or disable O2MICRO debug information + +}config_data_t; + + +typedef struct tag_parameter_data { + int32_t ocv_data_num; + int32_t cell_temp_num; + one_latitude_data_t *ocv; + one_latitude_data_t *temperature; + config_data_t *config; + + struct i2c_client *client; + + uint8_t charge_pursue_step; + uint8_t discharge_pursue_step; + uint8_t discharge_pursue_th; + uint8_t wait_method; + char * BATT_CAPACITY ; + char * BATT_FCC; + char * OCV_FLAG; + char * BATT_OFFSET; + uint8_t oz8806_cell_num; + int32_t res_divider_ratio; + uint8_t set_soc_from_ext; + int32_t soc_external; + uint8_t file_not_ok_cap; + uint8_t fix_car_init; + uint8_t bmu_sys_rw_kernel; + int8_t power_on_retry_times; +}parameter_data_t; + + +typedef struct tag_bmu { + int32_t Battery_ok; + int32_t fRC; //= 0; //Remaining Capacity, indicates how many mAhr in battery + int32_t fRSOC; //50 = 50%; //Relative State Of Charged, present percentage of battery capacity + int32_t fVolt; //= 0; //Voltage of battery, in mV + int32_t fCurr; //= 0; //Current of battery, in mA; plus value means charging, minus value means discharging + int32_t fPrevCurr; //= 0; //last one current reading + int32_t fOCVVolt; //= 0; //Open Circuit Voltage + int32_t fCellTemp; //= 0; //Temperature of battery + int32_t fRCPrev; + int32_t sCaMAH; //= 0; //adjusted residual capacity + int32_t i2c_error_times; +}bmu_data_t; + +typedef struct tag_gas_gauge { + + int32_t overflow_data; //unit: mAh, maximum capacity that the IC can measure + uint8_t discharge_end; + uint8_t charge_end; + uint8_t charge_fcc_update; + uint8_t discharge_fcc_update; + + int32_t sCtMAH ; //be carefull, this must be int32_t + int32_t fcc_data; + int32_t discharge_sCtMAH ;//be carefull, this must be int32_t + //uint8_t charge_wait_times; + //uint8_t discharge_wait_times; + //uint8_t charge_count; + //uint8_t discharge_count; + //uint32_t bmu_tick; + //uint32_t charge_tick; + + //uint8_t charge_table_num; + uint8_t rc_x_num; + uint8_t rc_y_num; + uint8_t rc_z_num; + + uint8_t charge_strategy; + int32_t charge_sCaUAH; + int32_t charge_ratio; //this must be static + uint8_t charge_table_flag; + int32_t charge_end_current_th2; + int32_t charge_max_ratio; + + uint8_t discharge_strategy; + int32_t discharge_sCaUAH; + int32_t discharge_ratio; //this must be static + uint8_t discharge_table_flag; + int32_t discharge_current_th; + uint32_t discharge_max_ratio; + + int32_t dsg_end_voltage_hi; + int32_t dsg_end_voltage_th1; + int32_t dsg_end_voltage_th2; + uint8_t dsg_count_2; + + uint8_t ocv_flag; + + uint8_t vbus_ok; + + uint8_t charge_full; + int32_t ri; + int32_t batt_ri; + int32_t line_impedance; + int32_t max_chg_reserve_percentage; + int32_t fix_chg_reserve_percentage; + uint8_t fast_charge_step; + int32_t start_fast_charge_ratio; + uint8_t charge_method_select; + int32_t max_charge_current_fix; + uint8_t ext_temp_measure; + uint8_t bmu_init_ok; + int32_t stored_capacity; + + uint8_t lower_capacity_reserve; + uint8_t lower_capacity_soc_start; + + uint8_t percent_10_reserve; +}gas_gauge_t; + +/**************************************************************************** +* extern variable/function declaration of table.c +***************************************************************************/ + +extern one_latitude_data_t ocv_data[OCV_DATA_NUM]; +extern int XAxisElement[XAxis]; +extern int YAxisElement[YAxis]; +extern int ZAxisElement[ZAxis]; +extern int RCtable[YAxis*ZAxis][XAxis]; +//extern one_latitude_data_t charge_data[CHARGE_DATA_NUM]; + + +/**************************************************************************** +* extern variable/function defined by parameter.c +***************************************************************************/ +extern config_data_t config_data; +extern uint8_t check_chip_function; +//****************************************************************************** + +extern void bmu_init_parameter(parameter_data_t *parameter_customer); +extern void bmu_init_gg(gas_gauge_t *gas_gauge); +extern void bmu_reinit(int32_t mode); //mode = 0,wakeup ic,rewrite car; mode = 1, reinit from ocv +#ifndef CONFIG_OZ8806_M +extern int bmulib_init(void); +extern void bmulib_exit(void); +#endif + +#ifdef OZ8806_API +//extern void bmu_init_charge_data(uint8_t *dest, uint32_t bytes); +extern void bmu_init_XAxisElement(uint8_t *dest, uint32_t bytes); +extern void bmu_init_YAxisElement(uint8_t *dest, uint32_t bytes); +extern void bmu_init_ZAxisElement(uint8_t *dest, uint32_t bytes); +extern void bmu_init_RCtable(uint8_t *dest, uint32_t bytes); +#endif +extern void bmu_init_table(int **x, int **y, int **z, int **rc); + +extern const char * get_table_version(void); + +/**************************************************************************** +* extern variable/function defined by oz8806_battery.c +***************************************************************************/ +#ifdef OZ8806_API +extern bmu_data_t *batt_info_ptr; +extern struct mutex *update_mutex_ptr; +#endif +extern int32_t oz8806_vbus_voltage(void); +extern int32_t oz8806_get_simulated_temp(void); +extern int32_t oz8806_get_init_status(void); //if return 1, battery capacity is initiated successfully +extern void oz8806_battery_update_data(void); +extern int oz8806_get_soc(void); +extern int oz8806_get_remaincap(void); +extern int oz8806_get_battry_current(void); +extern int oz8806_get_battery_voltage(void); +extern int oz8806_get_battery_temp(void); + +//export symbol for bmulib +extern struct i2c_client * oz8806_get_client(void); +extern int8_t get_adapter_status(void); + +extern void oz8806_register_bmu_callback(void *bmu_polling_loop_func, + void *bmu_wake_up_chip_func, + void *bmu_power_down_chip_func, + void *charge_end_process_func, + void *discharge_end_process_func, + void *oz8806_temp_read_func, + void *oz8806_current_read_func, + void *oz8806_voltage_read_func); + +extern void unregister_bmu_callback(void); +extern void oz8806_set_batt_info_ptr(bmu_data_t *batt_info); +extern void oz8806_set_gas_gauge(gas_gauge_t *gas_gauge); +extern int oz8806_get_save_capacity(void); +extern int oz8806_get_soc_from_ext(void); +extern unsigned long oz8806_get_power_on_time(void); +extern unsigned long oz8806_get_boot_up_time(void); +extern int oz8806_wakeup_full_power(void); + +/**************************************************************************** +* extern variable/function defined by oz8806_api_dev.c. +* This file is deprecated in Linux system. +***************************************************************************/ +#ifdef OZ8806_API +extern unsigned long oz8806_get_kernel_memaddr(void); +extern void bmu_call(void); +#endif + +extern int is_battery_exchanged(void); + +#endif //end _PARAMETER_H_ + diff --git a/drivers/power/sd77426_fg_mmi/table.c b/drivers/power/sd77426_fg_mmi/table.c new file mode 100644 index 000000000000..c4a72b15fedd --- /dev/null +++ b/drivers/power/sd77426_fg_mmi/table.c @@ -0,0 +1,129 @@ +/***************************************************************************** +* Copyright(c) O2Micro, 2014. All rights reserved. +* +* O2Micro battery gauge driver +* File: table.c +* +* $Source: /data/code/CVS +* $Revision: 4.00.01 $ +* +* This program is free software and can be edistributed and/or modify +* it under the terms of the GNU General Public License version 2 as +* published by the Free Software Foundation. +* +* This Source Code Reference Design for O2MICRO Battery Gauge access (\u201cReference Design\u201d) +* is sole for the use of PRODUCT INTEGRATION REFERENCE ONLY, and contains confidential +* and privileged information of O2Micro International Limited. O2Micro shall have no +* liability to any PARTY FOR THE RELIABILITY, SERVICEABILITY FOR THE RESULT OF PRODUCT +* INTEGRATION, or results from: (i) any modification or attempted modification of the +* Reference Design by any party, or (ii) the combination, operation or use of the +* Reference Design with non-O2Micro Reference Design. +* +* Battery Manufacture: Lenovo +* Battery Model: BL244 +* Absolute Max Capacity(mAhr): 5158 +* Limited Charge Voltage(mV): 4350 +* Cutoff Discharge Voltage(mV): 3200 +* Equipment: "JY1-8","JY1-4","JY1-4","JY2-8","JY2-8","JY2-8","JY2-5","JY1-1","JY1-1","JY1-8","JY1-8","JY1-8","JY1-8","JY2-5","JY2-5","JY2-5","JY2-5","JY1-8","JY2-8","JY2-8","JY1-8","JY1-2","JY1-2","JY2-6","JY2-6","JY2-6","JY2-7","JY2-7","JY2-7","JY2-7","JY2-7","JY2-7","JY2-7","JY2-7","JY2-7","JY2-7","JY2-7","JY2-7","JY2-7","JY2-7","JY2-7","JY2-7","JY2-7","JY2-7","JY1-3","JY1-3","JY1-6","JY1-6","JY1-6","JY2-8","JY2-5","JY2-5" +* Tester: "SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ" +* Battery ID: "BL244-1","BL244-1","BL244-1","BL244-1","BL244-1","BL244-1","BL244-1","BL244-1","BL244-1","BL244-2","BL244-2","BL244-2","BL244-2","BL244-2","BL244-2","BL244-2","BL244-2","BL244-2","BL244-2","BL244-2","BL244-2","BL244-2","BL244-2","BL244-3","BL244-3","BL244-3","BL244-4","BL244-4","BL244-4","BL244-4","BL244-4","BL244-4","BL244-4","BL244-4","BL244-4","BL244-4","BL244-4","BL244-4","BL244-4","BL244-4","BL244-4","BL244-4","BL244-4","BL244-4","BL244-4","BL244-4","BL244-4","BL244-4","BL244-4","BL244-1","BL244-2","BL244-02" +* Version = V00.13.00 +* Date = 2015.6.23 +* Comment = +* +*****************************************************************************/ + +#include +#include "table.h" + +/***************************************************************************** +* Global variables section - Exported +* add declaration of global variables that will be exported here +* e.g. +* int8_t foo; +****************************************************************************/ +const char * table_version = "V00.13.00-2015.6.23-BL244"; + +const char *battery_id[BATTERY_ID_NUM] = {"BL244-1","BL244-1","BL244-1","BL244-1","BL244-1","BL244-1","BL244-1","BL244-1","BL244-1","BL244-2","BL244-2","BL244-2","BL244-2","BL244-2","BL244-2","BL244-2","BL244-2","BL244-2","BL244-2","BL244-2","BL244-2","BL244-2","BL244-2","BL244-3","BL244-3","BL244-3","BL244-4","BL244-4","BL244-4","BL244-4","BL244-4","BL244-4","BL244-4","BL244-4","BL244-4","BL244-4","BL244-4","BL244-4","BL244-4","BL244-4","BL244-4","BL244-4","BL244-4","BL244-4","BL244-4","BL244-4","BL244-4","BL244-4","BL244-4","BL244-1","BL244-2","BL244-02"}; + +one_latitude_data_t ocv_data[OCV_DATA_NUM] = {{3242, 0},{3248, 2},{3488, 3},{3597, 5},{3669, 6},{3685, 8},{3689, 9},{3691, 11},{3693, 13},{3700, 14},{3713, 16},{3720, 17},{3731, 19},{3739, 20},{3744, 22},{3749, 23},{3755, 25},{3761, 27},{3766, 28},{3771, 30},{3776, 31},{3780, 33},{3785, 34},{3789, 36},{3793, 38},{3797, 39},{3802, 41},{3808, 42},{3814, 44},{3819, 45},{3826, 47},{3833, 48},{3841, 50},{3848, 52},{3857, 53},{3867, 55},{3879, 56},{3893, 58},{3911, 59},{3928, 61},{3942, 63},{3955, 64},{3967, 66},{3976, 67},{3985, 69},{3996, 70},{4016, 72},{4041, 73},{4060, 75},{4070, 77},{4084, 78},{4100, 80},{4117, 81},{4135, 83},{4151, 84},{4168, 86},{4185, 88},{4203, 89},{4220, 91},{4238, 92},{4256, 94},{4274, 95},{4292, 97},{4311, 98},{4333, 100}}; + +//real current to soc +one_latitude_data_t charge_data[CHARGE_DATA_NUM] = {{100, 10000},{105, 9994},{110, 9988},{115, 9981},{120, 9976},{125, 9970},{130, 9963},{135, 9957},{140, 9951},{145, 9945},{150, 9940},{155, 9933},{160, 9927},{165, 9920},{170, 9915},{175, 9908},{180, 9902},{185, 9896},{190, 9890},{195, 9884},{200, 9878},{210, 9865},{220, 9854},{230, 9842},{240, 9830},{250, 9819},{260, 9806},{270, 9794},{280, 9782},{290, 9770},{300, 9758},{310, 9746},{320, 9734},{330, 9722},{340, 9711},{350, 9699},{360, 9687},{370, 9676},{380, 9664},{390, 9652},{400, 9640},{420, 9617},{440, 9594},{460, 9571},{480, 9548},{500, 9524},{520, 9501},{540, 9479},{560, 9455},{580, 9432},{600, 9409},{625, 9381},{650, 9352},{675, 9323},{700, 9295},{725, 9267},{750, 9238},{775, 9211},{800, 9182},{825, 9155},{850, 9128},{875, 9100},{900, 9073},{950, 9020},{1000, 9003}}; + +//RC table X Axis value, in mV format +int32_t XAxisElement[XAxis] = {3200, 3400, 3515, 3635, 3656, 3661, 3668, 3685, 3700, 3711, 3719, 3729, 3739, 3751, 3759, 3766, 3774, 3782, 3791, 3801, 3812, 3824, 3838, 3856, 3882, 3906, 3927, 3948, 3968, 3987, 4015, 4038, 4062, 4089, 4115, 4142, 4169, 4198, 4226, 4255, 4286, 4325}; + +//RC table Y Axis value, in mA format +int32_t YAxisElement[YAxis] = {200, 400, 600, 800, 1000, 1500, 2000}; + +// RC table Z Axis value, in 10*'C format +int32_t ZAxisElement[ZAxis] = {-49, 0, 100, 200, 250, 300, 400}; + +// contents of RC table, its unit is 10000C, 1C = DesignCapacity +int32_t RCtable[YAxis*ZAxis][XAxis]={ + + +//temp = -5.0 ^C +{385, 585, 861, 1845, 2149, 2234, 2377, 2813, 3414, 3870, 4138, 4427, 4676, 4949, 5113, 5251, 5404, 5536, 5689, 5844, 6013, 6189, 6393, 6666, 7020, 7238, 7381, 7507, 7631, 7786, 8110, 8321, 8535, 8774, 9005, 9244, 9462, 9683, 9865, 9979, 10000, 10000}, +{680, 1222, 1888, 3842, 4481, 4615, 4791, 5174, 5462, 5657, 5792, 5960, 6113, 6296, 6410, 6510, 6625, 6734, 6868, 7010, 7157, 7293, 7435, 7587, 7778, 7955, 8135, 8344, 8531, 8693, 8932, 9121, 9304, 9503, 9672, 9825, 9928, 9981, 10000, 10000, 10000, 10000}, +{1073, 2238, 3499, 6091, 6462, 6545, 6657, 6915, 7137, 7292, 7398, 7541, 7674, 7835, 7936, 8022, 8114, 8199, 8291, 8391, 8490, 8595, 8711, 8867, 9088, 9268, 9417, 9544, 9652, 9733, 9833, 9893, 9935, 9968, 9990, 10000, 10000, 10000, 10000, 10000, 10000, 10000}, +{1124, 2221, 3822, 6241, 6542, 6612, 6711, 6934, 7129, 7259, 7354, 7467, 7570, 7692, 7767, 7831, 7898, 7968, 8046, 8128, 8221, 8319, 8441, 8604, 8833, 9027, 9186, 9341, 9474, 9587, 9737, 9833, 9901, 9950, 9982, 9999, 10000, 10000, 10000, 10000, 10000, 10000}, +{1650, 3381, 5594, 7729, 8093, 8181, 8305, 8608, 8868, 9055, 9168, 9288, 9384, 9473, 9521, 9558, 9594, 9624, 9658, 9691, 9723, 9754, 9782, 9818, 9857, 9890, 9913, 9935, 9952, 9968, 9987, 9997, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000}, +{2515, 5346, 7329, 9237, 9419, 9460, 9512, 9603, 9664, 9699, 9720, 9746, 9767, 9790, 9802, 9811, 9826, 9834, 9846, 9856, 9870, 9883, 9898, 9913, 9938, 9959, 9976, 9987, 9999, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000}, +{3939, 7150, 8855, 9807, 9833, 9839, 9849, 9866, 9881, 9888, 9898, 9906, 9915, 9926, 9933, 9939, 9946, 9951, 9957, 9967, 9976, 9985, 9991, 9997, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000}, + +//temp = 0.0 ^C +{261, 403, 551, 1253, 1548, 1613, 1710, 1992, 2317, 2659, 2997, 3502, 3887, 4251, 4472, 4648, 4831, 5002, 5189, 5371, 5563, 5757, 5962, 6218, 6606, 6945, 7137, 7278, 7393, 7506, 7768, 8038, 8260, 8504, 8742, 8992, 9234, 9482, 9708, 9907, 9999, 10000}, +{476, 710, 1089, 2313, 2806, 2957, 3225, 3910, 4397, 4681, 4865, 5092, 5290, 5509, 5651, 5770, 5899, 6020, 6157, 6303, 6463, 6643, 6856, 7098, 7338, 7505, 7644, 7801, 8003, 8203, 8462, 8667, 8876, 9111, 9329, 9539, 9733, 9900, 9980, 10000, 10000, 10000}, +{1048, 1586, 2255, 4507, 5091, 5217, 5374, 5708, 5964, 6140, 6259, 6409, 6547, 6706, 6814, 6907, 7006, 7111, 7232, 7358, 7488, 7614, 7742, 7882, 8068, 8248, 8436, 8631, 8799, 8950, 9159, 9340, 9507, 9676, 9811, 9912, 9966, 9994, 10000, 10000, 10000, 10000}, +{930, 1787, 2854, 5497, 5878, 5967, 6082, 6343, 6561, 6714, 6824, 6959, 7087, 7241, 7337, 7422, 7514, 7595, 7690, 7780, 7877, 7973, 8087, 8229, 8456, 8672, 8852, 9018, 9176, 9314, 9507, 9651, 9777, 9884, 9945, 9980, 10000, 10000, 10000, 10000, 10000, 10000}, +{1371, 2608, 4230, 6652, 6947, 7012, 7104, 7313, 7493, 7618, 7704, 7816, 7921, 8036, 8113, 8174, 8241, 8304, 8378, 8456, 8540, 8630, 8737, 8878, 9073, 9235, 9367, 9489, 9597, 9685, 9798, 9869, 9920, 9960, 9986, 10000, 10000, 10000, 10000, 10000, 10000, 10000}, +{1916, 4103, 6464, 8163, 8399, 8455, 8535, 8701, 8841, 8932, 8995, 9073, 9144, 9227, 9274, 9316, 9363, 9404, 9450, 9496, 9543, 9594, 9643, 9700, 9776, 9827, 9867, 9899, 9924, 9947, 9975, 9993, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000}, +{2698, 5808, 7704, 9103, 9267, 9304, 9350, 9451, 9527, 9570, 9603, 9641, 9670, 9705, 9723, 9742, 9759, 9774, 9791, 9808, 9825, 9842, 9861, 9886, 9916, 9942, 9961, 9981, 9994, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000}, + +//temp = 10.0 ^C +{219, 334, 461, 731, 1085, 1275, 1423, 1638, 1889, 2091, 2298, 2610, 3038, 3582, 3866, 4086, 4320, 4525, 4749, 4970, 5192, 5408, 5633, 5884, 6205, 6516, 6837, 7069, 7218, 7326, 7492, 7765, 8023, 8272, 8508, 8754, 9000, 9255, 9500, 9738, 9958, 10000}, +{283, 428, 582, 1510, 1809, 1887, 2008, 2396, 2934, 3434, 3743, 4073, 4359, 4657, 4843, 4994, 5157, 5302, 5470, 5636, 5809, 5981, 6174, 6418, 6802, 7086, 7247, 7375, 7500, 7651, 7979, 8195, 8411, 8652, 8887, 9131, 9361, 9601, 9817, 9971, 10000, 10000}, +{315, 501, 756, 2088, 2595, 2748, 3012, 3707, 4198, 4485, 4678, 4906, 5112, 5339, 5482, 5604, 5734, 5857, 5993, 6139, 6292, 6457, 6655, 6910, 7180, 7351, 7485, 7640, 7844, 8051, 8311, 8518, 8731, 8975, 9199, 9425, 9641, 9845, 9964, 10000, 10000, 10000}, +{533, 806, 1341, 3258, 4058, 4220, 4428, 4851, 5179, 5388, 5530, 5706, 5866, 6046, 6164, 6262, 6372, 6478, 6602, 6735, 6888, 7045, 7212, 7377, 7567, 7733, 7908, 8128, 8323, 8490, 8735, 8932, 9133, 9353, 9550, 9737, 9884, 9968, 9997, 10000, 10000, 10000}, +{588, 1005, 1757, 4445, 4951, 5057, 5205, 5524, 5782, 5959, 6082, 6236, 6382, 6549, 6661, 6760, 6871, 6975, 7093, 7208, 7320, 7423, 7531, 7665, 7867, 8099, 8309, 8499, 8675, 8841, 9079, 9271, 9455, 9655, 9816, 9929, 9977, 10000, 10000, 10000, 10000, 10000}, +{1094, 2066, 3680, 6320, 6626, 6691, 6789, 7008, 7193, 7324, 7412, 7519, 7617, 7734, 7801, 7862, 7927, 7989, 8057, 8138, 8227, 8326, 8443, 8598, 8811, 8998, 9153, 9298, 9434, 9551, 9712, 9819, 9896, 9950, 9980, 10000, 10000, 10000, 10000, 10000, 10000, 10000}, +{1439, 3084, 5568, 7455, 7698, 7753, 7826, 7994, 8134, 8228, 8298, 8377, 8457, 8555, 8617, 8673, 8736, 8792, 8867, 8937, 9018, 9100, 9192, 9303, 9462, 9591, 9689, 9779, 9841, 9886, 9932, 9964, 9984, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000}, + +//temp = 20.0 ^C +{143, 253, 378, 608, 762, 887, 1236, 1499, 1755, 1937, 2123, 2408, 2699, 3182, 3487, 3733, 3997, 4221, 4469, 4709, 4948, 5182, 5423, 5680, 5978, 6232, 6484, 6813, 7052, 7193, 7363, 7579, 7869, 8121, 8357, 8604, 8849, 9106, 9350, 9600, 9850, 10000}, +{163, 290, 430, 1009, 1477, 1546, 1660, 1945, 2315, 2629, 2935, 3361, 3711, 4082, 4304, 4486, 4672, 4850, 5036, 5223, 5417, 5594, 5783, 5998, 6294, 6600, 6907, 7109, 7247, 7364, 7639, 7897, 8117, 8364, 8599, 8843, 9082, 9333, 9569, 9796, 9978, 10000}, +{214, 360, 521, 1592, 1928, 2024, 2180, 2652, 3249, 3660, 3917, 4208, 4465, 4752, 4931, 5072, 5226, 5364, 5517, 5666, 5824, 5973, 6140, 6352, 6691, 7016, 7199, 7340, 7476, 7662, 7976, 8189, 8404, 8653, 8885, 9126, 9356, 9595, 9806, 9964, 10000, 10000}, +{259, 426, 630, 2074, 2600, 2763, 3034, 3682, 4151, 4435, 4627, 4858, 5062, 5293, 5431, 5551, 5678, 5789, 5919, 6052, 6190, 6337, 6513, 6746, 7076, 7271, 7413, 7574, 7789, 7990, 8248, 8457, 8674, 8915, 9143, 9372, 9590, 9804, 9949, 10000, 10000, 10000}, +{346, 539, 865, 2913, 3708, 3874, 4090, 4543, 4889, 5110, 5262, 5448, 5613, 5802, 5919, 6015, 6124, 6228, 6350, 6477, 6620, 6778, 6963, 7162, 7371, 7540, 7725, 7945, 8140, 8309, 8559, 8763, 8968, 9200, 9413, 9626, 9811, 9945, 9993, 10000, 10000, 10000}, +{502, 868, 1860, 4929, 5343, 5433, 5558, 5827, 6056, 6211, 6326, 6461, 6596, 6755, 6857, 6948, 7046, 7132, 7226, 7318, 7409, 7499, 7607, 7757, 8005, 8234, 8421, 8603, 8775, 8935, 9168, 9353, 9533, 9719, 9865, 9950, 9989, 10000, 10000, 10000, 10000, 10000}, +{758, 1555, 3524, 6114, 6418, 6487, 6584, 6803, 6994, 7120, 7206, 7313, 7404, 7513, 7579, 7638, 7702, 7769, 7847, 7933, 8032, 8139, 8268, 8428, 8648, 8846, 9016, 9179, 9330, 9471, 9661, 9792, 9887, 9950, 9986, 10000, 10000, 10000, 10000, 10000, 10000, 10000}, + +//temp = 25.0 ^C +{148, 258, 383, 615, 761, 886, 1252, 1515, 1772, 1959, 2150, 2430, 2706, 3120, 3411, 3666, 3928, 4166, 4412, 4656, 4903, 5139, 5383, 5639, 5922, 6167, 6407, 6706, 6999, 7161, 7338, 7553, 7841, 8093, 8331, 8579, 8825, 9082, 9327, 9575, 9830, 10000}, +{162, 285, 425, 905, 1454, 1520, 1630, 1916, 2277, 2562, 2833, 3227, 3581, 3964, 4191, 4380, 4575, 4753, 4948, 5144, 5340, 5525, 5717, 5930, 6214, 6498, 6797, 7050, 7202, 7323, 7595, 7850, 8074, 8322, 8557, 8802, 9041, 9296, 9535, 9770, 9969, 10000}, +{233, 373, 531, 1570, 1898, 1990, 2135, 2579, 3103, 3520, 3791, 4093, 4359, 4658, 4837, 4984, 5145, 5286, 5446, 5601, 5757, 5907, 6072, 6273, 6585, 6920, 7145, 7294, 7431, 7611, 7921, 8136, 8352, 8599, 8832, 9072, 9303, 9547, 9767, 9949, 10000, 10000}, +{224, 378, 560, 1901, 2359, 2497, 2710, 3328, 3831, 4138, 4350, 4595, 4819, 5067, 5222, 5353, 5486, 5599, 5733, 5870, 6004, 6146, 6307, 6527, 6877, 7134, 7285, 7435, 7631, 7842, 8105, 8316, 8529, 8774, 9006, 9241, 9469, 9705, 9896, 9993, 10000, 10000}, +{256, 434, 678, 2466, 3163, 3349, 3601, 4097, 4484, 4729, 4902, 5107, 5284, 5488, 5615, 5719, 5829, 5934, 6050, 6173, 6307, 6451, 6626, 6858, 7136, 7313, 7474, 7685, 7892, 8070, 8325, 8534, 8748, 8988, 9213, 9440, 9661, 9865, 9976, 10000, 10000, 10000}, +{317, 587, 1382, 4310, 4793, 4893, 5031, 5342, 5595, 5760, 5877, 6022, 6159, 6319, 6420, 6512, 6614, 6712, 6830, 6943, 7064, 7170, 7281, 7422, 7650, 7890, 8088, 8279, 8454, 8623, 8869, 9068, 9265, 9489, 9685, 9860, 9958, 9998, 10000, 10000, 10000, 10000}, +{436, 957, 2570, 5495, 5829, 5902, 6006, 6242, 6452, 6591, 6693, 6819, 6935, 7059, 7139, 7201, 7272, 7338, 7420, 7501, 7599, 7702, 7830, 8003, 8241, 8452, 8633, 8813, 8983, 9137, 9357, 9527, 9701, 9863, 9947, 9988, 10000, 10000, 10000, 10000, 10000, 10000}, + +//temp = 30.0 ^C +{51, 163, 291, 527, 689, 824, 1215, 1450, 1708, 1903, 2121, 2397, 2673, 3020, 3298, 3551, 3823, 4061, 4316, 4569, 4815, 5052, 5302, 5561, 5839, 6085, 6325, 6590, 6897, 7098, 7297, 7528, 7794, 8051, 8294, 8542, 8788, 9049, 9292, 9543, 9801, 10000}, +{143, 266, 406, 856, 1431, 1495, 1606, 1889, 2248, 2532, 2777, 3128, 3473, 3862, 4102, 4293, 4492, 4674, 4876, 5075, 5276, 5469, 5659, 5871, 6153, 6424, 6690, 6985, 7170, 7306, 7572, 7820, 8044, 8294, 8531, 8777, 9017, 9272, 9509, 9747, 9961, 10000}, +{153, 291, 446, 1449, 1775, 1862, 2001, 2421, 2884, 3287, 3561, 3872, 4155, 4456, 4647, 4799, 4967, 5115, 5283, 5447, 5610, 5772, 5937, 6137, 6432, 6734, 7005, 7188, 7336, 7507, 7812, 8029, 8247, 8494, 8728, 8969, 9205, 9455, 9688, 9902, 10000, 10000}, +{197, 351, 527, 1847, 2290, 2417, 2610, 3187, 3694, 4001, 4221, 4467, 4697, 4947, 5102, 5235, 5368, 5494, 5630, 5760, 5898, 6039, 6195, 6398, 6718, 7019, 7196, 7355, 7545, 7749, 8011, 8224, 8440, 8683, 8914, 9152, 9378, 9621, 9831, 9979, 10000, 10000}, +{224, 394, 618, 2344, 2969, 3148, 3390, 3925, 4315, 4572, 4745, 4955, 5155, 5364, 5492, 5601, 5718, 5821, 5933, 6053, 6184, 6324, 6486, 6706, 7021, 7226, 7389, 7592, 7799, 7975, 8230, 8439, 8653, 8890, 9116, 9348, 9568, 9794, 9953, 10000, 10000, 10000}, +{258, 493, 1136, 3954, 4461, 4569, 4725, 5058, 5326, 5506, 5627, 5777, 5911, 6072, 6172, 6260, 6358, 6456, 6568, 6689, 6818, 6955, 7092, 7241, 7462, 7697, 7902, 8091, 8269, 8436, 8688, 8884, 9091, 9321, 9535, 9742, 9906, 9988, 10000, 10000, 10000, 10000}, +{336, 750, 2134, 5144, 5497, 5579, 5690, 5928, 6143, 6281, 6385, 6516, 6635, 6779, 6871, 6951, 7027, 7105, 7190, 7273, 7371, 7474, 7603, 7771, 8013, 8230, 8417, 8598, 8773, 8932, 9167, 9360, 9546, 9742, 9891, 9972, 10000, 10000, 10000, 10000, 10000, 10000}, + +//temp = 40.0 ^C +{0, 116, 250, 498, 759, 1053, 1252, 1500, 1755, 2011, 2245, 2502, 2744, 2983, 3244, 3501, 3768, 4005, 4259, 4510, 4759, 4999, 5245, 5501, 5756, 6000, 6252, 6509, 6755, 6997, 7257, 7504, 7745, 8007, 8253, 8502, 8745, 9005, 9251, 9499, 9752, 10000}, +{13, 142, 289, 825, 1372, 1448, 1569, 1882, 2272, 2559, 2760, 3010, 3330, 3729, 3963, 4156, 4363, 4546, 4750, 4956, 5160, 5355, 5546, 5742, 6013, 6287, 6539, 6799, 7039, 7212, 7495, 7730, 7960, 8215, 8457, 8702, 8943, 9197, 9437, 9676, 9910, 10000}, +{67, 207, 368, 1394, 1729, 1819, 1969, 2392, 2799, 3117, 3374, 3695, 3989, 4303, 4495, 4657, 4824, 4983, 5152, 5323, 5489, 5643, 5806, 6005, 6295, 6579, 6835, 7078, 7256, 7440, 7729, 7951, 8176, 8426, 8662, 8904, 9140, 9389, 9619, 9842, 9995, 10000}, +{94, 249, 424, 1730, 2170, 2292, 2473, 2959, 3442, 3772, 3993, 4258, 4489, 4753, 4919, 5053, 5198, 5329, 5472, 5607, 5744, 5881, 6035, 6236, 6537, 6823, 7058, 7259, 7458, 7649, 7920, 8134, 8356, 8604, 8832, 9072, 9305, 9547, 9766, 9948, 10000, 10000}, +{59, 231, 438, 2099, 2647, 2800, 3030, 3583, 4010, 4279, 4463, 4687, 4891, 5117, 5259, 5374, 5499, 5610, 5731, 5855, 5986, 6125, 6285, 6493, 6804, 7067, 7260, 7465, 7665, 7849, 8113, 8326, 8545, 8782, 9012, 9245, 9475, 9704, 9898, 9995, 10000, 10000}, +{140, 362, 931, 3614, 4173, 4289, 4446, 4805, 5098, 5287, 5414, 5572, 5717, 5881, 5983, 6066, 6164, 6258, 6368, 6482, 6608, 6746, 6903, 7089, 7348, 7582, 7783, 7981, 8169, 8340, 8590, 8797, 9005, 9234, 9454, 9671, 9857, 9974, 10000, 10000, 10000, 10000}, +{201, 567, 1823, 4820, 5204, 5292, 5407, 5664, 5880, 6031, 6138, 6263, 6384, 6528, 6622, 6702, 6792, 6880, 6979, 7077, 7188, 7308, 7439, 7611, 7859, 8083, 8272, 8460, 8634, 8800, 9041, 9239, 9434, 9645, 9827, 9948, 9995, 10000, 10000, 10000, 10000, 10000}, +}; diff --git a/drivers/power/sd77426_fg_mmi/table.h b/drivers/power/sd77426_fg_mmi/table.h new file mode 100644 index 000000000000..d89c59e6bc42 --- /dev/null +++ b/drivers/power/sd77426_fg_mmi/table.h @@ -0,0 +1,69 @@ +/***************************************************************************** +* Copyright(c) O2Micro, 2014. All rights reserved. +* +* O2Micro battery gauge driver +* File: table.h +* +* $Source: /data/code/CVS +* $Revision: 4.00.01 $ +* +* This program is free software and can be edistributed and/or modify +* it under the terms of the GNU General Public License version 2 as +* published by the Free Software Foundation. +* +* This Source Code Reference Design for O2MICRO Battery Gauge access (\u201cReference Design\u201d) +* is sole for the use of PRODUCT INTEGRATION REFERENCE ONLY, and contains confidential +* and privileged information of O2Micro International Limited. O2Micro shall have no +* liability to any PARTY FOR THE RELIABILITY, SERVICEABILITY FOR THE RESULT OF PRODUCT +* INTEGRATION, or results from: (i) any modification or attempted modification of the +* Reference Design by any party, or (ii) the combination, operation or use of the +* Reference Design with non-O2Micro Reference Design. +* +* Battery Manufacture: Lenovo +* Battery Model: BL244 +* Absolute Max Capacity(mAhr): 5158 +* Limited Charge Voltage(mV): 4350 +* Cutoff Discharge Voltage(mV): 3200 +* Equipment: "JY1-8","JY1-4","JY1-4","JY2-8","JY2-8","JY2-8","JY2-5","JY1-1","JY1-1","JY1-8","JY1-8","JY1-8","JY1-8","JY2-5","JY2-5","JY2-5","JY2-5","JY1-8","JY2-8","JY2-8","JY1-8","JY1-2","JY1-2","JY2-6","JY2-6","JY2-6","JY2-7","JY2-7","JY2-7","JY2-7","JY2-7","JY2-7","JY2-7","JY2-7","JY2-7","JY2-7","JY2-7","JY2-7","JY2-7","JY2-7","JY2-7","JY2-7","JY2-7","JY2-7","JY1-3","JY1-3","JY1-6","JY1-6","JY1-6","JY2-8","JY2-5","JY2-5" +* Tester: "SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ","SZ" +* Battery ID: "BL244-1","BL244-1","BL244-1","BL244-1","BL244-1","BL244-1","BL244-1","BL244-1","BL244-1","BL244-2","BL244-2","BL244-2","BL244-2","BL244-2","BL244-2","BL244-2","BL244-2","BL244-2","BL244-2","BL244-2","BL244-2","BL244-2","BL244-2","BL244-3","BL244-3","BL244-3","BL244-4","BL244-4","BL244-4","BL244-4","BL244-4","BL244-4","BL244-4","BL244-4","BL244-4","BL244-4","BL244-4","BL244-4","BL244-4","BL244-4","BL244-4","BL244-4","BL244-4","BL244-4","BL244-4","BL244-4","BL244-4","BL244-4","BL244-4","BL244-1","BL244-2","BL244-02" +* Version = V00.13.00 +* Date = 2015.6.23 +* Comment = +* +*****************************************************************************/ + +#ifndef _TABLE_H_ +#define _TABLE_H_ + + +#define OCV_DATA_NUM 65 +#define CHARGE_DATA_NUM 65 + + +#define XAxis 42 +#define YAxis 7 +#define ZAxis 7 + +#define BATTERY_ID_NUM 52 + + +/**************************************************************************** +* Struct section +* add struct #define here if any +***************************************************************************/ +typedef struct tag_one_latitude_data { + int32_t x;// + int32_t y;// +} one_latitude_data_t; + + +/**************************************************************************** +* extern variable declaration section +***************************************************************************/ +extern const char *battery_id[] ; + +extern const char *table_version; + +#endif +