From 39f07e421e4ff3ff2d0d4b03392a614c3968ae3a Mon Sep 17 00:00:00 2001 From: liuyc20 Date: Tue, 24 Aug 2021 10:42:50 +0800 Subject: [PATCH] power: update sd77624_fg driver -Standard Code Writing Standard -Remove unnecessary code -Optimize driver loading time Change-Id: I98ae5a17572cf1a12d9d20d85b671e056856a7da Signed-off-by: liuyc20 Reviewed-on: https://gerrit.mot.com/2049092 SME-Granted: SME Approvals Granted SLTApproved: Slta Waiver Tested-by: Jira Key Reviewed-by: Huosheng Liao Submit-Approved: Jira Key --- drivers/power/sd77426_fg_mmi/battery_config.h | 49 +- drivers/power/sd77426_fg_mmi/bmulib.c | 1054 +++++++---------- drivers/power/sd77426_fg_mmi/calculate.o | Bin 219736 -> 234560 bytes drivers/power/sd77426_fg_mmi/oz8806_battery.c | 279 ++--- drivers/power/sd77426_fg_mmi/oz8806_regdef.h | 81 +- drivers/power/sd77426_fg_mmi/parameter.c | 74 +- drivers/power/sd77426_fg_mmi/parameter.h | 199 ++-- drivers/power/sd77426_fg_mmi/table.c | 303 +++-- drivers/power/sd77426_fg_mmi/table.h | 138 +-- 9 files changed, 973 insertions(+), 1204 deletions(-) diff --git a/drivers/power/sd77426_fg_mmi/battery_config.h b/drivers/power/sd77426_fg_mmi/battery_config.h index 4c72680a8326..30b407d44422 100644 --- a/drivers/power/sd77426_fg_mmi/battery_config.h +++ b/drivers/power/sd77426_fg_mmi/battery_config.h @@ -1,38 +1,37 @@ /***************************************************************************** -* Copyright(c) O2Micro, 2019. All rights reserved. +* Copyright(c) BMT, 2021. 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 +* BMT [oz8806] Source Code Reference Design +* File:[bmulib.c] +* +* This Source Code Reference Design for BMT [oz8806] access +* ("Reference Design") is solely for the use of PRODUCT INTEGRATION REFERENCE ONLY, +* and contains confidential and privileged information of BMT International +* Limited. BMT 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-BMT +* Reference Design. Use of the Reference Design is at user's discretion to qualify * the final work result. *****************************************************************************/ -#ifndef __O2_BATTERY_CONFIG_H +#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 10000 //Expanded 1000 times -#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 OZ8806_VOLTAGE 4350 +#define O2_CONFIG_CAPACITY 5000 +#define O2_CONFIG_RSENSE 10000//Expanded 1000 times +#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) diff --git a/drivers/power/sd77426_fg_mmi/bmulib.c b/drivers/power/sd77426_fg_mmi/bmulib.c index e5213096f3da..784c968ccfc9 100644 --- a/drivers/power/sd77426_fg_mmi/bmulib.c +++ b/drivers/power/sd77426_fg_mmi/bmulib.c @@ -1,31 +1,28 @@ /***************************************************************************** -* Copyright(c) O2Micro, 2019. All rights reserved. -* -* O2Micro [OZ8806] Source Code Reference Design +* Copyright(c) BMT, 2021. All rights reserved. +* +* BMT [oz8806] Source Code Reference Design * File:[bmulib.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 +* +* This Source Code Reference Design for BMT [oz8806] access +* ("Reference Design") is solely for the use of PRODUCT INTEGRATION REFERENCE ONLY, +* and contains confidential and privileged information of BMT International +* Limited. BMT 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-BMT +* 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 "parameter.h" @@ -33,13 +30,11 @@ #include "table.h" #include - #include #include #include #include #include - #include #include #include @@ -54,19 +49,14 @@ //#define FCC_UPDATA_CHARGE -#define VERSION "2021.08.12/7.00.06 disable otp and expand rsense" -#define charge_step parameter->charge_pursue_step -#define discharge_step parameter->discharge_pursue_step -#define discharge_th parameter->discharge_pursue_th -#define config_data parameter->config +#define VERSION "2021.08.12/7.00.06 disable otp and expand rsense" +#define charge_step parameter->charge_pursue_step +#define discharge_step parameter->discharge_pursue_step +#define discharge_th parameter->discharge_pursue_th +#define config_data parameter->config #define RETRY_CNT 8 - -#define FORCE_OTP_MAPPING 0 - - - - +#define FORCE_OTP_MAPPING 0 #define SHUTDOWN_HI 50 #define SHUTDOWN_TH1 100 @@ -78,8 +68,6 @@ //#define FCC_LOWER_LIMIT 80 #define FCC_LOWER_LIMIT 70 //for lianxiang - - #define charge_full_voltage (config_data->charge_cv_voltage - 26) //#define full_charge_data (gas_gauge->fcc_data + config_data->design_capacity / 100 - 1) #define full_charge_data (gas_gauge->fcc_data + gas_gauge->fcc_data / 100 - 1) @@ -90,44 +78,38 @@ #define MAX_SUSPEND_CONSUME (MAX_SUSPEND_CURRENT*10/36) //H7 add wakup CAR range check, max suspend consumption(1000*mah) #define MAX_SUSPEND_CHARGE (1800*10/36)//H7 add wakup CAR range check, max suspend charge(1000*mah) - - - #define ABS(a, b) ((a>b)?(a-b):(b-a)) - /***************************************************************************** * static variables section ****************************************************************************/ static unsigned long bmu_kernel_memaddr; - bmu_data_t *batt_info; - gas_gauge_t *gas_gauge; - parameter_data_t parameter_customer; - parameter_data_t *parameter; +bmu_data_t *batt_info; +gas_gauge_t *gas_gauge; +parameter_data_t parameter_customer; +parameter_data_t *parameter; - int *rc_table; - int *xaxis_table; - int *yaxis_table; - int *zaxis_table; +int *rc_table; +int *xaxis_table; +int *yaxis_table; +int *zaxis_table; - int32_t calculate_mah = 0; - int32_t calculate_soc = 0; +int32_t calculate_mah = 0; +int32_t calculate_soc = 0; static int car_error = 0; -static char * BATT_CAPACITY= NULL;//"/data/sCaMAH.dat"; -static char * BATT_FCC = NULL;//"/data/fcc.dat"; -static char * OCV_FLAG = NULL;//"/data/ocv_flag.dat"; +static char * BATT_CAPACITY = NULL;//"/data/sCaMAH.dat"; +static char * BATT_FCC = NULL;//"/data/fcc.dat"; +static char * OCV_FLAG = NULL;//"/data/ocv_flag.dat"; static char * BATT_OFFSET = NULL;//"/data/offset.dat"; -static uint8_t oz8806_pec_check = 0; -static uint8_t oz8806_cell_num = 1; -static int32_t res_divider_ratio = 2000; -static uint8_t charge_end_flag = 0; +static uint8_t oz8806_pec_check = 0; +static uint8_t oz8806_cell_num = 1; +static int32_t res_divider_ratio = 2000; +static uint8_t charge_end_flag = 0; - - - int32_t one_percent_rc = 0; +int32_t one_percent_rc = 0; //static uint8_t wait_dc_charger= 0; //static uint8_t wait_voltage_end = 0; @@ -138,7 +120,7 @@ static uint8_t wait_ocv_flag = 0; //static uint8_t oz8806_in_suspend = 0; //static uint8_t start_chg_count_flag = 0; - uint8_t battery_ri = 100; +uint8_t battery_ri = 100; //static uint8_t charge_end = 0; //static uint8_t charge_fcc_update = 0; @@ -154,11 +136,7 @@ static int32_t fRSOC_PRE; static uint8_t discharge_end_flag = 0; static uint8_t sleep_ocv_flag = 0; -//static struct timex time_x; //static struct rtc_time rtc_time; - - - static uint32_t previous_loop_timex = 0; static uint8_t set_soc_from_ext = 0; @@ -224,9 +202,6 @@ static void check_board_offset(void); static void check_shutdwon_voltage(void); static void trim_bmu_VD23(void); - - - //static int32_t oz8806_write_byte_pec(uint8_t addr,uint8_t index, uint8_t data); void bmu_init_parameter_more(parameter_data_t *paramter_temp) @@ -258,14 +233,13 @@ void bmu_init_parameter_more(parameter_data_t *paramter_temp) if (paramter_temp->fix_car_init) fix_car_init = paramter_temp->fix_car_init; - // if (paramter_temp->power_on_retry_times) + //if (paramter_temp->power_on_retry_times) power_on_retry_times = paramter_temp->power_on_retry_times; if (!paramter_temp->bmu_sys_rw_kernel) bmu_sys_rw_kernel = paramter_temp->bmu_sys_rw_kernel; - //pr_err("%s\n%s\n%s\n%s\n", BATT_CAPACITY, BATT_FCC, OCV_FLAG, BATT_OFFSET); - pr_err("oz8806_cell_num:%d, res_divider_ratio: %d,file_not_ok_cap:%d, set_soc_from_ext: %d, fix_car_init:%d,power_on_retry_times:%d, bmu_sys_rw_kernel:%d\n", + bmt_dbg("oz8806_cell_num:%d, res_divider_ratio: %d,file_not_ok_cap:%d, set_soc_from_ext: %d, fix_car_init:%d,power_on_retry_times:%d, bmu_sys_rw_kernel:%d\n", oz8806_cell_num, res_divider_ratio,file_not_ok_cap, set_soc_from_ext, fix_car_init,power_on_retry_times, bmu_sys_rw_kernel); } /***************************************************************************** @@ -280,7 +254,7 @@ void bmu_init_parameter_more(parameter_data_t *paramter_temp) { int32_t ret; - //uint16_t value; + //uint16_t value; uint8_t i; int32_t data; uint8_t * addr; @@ -290,7 +264,7 @@ void bmu_init_parameter_more(parameter_data_t *paramter_temp) byte_num = sizeof(config_data_t) + sizeof(bmu_data_t) + sizeof(gas_gauge_t); memset((uint8_t *)bmu_kernel_memaddr,num_0,byte_num); - + parameter = paramter_temp; addr = (uint8_t *)(parameter->config); for(byte_num = num_0;byte_num < sizeof(config_data_t);byte_num++) @@ -311,19 +285,17 @@ void bmu_init_parameter_more(parameter_data_t *paramter_temp) gas_gauge = (gas_gauge_t *)((uint8_t *)bmu_kernel_memaddr + byte_num); byte_num += sizeof(gas_gauge_t); //-------------------------------------------------------------------------------------------------- - gas_gauge->bmu_init_ok = 0; + gas_gauge->bmu_init_ok = 0; gas_gauge->charge_end = num_0; gas_gauge->charge_end_current_th2 = CHARGE_END_CURRENT2; gas_gauge->charge_strategy = 1; gas_gauge->charge_max_ratio = 3500; //gas_gauge->charge_max_ratio = 10000; // for lianxiang - - + gas_gauge->discharge_end = num_0; gas_gauge->discharge_current_th = DISCH_CURRENT_TH; gas_gauge->discharge_strategy = 1; gas_gauge->discharge_max_ratio = 8000; // for lianxiang - gas_gauge->dsg_end_voltage_hi = SHUTDOWN_HI; gas_gauge->batt_ri = 120; // charging. It is related to voltage when full charging condition. @@ -340,7 +312,7 @@ void bmu_init_parameter_more(parameter_data_t *paramter_temp) gas_gauge->lower_capacity_soc_start =30; gas_gauge->percent_10_reserve = 0; - //add this for oinom, end + //add this for oinom, end //this for test gas gaugue if(parameter->config->debug) @@ -350,47 +322,22 @@ void bmu_init_parameter_more(parameter_data_t *paramter_temp) gas_gauge->dsg_count_2 = num_0; gas_gauge->overflow_data = num_32768 * num_5 * 1000 / config_data->fRsense; - bmu_dbg("yyyy gas_gauge->overflow_data is %d\n",gas_gauge->overflow_data); + batt_dbg("yyyy gas_gauge->overflow_data is %d\n",gas_gauge->overflow_data); bmu_init_gg(gas_gauge); //-------------------------------------------------------------------------------------------------- -#ifdef OZ8806_API - //bmu_init_charge_data(((uint8_t *)bmu_kernel_memaddr + byte_num), 4*gas_gauge->charge_table_num* 2); - //byte_num += 4 * gas_gauge->charge_table_num * 2; - - xaxis_table = (int *)((uint8_t *)bmu_kernel_memaddr + byte_num); - bmu_init_XAxisElement(((uint8_t *)bmu_kernel_memaddr + byte_num), 4*gas_gauge->rc_x_num ); - byte_num += 4*gas_gauge->rc_x_num ; - - yaxis_table = (int *)((uint8_t *)bmu_kernel_memaddr + byte_num); - bmu_init_YAxisElement(((uint8_t *)bmu_kernel_memaddr + byte_num), 4*gas_gauge->rc_y_num); - byte_num += 4*gas_gauge->rc_y_num; - - zaxis_table = (int *)((uint8_t *)bmu_kernel_memaddr + byte_num); - bmu_init_ZAxisElement(((uint8_t *)bmu_kernel_memaddr + byte_num), 4*gas_gauge->rc_z_num); - byte_num += 4*gas_gauge->rc_z_num; - - rc_table = (int *)((uint8_t *)bmu_kernel_memaddr + byte_num); - bmu_init_RCtable(((uint8_t *)bmu_kernel_memaddr + byte_num), 4*gas_gauge->rc_x_num *gas_gauge->rc_y_num*gas_gauge->rc_z_num); - byte_num += 4*gas_gauge->rc_x_num *gas_gauge->rc_y_num*gas_gauge->rc_z_num; - -#else bmu_init_table(&xaxis_table, &yaxis_table, &zaxis_table, &rc_table); -#endif - - pr_err("byte_num is %d\n",byte_num); - + batt_dbg("byte_num is %d\n",byte_num); power_on_flag = num_0; bmu_sleep_flag = num_0; - one_percent_rc = config_data->design_capacity / num_100; - pr_err("AAAA O2MICRO OZ8806 DRIVER VERSION is %s\n",VERSION); + batt_dbg("AAAA BMT fgu DRIVER VERSION is %s\n",VERSION); - pr_err("OZ8806 test parameter:Rsense:%d, RTempPullup:%d, VTempRef:%d, CarLSB:%d, CurLSB:%d, VolLSB:%d, FCC:%d, CV:%d, EOC:%d, EOD:%d, BoardOffset:%d, Debug:%d\n", + batt_dbg("BMT fgu test parameter:Rsense:%d, RTempPullup:%d, VTempRef:%d, CarLSB:%d, CurLSB:%d, VolLSB:%d, FCC:%d, CV:%d, EOC:%d, EOD:%d, BoardOffset:%d, Debug:%d\n", config_test->fRsense, config_test->temp_pull_up, config_test->temp_ref_voltage, @@ -405,7 +352,7 @@ void bmu_init_parameter_more(parameter_data_t *paramter_temp) config_test->debug ); - + //check_pec_control(); //move check_oz8806_status here to avoid iic-commu-issue check_oz8806_staus(); @@ -416,15 +363,15 @@ void bmu_init_parameter_more(parameter_data_t *paramter_temp) */ if (oz8806_get_boot_up_time() < 625) { - pr_err("AAAA wait for current offset detection\n"); + batt_dbg("AAAA wait for current offset detection\n"); msleep(625 - oz8806_get_boot_up_time()); afe_register_read_word(OZ8806_OP_BOARD_OFFSET,(uint16_t *)&data); } - bmu_dbg("AAAAAAAAAAAAA Register BOARD_OFFSET: 0x%02x\n",data); - + batt_dbg("AAAAAAAAAAAAA Register BOARD_OFFSET: 0x%02x\n",data); + ret = afe_read_board_offset(&data); - pr_err("AAAA board_offset is %d mA\n",data); + batt_dbg("AAAA board_offset is %d mA\n",data); if(ret >= num_0) @@ -440,7 +387,7 @@ void bmu_init_parameter_more(parameter_data_t *paramter_temp) //wake up OZ8806 into FullPower mode - pr_err("oz8806_cell_num is %d\n",oz8806_cell_num); + batt_dbg("BMT fgu cell_num is %d\n",oz8806_cell_num); if(oz8806_cell_num > num_1) afe_register_write_byte(OZ8806_OP_CTRL,num_0x2c); @@ -448,7 +395,7 @@ void bmu_init_parameter_more(parameter_data_t *paramter_temp) afe_register_write_byte(OZ8806_OP_CTRL,num_0x20); ret = afe_register_read_byte(OZ8806_OP_CTRL,&i); - pr_err("first read reg[0x09]= 0x%02x, ret = %d\n", i, ret); + batt_dbg("first read reg[0x09]= 0x%02x, ret = %d\n", i, ret); if((i & num_0x40) || (ret < num_0)) { @@ -458,14 +405,13 @@ void bmu_init_parameter_more(parameter_data_t *paramter_temp) } else afe_register_write_byte(OZ8806_OP_CTRL,0x20); - bmu_dbg("Wake up oz8806 write op_ctrl 0x20 \n"); + batt_dbg("Wake up BMT fgu write op_ctrl 0x20 \n"); ret = afe_register_read_byte(OZ8806_OP_CTRL,&i); - pr_err("second read reg[0x09]= 0x%02x, ret = %d\n", i, ret); - + batt_dbg("second read reg[0x09]= 0x%02x, ret = %d\n", i, ret); } - - pr_err("O2MICRO OZ8806 parameter %d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,\n", + + batt_dbg("BMT fgu parameter %d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,\n", config_data->fRsense, config_data->temp_pull_up, config_data->temp_ref_voltage, @@ -478,7 +424,6 @@ void bmu_init_parameter_more(parameter_data_t *paramter_temp) config_data->discharge_end_voltage, config_data->board_offset, config_data->debug - ); //check_oz8806_staus(); @@ -499,24 +444,25 @@ void bmu_init_parameter_more(parameter_data_t *paramter_temp) { int32_t ret; - uint16_t value; + uint16_t value; uint8_t i; int32_t data; #if 1 - if (oz8806_get_boot_up_time() < 2000) // ocv can be stable after oz8806 is wakeuped for 2 s + if (oz8806_get_boot_up_time() < 1500)// ocv can be stable after oz8806 is wakeuped for 1.375 s { - pr_err("wait ocv flag register ready 1\n"); - msleep(2000 - oz8806_get_boot_up_time()); + batt_dbg("wait ocv flag register ready 1\n"); + msleep(1500 - oz8806_get_boot_up_time()); oz8806_get_boot_up_time(); //return; } - +/* if (oz8806_get_power_on_time() < 2250) { - pr_err("wait ocv flag register ready 2\n"); + batt_dbg("wait ocv flag register ready 2\n"); msleep(2250 - oz8806_get_power_on_time()); oz8806_get_power_on_time(); } +*/ #endif wait_ocv_flag = 1; @@ -528,17 +474,15 @@ void bmu_init_parameter_more(parameter_data_t *paramter_temp) { if ((value & POWER_OCV_FLAG) || (value & SLEEP_OCV_FLAG)) { - if (oz8806_get_power_on_time() < 4250)//2250+2000 + if (oz8806_get_power_on_time() < 2250)//2250+2000 { - pr_err("ocv or sleep_ocv: wait for normal scan cycle\n"); - msleep(4250 - oz8806_get_power_on_time()); + batt_dbg("ocv or sleep_ocv: wait for normal scan cycle\n"); oz8806_get_power_on_time(); } } else if (oz8806_get_boot_up_time() < 2250) { - pr_err("normal ok: wait for normal scan cycle\n"); - msleep(2250 - oz8806_get_boot_up_time()); + batt_dbg("normal ok: wait for normal scan cycle\n"); } break; } @@ -552,14 +496,13 @@ void bmu_init_parameter_more(parameter_data_t *paramter_temp) batt_info->fRSOC = batt_info->fRC * num_100; batt_info->fRSOC = batt_info->fRSOC / config_data->design_capacity ; - - pr_err("read batt_info.fVolt is %d\n",(batt_info->fVolt * oz8806_cell_num)); - pr_err("read batt_info.fRC is %d\n",batt_info->fRC); - pr_err("read batt_info.fCurr is %d\n",batt_info->fCurr); - pr_err("read ocv flag ret is 0x%02x,value is 0x%02x\n",ret,value); - pr_err("read fCellTemp is %d\n",batt_info->fCellTemp); - if (ret >= num_0 ) + batt_dbg("read batt_info.fVolt is %d\n",(batt_info->fVolt * oz8806_cell_num)); + batt_dbg("read batt_info.fRC is %d\n",batt_info->fRC); + batt_dbg("read batt_info.fCurr is %d\n",batt_info->fCurr); + batt_dbg("read ocv flag ret is 0x%02x,value is 0x%02x\n",ret,value); + batt_dbg("read fCellTemp is %d\n",batt_info->fCellTemp); + if (ret >= num_0 ) { // OZ8806 First power on if (value & POWER_OCV_FLAG) @@ -568,72 +511,65 @@ void bmu_init_parameter_more(parameter_data_t *paramter_temp) afe_read_ocv_volt(&batt_info->fOCVVolt); afe_read_cell_volt(&batt_info->fVolt); - if(oz8806_cell_num > num_1) batt_info->fOCVVolt = batt_info->fVolt; - - pr_err("AAAA ocv volt is %d\n",(batt_info->fOCVVolt * oz8806_cell_num)); - pr_err("AAAA volt is %d\n",(batt_info->fVolt * oz8806_cell_num)); - - - if(batt_info->fOCVVolt > (config_data->charge_cv_voltage + 70)){ + batt_dbg("AAAA ocv volt is %d\n",(batt_info->fOCVVolt * oz8806_cell_num)); + batt_dbg("AAAA volt is %d\n",(batt_info->fVolt * oz8806_cell_num)); + if(batt_info->fOCVVolt > (config_data->charge_cv_voltage + 150)){ + if (oz8806_get_power_on_time() < 2250)//2250+2000 + { + batt_dbg("ocv wait for normal scan cycle\n"); + msleep(2250 - oz8806_get_power_on_time()); + oz8806_get_power_on_time(); + } + afe_read_cell_volt(&batt_info->fVolt); batt_info->fOCVVolt = batt_info->fVolt; - pr_err("AAAAA ocv data errror ,so batt_info->fVolt is %d\n",batt_info->fVolt); + batt_dbg("AAAAA ocv data errror ,so batt_info->fVolt is %d\n",batt_info->fVolt); } afe_read_current(&batt_info->fCurr); - pr_err("AAAA batt_info.fCurr is %d\n",batt_info->fCurr); + batt_dbg("AAAA batt_info.fCurr is %d\n",batt_info->fCurr); if(batt_info->fCurr > num_50) data = batt_info->fOCVVolt - num_100; else data = batt_info->fOCVVolt; - batt_info->fRSOC = one_latitude_table(parameter->ocv_data_num,parameter->ocv,data); - pr_err("find ocv table batt_info.fRSOC is %d\n",batt_info->fRSOC); - + batt_dbg("find ocv table batt_info.fRSOC is %d\n",batt_info->fRSOC); if((batt_info->fRSOC >num_100) || (batt_info->fRSOC < num_0)) batt_info->fRSOC = num_50; batt_info->fRC = batt_info->fRSOC * config_data->design_capacity / num_100; - afe_read_current(&batt_info->fCurr); - - - if(batt_info->fRC >= (gas_gauge->overflow_data -num_10)) { batt_info->fRC = gas_gauge->overflow_data - gas_gauge->overflow_data /num_100; - batt_info->fRCPrev = batt_info->fRC; + batt_info->fRCPrev = batt_info->fRC; } - afe_write_car(batt_info->fRC); batt_info->fRCPrev = batt_info->fRC; gas_gauge->fcc_data= config_data->design_capacity * 100/100; - - pr_err("Power on mode is activated \n"); + batt_dbg("Power on mode is activated \n"); - batt_info->sCaMAH = batt_info->fRSOC * config_data->design_capacity / num_100; gas_gauge->sCtMAH = batt_info->sCaMAH; gas_gauge->discharge_sCtMAH = config_data->design_capacity - batt_info->sCaMAH; - } else if(value & SLEEP_OCV_FLAG) { afe_read_ocv_volt(&batt_info->fOCVVolt); sleep_ocv_flag = 1; - pr_err("Sleep ocv mode is activated \n"); + batt_dbg("Sleep ocv mode is activated \n"); } else - pr_err("Normal mode is activated \n"); + batt_dbg("Normal mode is activated \n"); } else { - pr_err("AAAA O2MICRO OZ8806 DRIVER \n"); - pr_err("AAAA O2MICRO OZ8806 read OZ8806_OP_OCV_LOW\n"); + batt_dbg("AAAA BMT fgu DRIVER \n"); + batt_dbg("AAAA BMT fgu read BMT_OP_OCV_LOW\n"); } @@ -642,23 +578,19 @@ void bmu_init_parameter_more(parameter_data_t *paramter_temp) afe_read_car(&batt_info->fRC); if((batt_info->fRC < (one_percent_rc)) && (batt_info->fRC > -3000)) { - bmu_dbg("yyyy fRC will over fRC is %d\n",batt_info->fRC); - + batt_dbg("yyyy fRC will over fRC is %d\n",batt_info->fRC); batt_info->fRC = one_percent_rc - num_1; afe_write_car(batt_info->fRC); batt_info->fRCPrev = batt_info->fRC; } afe_read_car(&batt_info->fRC); - pr_err("fRC is %d\n",batt_info->fRC); + batt_dbg("fRC is %d\n",batt_info->fRC); #endif - - - afe_register_read_byte(num_0,&i); - pr_err("O2micro regeidter 0x00 is 0x%02x\n",i); + batt_dbg("BMT fgu regeidter 0x00 is 0x%02x\n",i); afe_register_read_byte(num_9,&i); - pr_err("O2micro regeidter 0x09 is 0x%02x\n",i); + batt_dbg("BMT fgu regeidter 0x09 is 0x%02x\n",i); } /***************************************************************************** @@ -669,14 +601,13 @@ void bmu_init_parameter_more(parameter_data_t *paramter_temp) * Return: * None *****************************************************************************/ - void trim_bmu_VD23(void) +void trim_bmu_VD23(void) { int32_t ret; uint8_t i; uint16_t value; uint8_t data; uint8_t temp; - for(i = 0;i < 3;i++) { @@ -685,13 +616,13 @@ void bmu_init_parameter_more(parameter_data_t *paramter_temp) } if(ret < 0) { - pr_err("READ OZ8806_OP_VD23 fail and return:%d\n",ret); + batt_dbg("READ BMT_OP_VD23 fail and return:%d\n",ret); return; } - pr_err("READ oz8806 REG 0x03 is 0x%02x\n",value); + batt_dbg("READ BMT REG 0x03 is 0x%02x\n",value); data = ((value >> 6) & 0x02) | ((value >> 8) & 0x01); data &= 0x03; - pr_err("So trim is 0x%02x\n",data); + batt_dbg("So trim is 0x%02x\n",data); for(i = 0;i < 3;i++) { @@ -700,27 +631,21 @@ void bmu_init_parameter_more(parameter_data_t *paramter_temp) } if(ret < 0) { - pr_err("READ OZ8806_OP_PEC_CTRL fail and return:%d\n",ret); + batt_dbg("READ BMT_OP_PEC_CTRL fail and return:%d\n",ret); return; } + batt_dbg("READ BMT fgu REG 0x08 is 0x%02x\n",temp); - - - pr_err("READ oz8806 REG 0x08 is 0x%02x\n",temp); - - temp &= (~0x03); - if(data != 0x02) { temp |= data; for(i = 0;i < 3;i++) { ret = afe_register_write_byte(OZ8806_OP_PEC_CTRL,temp); - pr_err("write1 oz8806 REG 0x08 is 0x%02x\n",temp); + batt_dbg("write1 BMT fgu REG 0x08 is 0x%02x\n",temp); if(ret >= 0)break; } - } else { @@ -728,14 +653,12 @@ void bmu_init_parameter_more(parameter_data_t *paramter_temp) for(i = 0;i < 3;i++) { ret = afe_register_write_byte(OZ8806_OP_PEC_CTRL,temp); - pr_err("write2 oz8806 REG 0x08 is 0x%02x\n",temp); + batt_dbg("write2 BMT fgu REG 0x08 is 0x%02x\n",temp); if(ret >= 0)break; } - } - ret = afe_register_read_byte(OZ8806_OP_PEC_CTRL,&temp); - pr_err("oz8806 REG 0x08 is 0x%02x\n",temp); + batt_dbg("BMT fgu REG 0x08 is 0x%02x\n",temp); } @@ -747,7 +670,7 @@ void bmu_init_parameter_more(parameter_data_t *paramter_temp) * Return: * None *****************************************************************************/ - void check_shutdwon_voltage(void) +void check_shutdwon_voltage(void) { //int32_t ret; //uint8_t i; @@ -755,12 +678,10 @@ void bmu_init_parameter_more(parameter_data_t *paramter_temp) //int32_t infVolt; afe_read_cell_volt(&batt_info->fVolt); - if(!sleep_ocv_flag) return; - + temp = one_latitude_table(parameter->ocv_data_num,parameter->ocv,batt_info->fOCVVolt); - pr_err("Sleep data is %d \n",temp); - + batt_dbg("Sleep data is %d \n",temp); // select higher data if(calculate_soc > temp) @@ -770,18 +691,17 @@ void bmu_init_parameter_more(parameter_data_t *paramter_temp) if((batt_info->fRSOC - temp) > 20 || (batt_info->fVolt < (config_data->discharge_end_voltage - 50) && temp <= 5)) { - //batt_info->fRSOC -= 5; batt_info->fRSOC = temp; if(batt_info->fRSOC < 0) batt_info->fRSOC = 0; - + batt_info->sCaMAH = batt_info->fRSOC * gas_gauge->fcc_data/ 100; batt_info->fRC= batt_info->sCaMAH; if(batt_info->fRC > (gas_gauge->overflow_data - 20)) batt_info->fRC = gas_gauge->overflow_data - 20; afe_write_car(batt_info->fRC); - + batt_info->fRCPrev = batt_info->fRC; gas_gauge->sCtMAH = batt_info->sCaMAH; @@ -790,13 +710,8 @@ void bmu_init_parameter_more(parameter_data_t *paramter_temp) else gas_gauge->discharge_sCtMAH = 0; } - - } - - - /***************************************************************************** * Description: * check_oz8806_staus @@ -808,13 +723,7 @@ void bmu_init_parameter_more(parameter_data_t *paramter_temp) static void check_oz8806_staus(void) { - } - - - - - /***************************************************************************** * Description: * bmu_wait_ready @@ -829,20 +738,18 @@ static void bmu_wait_ready(void) //int32_t fcc; uint8_t i; int32_t ret; - uint16_t value; - + uint16_t value; int32_t calculate_soc_temp; - int32_t file_soc_temp; - pr_err("AAAA bmu wait times %d \n",times); + batt_dbg("AAAA bmu wait times %d \n",times); times ++; //wake up OZ8806 into FullPower mode oz8806_wakeup_full_power(); ret = afe_register_read_byte(OZ8806_OP_CTRL,&i); batt_info->Battery_ok = i & BI_STATUS; - pr_err("bmu_wait_ready read 0x09 ret is %d,i is 0x%02x\n",ret,i); + batt_dbg("bmu_wait_ready read 0x09 ret is %d,i is 0x%02x\n",ret,i); if((i & 0x40) || (ret < 0)) { @@ -852,51 +759,59 @@ static void bmu_wait_ready(void) } else afe_register_write_byte(OZ8806_OP_CTRL,0x20); - pr_err("oz8806 wake up function\n"); + batt_dbg("BMT fgu wake up function\n"); ret = afe_register_read_byte(OZ8806_OP_CTRL,&i); - pr_err("bmu_wait_ready read 0x09 ret is %d,i is 0x%02x\n",ret,i); + batt_dbg("bmu_wait_ready read 0x09 ret is %d,i is 0x%02x\n",ret,i); } //do we need add check ocv flag now? ret = afe_register_read_word(OZ8806_OP_OCV_LOW,&value); - if ((ret >= 0) && (value & POWER_OCV_FLAG)) + if ((ret >= 0) && (value & POWER_OCV_FLAG)) { - pr_err("read flag too late\n"); + batt_dbg("read flag too late\n"); wait_ocv_flag_fun(); } - if (oz8806_get_power_on_time() < 2250) + afe_read_car(&batt_info->fRC); + if((batt_info->fRC < 5)|| (power_on_flag)) { - pr_err("wait for normal scan cycle"); - msleep(2250 - oz8806_get_power_on_time()); + + if (oz8806_get_power_on_time() < 2250) + { + batt_dbg("wait for normal scan cycle and return \n"); + return; + //msleep(2250 - oz8806_get_power_on_time()); + } + else + batt_dbg("normal scan cycle delay ok\n"); } + else + batt_dbg("means normal boot,no need delay\n"); afe_read_cell_temp(&batt_info->fCellTemp); afe_read_cell_volt(&batt_info->fVolt); afe_read_current(&batt_info->fCurr); - afe_read_car(&batt_info->fRC); - - pr_err("fVolt is %d\n",(batt_info->fVolt * oz8806_cell_num)); - pr_err("fCurr is %d\n",batt_info->fCurr); - pr_err("ftemp is %d\n",batt_info->fCellTemp); - pr_err("fRC is %d\n",batt_info->fRC); + batt_dbg("fVolt is %d\n",(batt_info->fVolt * oz8806_cell_num)); + batt_dbg("fCurr is %d\n",batt_info->fCurr); + batt_dbg("ftemp is %d\n",batt_info->fCellTemp); + batt_dbg("fRC is %d\n",batt_info->fRC); // every time we check this and print to see if the voltage and temp and current is abnormal // how about if rc_result error - + calculate_soc_temp = calculate_soc_result(); calculate_soc = calculate_soc_temp; calculate_mah = calculate_soc * config_data->design_capacity / num_100; - + calculate_times++; #if 0 if (calculate_times <= calculate_retry_times) return; #endif - pr_err("calculate_times: %d\n",calculate_times); + batt_dbg("calculate_times: %d\n",calculate_times); gas_gauge->fcc_data = config_data->design_capacity; @@ -904,33 +819,32 @@ static void bmu_wait_ready(void) { store_rc = batt_info->fRC; //calculate_retry_times = 0; - pr_err("Success to get soc from car :%d\n", batt_info->fRC); + batt_dbg("Success to get soc from car :%d\n", batt_info->fRC); goto file_ok; } - +/* if (oz8806_get_boot_up_time() < 5000) // voltage can be stable after oz8806 is powered for 5 s { - pr_err("wait oz8806 ADC ready\n"); + batt_dbg("wait oz8806 ADC ready\n"); return; } - - + */ if((set_soc_from_ext)) { soc_external = oz8806_get_soc_from_ext(); - pr_err("soc from external: %d\n", soc_external); + batt_dbg("soc from external: %d\n", soc_external); if (soc_external == -1) { - pr_err("wait for external soc:%d, retry:%d\n", soc_external, retry_times); + batt_dbg("wait for external soc:%d, retry:%d\n", soc_external, retry_times); if(retry_times >= 0) { - pr_err("fail to get externl soc, retry_times:%d \n",retry_times); + batt_dbg("fail to get externl soc, retry_times:%d \n",retry_times); retry_times = 0; set_soc_from_ext = 0; - pr_err("can't get external soc,so make set_soc_from_ext 0\n"); + batt_dbg("can't get external soc,so make set_soc_from_ext 0\n"); } else { @@ -940,24 +854,24 @@ static void bmu_wait_ready(void) } else if ((soc_external <= 100) && (soc_external >= 0)) { - pr_err("Success to get soc from external :%d\n", soc_external); + batt_dbg("Success to get soc from external :%d\n", soc_external); store_rc = soc_external * gas_gauge->fcc_data / 100; store_rc += gas_gauge->fcc_data / 200; // + fcc / 100 * / 2 - pr_err("stored RC:%d\n", store_rc); + batt_dbg("stored RC:%d\n", store_rc); goto file_ok; } else { - pr_err("Error to get wrong soc from external :%d\n", soc_external); + batt_dbg("Error to get wrong soc from external :%d\n", soc_external); retry_times = 0; set_soc_from_ext = 0; - pr_err("can't get external soc,so make set_soc_from_ext 0\n"); + batt_dbg("can't get external soc,so make set_soc_from_ext 0\n"); } } - if (bmu_sys_rw_kernel) + if (bmu_sys_rw_kernel)// this ok { /* wait for sysfs to capacity from file*/ store_rc = bmu_read_data(BATT_CAPACITY); @@ -965,10 +879,10 @@ static void bmu_wait_ready(void) //check file ,if file not exit, goto file fail if(store_rc < 0) { - pr_err("open BATT_CAPACITY fail, retry_times:%d \n", retry_times); + batt_dbg("open BATT_CAPACITY fail, retry_times:%d \n", retry_times); if(retry_times >= power_on_retry_times) { - pr_err("BATT_CAPACITY file fail\n"); + batt_dbg("BATT_CAPACITY file fail\n"); batt_info->sCaMAH = calculate_mah; goto file_fail; } @@ -978,27 +892,27 @@ static void bmu_wait_ready(void) return; } } - pr_err("open BATT_CAPACITY success, retry_times:%d \n", retry_times); - pr_err("AAAA read battery capacity data is %d\n", store_rc); + batt_dbg("open BATT_CAPACITY success, retry_times:%d \n", retry_times); + batt_dbg("AAAA read battery capacity data is %d\n", store_rc); } else { store_rc = oz8806_get_save_capacity(); - - pr_err("RC from file:%d\n", store_rc); + batt_dbg("RC from file:%d\n", store_rc); if (store_rc == INIT_CAP) - { - pr_err("wait for reading file:%s, retry:%d\n", BATT_CAPACITY, retry_times); - if(retry_times > 10) - { - pr_err("fail to get save_capacity, retry_times:%d \n",retry_times); - goto file_fail; + { + batt_dbg("wait for reading file:%s, retry:%d\n", BATT_CAPACITY, retry_times); + if(retry_times > 10) + { + batt_dbg("fail to get save_capacity, retry_times:%d \n",retry_times); + goto file_fail; } - retry_times++; - return; - } - else if (store_rc == NO_FILE) { - pr_err("no file %s, retry_times:%d \n", BATT_CAPACITY, retry_times); + retry_times++; + return; + } + else if (store_rc == NO_FILE) + { + batt_dbg("no file %s, retry_times:%d \n", BATT_CAPACITY, retry_times); goto file_fail; } } @@ -1014,34 +928,34 @@ file_ok: //file ok, if ocv power on if(power_on_flag) { - pr_err("bmu_wait_ready, power on ok \n"); + batt_dbg("bmu_wait_ready, power on ok \n"); gas_gauge->ocv_flag = 1; //file_soc_temp: soc read from file //batt_info->fRSOC: calculated using OCV //calculated_soc: calculated using VI - pr_err("soc from file:%d, vi soc:%d, ocv soc:%d \n", + batt_dbg("soc from file:%d, vi soc:%d, ocv soc:%d \n", file_soc_temp, calculate_soc, batt_info->fRSOC); - pr_err("RC from file:%d, vi RC:%d, ocv RC:%d \n", + batt_dbg("RC from file:%d, vi RC:%d, ocv RC:%d \n", store_rc, calculate_mah, batt_info->sCaMAH); if((batt_info->fRSOC > 90)&& (file_soc_temp > 90)) { batt_info->sCaMAH = store_rc; - pr_err("start sCaMAH high USE file\n"); + batt_dbg("start sCaMAH high USE file\n"); } else if(batt_info->fCurr >= 0) { if( ABS(calculate_soc,file_soc_temp) > 30) { batt_info->sCaMAH = calculate_mah; - pr_err("start sCaMAH chg USE vi\n"); + batt_dbg("start sCaMAH chg USE vi\n"); } else // file { batt_info->sCaMAH = store_rc; - pr_err("start sCaMAH chg USE file\n"); + batt_dbg("start sCaMAH chg USE file\n"); } } else //discharging @@ -1050,22 +964,22 @@ file_ok: || (batt_info->fVolt < (config_data->discharge_end_voltage - 50) && file_soc_temp<=5)) { batt_info->sCaMAH = calculate_mah; - pr_err("start sCaMAH USE vi\n"); + batt_dbg("start sCaMAH USE vi\n"); } else { batt_info->sCaMAH = store_rc; - pr_err("start sCaMAH USE file\n"); + batt_dbg("start sCaMAH USE file\n"); } } } //if not ocv power on else - { pr_err("bmu_wait_ready, normal ok \n"); + { batt_dbg("bmu_wait_ready, normal ok \n"); gas_gauge->ocv_flag = 0; afe_read_car(&batt_info->fRC); - pr_err("RC from file: %d ,RC from register: %d\n", store_rc, batt_info->fRC); + batt_dbg("RC from file: %d ,RC from register: %d\n", store_rc, batt_info->fRC); if ((batt_info->fCurr > 0 && batt_info->fRC <= 2) || (batt_info->fCurr <= 0 && batt_info->fRC <= 0))//power on, no ocv flag @@ -1074,12 +988,12 @@ file_ok: || (batt_info->fVolt < (config_data->discharge_end_voltage - 50) && file_soc_temp<=5)) { batt_info->sCaMAH = calculate_mah; - pr_err("file ok but USE vi,fRC<=0\n"); + batt_dbg("file ok but USE vi,fRC<=0\n"); } else { batt_info->sCaMAH = store_rc; - pr_err("file ok USE file\n"); + batt_dbg("file ok USE file\n"); } } else @@ -1088,7 +1002,7 @@ file_ok: if(( ABS(batt_info->fRC,store_rc) > (one_percent_rc))) { batt_info->sCaMAH = batt_info->fRC; - pr_err("file ok USE RC\n"); + batt_dbg("file ok USE RC\n"); } else { @@ -1097,50 +1011,50 @@ file_ok: &&(batt_info->fRC > store_rc) &&(batt_info->fRC - store_rc <= one_percent_rc)) { - pr_err("file ok USE RC\n"); + batt_dbg("file ok USE RC\n"); batt_info->sCaMAH = batt_info->fRC; } else { batt_info->sCaMAH = store_rc; - pr_err("file ok USE file\n"); + batt_dbg("file ok USE file\n"); } } } - } - + } + file_fail: if(store_rc<0) //fail to red fil or no file exist { if(power_on_flag) { - pr_err("fVolt %dmv, oz8806_cell_num:%d, power_on_100_vol:%dmv\n",batt_info->fVolt,oz8806_cell_num,gas_gauge->power_on_100_vol); + batt_dbg("fVolt %dmv,cell_num:%d, power_on_100_vol:%dmv\n",batt_info->fVolt,oz8806_cell_num,gas_gauge->power_on_100_vol); if((batt_info->fVolt * oz8806_cell_num)>= gas_gauge->power_on_100_vol) batt_info->sCaMAH = full_charge_data; else batt_info->sCaMAH = calculate_mah; - pr_err("bmu_wait_ready, power on ok and file fail \n"); - pr_err("file fail USE vi\n"); + batt_dbg("bmu_wait_ready, power on ok and file fail \n"); + batt_dbg("file fail USE vi\n"); } else { - pr_err("bmu_wait_ready, normal on ok and file fail \n"); + batt_dbg("bmu_wait_ready, normal on ok and file fail \n"); afe_read_car(&batt_info->fRC); - pr_err("RC from register: %d, RC from vi: %d\n", batt_info->fRC, calculate_mah); + batt_dbg("RC from register: %d, RC from vi: %d\n", batt_info->fRC, calculate_mah); if ((batt_info->fCurr > 0 && batt_info->fRC <= 2) || (batt_info->fCurr <= 0 && batt_info->fRC <= 0))//power on, no ocv flag { - pr_err("big error first power on and ocv flag not set: %d ,%d\n", batt_info->fRC, calculate_mah); + batt_dbg("big error first power on and ocv flag not set: %d ,%d\n", batt_info->fRC, calculate_mah); batt_info->sCaMAH = calculate_mah; - pr_err("file fail USE vi\n"); + batt_dbg("file fail USE vi\n"); } else { #if 0 batt_info->sCaMAH = batt_info->fRC; - pr_err("file fail USE RC\n"); + batt_dbg("file fail USE RC\n"); #else if(batt_info->fRC < one_percent_rc ) //if CAR < 1% @@ -1149,58 +1063,54 @@ file_fail: if( ABS(batt_info->fRC,calculate_mah) > (file_not_ok_cap * config_data->design_capacity / num_100)) { batt_info->sCaMAH = calculate_mah; - pr_err("file fail USE vi\n"); + batt_dbg("file fail USE vi\n"); } else { batt_info->sCaMAH = batt_info->fRC; - pr_err("file fail USE RC\n"); + batt_dbg("file fail USE RC\n"); } if(fix_car_init) { batt_info->sCaMAH = batt_info->fRC; - pr_err("file fail fix fRC: %d,%d \n",batt_info->sCaMAH,batt_info->fRC); + batt_dbg("file fail fix fRC: %d,%d \n",batt_info->sCaMAH,batt_info->fRC); } #endif } } - } - + } + if(batt_info->sCaMAH <= num_0) { - pr_err("calculate_soc is %d\n",calculate_soc); + batt_dbg("calculate_soc is %d\n",calculate_soc); afe_read_cell_volt(&batt_info->fVolt); batt_info->fRSOC = calculate_soc; if((batt_info->fRSOC >num_100) || (batt_info->fRSOC < num_0)) batt_info->fRSOC = num_50; - pr_err("batt_info->fRSOC is %d\n",batt_info->fRSOC); + batt_dbg("batt_info->fRSOC is %d\n",batt_info->fRSOC); batt_info->fRC = batt_info->fRSOC * config_data->design_capacity / num_100; - pr_err("batt_info->fRC is %d\n",batt_info->fRC); + batt_dbg("batt_info->fRC is %d\n",batt_info->fRC); if(batt_info->fRC >= (gas_gauge->overflow_data -num_10)) { batt_info->fRC = gas_gauge->overflow_data - gas_gauge->overflow_data/num_100; - batt_info->fRCPrev = batt_info->fRC; + batt_info->fRCPrev = batt_info->fRC; } + batt_dbg("batt_info->fRC is %d\n",batt_info->fRC); - pr_err("batt_info->fRC is %d\n",batt_info->fRC); - afe_write_car(batt_info->fRC); batt_info->fRCPrev = batt_info->fRC; - - batt_info->sCaMAH = batt_info->fRC; - + batt_info->sCaMAH = batt_info->fRC; } - if(batt_info->sCaMAH > full_charge_data) { batt_info->sCaMAH = full_charge_data; } - pr_err("batt_info->sCaMAH is %d\n",batt_info->sCaMAH); - + batt_dbg("batt_info->sCaMAH is %d\n",batt_info->sCaMAH); + batt_info->fRSOC = batt_info->sCaMAH * num_100; batt_info->fRSOC = batt_info->fRSOC / gas_gauge->fcc_data ; @@ -1214,21 +1124,20 @@ file_fail: if(batt_info->fRC >= (gas_gauge->overflow_data -num_10)) { batt_info->fRC = gas_gauge->overflow_data - gas_gauge->overflow_data/num_100; - batt_info->fRCPrev = batt_info->fRC; + batt_info->fRCPrev = batt_info->fRC; } - gas_gauge->sCtMAH = batt_info->sCaMAH; - pr_err("AAAA batt_info->fVolt is %d\n",(batt_info->fVolt * oz8806_cell_num)); - pr_err("AAAA batt_info->fRSOC is %d\n",batt_info->fRSOC); - pr_err("AAAA batt_info->sCaMAH is %d\n",batt_info->sCaMAH); - pr_err("AAAA gas_gauge->sCtMAH is %d\n",gas_gauge->sCtMAH); - pr_err("AAAA fcc is %d\n",gas_gauge->fcc_data); - pr_err("AAAA batt_info->fRC is %d\n",batt_info->fRC); - pr_err("AAAA batt_info->fCurr is %d\n",batt_info->fCurr); - - afe_write_car(batt_info->fRC); - batt_info->fRCPrev = batt_info->fRC; + batt_dbg("AAAA batt_info->fVolt is %d\n",(batt_info->fVolt * oz8806_cell_num)); + batt_dbg("AAAA batt_info->fRSOC is %d\n",batt_info->fRSOC); + batt_dbg("AAAA batt_info->sCaMAH is %d\n",batt_info->sCaMAH); + batt_dbg("AAAA gas_gauge->sCtMAH is %d\n",gas_gauge->sCtMAH); + batt_dbg("AAAA fcc is %d\n",gas_gauge->fcc_data); + batt_dbg("AAAA batt_info->fRC is %d\n",batt_info->fRC); + batt_dbg("AAAA batt_info->fCurr is %d\n",batt_info->fCurr); + + afe_write_car(batt_info->fRC); + batt_info->fRCPrev = batt_info->fRC; if(gas_gauge->fcc_data > batt_info->sCaMAH) gas_gauge->discharge_sCtMAH = gas_gauge->fcc_data- batt_info->sCaMAH; @@ -1258,19 +1167,18 @@ file_fail: check_shutdwon_voltage(); fRSOC_PRE = batt_info->fRSOC; - + // double check if (bmu_sys_rw_kernel) { store_rc = bmu_read_data(BATT_CAPACITY); if(store_rc != batt_info->sCaMAH) - { + { bmu_write_data(BATT_CAPACITY,batt_info->sCaMAH); bmu_write_data(BATT_FCC, gas_gauge->fcc_data); - //pr_err("init write sCaMAH %d,%d\n",batt_info->sCaMAH,store_rc); + //batt_dbg("init write sCaMAH %d,%d\n",batt_info->sCaMAH,store_rc); } } - gas_gauge->bmu_init_ok = num_1; } @@ -1284,7 +1192,6 @@ file_fail: *****************************************************************************/ void bmu_power_down_chip(void) { - afe_read_cell_temp(&batt_info->fCellTemp); afe_read_cell_volt(&batt_info->fVolt); afe_read_current(&batt_info->fCurr); @@ -1295,16 +1202,14 @@ void bmu_power_down_chip(void) else afe_register_write_byte(OZ8806_OP_CTRL,SLEEP_MODE | SLEEP_OCV_EN); - - if(parameter->config->debug){ - pr_err("eeee power down oz8806 \n"); - pr_err("eeee batt_info->fVolt is %d\n",(batt_info->fVolt * oz8806_cell_num)); - pr_err("eeee batt_info->fRSOC is %d\n",batt_info->fRSOC); - pr_err("eeee batt_info->sCaMAH is %d\n",batt_info->sCaMAH); - pr_err("eeee batt_info->fRC is %d\n",batt_info->fRC); - pr_err("eeee batt_info->fCurr is %d\n",batt_info->fCurr); + if(parameter->config->debug){ + batt_dbg("eeee power down BMT fgu \n"); + batt_dbg("eeee batt_info->fVolt is %d\n",(batt_info->fVolt * oz8806_cell_num)); + batt_dbg("eeee batt_info->fRSOC is %d\n",batt_info->fRSOC); + batt_dbg("eeee batt_info->sCaMAH is %d\n",batt_info->sCaMAH); + batt_dbg("eeee batt_info->fRC is %d\n",batt_info->fRC); + batt_dbg("eeee batt_info->fCurr is %d\n",batt_info->fCurr); } - } /***************************************************************************** @@ -1326,36 +1231,36 @@ void bmu_wake_up_chip(void) int32_t car_wakeup = 0; int8_t adapter_status = 0; - pr_err("fCurr is %d\n",batt_info->fCurr); - + batt_dbg("fCurr is %d\n",batt_info->fCurr); + adapter_status = get_adapter_status(); if ((batt_info->fCurr <= gas_gauge->discharge_current_th) || (adapter_status == O2_CHARGER_BATTERY)) { discharge_flag = 1; } - - pr_err("adapter_status: %d\n", adapter_status); + + batt_dbg("adapter_status: %d\n", adapter_status); bmu_sleep_flag = 1; - + time_sec = oz8806_get_system_boot_time(); sleep_time = time_sec - previous_loop_timex; - pr_err("sleep time: %d s\n",sleep_time); + batt_dbg("sleep time: %d s\n",sleep_time); oz8806_wakeup_full_power(); ret = afe_register_read_byte(OZ8806_OP_CTRL,&data);//wake up OZ8806 into FullPower mode if((data & 0x40) || (ret < 0)) { - pr_err("bmu_wake_up_chip read 0x09 ret is %d,i is %d \n",ret,data); + batt_dbg("bmu_wake_up_chip read 0x09 ret is %d,i is %d \n",ret,data); if(oz8806_cell_num > 1) { afe_register_write_byte(OZ8806_OP_CTRL,0x2c); } else afe_register_write_byte(OZ8806_OP_CTRL,0x20); - pr_err("oz8806 wake up function\n"); + batt_dbg("BMT fgu wake up function\n"); } @@ -1364,20 +1269,19 @@ void bmu_wake_up_chip(void) if(batt_info->fRSOC >= num_100) batt_info->fRSOC = num_100; if(batt_info->sCaMAH > (full_charge_data)) { - pr_err("oz8806 wake up batt_info.sCaMAH big error is %d\n",batt_info->sCaMAH); + batt_dbg("BMT fgu wake up batt_info.sCaMAH big error is %d\n",batt_info->sCaMAH); batt_info->sCaMAH = full_charge_data; - } } - + afe_read_current(&batt_info->fCurr); afe_read_cell_volt(&batt_info->fVolt); - pr_err("sCaMAH:%d,fRC:%d,fcurr:%d,volt:%d,sCtMAH:%d\n", + batt_dbg("sCaMAH:%d,fRC:%d,fcurr:%d,volt:%d,sCtMAH:%d\n", batt_info->sCaMAH,batt_info->fRC,batt_info->fCurr, (batt_info->fVolt * oz8806_cell_num), gas_gauge->sCtMAH); - + for(i = num_0;i< num_3;i++) { ret = afe_read_car(&car_wakeup); @@ -1386,7 +1290,7 @@ void bmu_wake_up_chip(void) if ((car_wakeup == 0) || ((!discharge_flag) && (car_wakeup < 0))) { car_error += 1; - pr_err("test fRC read: %d, %d\n",car_error, car_wakeup); //H7 Test Version + batt_dbg("test fRC read: %d, %d\n",car_error, car_wakeup); //H7 Test Version } else break; @@ -1407,16 +1311,16 @@ void bmu_wake_up_chip(void) if (((value * 1000) - sleep_time) < 0) //over max car range { value = (sleep_time / 1000); - pr_err("Ab CAR:%d,mod:%d\n",car_wakeup,value); + batt_dbg("Ab CAR:%d,mod:%d\n",car_wakeup,value); car_wakeup = value + batt_info->fRC; afe_write_car(car_wakeup); } } - pr_err("CAR Prev:%d,CAR Now:%d\n",batt_info->fRC,car_wakeup); + batt_dbg("CAR Prev:%d,CAR Now:%d\n",batt_info->fRC,car_wakeup); //*******CAR zero reading Workaround****************************** if(car_wakeup <= 0) { - pr_err("fRC is %d\n",car_wakeup); + batt_dbg("fRC is %d\n",car_wakeup); //oz8806_over_flow_prevent(); gas_gauge->charge_fcc_update = num_0; gas_gauge->discharge_fcc_update = num_0; @@ -1438,7 +1342,7 @@ void bmu_wake_up_chip(void) batt_info->fRC = car_wakeup; batt_info->fRCPrev = batt_info->fRC; } - + if(discharge_flag) { check_shutdwon_voltage(); @@ -1472,23 +1376,22 @@ void bmu_wake_up_chip(void) if ((discharge_flag) && (car_wakeup > batt_info->fRC)) { - pr_err("it seems error 1\n"); + batt_dbg("it seems error 1\n"); value = car_wakeup - batt_info->fRC; car_wakeup = batt_info->fRC - value; afe_write_car(car_wakeup); } if ((!discharge_flag) && (car_wakeup < batt_info->fRC)) { - pr_err("it seems error 2\n"); + batt_dbg("it seems error 2\n"); value = batt_info->fRC - car_wakeup; car_wakeup = batt_info->fRC + value; - afe_write_car(car_wakeup); + afe_write_car(car_wakeup); } - bmu_dbg("tttt final wakeup car is %d\n",car_wakeup); + batt_dbg("tttt final wakeup car is %d\n",car_wakeup); } - /***************************************************************************** * Description: * check_board_offset @@ -1511,18 +1414,15 @@ static void check_board_offset(void) afe_write_board_offset(config_data->board_offset); return; } - + ret = bmu_read_data(BATT_OFFSET); - - - //pr_err("AAAA board_offset is %d\n",data); - + //batt_dbg("AAAA board_offset is %d\n",data); if(ret < num_0) { if((data > num_10) || (data <= num_0)) afe_write_board_offset(7); - + if(ret2 >= num_0) { if((data < num_10) && (data > num_0) && (data != num_0)) @@ -1530,11 +1430,11 @@ static void check_board_offset(void) ret = bmu_write_data(BATT_OFFSET,data); if(ret num_10) || (data <= num_0)) afe_write_board_offset(num_7); - + afe_read_board_offset(&data); - pr_err("AAAA board_offset is %dmA\n",data); + batt_dbg("AAAA board_offset is %dmA\n",data); } /***************************************************************************** @@ -1568,16 +1468,14 @@ void bmu_polling_loop(void) int32_t ret; uint8_t i; static uint8_t error_times = 0; -#if (FORCE_OTP_MAPPING) - uint32_t force_otp_time = 0; -#endif + int8_t adapter_status = 0; uint8_t retry = 0; uint8_t val = 0; if(is_battery_exchanged()){ //battery was exchanged, oz8806 in start-up mode gas_gauge->bmu_init_ok = 0; batt_info->i2c_error_times = 0; - pr_err("battery was exchanged, init SOC again\n"); + batt_dbg("battery was exchanged, init SOC again\n"); retry_wakeup: //wake up this stupid chip @@ -1586,11 +1484,11 @@ retry_wakeup: ret = afe_register_read_byte(OZ8806_OP_CTRL,&val); if((val & 0x40) || (ret < 0)) { - pr_err("bmu_wake_up_chip read 0x09 ret is %d,i is %d \n",ret,val); + batt_dbg("bmu_wake_up_chip read 0x09 ret is %d,i is %d \n",ret,val); retry++; if(retry>10){ - pr_err("fail wakeup ic"); + batt_dbg("fail wakeup ic"); } goto retry_wakeup; } @@ -1602,7 +1500,7 @@ retry_wakeup: wait_ocv_flag_fun(); } - bmu_dbg("-----------------------bmu_polling_loop start------------------\n"); + batt_dbg("-----------------------bmu_polling_loop start------------------\n"); if(!(gas_gauge->bmu_init_ok)) { @@ -1611,7 +1509,7 @@ retry_wakeup: else bmu_wait_ready(); - if(gas_gauge->bmu_init_ok) + if(gas_gauge->bmu_init_ok) check_board_offset(); goto end; @@ -1628,15 +1526,15 @@ retry_wakeup: ret = afe_read_car(&data); if(parameter->config->debug) { if (data == 0) car_error++; - pr_err("CAR is %d, %d\n",data, car_error); + batt_dbg("CAR is %d, %d\n",data, car_error); } - + if((ret >= 0) && (data > 0)) { // for big current charge // 10% if (ABS(batt_info->fRCPrev, data) < (10 * config_data->design_capacity / num_100)) - { + { batt_info->fRC = data; error_times = 0; } @@ -1645,7 +1543,7 @@ retry_wakeup: error_times++; if(error_times > 3) { - pr_err("CAR error_times is %d\n",error_times); + batt_dbg("CAR error_times is %d\n",error_times); error_times = 0; afe_write_car(batt_info->sCaMAH); batt_info->fRCPrev = batt_info->sCaMAH; @@ -1653,8 +1551,8 @@ retry_wakeup: } } } - - bmu_dbg("first sCaMAH:%d,fRC:%d,fRCPrev:%d,fcurr:%d,volt:%d\n", + + batt_dbg("first sCaMAH:%d,fRC:%d,fRCPrev:%d,fcurr:%d,volt:%d\n", batt_info->sCaMAH,batt_info->fRC,batt_info->fRCPrev, batt_info->fCurr,(batt_info->fVolt * oz8806_cell_num)); @@ -1662,20 +1560,19 @@ retry_wakeup: //H7====LOW VOLTAGE CHARGE PREVENT====== if ((batt_info->fVolt < config_data->discharge_end_voltage) && (batt_info->fCurr > 0)) //charge and voltage < 3300 { - pr_err("Low voltage %d charge current %d detected\n",batt_info->fVolt,batt_info->fCurr); + batt_dbg("Low voltage %d charge current %d detected\n",batt_info->fVolt,batt_info->fCurr); if (batt_info->fRC > batt_info->fRCPrev) //CAR increased { - pr_err("Low voltage fRC limit triggered %d\n",batt_info->fRCPrev); + batt_dbg("Low voltage fRC limit triggered %d\n",batt_info->fRCPrev); batt_info->fRC = batt_info->fRCPrev; //Limit CAR as previous afe_write_car(batt_info->fRC); //write back CAR } } //H7====LOW VOLTAGE CHARGE PREVENT====== - gas_gauge->sCtMAH += batt_info->fRC - batt_info->fRCPrev; gas_gauge->discharge_sCtMAH += batt_info->fRCPrev - batt_info->fRC; - + if(gas_gauge->sCtMAH < num_0) gas_gauge->sCtMAH = num_0; if(gas_gauge->discharge_sCtMAH < num_0) gas_gauge->discharge_sCtMAH = num_0; @@ -1688,27 +1585,24 @@ retry_wakeup: else charge_process(); - bmu_dbg("second sCaMAH:%d,fRC:%d,fRCPrev:%d,fcurr:%d,volt:%d\n", + batt_dbg("second sCaMAH:%d,fRC:%d,fRCPrev:%d,fcurr:%d,volt:%d\n", batt_info->sCaMAH,batt_info->fRC,batt_info->fRCPrev, batt_info->fCurr,(batt_info->fVolt * oz8806_cell_num)); if(gas_gauge->charge_end) { if(!charge_end_flag) - { - pr_err("enter 8806 charge end\n"); + { + batt_dbg("enter BMT fgu charge end\n"); charge_end_flag = num_1; charge_end_process(); } - } else { charge_end_flag = num_0; } - - if(gas_gauge->discharge_end) { if(!discharge_end_flag) @@ -1716,7 +1610,6 @@ retry_wakeup: discharge_end_flag = num_1; discharge_end_process(); } - } else { @@ -1734,24 +1627,22 @@ retry_wakeup: discharge_end_process(); } */ - - //gas_gauge->bmu_tick++; previous_loop_timex = time_sec; time_sec = oz8806_get_system_boot_time(); - bmu_dbg("----------------------------------------------------\n" - "VERSION: %s\n" - "TABLEVERSION: %s\n" - "battery_ok: %d,time_x: %d\n" - "chg_fcc_update: %d, disg_fcc_update: %d\n" - "fVolt: %d fCurr: %d fCellTemp: %d fRSOC: %d\n" - "sCaMAH: %d, sCtMAH1: %d, sCtMAH2: %d\n" - "fcc: %d, fRC: %d\n" - "i2c_error_times: %d\n" - "charge_end: %d, discharge_end: %d\n" - "adapter_status: %d\n" - "----------------------------------------------------\n", - VERSION, get_table_version(),batt_info->Battery_ok,time_sec, + batt_dbg("----------------------------------------------------\n" + "[bmt]:VERSION: %s-%x\n" + "[bmt]:TABLEVERSION: %s\n" + "[bmt]:battery_ok: %d,time_x: %d\n" + "[bmt]:chg_fcc_update: %d, disg_fcc_update: %d\n" + "[bmt]:fVolt: %d fCurr: %d fCellTemp: %d fRSOC: %d\n" + "[bmt]:sCaMAH: %d, sCtMAH1: %d, sCtMAH2: %d\n" + "[bmt]:fcc: %d, fRC: %d\n" + "[bmt]:i2c_error_times: %d\n" + "[bmt]:charge_end: %d, discharge_end: %d\n" + "[bmt]:adapter_status: %d\n" + "[bmt]:----------------------------------------------------\n", + VERSION,calculate_version,get_table_version(),batt_info->Battery_ok,time_sec, gas_gauge->charge_fcc_update,gas_gauge->discharge_fcc_update, (batt_info->fVolt * oz8806_cell_num),batt_info->fCurr,batt_info->fCellTemp,batt_info->fRSOC, batt_info->sCaMAH,gas_gauge->sCtMAH,gas_gauge->discharge_sCtMAH, @@ -1762,13 +1653,13 @@ retry_wakeup: if(batt_info->sCaMAH > (full_charge_data)) { - pr_err("big error sCaMAH is %d\n",batt_info->sCaMAH); + batt_dbg("big error sCaMAH is %d\n",batt_info->sCaMAH); batt_info->sCaMAH = full_charge_data; } if(batt_info->sCaMAH < (gas_gauge->fcc_data / 100 - 1)) { - //pr_err("big error sCaMAH is %d\n",batt_info->sCaMAH); + //batt_dbg("big error sCaMAH is %d\n",batt_info->sCaMAH); batt_info->sCaMAH = gas_gauge->fcc_data / 100 - 1; } @@ -1778,7 +1669,7 @@ retry_wakeup: gas_gauge->fcc_data= config_data->design_capacity * FCC_UPPER_LIMIT / 100 ; bmu_write_data(BATT_FCC,gas_gauge->fcc_data); - pr_err("fcc error is %d\n",gas_gauge->fcc_data); + batt_dbg("fcc error is %d\n",gas_gauge->fcc_data); } if((gas_gauge->fcc_data <= 0) || (gas_gauge->fcc_data < (config_data->design_capacity * FCC_LOWER_LIMIT / 100))) @@ -1786,7 +1677,7 @@ retry_wakeup: gas_gauge->fcc_data = config_data->design_capacity * FCC_LOWER_LIMIT /100; bmu_write_data(BATT_FCC,gas_gauge->fcc_data); - pr_err("fcc error is %d\n",gas_gauge->fcc_data); + batt_dbg("fcc error is %d\n",gas_gauge->fcc_data); } */ @@ -1796,22 +1687,21 @@ retry_wakeup: if (bmu_sys_rw_kernel) { data = bmu_read_data(BATT_CAPACITY); - //bmu_dbg("read from RAM batt_info->sCaMAH is %d\n",data); + //batt_dbg("read from RAM batt_info->sCaMAH is %d\n",data); if(data >= num_0) { if(fRSOC_PRE != batt_info->fRSOC) { fRSOC_PRE = batt_info->fRSOC; bmu_write_data(BATT_CAPACITY,batt_info->sCaMAH); - // bmu_dbg("o2 back batt_info->sCaMAH num_1 is %d\n",batt_info->sCaMAH); + // batt_dbg("o2 back batt_info->sCaMAH num_1 is %d\n",batt_info->sCaMAH); //return; goto end; - } if(((batt_info->sCaMAH - data)> (gas_gauge->fcc_data/200))||((data - batt_info->sCaMAH)> (gas_gauge->fcc_data/200))){ bmu_write_data(BATT_CAPACITY,batt_info->sCaMAH); - // bmu_dbg("o2 back batt_info->sCaMAH 2 is %d\n",batt_info->sCaMAH); + // batt_dbg("o2 back batt_info->sCaMAH 2 is %d\n",batt_info->sCaMAH); } } else bmu_write_data(BATT_CAPACITY,batt_info->sCaMAH); @@ -1821,7 +1711,7 @@ retry_wakeup: if(fRSOC_PRE != batt_info->fRSOC) { fRSOC_PRE = batt_info->fRSOC; - //bmu_dbg("o2 back batt_info->sCaMAH num_1 is %d\n",batt_info->sCaMAH); + //batt_dbg("o2 back batt_info->sCaMAH num_1 is %d\n",batt_info->sCaMAH); goto end; } } @@ -1834,17 +1724,17 @@ retry_wakeup: if((i & num_0x40) || (ret < num_0)) { - bmu_dbg("bmu_polling_loop read 0x09 ret is %d,i is %d \n",ret,i); + batt_dbg("bmu_polling_loop read 0x09 ret is %d,i is %d \n",ret,i); if(oz8806_cell_num > 1) { afe_register_write_byte(OZ8806_OP_CTRL,num_0x2c); } else afe_register_write_byte(OZ8806_OP_CTRL,num_0x20); - //pr_err("oz8806 wake up function\n"); + //batt_dbg("oz8806 wake up function\n"); } - + ret = afe_read_board_offset(&data); if (ret >= 0) { @@ -1854,37 +1744,32 @@ retry_wakeup: if(ABS(data, config_data->board_offset) > 3) { afe_write_board_offset(config_data->board_offset); - pr_err("oz8806 board offset error1 is %d \n",data); + batt_dbg("BMT fgu board offset error1 is %d \n",data); } } else { if((data > 10) || (data <= 0)) { - pr_err("oz8806 board offset error2 is %d \n",data); + batt_dbg("BMT fgu board offset error2 is %d \n",data); afe_write_board_offset(7); } - } } - - - bmu_dbg("test data is %d\n",batt_info->sCaMAH); - + batt_dbg("test data is %d\n",batt_info->sCaMAH); /* - + data = bmu_read_data(BATT_FCC); if(data != gas_gauge->fcc_data) { bmu_write_data(BATT_FCC,gas_gauge->fcc_data); - pr_err("test %d\n",gas_gauge->fcc_data); + batt_dbg("test %d\n",gas_gauge->fcc_data); } - */ - + end: - bmu_dbg("-----------------------bmu_polling_loop end--------------------\n"); + batt_dbg("-----------------------bmu_polling_loop end--------------------\n"); } /***************************************************************************** @@ -1900,7 +1785,7 @@ static void oz8806_over_flow_prevent(void) int32_t ret; int32_t data; - if((batt_info->fRSOC > num_0) && gas_gauge->discharge_end) + if((batt_info->fRSOC > num_0) && gas_gauge->discharge_end) gas_gauge->discharge_end = num_0; if((batt_info->fRSOC < num_100) && gas_gauge->charge_end) @@ -1909,17 +1794,17 @@ static void oz8806_over_flow_prevent(void) if(batt_info->fRC< num_0) { if(batt_info->fVolt >= (config_data->charge_cv_voltage - 200)) - { + { batt_info->fRC = gas_gauge->fcc_data -num_1; } else - { + { if(batt_info->fRSOC > 0) batt_info->fRC = batt_info->fRSOC * gas_gauge->fcc_data / num_100 - num_1; else batt_info->fRC = batt_info->sCaMAH; } - + afe_write_car(batt_info->fRC); batt_info->fRCPrev = batt_info->fRC; } @@ -1932,24 +1817,22 @@ static void oz8806_over_flow_prevent(void) ret = (int16_t)ret; if(ret >= (num_32768 - num_10 * config_data->fRsense)) { - if(parameter->config->debug)pr_err("yyyy CAR WILL UP OVER %d\n",ret); + if(parameter->config->debug)batt_dbg("yyyy CAR WILL UP OVER %d\n",ret); ret = 32768 - 15 * config_data->fRsense; oz8806_write_word(OZ8806_OP_CAR,(int16_t)ret); afe_read_car(&batt_info->fRC); batt_info->fRCPrev = batt_info->fRC; - } else if(ret <= (num_10 * config_data->fRsense)) { - if(parameter->config->debug)pr_err("yyyy CAR WILL DOWN OVER %d\n",ret); + if(parameter->config->debug)batt_dbg("yyyy CAR WILL DOWN OVER %d\n",ret); ret = num_15 * config_data->fRsense; oz8806_write_word(OZ8806_OP_CAR,(int16_t)ret); afe_read_car(&batt_info->fRC); - batt_info->fRCPrev = batt_info->fRC; - } - + batt_info->fRCPrev = batt_info->fRC; + } - } + } */ ret = afe_read_car(&data); @@ -1961,16 +1844,16 @@ static void oz8806_over_flow_prevent(void) afe_write_car(batt_info->sCaMAH); batt_info->fRCPrev = batt_info->sCaMAH; batt_info->fRC = batt_info->sCaMAH; - bmu_dbg("dddd car down is %d\n",data); + batt_dbg("dddd car down is %d\n",data); } else if(data > (32768 * parameter->config->dbCARLSB * 1000 / config_data->fRsense -5)) { afe_write_car(batt_info->sCaMAH); batt_info->fRCPrev = batt_info->sCaMAH; batt_info->fRC = batt_info->sCaMAH; - bmu_dbg("dddd car up is %d\n",data); + batt_dbg("dddd car up is %d\n",data); } - + if(ABS(batt_info->sCaMAH, data) > one_percent_rc) { if((batt_info->sCaMAH < gas_gauge->overflow_data ) && (batt_info->sCaMAH > 0)) @@ -1979,17 +1862,16 @@ static void oz8806_over_flow_prevent(void) batt_info->fRCPrev = batt_info->sCaMAH; batt_info->fRC = batt_info->sCaMAH; if(parameter->config->debug){ - pr_err("dddd write car batt_info->fRCPrev is %d\n",batt_info->fRCPrev); - pr_err("dddd write car batt_info->fRC is %d\n",batt_info->fRC); - pr_err("dddd write car batt_info->sCaMAH is %d\n",batt_info->sCaMAH); + batt_dbg("dddd write car batt_info->fRCPrev is %d\n",batt_info->fRCPrev); + batt_dbg("dddd write car batt_info->fRC is %d\n",batt_info->fRC); + batt_dbg("dddd write car batt_info->sCaMAH is %d\n",batt_info->sCaMAH); } } } - if(batt_info->fRC > (full_charge_data)) { - pr_err("more fRC %d\n",batt_info->fRC); + batt_dbg("more fRC %d\n",batt_info->fRC); batt_info->fRC = full_charge_data; batt_info->fRCPrev = batt_info->fRC; afe_write_car(batt_info->fRC); @@ -2017,16 +1899,16 @@ void charge_end_process(void) gas_gauge->fcc_data = gas_gauge->sCtMAH; bmu_write_data(BATT_FCC,gas_gauge->fcc_data); - pr_err("charge1 fcc update is %d\n",gas_gauge->fcc_data); + batt_dbg("charge1 fcc update is %d\n",gas_gauge->fcc_data); } if(gas_gauge->fcc_data > (config_data->design_capacity *FCC_UPPER_LIMIT / 100)) - { + { gas_gauge->fcc_data= config_data->design_capacity * FCC_UPPER_LIMIT / 100 ; bmu_write_data(BATT_FCC,gas_gauge->fcc_data); - - pr_err("charge2 fcc update is %d\n",gas_gauge->fcc_data); + + batt_dbg("charge2 fcc update is %d\n",gas_gauge->fcc_data); } if((gas_gauge->fcc_data <= 0) || (gas_gauge->fcc_data < (config_data->design_capacity * FCC_LOWER_LIMIT / 100))) @@ -2034,11 +1916,11 @@ void charge_end_process(void) gas_gauge->fcc_data = config_data->design_capacity * FCC_LOWER_LIMIT / 100; bmu_write_data(BATT_FCC,gas_gauge->fcc_data); - pr_err("charge3 fcc update is %d\n",gas_gauge->fcc_data); + batt_dbg("charge3 fcc update is %d\n",gas_gauge->fcc_data); } */ - + gas_gauge->fcc_data = config_data->design_capacity; batt_info->sCaMAH = full_charge_data;; @@ -2049,8 +1931,8 @@ void charge_end_process(void) if(gas_gauge->ocv_flag) bmu_write_data(OCV_FLAG,0); - - pr_err("yyyy end charge \n"); + + batt_dbg("yyyy end charge \n"); batt_info->fRSOC = num_100; gas_gauge->charge_end = num_1; charge_end_flag = num_1; @@ -2059,7 +1941,6 @@ void charge_end_process(void) gas_gauge->discharge_fcc_update = 1; gas_gauge->discharge_sCtMAH = 0; power_on_flag = 0; - } /***************************************************************************** @@ -2080,43 +1961,43 @@ void discharge_end_process(void) { gas_gauge->fcc_data = gas_gauge->discharge_sCtMAH; bmu_write_data(BATT_FCC,gas_gauge->fcc_data); - pr_err("discharge1 fcc update is %d\n",gas_gauge->fcc_data); + batt_dbg("discharge1 fcc update is %d\n",gas_gauge->fcc_data); } if(gas_gauge->fcc_data > (config_data->design_capacity *FCC_UPPER_LIMIT / 100)) - { - gas_gauge->fcc_data= config_data->design_capacity * FCC_UPPER_LIMIT / 100 ; + { + gas_gauge->fcc_data= config_data->design_capacity * FCC_UPPER_LIMIT / 100 ; bmu_write_data(BATT_FCC,gas_gauge->fcc_data); - pr_err("discharge2 fcc update is %d\n",gas_gauge->fcc_data); + batt_dbg("discharge2 fcc update is %d\n",gas_gauge->fcc_data); } if((gas_gauge->fcc_data <= 0) || (gas_gauge->fcc_data < (config_data->design_capacity * FCC_LOWER_LIMIT / 100))) - { + { gas_gauge->fcc_data = config_data->design_capacity * FCC_LOWER_LIMIT / 100; bmu_write_data(BATT_FCC,gas_gauge->fcc_data); - pr_err("discharge3 fcc update is %d\n",gas_gauge->fcc_data); + batt_dbg("discharge3 fcc update is %d\n",gas_gauge->fcc_data); } */ gas_gauge->fcc_data = config_data->design_capacity; if(gas_gauge->ocv_flag) bmu_write_data(OCV_FLAG,0); - + batt_info->sCaMAH = gas_gauge->fcc_data / 100 - 1; if (bmu_sys_rw_kernel) bmu_write_data(BATT_CAPACITY,batt_info->sCaMAH); - + afe_write_car(batt_info->sCaMAH); batt_info->fRCPrev = batt_info->sCaMAH; - - - pr_err("yyyy end discharge \n"); + + + batt_dbg("yyyy end discharge \n"); batt_info->fRSOC = num_0; gas_gauge->discharge_end = num_1; gas_gauge->discharge_fcc_update = 1; gas_gauge->charge_fcc_update = 1; gas_gauge->sCtMAH = num_0; - + } @@ -2136,7 +2017,7 @@ static int bmu_check_file(char * address) if(fd < num_0) { - //bmu_dbg(" bmu check file fail %s\n",address); + //batt_dbg(" bmu check file fail %s\n",address); return -num_1; } sys_close(fd); @@ -2152,7 +2033,7 @@ static int bmu_read_data(char * address) if(fd < num_0) { - bmu_dbg(" bmu read open file fail %s, return %ld\n",address, fd); + batt_dbg(" bmu read open file fail %s, return %ld\n",address, fd); return fd; } @@ -2171,7 +2052,7 @@ static int bmu_write_data(char * address,int data) if(fd < num_0) { - bmu_dbg("bmu wirte open file fail %s failed, return %ld\n",address, fd); + batt_dbg("bmu wirte open file fail %s failed, return %ld\n",address, fd); return fd; } *p = data; @@ -2193,12 +2074,12 @@ static int bmu_read_data(char * address) int ret = 0; int val = 0; - //pr_err("%s\n", __func__); + //batt_dbg("%s\n", __func__); fp = filp_open(address, O_RDONLY, 0644); if (IS_ERR(fp)) { - pr_err(" %s: open file fail %s\n", __func__, address); + batt_dbg(" %s: open file fail %s\n", __func__, address); return -1; } @@ -2208,14 +2089,14 @@ static int bmu_read_data(char * address) pos = 0; ret = vfs_read(fp, buf_r, sizeof(buf_r), &pos); if (ret < 0) - pr_err(" %s: read file fail %s\n", __func__, address); + batt_dbg(" %s: read file fail %s\n", __func__, address); buf_r[4] = '\0'; - bmu_dbg("%s: read: %s\n", __func__, buf_r); + batt_dbg("%s: read: %s\n", __func__, buf_r); ret = kstrtoint(buf_r, 10, &val); if (ret < 0) - pr_err(" %s: fail to get int from %s\n", __func__, address); + batt_dbg(" %s: fail to get int from %s\n", __func__, address); set_fs(fs); @@ -2242,12 +2123,12 @@ static int bmu_write_data(char * address,int data) ret = sprintf(buf, "%d", data); - //pr_err("%s\n", __func__); + //batt_dbg("%s\n", __func__); fp = filp_open(address, O_RDWR | O_CREAT, 0644); if (IS_ERR(fp)) { - pr_err(" %s: open file fail %s\n", __func__, address); + batt_dbg(" %s: open file fail %s\n", __func__, address); return -1; } @@ -2257,7 +2138,7 @@ static int bmu_write_data(char * address,int data) pos = 0; ret = vfs_write(fp, buf, sizeof(buf), &pos); if (ret < 0) - pr_err(" %s: write file fail %s\n", __func__, address); + batt_dbg(" %s: write file fail %s\n", __func__, address); else if (!strcmp(address, BATT_CAPACITY)) gas_gauge->stored_capacity = data; @@ -2267,13 +2148,13 @@ static int bmu_write_data(char * address,int data) pos = 0; ret = vfs_read(fp, buf_r, sizeof(buf_r), &pos); if (ret < 0) - pr_err(" %s: read file fail %s\n", __func__, address); + batt_dbg(" %s: read file fail %s\n", __func__, address); - bmu_dbg("%s: read: %s\n", __func__, buf_r); + batt_dbg("%s: read: %s\n", __func__, buf_r); ret = kstrtoint(buf_r, 10, &val); if (ret < 0) - pr_err(" %s: fail to get int from %s\n", __func__, address); + batt_dbg(" %s: fail to get int from %s\n", __func__, address); } set_fs(fs); @@ -2291,7 +2172,7 @@ static int bmu_check_file(char * address) fp = filp_open(address, O_RDONLY, 0644); if (IS_ERR(fp)) { - pr_err(" %s: open file fail %s\n", __func__, address); + batt_dbg(" %s: open file fail %s\n", __func__, address); return -1; } return 0; @@ -2316,13 +2197,13 @@ static int bmu_check_file(char * address) * index: oz8806 operation register * data: write data * Return: - * see I2C_STATUS_XXX define + * see I2C_STATUS_XXX define ****************************************************************************/ #if 0 static int32_t oz8806_write_byte_pec(uint8_t addr,uint8_t index, uint8_t data) { int32_t ret; - + uint8_t pec_data = num_0; uint16_t temp = num_0; pec_data =pec_calculate(pec_data,addr); @@ -2336,8 +2217,6 @@ static int32_t oz8806_write_byte_pec(uint8_t addr,uint8_t index, uint8_t data) } #endif - - /**************************************************************************** * Description: * read oz8806 operation register @@ -2345,14 +2224,14 @@ static int32_t oz8806_write_byte_pec(uint8_t addr,uint8_t index, uint8_t data) * index: oz8806 operation register * buf: pointer to buffer to store read data * Return: - * see I2C_STATUS_XXX define + * see I2C_STATUS_XXX define ****************************************************************************/ static int32_t oz8806_read_byte(uint8_t index) { int32_t ret; uint8_t pec_data = num_0; uint8_t temp; - + if(num_0) { @@ -2364,15 +2243,15 @@ static int32_t oz8806_read_byte(uint8_t index) temp = (uint8_t)(ret & 0xff); pec_data =pec_calculate(pec_data,temp); temp = (uint8_t)(ret >> 8); - + if(pec_data != temp) { - pr_err("33333333333333333 oz8806_read_byte\n"); - pr_err("33333333333333333 pec_data is %d\n",pec_data); - pr_err("33333333333333333 temp is %d\n",temp); + batt_dbg("33333333333333333 BMT_fgu_read_byte\n"); + batt_dbg("33333333333333333 pec_data is %d\n",pec_data); + batt_dbg("33333333333333333 temp is %d\n",temp); return -num_1; } - + return ret; } else @@ -2382,7 +2261,6 @@ static int32_t oz8806_read_byte(uint8_t index) } } - /**************************************************************************** * Description: * write oz8806 operation register @@ -2390,14 +2268,14 @@ static int32_t oz8806_read_byte(uint8_t index) * index: oz8806 operation register * data: write data * Return: - * see I2C_STATUS_XXX define + * see I2C_STATUS_XXX define ****************************************************************************/ static int32_t oz8806_write_byte(uint8_t index, uint8_t data) { int32_t ret; uint8_t pec_data = num_0; uint16_t temp = num_0; - + if(oz8806_pec_check) { pec_data =pec_calculate(pec_data,0x5e); @@ -2422,7 +2300,7 @@ static int32_t oz8806_write_byte(uint8_t index, uint8_t data) * Parameters: * index: oz8806 operation register * Return: - * see I2C_STATUS_XXX define + * see I2C_STATUS_XXX define ****************************************************************************/ static int32_t oz8806_read_word(uint8_t index) { @@ -2430,7 +2308,7 @@ static int32_t oz8806_read_word(uint8_t index) int32_t ret1 = num_0; uint8_t temp; uint8_t pec_data = num_0; - + if(num_0) { ret = i2c_smbus_read_word_data(parameter->client, index); @@ -2444,16 +2322,16 @@ static int32_t oz8806_read_word(uint8_t index) if(pec_data != temp) { - pr_err("index 0x%02x\n",index); - pr_err("0x%02x\n",(uint8_t)(ret & 0xff)); - pr_err("33333333333333333 oz8806_read_word num_1\n"); - pr_err("33333333333333333 pec_data is 0x%02x\n",pec_data); - pr_err("33333333333333333 temp is 0x%02x\n",temp); + batt_dbg("index 0x%02x\n",index); + batt_dbg("0x%02x\n",(uint8_t)(ret & 0xff)); + batt_dbg("33333333333333333 BMT_fgu_read_word num_1\n"); + batt_dbg("33333333333333333 pec_data is 0x%02x\n",pec_data); + batt_dbg("33333333333333333 temp is 0x%02x\n",temp); - pr_err("33333333333333333 ret is 0x%02x\n",ret); + batt_dbg("33333333333333333 ret is 0x%02x\n",ret); return -num_1; } - + ret1 = i2c_smbus_read_word_data(parameter->client, (index + num_1)); if(ret1 < num_0) return ret1; @@ -2467,18 +2345,18 @@ static int32_t oz8806_read_word(uint8_t index) if(pec_data != temp) { - pr_err("33333333333333333 oz8806_read_word 2\n"); - pr_err("33333333333333333 pec_data is %d\n",pec_data); - pr_err("33333333333333333 temp is %d\n",temp); + batt_dbg("33333333333333333 BMT_fgu_read_word 2\n"); + batt_dbg("33333333333333333 pec_data is %d\n",pec_data); + batt_dbg("33333333333333333 temp is %d\n",temp); return -num_1; } - + ret1 <<= 8; ret1 |= (uint8_t)(0xff & ret); return ret1; } else - { + { ret = i2c_smbus_read_word_data(parameter->client, index); return ret; } @@ -2491,7 +2369,7 @@ static int32_t oz8806_read_word(uint8_t index) * index: oz8806 operation register * data: write data * Return: - * see I2C_STATUS_XXX define + * see I2C_STATUS_XXX define ****************************************************************************/ static int32_t oz8806_write_word( uint8_t index, uint16_t data) { @@ -2499,10 +2377,10 @@ static int32_t oz8806_write_word( uint8_t index, uint16_t data) uint8_t pec_data = num_0; uint16_t temp = num_0; - + if(oz8806_pec_check) { - + pec_data =pec_calculate(pec_data,0x5e); pec_data =pec_calculate(pec_data,index); pec_data =pec_calculate(pec_data,(uint8_t)data); @@ -2510,10 +2388,10 @@ static int32_t oz8806_write_word( uint8_t index, uint16_t data) temp <<= 8; temp |= (uint8_t)data; ret = i2c_smbus_write_word_data(parameter->client, index,temp); - + if(ret < num_0) return ret; pec_data = num_0; - + pec_data =pec_calculate(pec_data,0x5e); pec_data =pec_calculate(pec_data,(index +num_1)); pec_data =pec_calculate(pec_data,(uint8_t)(data>>8)); @@ -2537,17 +2415,17 @@ static int32_t oz8806_write_word( uint8_t index, uint16_t data) * Parameters: * voltage: cell voltage in mV, range from -5120mv to +5120mv * Return: - * see I2C_STATUS_XXX define + * see I2C_STATUS_XXX define ****************************************************************************/ static int32_t oz8806_cell_voltage_read(int32_t *voltage) { int32_t ret; int32_t data; - + ret = oz8806_read_word(OZ8806_OP_CELL_VOLT); if (ret < num_0) return ret; - + data = ret & 0xFFFF; data = (int16_t)data / 16; // >> 4 and keep sign bit @@ -2556,12 +2434,12 @@ static int32_t oz8806_cell_voltage_read(int32_t *voltage) if (data > 5117 || data < 0) { - pr_err("%s:data: %d, reg:%x\n", __func__, data, ret); + batt_dbg("%s:data: %d, reg:%x\n", __func__, data, ret); return -1; } batt_info->i2c_error_times = 0; *voltage = data; - + return ret; } @@ -2571,16 +2449,16 @@ static int32_t oz8806_cell_voltage_read(int32_t *voltage) * Parameters: * voltage: voltage in mV, range from -5120mv to +5120mv with 2.5mV LSB * Return: - * see I2C_STATUS_XXX define + * see I2C_STATUS_XXX define ****************************************************************************/ static int32_t oz8806_ocv_voltage_read(int32_t *voltage) { int32_t ret; int32_t data; - + ret = oz8806_read_word(OZ8806_OP_OCV_LOW); if (ret < num_0) return ret; - + data = ret & 0xFFFF; data = (int16_t)data / 16; // >> 4 and keep sign bit @@ -2589,12 +2467,12 @@ static int32_t oz8806_ocv_voltage_read(int32_t *voltage) if (data > 5117 || data < 0) { - pr_err("%s:data: %d, reg:%x\n", __func__, data, ret); + batt_dbg("%s:data: %d, reg:%x\n", __func__, data, ret); return -1; } *voltage = data; - + return ret; } @@ -2604,14 +2482,14 @@ static int32_t oz8806_ocv_voltage_read(int32_t *voltage) * Parameters: * current: in mA, range is +/-64mv / Rsense with 7.8uv LSB / Rsense * Return: - * see I2C_STATUS_XXX define + * see I2C_STATUS_XXX define ****************************************************************************/ static int32_t oz8806_current_read(int32_t *data) { int32_t ret; int32_t temp; - + ret = oz8806_read_word(OZ8806_OP_CURRENT); if (ret < num_0) return ret; @@ -2632,18 +2510,18 @@ static int32_t oz8806_current_read(int32_t *data) * Parameters: * voltage: voltage value in mV, range is +/- 5120mV with 2.5mV LSB * Return: - * see I2C_STATUS_XXX define + * see I2C_STATUS_XXX define ****************************************************************************/ int32_t oz8806_temp_read(int32_t *voltage) { int32_t ret; int32_t data; - + ret = oz8806_read_word(OZ8806_OP_CELL_TEMP); if (ret < num_0) return ret; - //pr_err("1111111111111 regeister is 0x%02x\n",ret); - + //batt_dbg("1111111111111 regeister is 0x%02x\n",ret); + data = ret & 0xFFFF; data = (int16_t)data / 16; // >> 4 and keep sign bit @@ -2652,14 +2530,14 @@ int32_t oz8806_temp_read(int32_t *voltage) if (data > 5117 || data < 0) { - pr_err("%s:data: %d, reg:%x\n", __func__, data, ret); + batt_dbg("%s:data: %d, reg:%x\n", __func__, data, ret); return -1; } *voltage = data; - //pr_err("1111111111111 voltage is %d\n",*voltage); - + //batt_dbg("1111111111111 voltage is %d\n",*voltage); + return ret; } @@ -2669,18 +2547,17 @@ int32_t oz8806_temp_read(int32_t *voltage) * Parameters: * car: in mAHr, range is +/- 163840 uvHr/ Rsense with 5 uvHr LSB / Rsense * Return: - * see I2C_STATUS_XXX define + * see I2C_STATUS_XXX define ****************************************************************************/ static int32_t oz8806_car_read(int32_t *car) { int32_t ret; int32_t data; - + ret = oz8806_read_word(OZ8806_OP_CAR); if (ret < num_0) return ret; - data = (int16_t)ret; data = data * parameter->config->dbCARLSB; data = data * 1000 / parameter->config->fRsense; @@ -2690,20 +2567,19 @@ static int32_t oz8806_car_read(int32_t *car) return ret; } - /**************************************************************************** * Description: * write oz8806 CAR * Parameters: * data: in mAHr, range is +/- 163840 uvHr/ Rsense with 5 uvHr LSB / Rsense * Return: - * see I2C_STATUS_XXX define + * see I2C_STATUS_XXX define ****************************************************************************/ static int32_t oz8806_car_write(int32_t data) { int32_t temp; int32_t ret; - + temp = data; temp = (temp * parameter->config->fRsense) / parameter->config->dbCARLSB; //transfer to CAR temp /= 1000; @@ -2718,18 +2594,18 @@ static int32_t oz8806_car_write(int32_t data) * Parameters: * data: in mA, +/- 8mV / Rsense with 7.8uV / Rsense * Return: - * see I2C_STATUS_XXX define + * see I2C_STATUS_XXX define ****************************************************************************/ static int32_t oz8806_board_offset_read(int32_t *data) { int32_t ret; int32_t temp; - + ret = oz8806_read_word(OZ8806_OP_BOARD_OFFSET); if (ret < num_0) return ret; - + temp = (int16_t)ret; temp = temp & 0x7ff; if(temp & 0x0400)// if bit[10] is 1, it's negative @@ -2747,15 +2623,13 @@ static int32_t oz8806_board_offset_read(int32_t *data) * Parameters: * data: the data will be wrriten * Return: - * see I2C_STATUS_XXX define + * see I2C_STATUS_XXX define ****************************************************************************/ static int32_t oz8806_board_offset_write(int32_t data) { int32_t ret; int32_t over_data; - - - + if(data > num_0){ data = data * config_data->fRsense * num_10 / 78; data /= 1000; @@ -2777,7 +2651,6 @@ static int32_t oz8806_board_offset_write(int32_t data) return ret; } - /***************************************************************************** * Description: * wrapper function for operation register byte reading @@ -2798,7 +2671,7 @@ static int32_t afe_register_read_byte(uint8_t index, uint8_t *dat) } if(i >= RETRY_CNT){ batt_info->i2c_error_times++; - bmu_dbg("yyyy. %s failed, ret %d\n", __func__, ret); + batt_dbg("yyyy. %s failed, ret %d\n", __func__, ret); return ret; } @@ -2807,7 +2680,6 @@ static int32_t afe_register_read_byte(uint8_t index, uint8_t *dat) return ret; } - /***************************************************************************** * Description: * wrapper function for operation register byte writing @@ -2828,14 +2700,13 @@ static int32_t afe_register_write_byte(uint8_t index, uint8_t dat) } if(i >= RETRY_CNT){ batt_info->i2c_error_times++; - bmu_dbg("yyyy. %s failed, ret %d\n", __func__, ret); + batt_dbg("yyyy. %s failed, ret %d\n", __func__, ret); return ret; } return ret; } - /***************************************************************************** * Description: * wrapper function for operation register word reading @@ -2849,7 +2720,6 @@ static int32_t afe_register_read_word(uint8_t index, uint16_t *dat) { int32_t ret; uint8_t i; - for(i = num_0; i < RETRY_CNT; i++){ ret = oz8806_read_word(index); @@ -2857,7 +2727,7 @@ static int32_t afe_register_read_word(uint8_t index, uint16_t *dat) } if(i >= RETRY_CNT){ batt_info->i2c_error_times++; - bmu_dbg("yyyy. %s failed, ret %d\n", __func__, ret); + batt_dbg("yyyy. %s failed, ret %d\n", __func__, ret); return ret; } @@ -2866,7 +2736,6 @@ static int32_t afe_register_read_word(uint8_t index, uint16_t *dat) return ret; } - /***************************************************************************** * Description: * wrapper function for operation register word writing @@ -2888,7 +2757,7 @@ static int32_t afe_register_write_word(uint8_t index, uint16_t dat) } if(i >= RETRY_CNT){ batt_info->i2c_error_times++; - bmu_dbg("yyyy. %s failed, ret %d\n", __func__, ret); + batt_dbg("yyyy. %s failed, ret %d\n", __func__, ret); return ret; } @@ -2896,8 +2765,6 @@ static int32_t afe_register_write_word(uint8_t index, uint16_t dat) } #endif - - /***************************************************************************** * Description: * wrapper function to read cell voltage @@ -2922,22 +2789,21 @@ int32_t afe_read_cell_volt(int32_t *voltage) } if(i >= RETRY_CNT){ batt_info->i2c_error_times++; - bmu_dbg("yyyy. %s failed, ret %d\n", __func__, ret); + batt_dbg("yyyy. %s failed, ret %d\n", __func__, ret); return ret; } if(oz8806_cell_num > num_1) { //*voltage = buf * num_1000 / res_divider_ratio; - bmu_dbg("read from register %d mv \n",buf); + batt_dbg("read from register %d mv \n",buf); *voltage = buf * res_divider_ratio / num_1000; // res_divider_ratio = ((Rpull + Rdown) / Rdown) * 1000 *voltage /= oz8806_cell_num; } - else + else *voltage = buf; return ret; } - /***************************************************************************** * Description: * wrapper function to read cell ocv voltage @@ -2962,7 +2828,7 @@ static int32_t afe_read_ocv_volt(int32_t *voltage) } if(i >= RETRY_CNT){ batt_info->i2c_error_times++; - bmu_dbg("yyyy. %s failed, ret %d\n", __func__, ret); + batt_dbg("yyyy. %s failed, ret %d\n", __func__, ret); return ret; } @@ -2971,9 +2837,9 @@ static int32_t afe_read_ocv_volt(int32_t *voltage) *voltage = buf * num_1000 / res_divider_ratio; *voltage /= oz8806_cell_num; } - else + else *voltage = buf; - + return ret; } @@ -3001,14 +2867,13 @@ int32_t afe_read_current(int32_t *dat) } if(i >= RETRY_CNT){ batt_info->i2c_error_times++; - bmu_dbg("yyyy. %s failed, ret %d\n", __func__, ret); + batt_dbg("yyyy. %s failed, ret %d\n", __func__, ret); return ret; } *dat = buf; return ret; } - /***************************************************************************** * Description: * wrapper function to read CAR(accummulated current calculation) @@ -3033,15 +2898,13 @@ static int32_t afe_read_car(int32_t *dat) } if(i >= RETRY_CNT){ batt_info->i2c_error_times++; - bmu_dbg("yyyy. %s failed, ret %d\n", __func__, ret); + batt_dbg("yyyy. %s failed, ret %d\n", __func__, ret); return ret; } *dat = buf; return ret; } - - /***************************************************************************** * Description: * wrapper function to write car @@ -3065,7 +2928,7 @@ static int32_t afe_write_car(int32_t date) } if(i >= RETRY_CNT){ batt_info->i2c_error_times++; - bmu_dbg("yyyy. %s failed, ret %d\n", __func__, ret); + batt_dbg("yyyy. %s failed, ret %d\n", __func__, ret); return ret; } return ret; @@ -3093,7 +2956,7 @@ static int32_t afe_write_board_offset(int32_t date) } if(i >= RETRY_CNT){ batt_info->i2c_error_times++; - bmu_dbg("yyyy. %s failed, ret %d\n", __func__, ret); + batt_dbg("yyyy. %s failed, ret %d\n", __func__, ret); return ret; } return ret; @@ -3122,12 +2985,13 @@ static int32_t afe_read_board_offset(int32_t *dat) } if(i >= RETRY_CNT){ batt_info->i2c_error_times++; - bmu_dbg("yyyy. %s failed, ret %d\n", __func__, ret); + batt_dbg("yyyy. %s failed, ret %d\n", __func__, ret); return ret; } *dat = buf; return ret; } + /***************************************************************************** * Description: * wrapper function to read temp @@ -3155,11 +3019,10 @@ static int32_t afe_read_cell_temp(int32_t *data) } if(i >= RETRY_CNT){ batt_info->i2c_error_times++; - bmu_dbg("yyyy. %s failed, ret %d\n", __func__, ret); + batt_dbg("yyyy. %s failed, ret %d\n", __func__, ret); return ret; } - if((buf >= config_data->temp_ref_voltage)|| (buf <= num_0)){ *data = num_25; } @@ -3168,7 +3031,7 @@ static int32_t afe_read_cell_temp(int32_t *data) temp = temp / (config_data->temp_ref_voltage - buf); *data = one_latitude_table(parameter->cell_temp_num,parameter->temperature,temp); } - //pr_err("1111111111111 r is %d\n",temp); + //batt_dbg("1111111111111 r is %d\n",temp); return ret; } @@ -3181,7 +3044,7 @@ static int32_t afe_read_cell_temp(int32_t *data) * Return: * crc data * Note: - * + * *****************************************************************************/ static uint8_t pec_calculate (uint8_t ucCrc, uint8_t ucData) { @@ -3200,6 +3063,7 @@ static uint8_t pec_calculate (uint8_t ucCrc, uint8_t ucData) } return ucCrc; } + #if 0 /***************************************************************************** * Description: @@ -3207,7 +3071,7 @@ static uint8_t pec_calculate (uint8_t ucCrc, uint8_t ucData) * Parameters: * Return: * Note: - * + * *****************************************************************************/ static int32_t i2c_read_byte(uint8_t addr,uint8_t index,uint8_t *data) { @@ -3240,7 +3104,7 @@ static int32_t i2c_read_byte(uint8_t addr,uint8_t index,uint8_t *data) * Parameters: * Return: * Note: - * + * *****************************************************************************/ static int32_t i2c_write_byte(uint8_t addr,uint8_t index,uint8_t data) { @@ -3249,7 +3113,7 @@ static int32_t i2c_write_byte(uint8_t addr,uint8_t index,uint8_t data) struct i2c_adapter *adap=parameter->client->adapter; struct i2c_msg msg; int32_t scl_rate = num_100 * num_1000; - + char tx_buf[num_3]; tx_buf[num_0] = index; tx_buf[num_1] = data; @@ -3276,9 +3140,6 @@ static int32_t i2c_write_byte(uint8_t addr,uint8_t index,uint8_t data) } #endif - - - void bmu_reinit(int32_t mode) { if(mode) @@ -3312,11 +3173,7 @@ void bmu_reinit(int32_t mode) } EXPORT_SYMBOL(bmu_reinit); -#ifdef CONFIG_OZ8806_M -static int __init bmulib_init(void) -#else int bmulib_init(void) -#endif { int ret = 0; #if !defined(OZ8806_API) @@ -3324,24 +3181,21 @@ int bmulib_init(void) uint8_t * p = NULL; #endif - pr_err("%s\n", __func__); + bmt_dbg("%s\n", __func__); //NOTICE: Don't change the sequence of calling below functions - -#ifdef OZ8806_API - bmu_kernel_memaddr = oz8806_get_kernel_memaddr(); -#else + byte_num = sizeof(config_data_t) + sizeof(bmu_data_t) + sizeof(gas_gauge_t); p = kzalloc(byte_num, GFP_KERNEL); bmu_kernel_memaddr = (unsigned long)p; -#endif + if (!bmu_kernel_memaddr) goto fail_mem; parameter_customer.client = oz8806_get_client(); if (!parameter_customer.client) goto fail_i2c; - pr_err("i2c address:%x\n", parameter_customer.client->addr); + bmt_dbg("i2c address:%x\n", parameter_customer.client->addr); //struct oz8806_data *data = i2c_get_clientdata(parameter_customer.client); bmu_init_parameter(¶meter_customer); @@ -3360,20 +3214,16 @@ int bmulib_init(void) return ret; fail_mem: - pr_err("%s: bmu_kernel_memaddr error\n", __func__); + bmt_dbg("%s: bmu_kernel_memaddr error\n", __func__); fail_i2c: - pr_err("%s: oz8806 i2c register error\n", __func__); + bmt_dbg("%s: oz8806 i2c register error\n", __func__); return -1; } -#ifdef CONFIG_OZ8806_M -static void __exit bmulib_exit(void) -#else void bmulib_exit(void) -#endif { - pr_err("%s\n", __func__); + batt_dbg("%s\n", __func__); unregister_bmu_callback(); #if !defined(OZ8806_API) @@ -3383,13 +3233,3 @@ void bmulib_exit(void) #endif } -#ifdef CONFIG_OZ8806_M -//module_init(bmulib_init); -late_initcall(bmulib_init); -module_exit(bmulib_exit); - -MODULE_AUTHOR("O2Micro"); -MODULE_DESCRIPTION("o2micro oz8806 battery gauge driver"); -//MODULE_LICENSE("GPL"); -#endif - diff --git a/drivers/power/sd77426_fg_mmi/calculate.o b/drivers/power/sd77426_fg_mmi/calculate.o index 634c8346146847ffb3651566b6c060d1ea74b2d1..a8b9befaa9ea54f7b175e21beb468cc5db8c8fce 100644 GIT binary patch literal 234560 zcmb5X33!#&)i%7JGlT;Pa7aQDl0Z&EfDncRNF+gqLqH8gBoe>~gd}7jGz^gtj5TTy ztW+F=V2ffkfCE?uI%q+w2CEi_R-CbF4NkSK{X|<^X|;U!z1DtC;_!a&|8re=&bs$n zd+oK?UVD7@Ib3npxo3ME$GHC-^DEPX+*D(_uJ=YjSg5c`FmWc$q&2Sbn}x$o_;981 zHikWB;a`2gA+z0Q+86XOCO$3XeYFn!8l*jLJdI(;EW8$fTYP5FhhFbJX~x&+oIbrU z^n7TW>8d=`<*j_}L$7mBmoI#nH1p5)n7l1*m+fc|nHNVI-?kCPY#ZKCdnmJ^>QE=- zj^MAz_)2bv4e7>|WVCrws*G7!gS4WU-z3B4XzB`ConKx0$bqlCX8Y$$JqHqu>G)TQ zIraB4=fK~+Ci@>=C%elNK4oI?cQ9NSN;UbYaz{S{jL+Fl_^<(eg~!*}w=`V%QS`t+*Oc&+{8ED3%N~wM{OGcx!XPd#;absO5_6N;leSH ztB2e>@DJsx`etp5f?TDEYCQYc50Yp2%|-VmnuXooe)puquO9gGcF1mntOs=>O*_)z zQxi1XXPCZ?C;oeS;c1__sM{NJPag8DfzO$bZQ$l3&3rqfG~ex>K9VmD<#l_b@0rvq z-#fkXk!HSTo9_xwK=RFSoW_vfobMdllzbX>?)I7UJmA-+N|~wE0bMY&cYe`UV_Ra`79@hvpusJoKQ)Qxdo=yyIVHseUv$Wukn;zg-_F#z5D65J}E_Q;T>D> zXJU@t@>3HP9YDMM*7S*P^!H8qfhQ{ZPS61-eCldXpXjH3eN$qd8MEz9e4fBx-!~c$ ztvqqdOWR;e%rhgmt&G3_v(Zj;$=&B1`Rq^M|Ho&eVcY1-%K3`gN;9n`>Q(s;B)PA==F^&<#h26&F1w7`#u3qtu z0U-ZDq=iuCcjaf^474jgx8rZ;BIoP*!~Z>~ zX7Bo<7>r$zqrdKeo|=X1|K8}UI6kz+rQD4%!f8w2o&IG#+N-^!2r+qeoXOwh3!iF7 zf1{lq=sU5mV?p(_d)5~r&4cl2rsS#Hk5< z;i}6`N^hH!yr!hHR}56ahHz^5@ZY_0CG`8g-#FVnO+(94p{vMeqPx9GY_FXusiv%V zKGPrhP*$~RztLc93>AmAaV$)S|3Vn6)4Zl}EXJWXy(VuD%JZOo8Qbab?GD?@CTgi^wXXEmgN_C{}pJp2+pDW)rV^FK9~+!,?q{o&VavR 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 Lr^oxpYSjM&+`&D! literal 219736 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 Ou>K$J<(@Cy{{I0s?JsKp diff --git a/drivers/power/sd77426_fg_mmi/oz8806_battery.c b/drivers/power/sd77426_fg_mmi/oz8806_battery.c index b9fb02ad97d3..5e66715f699f 100644 --- a/drivers/power/sd77426_fg_mmi/oz8806_battery.c +++ b/drivers/power/sd77426_fg_mmi/oz8806_battery.c @@ -1,17 +1,17 @@ /***************************************************************************** -* Copyright(c) O2Micro, 2019. All rights reserved. +* Copyright(c) BMT, 2021. 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 +* BMT [oz8806] Source Code Reference Design +* File:[bmulib.c] +* +* This Source Code Reference Design for BMT [oz8806] access +* ("Reference Design") is solely for the use of PRODUCT INTEGRATION REFERENCE ONLY, +* and contains confidential and privileged information of BMT International +* Limited. BMT 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-BMT +* Reference Design. Use of the Reference Design is at user's discretion to qualify * the final work result. *****************************************************************************/ @@ -26,14 +26,12 @@ #include #include #include -//you must add these here for O2MICRO +//you must add these here for BMT #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 ****************************************************************************/ @@ -41,12 +39,7 @@ static int fg_hw_init_done = 0; static uint8_t bmu_init_done = 0; static int oz8806_suspend = 0; static DEFINE_MUTEX(update_mutex); -#ifdef OZ8806_API -struct mutex *update_mutex_ptr = &update_mutex; -bmu_data_t *batt_info_ptr = NULL; -#else static bmu_data_t *batt_info_ptr = NULL; -#endif static gas_gauge_t *gas_gauge_ptr = NULL; static uint8_t charger_finish = 0; static unsigned long ic_wakeup_time = 0; @@ -113,9 +106,9 @@ static int oz8806_battery_get_property(struct power_supply *psy, 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*/ @@ -131,7 +124,6 @@ static int oz8806_battery_get_property(struct power_supply *psy, } else val->intval = POWER_SUPPLY_STATUS_DISCHARGING; - break; case POWER_SUPPLY_PROP_VOLTAGE_NOW: val->intval = data->batt_info.batt_voltage * 1000; @@ -151,27 +143,21 @@ static int oz8806_battery_get_property(struct power_supply *psy, 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; } @@ -190,7 +176,6 @@ static void oz8806_external_power_changed(struct power_supply *psy) 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; @@ -204,7 +189,6 @@ static void oz8806_powersupply_init(struct oz8806_data *data) *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]; @@ -214,10 +198,10 @@ static ssize_t oz8806_register_store(struct device *dev, struct device_attribute int len; struct oz8806_data *oz8806; - len = strlen(buf); + 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 @@ -236,7 +220,7 @@ static ssize_t oz8806_register_store(struct device *dev, struct device_attribute && address != OZ8806_OP_BOARD_OFFSET && address != OZ8806_OP_BOARD_OFFSET+1) { - pr_err("register[0x%.2x] is read-only\n", address); + bmt_dbg("register[0x%.2x] is read-only\n", address); return _count; } @@ -248,7 +232,7 @@ static ssize_t oz8806_register_store(struct device *dev, struct device_attribute oz8806_write_byte(oz8806, address, value); - pr_err("write 0x%.2x into register[0x%.2x]\n", value, address); + bmt_dbg("write 0x%.2x into register[0x%.2x]\n", value, address); return _count; } @@ -257,12 +241,12 @@ static ssize_t oz8806_register_store(struct device *dev, struct device_attribute 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 @@ -276,22 +260,22 @@ static ssize_t oz8806_register_show(struct device *dev, struct device_attribute 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++) - { + 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 @@ -322,16 +306,16 @@ static ssize_t oz8806_debug_store(struct device *dev, struct device_attribute *a if(val == 1) { config_data.debug = 1; - pr_err("DEBUG ON \n"); + bmt_dbg("DEBUG ON \n"); } else if (val == 0) { config_data.debug = 0; - pr_err("DEBUG CLOSE \n"); + bmt_dbg("DEBUG CLOSE \n"); } else { - pr_err("invalid command\n"); + bmt_dbg("invalid command\n"); return -EINVAL; } @@ -354,7 +338,7 @@ static ssize_t oz8806_bmu_init_done_store(struct device *dev, struct device_attr int val = 0; if (kstrtoint(buf, 10, &val)) return -EINVAL; - + bmu_init_done = 0; ic_wakeup_time = jiffies; @@ -363,18 +347,18 @@ static ssize_t oz8806_bmu_init_done_store(struct device *dev, struct device_attr if(val == 1) { - pr_err("reinit oz8806 from ocv\n"); + bmt_dbg("reinit BMT from ocv\n"); bmu_reinit(1);//bmu_init_done will be setted } else if (val == 0) { - pr_err("reinit oz8806,just wakeup ic\n"); + bmt_dbg("reinit BMT,just wakeup ic\n"); bmu_reinit(0); bmu_init_done = 1; } else { - pr_err("invalid command\n"); + bmt_dbg("invalid command\n"); return -EINVAL; } schedule_delayed_work(&the_oz8806->work, 0); @@ -383,13 +367,13 @@ static ssize_t oz8806_bmu_init_done_store(struct device *dev, struct device_attr 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(bmt_debug, S_IRUGO | (S_IWUSR|S_IWGRP), oz8806_debug_show, oz8806_debug_store); static DEVICE_ATTR(save_capacity, S_IRUGO, oz8806_save_capacity_show, NULL); static DEVICE_ATTR(bmu_init_done, S_IRUGO| (S_IWUSR|S_IWGRP), oz8806_bmu_init_done_show, oz8806_bmu_init_done_store); static struct attribute *oz8806_attributes[] = { &dev_attr_registers.attr, &dev_attr_chip_id.attr, - &dev_attr_debug.attr, + &dev_attr_bmt_debug.attr, &dev_attr_bmu_init_done.attr, &dev_attr_save_capacity.attr, NULL, @@ -403,10 +387,10 @@ static int oz8806_create_sys(struct device *dev, const struct attribute_group * { int err; - batt_dbg("oz8806_create_sysfs"); - + bmt_dbg("BMT_create_sysfs\n"); + if(NULL == dev){ - pr_err("[BATT]: failed to register battery\n"); + bmt_dbg("[BATT]: failed to register battery\n"); return -EINVAL; } @@ -414,11 +398,11 @@ static int oz8806_create_sys(struct device *dev, const struct attribute_group * if (!err) { - batt_dbg("creat oz8806 sysfs group ok"); + bmt_dbg("creat BMT sysfs group ok\n"); } else { - pr_err("creat oz8806 sysfs group fail\n"); + bmt_dbg("creat BMT sysfs group fail\n"); return -EIO; } return err; @@ -451,7 +435,7 @@ static int32_t oz8806_write_byte(struct oz8806_data *data, uint8_t index, uint8_ 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; @@ -497,7 +481,7 @@ int oz8806_wakeup_full_power(void) struct oz8806_data *data = the_oz8806; ret = oz8806_read_byte(data, OZ8806_OP_CTRL, &val); - pr_err("OZ8806_OP_CTRL: 0x%02x\n", val); + bmt_dbg("BMT_OP_CTRL: 0x%02x\n", val); if ((val & SLEEP_MODE) != 0<<6) { @@ -505,19 +489,19 @@ int oz8806_wakeup_full_power(void) ret = oz8806_read_byte(data, OZ8806_OP_CTRL, &val); - pr_err("OZ8806_OP_CTRL: 0x%02x after writing\n", val); + bmt_dbg("BMT_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"); + bmt_dbg("fail to wake up BMT 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"); + bmt_dbg("wake up BMT to full power mode\n"); } } - pr_err("ic_wakeup_time %lu\n",ic_wakeup_time); + bmt_dbg("ic_wakeup_time %lu\n",ic_wakeup_time); return ret; } @@ -544,17 +528,16 @@ static void discharge_end_fun(struct oz8806_data *data) */ 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; - discharge_end_process(); - } - 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--; + { + if(batt_info_ptr->fRSOC == 1) + { + batt_info_ptr->fRSOC = 0; + batt_info_ptr->sCaMAH = data->batt_info.batt_fcc_data / num_100 -1; + discharge_end_process(); + } + 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--; } } } @@ -583,14 +566,14 @@ static void charge_end_fun(void) 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"); + bmt_dbg("charger is full, enter external charger finish\n"); goto charger_full; } @@ -612,7 +595,7 @@ static void charge_end_fun(void) start_record_flag = 0; #endif return; - } + } 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)) @@ -626,7 +609,7 @@ static void charge_end_fun(void) if (time_accumulation >= CHG_END_PERIOD_MS) { charger_finish = 1; - batt_dbg("enter external charger finish"); + bmt_dbg("enter external charger finish\n"); } else { @@ -641,19 +624,19 @@ static void charge_end_fun(void) } charger_full: - batt_dbg("%s, time_accumulation:%d, charger_finish:%d", + bmt_dbg("%s, time_accumulation:%d, charger_finish:%d\n", __func__, time_accumulation, charger_finish); - batt_dbg("voltage:%d, cv:%d, fcurr:%d, 8806 eoc:%d, gas_gauge_ptr->charge_end:%d", + bmt_dbg("voltage:%d, cv:%d, fcurr:%d, BMT eoc:%d, gas_gauge_ptr->charge_end:%d\n", 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)); + bmt_dbg("start_record_flag: %d, at %d ms\n",start_record_flag, jiffies_to_msecs(jiffies)); } if((batt_info_ptr->fRSOC != 99) ||(batt_info_ptr->fCurr < oz8806_eoc)) { @@ -664,31 +647,29 @@ charger_full: { 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)); + bmt_dbg("start_record_flag: %d, at %d ms\n",start_record_flag, jiffies_to_msecs(jiffies)); charger_finish = 1; start_record_flag = 0; - batt_dbg("enter charge timer finish"); + bmt_dbg("enter charge timer finish\n"); } } #endif - if(charger_finish) { if(!gas_gauge_ptr->charge_end) { if(batt_info_ptr->fRSOC < 100) { - static int32_t fRSOC_extern = 0; + 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); + bmt_dbg("fRSOC_extern:%d, soc:%d \n",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); @@ -704,30 +685,26 @@ charger_full: 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 ++; + 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); + bmt_dbg("enter charger finsh update soc:%d\n",batt_info_ptr->fRSOC); } else { - batt_dbg("enter charger charge end"); + bmt_dbg("enter charger charge end\n"); gas_gauge_ptr->charge_end = 1; charge_end_process(); 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; } @@ -747,7 +724,6 @@ static void oz8806_wakeup_event(struct oz8806_data *data) } //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; @@ -794,11 +770,10 @@ static void system_charge_discharge_status(struct oz8806_data *data) 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); + batt_dbg("val_ac.intval %d, val_usb.intval %d,adapter_status_temp %d\n",val_ac.intval,val_usb.intval,adapter_status_temp); #endif - adapter_status = adapter_status_temp; - batt_dbg("adapter_status:%d", adapter_status); + batt_dbg("adapter_status:%d\n", adapter_status); } static void oz8806_lock_soc(struct oz8806_data *data) @@ -809,7 +784,6 @@ static void oz8806_lock_soc(struct oz8806_data *data) //bmu ok if(bmu_init_done) { - pr_err("\n"); if(rsoc_pre < 0) rsoc_pre = 0; if(rsoc_pre > 100) rsoc_pre = 100; @@ -818,7 +792,7 @@ static void oz8806_lock_soc(struct oz8806_data *data) { 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); + bmt_dbg("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 @@ -826,7 +800,7 @@ static void oz8806_lock_soc(struct oz8806_data *data) temp = (car * config_data.fRsense) / config_data.dbCARLSB; //transfer to CAR temp /= 1000; - + i2c_smbus_write_word_data(data->myclient, OZ8806_OP_CAR,(unsigned short)temp); } } @@ -836,15 +810,15 @@ static void oz8806_lock_soc(struct oz8806_data *data) { 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); + bmt_dbg("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 temp /= 1000; - - i2c_smbus_write_word_data(data->myclient, OZ8806_OP_CAR,(unsigned short)temp); + + i2c_smbus_write_word_data(data->myclient, OZ8806_OP_CAR,(unsigned short)temp); } } } @@ -858,7 +832,7 @@ static void oz8806_battery_func(struct oz8806_data *data) if(0 == cur_jiffies) cur_jiffies = jiffies; - pr_err("%s: !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n", __func__); + batt_dbg("BMT battery func: !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"); time_since_last_update_ms = jiffies_to_msecs(jiffies - cur_jiffies); cur_jiffies = jiffies; @@ -867,7 +841,7 @@ static void oz8806_battery_func(struct oz8806_data *data) rsoc_pre = data->batt_info.batt_soc; - //you must add this code here for O2MICRO + //you must add this code here for BMT //Notice: don't nest mutex #ifdef EXT_THERMAL_READ oz8806_update_batt_temp(data); @@ -892,12 +866,12 @@ static void oz8806_battery_func(struct oz8806_data *data) oz8806_wakeup_event(data); - batt_dbg("l=%d v=%d t=%d c=%d ch=%d", + batt_dbg("l=%d v=%d t=%d c=%d ch=%d\n", 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); + power_supply_changed(data->bat); + batt_dbg("since last batt update = %lu ms\n", time_since_last_update_ms); } static void oz8806_battery_work(struct work_struct *work) @@ -917,7 +891,7 @@ static void oz8806_battery_work(struct work_struct *work) schedule_delayed_work(&data->work, msecs_to_jiffies(data->interval)); } - batt_dbg("interval:%d ms", data->interval); + batt_dbg("interval:%d ms\n", data->interval); } int32_t is_battery_exchanged(void) @@ -931,20 +905,18 @@ static int oz8806_suspend_notifier(struct notifier_block *nb, 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); + bmt_dbg("BMT 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"); - + bmt_dbg("BMT 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) @@ -962,12 +934,10 @@ static int oz8806_suspend_notifier(struct notifier_block *nb, if (batt_info_ptr) batt_info_ptr->fCurr = -20; data->batt_info.batt_current = -20; - pr_err("drop current\n"); + bmt_dbg("drop current\n"); } } - oz8806_suspend = 0; - return NOTIFY_OK; default: @@ -989,7 +959,7 @@ static void oz8806_init_soc(struct oz8806_data *data) } if(i >= 5) { - batt_dbg("%s failed, reg value %x\n",__func__,ret); + bmt_dbg("BMT fgu init soc failed, reg value %x\n",ret); init_soc = 50; return; } @@ -1008,7 +978,7 @@ static void oz8806_init_soc(struct oz8806_data *data) else init_soc = 0; - batt_dbg("%s succeed, init soc is %d",__func__,init_soc); + bmt_dbg("BMT fgu init soc succeed, init soc is %d\n",init_soc); } static int oz8806_init_batt_info(struct oz8806_data *data) { @@ -1040,7 +1010,6 @@ static int oz8806_update_batt_info(struct oz8806_data *data) 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; @@ -1067,7 +1036,6 @@ static int oz8806_update_batt_temp(struct oz8806_data *data) 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; } @@ -1087,7 +1055,6 @@ int oz8806_get_remaincap(void) } EXPORT_SYMBOL(oz8806_get_remaincap); - int oz8806_get_soc_from_ext(void) { int ret = -1; @@ -1129,7 +1096,7 @@ int oz8806_get_battry_current(void) if (ret < 0) { ret = -1; - batt_dbg("%s:oz8806 current adc error", __func__); + bmt_dbg("BMT current adc error\n"); } if (batt_info_ptr && ret >= 0) @@ -1155,7 +1122,7 @@ int oz8806_get_battery_voltage(void) if (ret < 0) { ret = -1; - batt_dbg("%s:oz8806 voltage adc error", __func__); + bmt_dbg("BMT voltage adc error\n"); } if (batt_info_ptr && ret >= 0) @@ -1186,7 +1153,7 @@ EXPORT_SYMBOL(oz8806_get_battery_temp); void oz8806_battery_update_data(void) { - batt_dbg("enter %s", __func__); + bmt_dbg("enter BMT fgu battery update data"); if (fg_hw_init_done && the_oz8806 && bmu_init_done) oz8806_battery_func(the_oz8806); } @@ -1201,11 +1168,11 @@ int32_t oz8806_vbus_voltage(void) if (ret < 0) { - batt_dbg("%s:oz8806 temp adc error", __func__); + bmt_dbg("BMT temp adc error\n"); return ret; } - batt_dbg("voltage from oz8806:%d", vbus_voltage); + bmt_dbg("voltage from BMT:%d\n", vbus_voltage); vbus_voltage = vbus_voltage * (RPULL + RDOWN) / RDOWN; return vbus_voltage; @@ -1224,7 +1191,7 @@ 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; @@ -1237,7 +1204,7 @@ struct i2c_client * oz8806_get_client(void) return the_oz8806->myclient; else { - pr_err("the_oz8806 is NULL, oz8806_probe didn't call\n"); + bmt_dbg("BMT is NULL, BMT_probe didn't call\n"); return NULL; } @@ -1307,7 +1274,7 @@ void oz8806_set_batt_info_ptr(bmu_data_t *batt_info) if (!batt_info) { - pr_err("%s: batt_info NULL\n", __func__); + bmt_dbg("BMT fgu batt_info NULL\n"); mutex_unlock(&update_mutex); return; } @@ -1324,7 +1291,7 @@ void oz8806_set_gas_gauge(gas_gauge_t *gas_gauge) if (!gas_gauge) { - pr_err("%s: gas_gauge NULL\n", __func__); + bmt_dbg("BMT fgu gas_gauge NULL\n"); mutex_unlock(&update_mutex); return; } @@ -1337,7 +1304,7 @@ void oz8806_set_gas_gauge(gas_gauge_t *gas_gauge) 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", + bmt_dbg("batt_fcc_data:%d, discharge_current_th:%d\n", the_oz8806->batt_info.batt_fcc_data, the_oz8806->batt_info.discharge_current_th); gas_gauge_ptr->ext_temp_measure = ext_thermal_read; @@ -1358,8 +1325,8 @@ unsigned long oz8806_get_system_boot_time(void) unsigned long mod; time_sec = ktime_to_ns(ktime_get_boottime()); mod = do_div(time_sec,1000000); - batt_dbg("system boottime: %lu ms", (unsigned long)time_sec); - + batt_dbg("system boottime: %lu ms\n", (unsigned long)time_sec); + return time_sec; } EXPORT_SYMBOL(oz8806_get_system_boot_time); @@ -1370,7 +1337,7 @@ unsigned long oz8806_get_boot_up_time(void) 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); + bmt_dbg("boot up time: %lu ms\n", (unsigned long) t); return t; } @@ -1379,10 +1346,10 @@ EXPORT_SYMBOL(oz8806_get_boot_up_time); unsigned long oz8806_get_power_on_time(void) { unsigned int t = 0; - pr_err("jiffies %lu,ic_wakeup_time %lu\n",jiffies,ic_wakeup_time); + bmt_dbg("jiffies %lu,ic_wakeup_time %lu\n",jiffies,ic_wakeup_time); t = jiffies_to_msecs(jiffies - ic_wakeup_time); - pr_err("IC wakeup time: %u ms\n", t); + bmt_dbg("IC wakeup time: %u ms\n", t); return (unsigned long)t; } @@ -1397,17 +1364,16 @@ static int oz8806_probe(struct i2c_client *client,const struct i2c_device_id *id .of_node = client->dev.of_node, }; - pr_err("%s start\n",__func__); + bmt_dbg("BMT fgu probe start\n"); /***************************************************************************** -* O2Micro Warning: +* BMT 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"); + dev_err(&client->dev, "Can't alloc BMT_data struct\n"); return -ENOMEM; } @@ -1417,12 +1383,13 @@ static int oz8806_probe(struct i2c_client *client,const struct i2c_device_id *id the_oz8806 = data; data->myclient = client; //init battery information as soon as possible + oz8806_wakeup_full_power(); 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. +* BMT 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. *****************************************************************************/ @@ -1449,7 +1416,7 @@ static int oz8806_probe(struct i2c_client *client,const struct i2c_device_id *id 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"); + bmt_dbg("failed to register power_supply battery\n"); goto register_fail; } /* @@ -1457,10 +1424,10 @@ static int oz8806_probe(struct i2c_client *client,const struct i2c_device_id *id */ ret = oz8806_create_sys(&(client->dev), &oz8806_attribute_group); if(ret){ - pr_err("[BATT]: Err failed to creat oz8806 attributes\n"); + bmt_dbg("[BATT]: Err failed to creat BMT attributes\n"); goto bat_failed; } - + //alternative suspend/resume method data->pm_nb.notifier_call = oz8806_suspend_notifier; register_pm_notifier(&data->pm_nb); @@ -1468,17 +1435,17 @@ static int oz8806_probe(struct i2c_client *client,const struct i2c_device_id *id 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__); + bmt_dbg("BMT fgu probe end\n"); return 0; //return Ok bat_failed: power_supply_unregister(the_oz8806->bat); register_fail: - pr_err("%s() fail: return %d\n", __func__, ret); + bmt_dbg("BMT fgu probe () fail: return %d\n",ret); the_oz8806 = NULL; return ret; } @@ -1514,7 +1481,7 @@ static int oz8806_remove(struct i2c_client *client) static void oz8806_shutdown(struct i2c_client *client) { struct oz8806_data *data = i2c_get_clientdata(client); - pr_err("oz8806 shutdown\n"); + bmt_dbg("BMT fgu shutdown\n"); cancel_delayed_work(&data->work); @@ -1564,16 +1531,16 @@ static int __init oz8806_init(void) ret = i2c_add_driver(&oz8806_driver); if(ret != 0) - pr_err("failed to register oz8806 i2c driver.\n"); + bmt_dbg("failed to register BMT i2c driver.\n"); else - pr_err("Success to register oz8806 i2c driver.\n"); + bmt_dbg("Success to register BMT i2c driver.\n"); return ret; } static void __exit oz8806_exit(void) { - pr_err("%s\n", __func__); + bmt_dbg("BMT fgu exit\n"); i2c_del_driver(&oz8806_driver); } diff --git a/drivers/power/sd77426_fg_mmi/oz8806_regdef.h b/drivers/power/sd77426_fg_mmi/oz8806_regdef.h index eba2e835589f..0a96ee34256b 100644 --- a/drivers/power/sd77426_fg_mmi/oz8806_regdef.h +++ b/drivers/power/sd77426_fg_mmi/oz8806_regdef.h @@ -1,17 +1,17 @@ /***************************************************************************** -* Copyright(c) O2Micro, 2019. All rights reserved. +* Copyright(c) BMT, 2021. 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 +* BMT [oz8806] Source Code Reference Design +* File:[bmulib.c] +* +* This Source Code Reference Design for BMT [oz8806] access +* ("Reference Design") is solely for the use of PRODUCT INTEGRATION REFERENCE ONLY, +* and contains confidential and privileged information of BMT International +* Limited. BMT 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-BMT +* Reference Design. Use of the Reference Design is at user's discretion to qualify * the final work result. *****************************************************************************/ @@ -30,59 +30,58 @@ *****************************************************************************/ /* 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_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 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 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_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_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 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 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_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 +#define OZ8806_OP_BOARD_OFFSET 0x18 - /***************************************************************************** * function prototype section * add function prototype here diff --git a/drivers/power/sd77426_fg_mmi/parameter.c b/drivers/power/sd77426_fg_mmi/parameter.c index 3b8cc390816a..86127b28a78f 100644 --- a/drivers/power/sd77426_fg_mmi/parameter.c +++ b/drivers/power/sd77426_fg_mmi/parameter.c @@ -1,17 +1,17 @@ /***************************************************************************** -* Copyright(c) O2Micro, 2019. All rights reserved. +* Copyright(c) BMT, 2021. 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 +* BMT [oz8806] Source Code Reference Design +* File:[bmulib.c] +* +* This Source Code Reference Design for BMT [oz8806] access +* ("Reference Design") is solely for the use of PRODUCT INTEGRATION REFERENCE ONLY, +* and contains confidential and privileged information of BMT International +* Limited. BMT 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-BMT +* Reference Design. Use of the Reference Design is at user's discretion to qualify * the final work result. *****************************************************************************/ @@ -22,8 +22,7 @@ #include "table.h" #include "battery_config.h" - -one_latitude_data_t cell_temp_data[TEMPERATURE_DATA_NUM] = { +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}, @@ -38,22 +37,21 @@ one_latitude_data_t cell_temp_data[TEMPERATURE_DATA_NUM] = { config_data_t config_data = { - .fRsense = O2_CONFIG_RSENSE, - .temp_pull_up = O2_TEMP_PULL_UP_R, + .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, + .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, + .board_offset = O2_CONFIG_BOARD_OFFSET, + .debug = 1, }; - /***************************************************************************** * bmu_init_parameter: * this implements a interface for customer initiating bmu parameters @@ -61,21 +59,14 @@ config_data_t config_data = { *****************************************************************************/ 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 + check_chip_function = 0; 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->charge_pursue_step = 10; + parameter_customer->discharge_pursue_step = 6; parameter_customer->discharge_pursue_th = 10; parameter_customer->wait_method = 2; @@ -97,7 +88,6 @@ void bmu_init_parameter(parameter_data_t *parameter_customer) } EXPORT_SYMBOL(bmu_init_parameter); - /***************************************************************************** * Description: * bmu_init_gg @@ -113,7 +103,7 @@ void bmu_init_gg(gas_gauge_t *gas_gauge) 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]); + bmt_dbg("AAAA battery_id is %s\n", battery_id[0]); gas_gauge->ri = 18; gas_gauge->line_impedance = 10; @@ -123,31 +113,11 @@ void bmu_init_gg(gas_gauge_t *gas_gauge) //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); diff --git a/drivers/power/sd77426_fg_mmi/parameter.h b/drivers/power/sd77426_fg_mmi/parameter.h index e5436f11fb31..ec6e99597caa 100644 --- a/drivers/power/sd77426_fg_mmi/parameter.h +++ b/drivers/power/sd77426_fg_mmi/parameter.h @@ -1,17 +1,17 @@ /***************************************************************************** -* Copyright(c) O2Micro, 2019. All rights reserved. +* Copyright(c) BMT, 2021. 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 +* BMT [oz8806] Source Code Reference Design +* File:[bmulib.c] +* +* This Source Code Reference Design for BMT [oz8806] access +* ("Reference Design") is solely for the use of PRODUCT INTEGRATION REFERENCE ONLY, +* and contains confidential and privileged information of BMT International +* Limited. BMT 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-BMT +* Reference Design. Use of the Reference Design is at user's discretion to qualify * the final work result. *****************************************************************************/ @@ -26,26 +26,18 @@ #include #include - /**************************************************************************** * #define section * add constant #define here if any ***************************************************************************/ -//#define MUTEX_TIMEOUT 5000 -#define MYDRIVER "oz8806" //"oz8806" - -//#define OZ8806_API -//#define BAT_STAT - -//two cells application -//#define OZ8806_VME_SEL +#define MYDRIVER "oz8806" //"oz8806" #define DISCH_CURRENT_TH -10 #define O2_OCV_100_VOLTAGE 8700 #define TEMPERATURE_DATA_NUM 28 #define num_0 0 -#define num_1 1 +#define num_1 1 #define num_32768 32768 #define num_5 5 #define num_0x2c 0x2c @@ -79,7 +71,6 @@ #define INIT_CAP (-2) #define NO_FILE (-1) - /**************************************************************************** * Struct section * add struct #define here if any @@ -93,16 +84,14 @@ enum charger_type_t { }; 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; + 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 @@ -111,53 +100,41 @@ struct oz8806_data struct power_supply_desc bat_desc; struct power_supply *ac_psy; struct power_supply *usb_psy; - struct delayed_work work; -#ifdef BAT_STAT - struct delayed_work bat_monitor_work; - int32_t bat_changed; -#endif 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 * 1000; //Rsense value of chip, in mini ohm expand 1000 times - 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 + int32_t fRsense; //= 20 * 1000; //Rsense value of chip, in mini ohm expand 1000 times + 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; + 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; @@ -172,29 +149,26 @@ typedef struct tag_parameter_data { 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; + 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 @@ -204,35 +178,28 @@ typedef struct tag_gas_gauge { //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; + 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; @@ -244,16 +211,25 @@ typedef struct tag_gas_gauge { uint8_t charge_method_select; int32_t max_charge_current_fix; uint8_t ext_temp_measure; - uint8_t bmu_init_ok; + 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; uint32_t power_on_100_vol; }gas_gauge_t; +/**************************************************************************** +* debug func * +***************************************************************************/ +#define bmt_dbg(fmt, args...) printk(KERN_ERR"[bmt]:"pr_fmt(fmt)"", ## args) + +#define batt_dbg(fmt, args...)\ +do {\ + if(parameter->config->debug)\ + printk(KERN_ERR"[bmt]:"pr_fmt(fmt)"", ## args);\ +} while(0) + /**************************************************************************** * extern variable/function declaration of table.c ***************************************************************************/ @@ -265,8 +241,8 @@ extern int ZAxisElement[ZAxis]; extern int RCtable[YAxis*ZAxis][XAxis]; //extern one_latitude_data_t charge_data[CHARGE_DATA_NUM]; -extern uint8_t battery_ri ; -extern int32_t one_percent_rc ; +extern uint8_t battery_ri; +extern int32_t one_percent_rc; /**************************************************************************** * extern variable/function defined by parameter.c @@ -283,24 +259,15 @@ extern int bmulib_init(void); extern void bmulib_exit(void); #endif -//bmulib extern -extern void bmu_polling_loop(void); -extern void bmu_wake_up_chip(void); -extern void bmu_power_down_chip(void); -extern void charge_end_process(void); -extern void discharge_end_process(void); -extern int32_t oz8806_temp_read(int32_t *voltage); -extern int32_t afe_read_current(int32_t *dat); -extern int32_t afe_read_cell_volt(int32_t *voltage); -//endif +extern void bmu_polling_loop(void); +extern void bmu_wake_up_chip(void); +extern void bmu_power_down_chip(void); +extern void charge_end_process(void); +extern void discharge_end_process(void); +extern int32_t oz8806_temp_read(int32_t *voltage); +extern int32_t afe_read_current(int32_t *dat); +extern int32_t afe_read_cell_volt(int32_t *voltage); -#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); @@ -308,10 +275,6 @@ 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 @@ -349,26 +312,14 @@ extern void oz8806_reset_wkuptime(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); - - -#define bmu_dbg(fmt, args...)\ -do {\ - if(parameter->config->debug)\ - printk(KERN_ERR pr_fmt(fmt), ## args);\ -} while(0) extern int32_t calculate_soc_result(void); extern int32_t one_latitude_table(int32_t number,one_latitude_data_t *data,int32_t value); extern uint8_t OZ8806_LookUpRCTable(int infVolt,int infCurr, int infTemp, int *infCal); void charge_process(void); void discharge_process(void); - extern bmu_data_t *batt_info; extern gas_gauge_t *gas_gauge; extern parameter_data_t parameter_customer; @@ -379,14 +330,12 @@ extern int *xaxis_table; extern int *yaxis_table; extern int *zaxis_table; - extern int32_t calculate_mah; +extern int32_t calculate_mah; extern int32_t calculate_soc ; +extern uint32_t calculate_version; #define X_AXIS gas_gauge->rc_x_num #define Y_AXIS gas_gauge->rc_y_num #define Z_AXIS gas_gauge->rc_z_num - - - #endif //end _PARAMETER_H_ diff --git a/drivers/power/sd77426_fg_mmi/table.c b/drivers/power/sd77426_fg_mmi/table.c index c4a72b15fedd..a17eee99b121 100644 --- a/drivers/power/sd77426_fg_mmi/table.c +++ b/drivers/power/sd77426_fg_mmi/table.c @@ -1,129 +1,174 @@ -/***************************************************************************** -* 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}, -}; +/***************************************************************************** +* 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: ATL +* Battery Model: M1892 +* Absolute Max Capacity(mAhr): 3661 +* Limited Charge Voltage(mV): 4400 +* Cutoff Discharge Voltage(mV): 3200 +* Equipment: "JY1-5","JY1-5","JY1-5","JY1-5","JY1-5","JY1-5","JY1-5","JY1-5","JY1-5","JY1-5","JY1-5","JY1-5","JY2-5","JY2-5","JY2-5","JY2-6","JY2-6","JY2-6","JY2-6","JY2-6","JY2-6","JY2-6","JY2-5","JY2-5","JY2-5","JY2-5","JY2-5","JY2-5","JY2-5","JY2-5","JY2-5","JY2-5","JY2-6","JY2-6","JY2-6","JY2-6","JY2-6","JY2-6","JY2-6","JY2-6","JY2-6","JY2-5","JY1-6","JY1-6","JY1-6","JY1-6","JY1-6","JY1-6","JY1-8","JY1-8","JY1-8","JY1-8","JY1-6","JY1-6","JY1-6","JY1-6","JY1-6","JY1-6","JY1-6","JY1-6","JY1-6","JY1-6","JY1-6","JY1-8","JY1-7","JY1-7","JY1-7","JY1-7","JY1-7","JY1-7","JY1-3","JY1-3","JY1-3","JY1-5","JY1-5","JY2-5","JY2-5","JY2-5","JY2-5","JY2-5","JY2-5","JY2-5","JY2-5","JY2-5","JY2-5","JY1-8","JY1-8","JY1-2","JY1-2","JY1-2","JY2-6","JY2-6","JY2-6" +* 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","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: "M1892_1","M1892_1","M1892_1","M1892_1","M1892_1","M1892_1","M1892_1","M1892_1","M1892_1","M1892_1","M1892_1","M1892_1","M1892_1","M1892_1","M1892_1","M1892_1","M1892_1","M1892_1","M1892_1","M1892_1","M1892_1","M1892_1","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_3","M1892_3","M1892_3","M1892_3","M1892_3","M1892_3","M1892_3","M1892_3","M1892_3","M1892_3","M1892_3","M1892_3","M1892_3","M1892_3","M1892_3","M1892_3","M1892_3","M1892_4","M1892_4","M1892_4","M1892_2","M1892_2","M1892_2" +* Version = V00.8D.00 +* Date = 2018.3.26 +* 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.8D.00-2018.3.26-M1892"; + +const char *battery_id[BATTERY_ID_NUM] = {"M1892_1","M1892_1","M1892_1","M1892_1","M1892_1","M1892_1","M1892_1","M1892_1","M1892_1","M1892_1","M1892_1","M1892_1","M1892_1","M1892_1","M1892_1","M1892_1","M1892_1","M1892_1","M1892_1","M1892_1","M1892_1","M1892_1","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_3","M1892_3","M1892_3","M1892_3","M1892_3","M1892_3","M1892_3","M1892_3","M1892_3","M1892_3","M1892_3","M1892_3","M1892_3","M1892_3","M1892_3","M1892_3","M1892_3","M1892_4","M1892_4","M1892_4","M1892_2","M1892_2","M1892_2"}; + +one_latitude_data_t ocv_data[OCV_DATA_NUM] = {{3200, 0},{3511, 2},{3607, 3},{3672, 5},{3687, 6},{3689, 8},{3690, 9},{3692, 11},{3701, 13},{3713, 14},{3721, 16},{3730, 17},{3737, 19},{3743, 20},{3748, 22},{3754, 23},{3761, 25},{3768, 27},{3774, 28},{3780, 30},{3785, 31},{3790, 33},{3795, 34},{3799, 36},{3804, 38},{3810, 39},{3815, 41},{3822, 42},{3828, 44},{3835, 45},{3843, 47},{3852, 48},{3860, 50},{3869, 52},{3880, 53},{3893, 55},{3910, 56},{3929, 58},{3946, 59},{3961, 61},{3973, 63},{3985, 64},{3998, 66},{4014, 67},{4030, 69},{4046, 70},{4062, 72},{4076, 73},{4092, 75},{4109, 77},{4126, 78},{4143, 80},{4161, 81},{4178, 83},{4196, 84},{4214, 86},{4233, 88},{4251, 89},{4269, 91},{4287, 92},{4306, 94},{4325, 95},{4344, 97},{4363, 98},{4390, 100}}; + +//real current to soc +one_latitude_data_t charge_data[CHARGE_DATA_NUM] = {{73, 9999},{74, 9998},{76, 9995},{78, 9993},{80, 9991},{82, 9988},{84, 9986},{86, 9983},{88, 9982},{90, 9979},{92, 9978},{94, 9974},{96, 9972},{98, 9970},{100, 9967},{105, 9961},{110, 9956},{115, 9949},{120, 9944},{125, 9937},{130, 9931},{135, 9926},{140, 9919},{145, 9913},{150, 9908},{155, 9901},{160, 9895},{165, 9890},{170, 9883},{175, 9877},{180, 9872},{185, 9865},{190, 9859},{195, 9853},{200, 9847},{210, 9834},{220, 9822},{230, 9811},{240, 9798},{250, 9786},{260, 9774},{270, 9763},{280, 9750},{290, 9738},{300, 9727},{310, 9715},{320, 9702},{330, 9691},{340, 9679},{350, 9668},{360, 9657},{370, 9645},{380, 9633},{390, 9623},{400, 9611},{425, 9583},{450, 9556},{475, 9529},{500, 9503},{525, 9477},{550, 9452},{575, 9427},{600, 9403},{650, 9356},{727, 9297}}; + +//RC table X Axis value, in mV format +int32_t XAxisElement[XAxis] = {3200, 3220, 3260, 3280, 3300, 3320, 3340, 3360, 3380, 3400, 3420, 3440, 3460, 3480, 3500, 3511, 3525, 3538, 3551, 3557, 3563, 3574, 3584, 3595, 3608, 3621, 3636, 3643, 3650, 3662, 3667, 3678, 3695, 3709, 3720, 3729, 3739, 3748, 3757, 3765, 3773, 3782, 3791, 3802, 3813, 3826, 3840, 3855, 3875, 3884, 3900, 3916, 3925, 3939, 3947, 3959, 3968, 3977, 3992, 4019, 4030, 4044, 4060, 4070, 4081, 4097, 4114, 4125, 4142, 4154, 4171, 4183, 4194, 4212, 4230, 4242, 4254, 4271, 4289, 4301, 4313, 4331, 4345, 4352, 4369, 4390}; + +//RC table Y Axis value, in mA format +int32_t YAxisElement[YAxis] = {200, 500, 800, 1000, 1200, 1500, 1800, 2000, 2500, 3000}; + +// RC table Z Axis value, in 10*'C format +int32_t ZAxisElement[ZAxis] = {-199, -99, 0, 100, 200, 300, 400, 500, 600}; + +// contents of RC table, its unit is 10000C, 1C = DesignCapacity +int32_t RCtable[YAxis*ZAxis][XAxis]={ + + +//temp = -20.0 ^C +{1599, 1756, 2111, 2306, 2524, 2745, 2986, 3235, 3508, 3782, 4073, 4368, 4683, 4988, 5320, 5539, 5725, 5942, 6159, 6270, 6368, 6584, 6772, 6969, 7218, 7481, 7787, 7937, 8096, 8470, 8681, 9096, 9474, 9615, 9683, 9726, 9765, 9793, 9816, 9836, 9853, 9867, 9881, 9895, 9908, 9922, 9935, 9946, 9960, 9965, 9972, 9979, 9982, 9986, 9988, 9990, 9992, 9994, 9996, 9998, 9998, 9999, 9999, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000}, +{3866, 4135, 4697, 4997, 5280, 5582, 5862, 6170, 6458, 6735, 7040, 7343, 7658, 8008, 8441, 8713, 9160, 9455, 9563, 9610, 9645, 9697, 9737, 9773, 9806, 9832, 9857, 9868, 9878, 9893, 9898, 9910, 9926, 9937, 9946, 9952, 9958, 9963, 9968, 9971, 9975, 9979, 9982, 9986, 9989, 9992, 9994, 9997, 9998, 9999, 9999, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000}, +{3866, 4135, 4697, 4997, 5280, 5582, 5862, 6170, 6458, 6735, 7040, 7343, 7658, 8008, 8441, 8713, 9160, 9455, 9563, 9610, 9645, 9697, 9737, 9773, 9806, 9832, 9857, 9868, 9878, 9893, 9898, 9910, 9926, 9937, 9946, 9952, 9958, 9963, 9968, 9971, 9975, 9979, 9982, 9986, 9989, 9992, 9994, 9997, 9998, 9999, 9999, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000}, +{8577, 8760, 9134, 9311, 9458, 9576, 9659, 9723, 9771, 9809, 9841, 9869, 9894, 9914, 9936, 9944, 9956, 9965, 9975, 9977, 9978, 9986, 9988, 9989, 9995, 9997, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000}, +{8577, 8760, 9134, 9311, 9458, 9576, 9659, 9723, 9771, 9809, 9841, 9869, 9894, 9914, 9936, 9944, 9956, 9965, 9975, 9977, 9978, 9986, 9988, 9989, 9995, 9997, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000}, +{8577, 8760, 9134, 9311, 9458, 9576, 9659, 9723, 9771, 9809, 9841, 9869, 9894, 9914, 9936, 9944, 9956, 9965, 9975, 9977, 9978, 9986, 9988, 9989, 9995, 9997, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000}, +{8577, 8760, 9134, 9311, 9458, 9576, 9659, 9723, 9771, 9809, 9841, 9869, 9894, 9914, 9936, 9944, 9956, 9965, 9975, 9977, 9978, 9986, 9988, 9989, 9995, 9997, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000}, +{9936, 9947, 9976, 9985, 9987, 9992, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000}, +{9936, 9947, 9976, 9985, 9987, 9992, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000}, +{9936, 9947, 9976, 9985, 9987, 9992, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000}, + +//temp = -10.0 ^C +{595, 609, 640, 657, 676, 695, 717, 740, 765, 794, 826, 862, 907, 959, 1026, 1069, 1136, 1205, 1288, 1335, 1382, 1478, 1559, 1656, 1768, 1892, 2052, 2131, 2216, 2372, 2447, 2629, 2977, 3362, 3710, 4021, 4320, 4546, 4746, 4908, 5066, 5232, 5384, 5560, 5724, 5902, 6084, 6269, 6507, 6611, 6796, 6972, 7059, 7179, 7242, 7330, 7399, 7465, 7576, 7818, 7933, 8066, 8208, 8297, 8393, 8529, 8673, 8766, 8910, 9009, 9150, 9247, 9333, 9470, 9602, 9683, 9758, 9852, 9932, 9968, 9990, 10000, 10000, 10000, 10000, 10000}, +{1574, 1690, 1951, 2101, 2259, 2435, 2621, 2825, 3038, 3269, 3525, 3776, 4045, 4344, 4643, 4815, 5032, 5226, 5431, 5540, 5623, 5796, 5944, 6115, 6308, 6539, 6711, 6812, 6899, 7069, 7130, 7270, 7476, 7638, 7763, 7869, 7979, 8074, 8177, 8257, 8340, 8433, 8520, 8630, 8732, 8853, 8980, 9100, 9266, 9330, 9448, 9545, 9599, 9678, 9715, 9765, 9800, 9829, 9870, 9928, 9946, 9962, 9977, 9985, 9991, 9997, 9999, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000}, +{2254, 2418, 2794, 3019, 3247, 3485, 3755, 4044, 4328, 4630, 4934, 5245, 5552, 5848, 6142, 6308, 6492, 6688, 6859, 6942, 7022, 7160, 7294, 7429, 7595, 7743, 7916, 8008, 8093, 8223, 8275, 8389, 8567, 8706, 8804, 8893, 8987, 9063, 9134, 9196, 9250, 9315, 9381, 9446, 9509, 9581, 9645, 9703, 9769, 9795, 9832, 9866, 9883, 9906, 9919, 9932, 9943, 9953, 9966, 9986, 9991, 9996, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000}, +{2767, 2964, 3411, 3665, 3926, 4219, 4510, 4802, 5097, 5402, 5704, 5990, 6248, 6527, 6786, 6935, 7102, 7258, 7414, 7486, 7562, 7691, 7804, 7924, 8067, 8213, 8378, 8445, 8505, 8609, 8656, 8771, 8958, 9074, 9157, 9226, 9295, 9357, 9407, 9454, 9502, 9547, 9588, 9637, 9679, 9726, 9770, 9812, 9855, 9874, 9899, 9922, 9935, 9950, 9957, 9967, 9976, 9981, 9988, 9998, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000}, +{3085, 3290, 3756, 4013, 4286, 4554, 4846, 5119, 5403, 5695, 5958, 6223, 6474, 6710, 6951, 7067, 7225, 7361, 7513, 7578, 7647, 7755, 7862, 7972, 8102, 8232, 8382, 8449, 8512, 8622, 8674, 8755, 8897, 9019, 9110, 9178, 9245, 9298, 9347, 9392, 9432, 9478, 9525, 9580, 9632, 9687, 9737, 9784, 9841, 9863, 9895, 9925, 9938, 9953, 9963, 9976, 9981, 9986, 9996, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000}, +{4092, 4327, 4839, 5128, 5402, 5676, 5959, 6229, 6493, 6768, 7024, 7319, 7573, 7817, 8126, 8269, 8449, 8621, 8790, 8862, 8922, 9041, 9137, 9238, 9353, 9447, 9541, 9577, 9612, 9666, 9685, 9724, 9774, 9805, 9831, 9850, 9864, 9881, 9895, 9906, 9914, 9926, 9935, 9946, 9959, 9967, 9976, 9985, 9995, 9997, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000}, +{4926, 5178, 5688, 5983, 6210, 6491, 6730, 6965, 7197, 7427, 7654, 7858, 8087, 8313, 8552, 8674, 8833, 8966, 9099, 9154, 9210, 9302, 9377, 9449, 9527, 9585, 9653, 9676, 9702, 9737, 9750, 9776, 9815, 9843, 9863, 9875, 9893, 9903, 9913, 9925, 9932, 9945, 9953, 9959, 9972, 9979, 9988, 9992, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000}, +{5489, 5739, 6227, 6469, 6706, 6937, 7160, 7386, 7607, 7824, 8043, 8251, 8456, 8653, 8864, 8974, 9097, 9205, 9307, 9348, 9392, 9461, 9519, 9573, 9632, 9676, 9725, 9747, 9765, 9792, 9806, 9827, 9855, 9882, 9896, 9908, 9921, 9928, 9942, 9946, 9957, 9967, 9971, 9976, 9987, 9993, 9995, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000}, +{8331, 8508, 8860, 9036, 9202, 9363, 9514, 9621, 9684, 9729, 9768, 9799, 9819, 9848, 9864, 9882, 9892, 9902, 9920, 9923, 9925, 9938, 9945, 9952, 9965, 9971, 9982, 9985, 9987, 9989, 9991, 9994, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000}, +{9172, 9288, 9489, 9567, 9625, 9670, 9705, 9737, 9764, 9794, 9816, 9841, 9856, 9873, 9899, 9906, 9922, 9928, 9943, 9948, 9952, 9962, 9972, 9974, 9985, 9988, 9992, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000}, + +//temp = 0.0 ^C +{595, 609, 640, 657, 676, 695, 717, 740, 765, 794, 826, 862, 907, 959, 1026, 1069, 1136, 1205, 1288, 1335, 1382, 1478, 1559, 1656, 1768, 1892, 2052, 2131, 2216, 2372, 2447, 2629, 2977, 3362, 3710, 4021, 4320, 4546, 4746, 4908, 5066, 5232, 5384, 5560, 5724, 5902, 6084, 6269, 6507, 6611, 6796, 6972, 7059, 7179, 7242, 7330, 7399, 7465, 7576, 7818, 7933, 8066, 8208, 8297, 8393, 8529, 8673, 8766, 8910, 9009, 9150, 9247, 9333, 9470, 9602, 9683, 9758, 9852, 9932, 9968, 9990, 10000, 10000, 10000, 10000, 10000}, +{1109, 1163, 1279, 1346, 1420, 1503, 1592, 1689, 1801, 1913, 2040, 2178, 2328, 2498, 2685, 2805, 2951, 3104, 3271, 3356, 3432, 3600, 3746, 3925, 4142, 4379, 4657, 4805, 4931, 5162, 5250, 5454, 5753, 5932, 6085, 6206, 6332, 6447, 6556, 6649, 6745, 6845, 6947, 7068, 7185, 7321, 7462, 7604, 7781, 7860, 7985, 8105, 8175, 8286, 8348, 8443, 8525, 8597, 8712, 8920, 9004, 9105, 9220, 9288, 9360, 9461, 9567, 9628, 9716, 9772, 9841, 9883, 9914, 9955, 9980, 9991, 9998, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000}, +{1431, 1527, 1757, 1891, 2063, 2207, 2362, 2544, 2737, 2937, 3160, 3390, 3634, 3911, 4190, 4350, 4570, 4766, 4972, 5070, 5159, 5339, 5501, 5667, 5854, 6049, 6274, 6369, 6454, 6619, 6682, 6819, 7024, 7182, 7294, 7394, 7506, 7595, 7683, 7763, 7834, 7903, 7980, 8097, 8206, 8312, 8424, 8539, 8686, 8751, 8869, 8987, 9047, 9146, 9197, 9271, 9324, 9377, 9462, 9598, 9649, 9709, 9768, 9802, 9836, 9877, 9915, 9936, 9958, 9972, 9986, 9994, 9999, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000}, +{1573, 1682, 1927, 2086, 2254, 2433, 2641, 2852, 3084, 3323, 3580, 3849, 4132, 4426, 4727, 4890, 5110, 5316, 5515, 5607, 5702, 5864, 6013, 6166, 6344, 6530, 6718, 6804, 6891, 7036, 7098, 7224, 7402, 7555, 7661, 7757, 7855, 7937, 8024, 8095, 8167, 8245, 8325, 8415, 8502, 8606, 8714, 8818, 8962, 9025, 9140, 9238, 9295, 9377, 9423, 9484, 9530, 9574, 9642, 9747, 9785, 9828, 9870, 9891, 9912, 9940, 9961, 9973, 9986, 9994, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000}, +{1805, 1928, 2228, 2399, 2592, 2800, 3030, 3264, 3530, 3800, 4078, 4370, 4661, 4965, 5276, 5441, 5651, 5844, 6028, 6118, 6197, 6350, 6481, 6627, 6791, 6947, 7123, 7205, 7281, 7409, 7465, 7583, 7751, 7890, 7996, 8079, 8173, 8253, 8331, 8397, 8459, 8534, 8606, 8692, 8771, 8868, 8969, 9068, 9203, 9259, 9356, 9441, 9486, 9559, 9594, 9647, 9681, 9716, 9769, 9847, 9873, 9899, 9927, 9942, 9954, 9974, 9985, 9993, 9998, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000}, +{2254, 2413, 2783, 2992, 3220, 3468, 3726, 3988, 4271, 4562, 4861, 5165, 5461, 5754, 6043, 6188, 6382, 6552, 6711, 6787, 6861, 7001, 7118, 7246, 7387, 7530, 7688, 7763, 7835, 7962, 8007, 8111, 8268, 8394, 8487, 8563, 8642, 8717, 8784, 8846, 8906, 8966, 9034, 9103, 9174, 9253, 9338, 9417, 9518, 9556, 9624, 9689, 9720, 9769, 9791, 9823, 9843, 9864, 9890, 9935, 9948, 9960, 9978, 9984, 9990, 9998, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000}, +{2760, 2951, 3358, 3587, 3835, 4097, 4388, 4666, 4953, 5253, 5544, 5829, 6109, 6369, 6638, 6786, 6978, 7128, 7257, 7315, 7378, 7491, 7600, 7719, 7849, 7977, 8123, 8192, 8247, 8364, 8408, 8505, 8646, 8761, 8840, 8910, 8981, 9040, 9104, 9156, 9203, 9262, 9317, 9377, 9430, 9497, 9563, 9622, 9699, 9724, 9774, 9820, 9837, 9868, 9880, 9904, 9918, 9927, 9947, 9974, 9982, 9990, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000}, +{3087, 3276, 3707, 3953, 4207, 4474, 4758, 5036, 5338, 5616, 5899, 6164, 6425, 6676, 6908, 7037, 7190, 7336, 7483, 7547, 7607, 7715, 7819, 7925, 8053, 8172, 8314, 8370, 8435, 8538, 8582, 8664, 8797, 8906, 8979, 9049, 9110, 9168, 9227, 9271, 9321, 9368, 9418, 9471, 9528, 9580, 9644, 9697, 9760, 9784, 9823, 9861, 9875, 9899, 9912, 9932, 9943, 9952, 9966, 9988, 9994, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000}, +{4088, 4307, 4809, 5076, 5338, 5611, 5885, 6145, 6403, 6647, 6895, 7117, 7342, 7570, 7788, 7897, 8036, 8167, 8286, 8349, 8402, 8500, 8587, 8681, 8788, 8887, 8991, 9043, 9086, 9164, 9200, 9257, 9358, 9429, 9481, 9523, 9571, 9603, 9637, 9670, 9690, 9722, 9743, 9775, 9803, 9827, 9854, 9881, 9912, 9923, 9941, 9956, 9969, 9981, 9983, 9990, 9993, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000}, +{5060, 5300, 5799, 6049, 6298, 6540, 6777, 7017, 7238, 7464, 7673, 7875, 8082, 8278, 8452, 8554, 8679, 8776, 8876, 8923, 8970, 9042, 9110, 9176, 9261, 9331, 9415, 9445, 9484, 9540, 9557, 9596, 9655, 9696, 9730, 9752, 9774, 9791, 9810, 9831, 9844, 9856, 9877, 9889, 9909, 9920, 9940, 9951, 9970, 9980, 9988, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000}, + +//temp = 10.0 ^C +{255, 263, 284, 295, 307, 320, 334, 349, 366, 384, 403, 424, 446, 471, 499, 514, 535, 557, 579, 591, 602, 625, 650, 681, 732, 811, 978, 1121, 1288, 1460, 1522, 1659, 1909, 2162, 2425, 2687, 3063, 3423, 3713, 3937, 4146, 4361, 4566, 4789, 4998, 5218, 5437, 5638, 5871, 5965, 6143, 6323, 6424, 6583, 6674, 6795, 6874, 6943, 7052, 7271, 7376, 7525, 7680, 7769, 7868, 8010, 8159, 8257, 8404, 8508, 8654, 8760, 8852, 9003, 9156, 9257, 9357, 9496, 9637, 9728, 9815, 9925, 9982, 9996, 10000, 10000}, +{451, 466, 498, 518, 536, 558, 582, 607, 634, 667, 704, 749, 803, 870, 955, 1012, 1098, 1199, 1311, 1368, 1421, 1527, 1620, 1732, 1876, 2035, 2250, 2368, 2492, 2753, 2878, 3178, 3688, 4087, 4348, 4543, 4741, 4906, 5066, 5200, 5326, 5461, 5593, 5742, 5886, 6047, 6219, 6403, 6641, 6739, 6899, 7036, 7107, 7214, 7273, 7365, 7440, 7521, 7660, 7911, 8008, 8126, 8262, 8347, 8440, 8576, 8718, 8812, 8950, 9051, 9187, 9286, 9372, 9509, 9640, 9722, 9800, 9891, 9960, 9985, 9997, 10000, 10000, 10000, 10000, 10000}, +{653, 678, 739, 773, 812, 858, 910, 970, 1040, 1123, 1226, 1334, 1471, 1617, 1784, 1886, 2013, 2152, 2310, 2379, 2459, 2619, 2770, 2963, 3207, 3476, 3816, 3979, 4145, 4421, 4529, 4749, 5057, 5288, 5457, 5591, 5729, 5850, 5966, 6071, 6170, 6283, 6395, 6531, 6659, 6808, 6960, 7103, 7279, 7352, 7476, 7603, 7677, 7799, 7872, 7977, 8061, 8138, 8262, 8485, 8575, 8690, 8816, 8896, 8985, 9112, 9239, 9321, 9448, 9532, 9646, 9720, 9780, 9869, 9935, 9963, 9980, 9996, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000}, +{819, 857, 948, 1003, 1059, 1131, 1210, 1306, 1411, 1529, 1670, 1817, 1989, 2180, 2393, 2524, 2702, 2883, 3081, 3175, 3272, 3467, 3653, 3873, 4128, 4402, 4701, 4837, 4961, 5169, 5253, 5426, 5673, 5869, 6013, 6131, 6254, 6366, 6472, 6569, 6666, 6767, 6872, 6991, 7103, 7229, 7354, 7478, 7639, 7708, 7841, 7978, 8058, 8183, 8250, 8345, 8419, 8490, 8611, 8824, 8911, 9020, 9140, 9213, 9290, 9408, 9524, 9590, 9696, 9763, 9845, 9892, 9924, 9962, 9984, 9995, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000}, +{992, 1048, 1177, 1251, 1337, 1437, 1548, 1676, 1822, 1980, 2161, 2352, 2564, 2800, 3067, 3224, 3431, 3644, 3859, 3968, 4073, 4273, 4460, 4668, 4903, 5128, 5374, 5485, 5587, 5758, 5832, 5979, 6205, 6378, 6506, 6616, 6734, 6832, 6930, 7018, 7103, 7194, 7282, 7387, 7485, 7595, 7709, 7831, 7993, 8067, 8200, 8338, 8414, 8526, 8589, 8679, 8750, 8820, 8933, 9131, 9212, 9309, 9419, 9480, 9554, 9648, 9741, 9794, 9863, 9901, 9941, 9960, 9975, 9992, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000}, +{1247, 1333, 1529, 1645, 1773, 1921, 2085, 2267, 2469, 2685, 2917, 3161, 3433, 3717, 4022, 4205, 4434, 4650, 4872, 4974, 5078, 5258, 5421, 5589, 5785, 5967, 6172, 6267, 6354, 6501, 6562, 6686, 6885, 7038, 7152, 7250, 7346, 7441, 7523, 7596, 7664, 7742, 7822, 7916, 8004, 8104, 8219, 8338, 8500, 8570, 8697, 8817, 8882, 8988, 9043, 9127, 9188, 9250, 9347, 9513, 9576, 9655, 9731, 9777, 9823, 9872, 9916, 9936, 9961, 9975, 9992, 9998, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000}, +{1497, 1609, 1871, 2022, 2192, 2385, 2583, 2812, 3057, 3316, 3592, 3870, 4171, 4481, 4796, 4971, 5188, 5395, 5597, 5691, 5774, 5943, 6076, 6222, 6396, 6559, 6739, 6825, 6902, 7043, 7098, 7215, 7388, 7528, 7634, 7724, 7806, 7889, 7964, 8034, 8099, 8169, 8243, 8334, 8419, 8521, 8626, 8742, 8889, 8950, 9067, 9173, 9232, 9324, 9376, 9442, 9495, 9547, 9626, 9752, 9792, 9842, 9886, 9908, 9925, 9951, 9969, 9981, 9996, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000}, +{1649, 1775, 2067, 2232, 2420, 2631, 2856, 3088, 3352, 3645, 3926, 4210, 4514, 4836, 5142, 5323, 5537, 5734, 5916, 6002, 6077, 6225, 6364, 6499, 6663, 6819, 6983, 7061, 7136, 7264, 7318, 7435, 7600, 7739, 7835, 7915, 7999, 8074, 8149, 8216, 8284, 8356, 8431, 8514, 8601, 8693, 8801, 8910, 9053, 9113, 9218, 9321, 9380, 9461, 9511, 9578, 9624, 9664, 9727, 9833, 9862, 9896, 9926, 9941, 9957, 9976, 9985, 9996, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000}, +{2271, 2448, 2837, 3058, 3294, 3543, 3809, 4094, 4399, 4687, 5000, 5296, 5595, 5886, 6160, 6312, 6497, 6660, 6816, 6890, 6957, 7083, 7195, 7316, 7463, 7591, 7737, 7800, 7863, 7979, 8025, 8124, 8261, 8387, 8473, 8546, 8619, 8694, 8756, 8818, 8873, 8943, 9003, 9085, 9150, 9234, 9328, 9412, 9526, 9578, 9654, 9723, 9757, 9796, 9826, 9850, 9875, 9887, 9914, 9954, 9965, 9981, 9992, 9994, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000}, +{2933, 3136, 3591, 3842, 4099, 4389, 4676, 4957, 5259, 5549, 5831, 6098, 6372, 6629, 6871, 7004, 7157, 7308, 7441, 7507, 7577, 7686, 7781, 7891, 8012, 8127, 8257, 8323, 8375, 8475, 8518, 8603, 8735, 8848, 8921, 8988, 9055, 9121, 9179, 9226, 9278, 9333, 9389, 9453, 9511, 9574, 9643, 9708, 9776, 9804, 9837, 9877, 9888, 9911, 9926, 9938, 9955, 9963, 9976, 9993, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000}, + +//temp = 20.0 ^C +{101, 108, 125, 134, 144, 156, 167, 182, 197, 212, 230, 249, 269, 292, 316, 331, 351, 370, 390, 401, 411, 431, 449, 471, 498, 529, 579, 616, 676, 946, 1172, 1351, 1598, 1827, 2066, 2309, 2578, 2888, 3195, 3447, 3686, 3931, 4159, 4409, 4644, 4892, 5137, 5361, 5611, 5706, 5866, 6025, 6124, 6293, 6382, 6509, 6605, 6692, 6829, 7064, 7163, 7308, 7469, 7561, 7662, 7806, 7957, 8057, 8205, 8309, 8457, 8562, 8653, 8805, 8958, 9059, 9161, 9303, 9455, 9553, 9652, 9800, 9900, 9942, 10000, 10000}, +{212, 221, 244, 256, 269, 284, 300, 317, 335, 355, 377, 401, 425, 454, 486, 505, 529, 557, 588, 606, 625, 668, 718, 795, 940, 1196, 1437, 1528, 1621, 1803, 1890, 2094, 2542, 3032, 3387, 3649, 3905, 4116, 4317, 4480, 4642, 4810, 4968, 5153, 5325, 5512, 5698, 5877, 6101, 6212, 6394, 6563, 6651, 6781, 6852, 6950, 7025, 7097, 7224, 7490, 7589, 7712, 7853, 7940, 8033, 8173, 8316, 8411, 8553, 8657, 8800, 8900, 8990, 9142, 9292, 9390, 9490, 9626, 9767, 9851, 9925, 9988, 10000, 10000, 10000, 10000}, +{295, 309, 338, 353, 370, 390, 409, 433, 457, 483, 512, 546, 586, 638, 702, 745, 808, 886, 988, 1049, 1115, 1259, 1388, 1530, 1705, 1898, 2164, 2316, 2486, 2843, 3016, 3367, 3823, 4146, 4371, 4552, 4740, 4891, 5046, 5173, 5295, 5425, 5557, 5701, 5845, 6005, 6178, 6357, 6584, 6675, 6826, 6965, 7038, 7152, 7220, 7320, 7407, 7493, 7626, 7864, 7958, 8077, 8211, 8296, 8386, 8522, 8664, 8755, 8896, 8997, 9134, 9235, 9323, 9468, 9608, 9700, 9785, 9891, 9966, 9987, 10000, 10000, 10000, 10000, 10000, 10000}, +{357, 374, 406, 426, 448, 470, 496, 525, 559, 597, 643, 696, 758, 840, 943, 1021, 1136, 1268, 1414, 1489, 1559, 1699, 1837, 2006, 2239, 2522, 2924, 3137, 3340, 3677, 3806, 4058, 4409, 4665, 4852, 5009, 5167, 5300, 5436, 5551, 5659, 5775, 5894, 6029, 6167, 6327, 6498, 6661, 6860, 6941, 7073, 7203, 7276, 7404, 7478, 7586, 7671, 7750, 7874, 8102, 8193, 8314, 8447, 8527, 8622, 8752, 8890, 8981, 9117, 9218, 9354, 9448, 9531, 9670, 9792, 9866, 9922, 9973, 9995, 10000, 10000, 10000, 10000, 10000, 10000, 10000}, +{425, 443, 484, 510, 534, 568, 602, 642, 692, 749, 814, 889, 989, 1115, 1277, 1391, 1536, 1690, 1856, 1948, 2030, 2219, 2402, 2636, 2958, 3304, 3705, 3874, 4037, 4285, 4390, 4593, 4887, 5111, 5275, 5413, 5548, 5672, 5790, 5892, 5996, 6107, 6221, 6356, 6493, 6636, 6790, 6929, 7105, 7175, 7308, 7450, 7532, 7660, 7733, 7832, 7915, 7989, 8114, 8337, 8432, 8542, 8673, 8755, 8846, 8976, 9112, 9202, 9335, 9427, 9556, 9643, 9719, 9835, 9922, 9956, 9981, 9996, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000}, +{538, 566, 629, 668, 711, 761, 814, 884, 961, 1051, 1163, 1298, 1463, 1667, 1901, 2047, 2256, 2475, 2717, 2843, 2967, 3214, 3454, 3714, 4008, 4278, 4565, 4694, 4806, 4997, 5085, 5251, 5492, 5684, 5825, 5946, 6067, 6181, 6293, 6391, 6483, 6596, 6697, 6811, 6921, 7044, 7166, 7287, 7460, 7540, 7683, 7827, 7902, 8023, 8089, 8186, 8262, 8334, 8460, 8678, 8762, 8875, 9006, 9080, 9168, 9290, 9420, 9499, 9622, 9705, 9806, 9871, 9913, 9958, 9987, 9995, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000}, +{453, 478, 535, 571, 608, 655, 711, 769, 847, 938, 1050, 1181, 1364, 1616, 1950, 2166, 2463, 2763, 3071, 3226, 3365, 3623, 3838, 4064, 4310, 4535, 4788, 4894, 5000, 5179, 5255, 5403, 5632, 5818, 5956, 6072, 6193, 6303, 6411, 6501, 6588, 6686, 6782, 6880, 6981, 7092, 7211, 7349, 7531, 7613, 7755, 7898, 7971, 8092, 8158, 8255, 8330, 8402, 8529, 8752, 8839, 8955, 9082, 9160, 9252, 9385, 9526, 9609, 9735, 9817, 9903, 9940, 9965, 9990, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000}, +{578, 610, 685, 736, 785, 846, 919, 1005, 1104, 1230, 1389, 1589, 1859, 2197, 2604, 2848, 3159, 3456, 3744, 3873, 4001, 4206, 4389, 4580, 4792, 4996, 5218, 5315, 5410, 5579, 5647, 5784, 5999, 6172, 6305, 6419, 6531, 6631, 6727, 6811, 6887, 6968, 7052, 7148, 7237, 7354, 7483, 7615, 7792, 7867, 7999, 8137, 8209, 8326, 8388, 8484, 8558, 8631, 8753, 8966, 9051, 9160, 9280, 9360, 9445, 9567, 9686, 9764, 9861, 9909, 9955, 9972, 9989, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000}, +{857, 915, 1051, 1132, 1230, 1348, 1489, 1669, 1879, 2137, 2461, 2825, 3224, 3644, 4025, 4224, 4474, 4682, 4892, 4985, 5065, 5230, 5369, 5513, 5684, 5851, 6039, 6125, 6205, 6350, 6406, 6539, 6721, 6872, 6972, 7056, 7148, 7227, 7301, 7375, 7443, 7528, 7602, 7702, 7796, 7905, 8028, 8152, 8318, 8388, 8517, 8648, 8715, 8827, 8892, 8982, 9051, 9119, 9226, 9428, 9509, 9607, 9718, 9776, 9834, 9895, 9936, 9961, 9985, 9996, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000}, +{1262, 1361, 1608, 1758, 1932, 2149, 2400, 2685, 3013, 3375, 3739, 4090, 4438, 4759, 5062, 5217, 5408, 5581, 5750, 5827, 5893, 6031, 6155, 6284, 6434, 6572, 6738, 6810, 6885, 6996, 7047, 7147, 7296, 7420, 7522, 7599, 7685, 7769, 7840, 7906, 7975, 8051, 8132, 8217, 8314, 8418, 8534, 8644, 8799, 8875, 8991, 9110, 9172, 9279, 9340, 9417, 9490, 9547, 9645, 9803, 9847, 9893, 9928, 9947, 9967, 9987, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000}, + +//temp = 30.0 ^C +{1, 8, 23, 32, 43, 53, 66, 79, 94, 110, 127, 146, 167, 190, 215, 230, 250, 269, 290, 300, 310, 330, 349, 371, 399, 428, 472, 502, 547, 765, 992, 1251, 1505, 1749, 2011, 2263, 2510, 2748, 3003, 3255, 3501, 3757, 4000, 4261, 4502, 4758, 5014, 5249, 5507, 5598, 5750, 5907, 6000, 6156, 6256, 6403, 6506, 6600, 6747, 6997, 7100, 7252, 7406, 7501, 7600, 7749, 7900, 7999, 8147, 8253, 8400, 8504, 8598, 8750, 8902, 9004, 9105, 9249, 9400, 9499, 9599, 9749, 9856, 9904, 9991, 10000}, +{64, 72, 91, 103, 113, 126, 141, 157, 174, 192, 212, 233, 257, 284, 313, 331, 353, 376, 402, 415, 427, 453, 483, 526, 604, 737, 1087, 1243, 1353, 1530, 1614, 1813, 2211, 2629, 2971, 3256, 3537, 3768, 3983, 4157, 4329, 4510, 4688, 4885, 5073, 5275, 5474, 5666, 5892, 5991, 6164, 6350, 6447, 6593, 6671, 6781, 6864, 6944, 7073, 7338, 7442, 7569, 7709, 7797, 7895, 8034, 8179, 8274, 8420, 8520, 8662, 8762, 8854, 9006, 9157, 9257, 9359, 9501, 9652, 9747, 9839, 9950, 9993, 10000, 10000, 10000}, +{106, 117, 140, 152, 166, 182, 199, 217, 238, 260, 283, 310, 337, 370, 408, 433, 467, 510, 560, 594, 626, 705, 798, 958, 1203, 1420, 1674, 1798, 1934, 2226, 2368, 2704, 3241, 3621, 3887, 4083, 4283, 4460, 4623, 4765, 4905, 5055, 5198, 5361, 5518, 5688, 5869, 6045, 6280, 6383, 6556, 6712, 6795, 6918, 6987, 7087, 7176, 7260, 7398, 7640, 7736, 7856, 7992, 8078, 8169, 8304, 8446, 8539, 8681, 8781, 8920, 9018, 9110, 9262, 9410, 9508, 9608, 9744, 9874, 9939, 9981, 10000, 10000, 10000, 10000, 10000}, +{133, 145, 171, 186, 201, 219, 240, 259, 282, 308, 335, 365, 401, 445, 504, 541, 599, 672, 761, 817, 877, 1016, 1180, 1365, 1586, 1817, 2141, 2322, 2518, 2909, 3068, 3380, 3802, 4107, 4323, 4498, 4674, 4824, 4973, 5100, 5223, 5357, 5485, 5633, 5779, 5938, 6112, 6294, 6524, 6615, 6771, 6911, 6986, 7115, 7185, 7294, 7382, 7460, 7592, 7822, 7917, 8035, 8169, 8250, 8345, 8476, 8617, 8707, 8847, 8947, 9086, 9185, 9278, 9424, 9572, 9669, 9765, 9878, 9963, 9988, 10000, 10000, 10000, 10000, 10000, 10000}, +{165, 180, 209, 225, 243, 263, 285, 312, 336, 368, 402, 444, 495, 561, 644, 705, 798, 904, 1055, 1140, 1226, 1396, 1565, 1766, 2029, 2337, 2783, 3002, 3210, 3530, 3661, 3906, 4251, 4511, 4704, 4860, 5014, 5153, 5289, 5399, 5513, 5633, 5753, 5893, 6030, 6186, 6357, 6528, 6737, 6816, 6961, 7099, 7181, 7313, 7385, 7491, 7573, 7651, 7775, 8006, 8099, 8216, 8344, 8429, 8517, 8649, 8788, 8877, 9017, 9114, 9253, 9352, 9440, 9589, 9729, 9816, 9891, 9959, 9993, 10000, 10000, 10000, 10000, 10000, 10000, 10000}, +{219, 234, 270, 294, 316, 341, 370, 405, 443, 492, 546, 611, 699, 805, 952, 1057, 1221, 1399, 1613, 1719, 1835, 2063, 2287, 2578, 2949, 3309, 3688, 3853, 3997, 4232, 4331, 4525, 4807, 5034, 5192, 5328, 5466, 5586, 5704, 5809, 5913, 6021, 6134, 6269, 6397, 6548, 6698, 6839, 7018, 7100, 7247, 7395, 7475, 7599, 7670, 7775, 7851, 7923, 8044, 8268, 8361, 8474, 8603, 8685, 8771, 8902, 9041, 9130, 9267, 9361, 9501, 9594, 9681, 9807, 9911, 9954, 9977, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000}, +{282, 304, 353, 380, 414, 448, 493, 542, 600, 667, 748, 851, 984, 1158, 1401, 1566, 1803, 2062, 2350, 2493, 2642, 2931, 3199, 3490, 3788, 4054, 4347, 4474, 4589, 4786, 4870, 5032, 5280, 5482, 5623, 5740, 5869, 5981, 6086, 6188, 6284, 6394, 6499, 6618, 6729, 6856, 6981, 7121, 7301, 7382, 7530, 7669, 7749, 7870, 7939, 8032, 8111, 8184, 8305, 8524, 8615, 8728, 8852, 8931, 9022, 9147, 9281, 9369, 9507, 9600, 9724, 9807, 9869, 9943, 9982, 9996, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000}, +{339, 363, 419, 458, 496, 541, 597, 657, 731, 818, 925, 1056, 1237, 1481, 1801, 2004, 2300, 2602, 2931, 3089, 3237, 3500, 3727, 3962, 4217, 4453, 4710, 4822, 4930, 5106, 5184, 5338, 5564, 5751, 5888, 5996, 6117, 6226, 6334, 6426, 6519, 6614, 6714, 6818, 6929, 7041, 7172, 7304, 7490, 7568, 7707, 7848, 7928, 8044, 8110, 8205, 8279, 8351, 8472, 8688, 8776, 8889, 9014, 9091, 9183, 9309, 9442, 9528, 9654, 9738, 9844, 9907, 9943, 9980, 9998, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000}, +{534, 574, 668, 724, 793, 869, 965, 1070, 1202, 1369, 1597, 1882, 2239, 2660, 3116, 3361, 3668, 3942, 4188, 4303, 4403, 4586, 4750, 4920, 5108, 5294, 5501, 5592, 5677, 5830, 5896, 6026, 6227, 6392, 6511, 6611, 6723, 6803, 6896, 6972, 7043, 7122, 7213, 7309, 7408, 7520, 7646, 7779, 7949, 8025, 8158, 8292, 8364, 8478, 8543, 8632, 8711, 8777, 8890, 9102, 9192, 9291, 9419, 9489, 9573, 9688, 9799, 9853, 9924, 9955, 9980, 9990, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000}, +{1374, 1489, 1778, 1949, 2150, 2372, 2625, 2887, 3189, 3511, 3858, 4209, 4559, 4915, 5241, 5401, 5589, 5732, 5864, 5919, 5973, 6079, 6203, 6334, 6494, 6642, 6819, 6901, 6970, 7105, 7149, 7269, 7430, 7569, 7674, 7762, 7851, 7927, 8016, 8082, 8156, 8231, 8316, 8405, 8501, 8612, 8725, 8848, 9014, 9081, 9202, 9333, 9393, 9506, 9557, 9641, 9700, 9748, 9824, 9906, 9928, 9952, 9969, 9979, 9987, 9996, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000}, + +//temp = 40.0 ^C +{48, 55, 71, 81, 91, 102, 114, 128, 143, 159, 176, 196, 216, 240, 265, 280, 300, 319, 341, 351, 361, 381, 400, 422, 450, 480, 524, 554, 603, 883, 1161, 1327, 1602, 1855, 2146, 2368, 2587, 2762, 2949, 3177, 3423, 3685, 3926, 4191, 4436, 4703, 4957, 5201, 5458, 5546, 5688, 5833, 5927, 6082, 6173, 6316, 6428, 6532, 6683, 6940, 7050, 7198, 7352, 7446, 7547, 7694, 7848, 7946, 8097, 8200, 8349, 8452, 8545, 8700, 8854, 8954, 9054, 9199, 9354, 9454, 9557, 9712, 9825, 9878, 9984, 10000}, +{95, 103, 120, 131, 142, 157, 170, 185, 202, 219, 240, 261, 284, 310, 339, 356, 379, 400, 425, 437, 449, 474, 497, 533, 594, 708, 1042, 1250, 1366, 1550, 1632, 1833, 2228, 2571, 2846, 3091, 3363, 3602, 3828, 4015, 4194, 4380, 4565, 4771, 4965, 5174, 5380, 5567, 5782, 5874, 6037, 6209, 6312, 6474, 6557, 6677, 6762, 6846, 6982, 7248, 7352, 7481, 7625, 7712, 7810, 7950, 8097, 8192, 8339, 8442, 8585, 8685, 8777, 8930, 9081, 9183, 9286, 9429, 9586, 9688, 9788, 9921, 9986, 9998, 10000, 10000}, +{123, 133, 153, 167, 178, 195, 211, 227, 247, 268, 291, 315, 341, 372, 406, 427, 454, 486, 526, 549, 575, 637, 715, 835, 1089, 1358, 1615, 1736, 1870, 2127, 2246, 2534, 2999, 3401, 3667, 3880, 4098, 4279, 4449, 4599, 4744, 4902, 5048, 5220, 5382, 5557, 5735, 5906, 6125, 6221, 6397, 6568, 6655, 6791, 6864, 6968, 7054, 7138, 7283, 7525, 7624, 7743, 7885, 7968, 8060, 8200, 8344, 8436, 8579, 8679, 8818, 8919, 9012, 9162, 9311, 9417, 9520, 9665, 9814, 9898, 9961, 9999, 10000, 10000, 10000, 10000}, +{147, 155, 180, 194, 209, 223, 242, 259, 281, 303, 330, 357, 387, 422, 464, 493, 537, 593, 668, 710, 759, 876, 1026, 1237, 1470, 1702, 1996, 2150, 2316, 2637, 2786, 3093, 3549, 3878, 4106, 4288, 4480, 4637, 4788, 4922, 5055, 5192, 5332, 5480, 5629, 5793, 5964, 6134, 6357, 6454, 6618, 6768, 6853, 6983, 7056, 7167, 7252, 7336, 7466, 7702, 7795, 7918, 8053, 8137, 8232, 8360, 8502, 8596, 8733, 8834, 8974, 9076, 9165, 9318, 9470, 9569, 9674, 9811, 9933, 9975, 9998, 10000, 10000, 10000, 10000, 10000}, +{170, 179, 208, 222, 238, 257, 277, 296, 320, 348, 374, 407, 445, 494, 561, 608, 680, 769, 891, 965, 1040, 1222, 1397, 1597, 1853, 2106, 2486, 2681, 2876, 3216, 3354, 3627, 4000, 4288, 4479, 4645, 4810, 4953, 5092, 5214, 5333, 5462, 5589, 5726, 5867, 6023, 6189, 6359, 6578, 6666, 6814, 6959, 7042, 7172, 7249, 7352, 7438, 7515, 7645, 7874, 7965, 8081, 8215, 8299, 8393, 8523, 8661, 8755, 8893, 8992, 9134, 9232, 9320, 9473, 9626, 9726, 9819, 9926, 9987, 10000, 10000, 10000, 10000, 10000, 10000, 10000}, +{200, 213, 242, 261, 278, 302, 324, 352, 378, 412, 457, 506, 573, 655, 775, 860, 993, 1152, 1345, 1448, 1554, 1768, 1967, 2210, 2535, 2899, 3313, 3493, 3655, 3919, 4028, 4241, 4545, 4780, 4955, 5092, 5237, 5367, 5489, 5598, 5706, 5822, 5931, 6065, 6195, 6345, 6508, 6664, 6855, 6936, 7088, 7234, 7315, 7438, 7509, 7611, 7686, 7763, 7885, 8114, 8204, 8321, 8450, 8535, 8620, 8750, 8887, 8978, 9114, 9213, 9355, 9454, 9544, 9696, 9835, 9906, 9960, 9994, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000}, +{303, 322, 366, 391, 418, 451, 485, 529, 582, 646, 722, 817, 944, 1114, 1338, 1496, 1705, 1943, 2199, 2324, 2461, 2740, 2997, 3287, 3599, 3876, 4169, 4304, 4414, 4614, 4700, 4865, 5126, 5323, 5472, 5597, 5719, 5831, 5930, 6026, 6119, 6220, 6326, 6439, 6554, 6683, 6821, 6957, 7136, 7222, 7357, 7495, 7567, 7690, 7755, 7851, 7926, 8001, 8121, 8336, 8425, 8532, 8661, 8737, 8831, 8956, 9092, 9183, 9322, 9424, 9566, 9665, 9752, 9881, 9955, 9983, 9999, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000}, +{368, 393, 440, 470, 508, 546, 591, 651, 713, 796, 901, 1027, 1200, 1408, 1688, 1877, 2140, 2421, 2721, 2876, 3030, 3306, 3546, 3796, 4054, 4289, 4555, 4668, 4773, 4958, 5035, 5187, 5429, 5611, 5746, 5867, 5980, 6094, 6196, 6288, 6378, 6477, 6576, 6688, 6801, 6929, 7055, 7196, 7373, 7457, 7589, 7729, 7809, 7928, 7990, 8087, 8164, 8236, 8356, 8580, 8669, 8773, 8904, 8982, 9072, 9202, 9338, 9429, 9568, 9670, 9796, 9872, 9923, 9971, 9993, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000}, +{517, 551, 635, 681, 744, 811, 889, 994, 1116, 1268, 1458, 1697, 2009, 2396, 2837, 3098, 3421, 3709, 3977, 4092, 4205, 4403, 4566, 4740, 4938, 5127, 5332, 5433, 5527, 5679, 5745, 5875, 6075, 6240, 6366, 6465, 6574, 6664, 6755, 6834, 6911, 6997, 7086, 7188, 7290, 7410, 7536, 7663, 7833, 7906, 8044, 8172, 8249, 8358, 8423, 8517, 8585, 8657, 8775, 8987, 9075, 9184, 9315, 9388, 9481, 9606, 9735, 9812, 9903, 9938, 9972, 9989, 9995, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000}, +{709, 761, 894, 974, 1077, 1188, 1331, 1503, 1722, 1999, 2352, 2751, 3182, 3610, 4007, 4214, 4454, 4666, 4873, 4958, 5043, 5210, 5339, 5493, 5653, 5817, 5995, 6082, 6160, 6290, 6358, 6470, 6646, 6790, 6899, 6985, 7074, 7163, 7244, 7315, 7390, 7465, 7549, 7638, 7734, 7843, 7963, 8092, 8248, 8322, 8449, 8576, 8644, 8762, 8819, 8916, 8983, 9057, 9170, 9385, 9465, 9575, 9693, 9761, 9831, 9904, 9948, 9965, 9990, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000}, + +//temp = 50.0 ^C +{75, 82, 99, 109, 120, 131, 144, 158, 174, 191, 209, 229, 250, 274, 300, 315, 336, 356, 377, 389, 399, 421, 440, 463, 492, 524, 573, 614, 692, 1166, 1283, 1426, 1708, 2004, 2282, 2471, 2683, 2810, 2958, 3162, 3408, 3661, 3900, 4159, 4404, 4664, 4921, 5163, 5435, 5526, 5657, 5794, 5887, 6042, 6131, 6267, 6370, 6474, 6641, 6910, 7025, 7162, 7316, 7411, 7513, 7664, 7815, 7915, 8066, 8174, 8319, 8423, 8517, 8671, 8824, 8927, 9030, 9176, 9330, 9433, 9537, 9695, 9813, 9867, 9979, 10000}, +{120, 129, 146, 158, 170, 183, 198, 213, 231, 248, 269, 291, 315, 342, 369, 387, 410, 432, 458, 470, 481, 506, 531, 566, 633, 764, 1161, 1329, 1437, 1626, 1713, 1924, 2323, 2623, 2844, 3041, 3295, 3528, 3754, 3949, 4126, 4314, 4505, 4703, 4900, 5115, 5328, 5517, 5721, 5807, 5969, 6140, 6234, 6388, 6479, 6603, 6696, 6785, 6932, 7196, 7299, 7429, 7575, 7662, 7764, 7906, 8053, 8150, 8296, 8399, 8542, 8646, 8736, 8890, 9042, 9144, 9247, 9396, 9553, 9656, 9762, 9901, 9980, 9996, 10000, 10000}, +{146, 156, 178, 190, 203, 218, 235, 252, 271, 292, 315, 339, 367, 398, 430, 451, 479, 507, 545, 568, 591, 654, 735, 865, 1127, 1403, 1660, 1786, 1919, 2176, 2293, 2543, 2935, 3286, 3556, 3770, 3987, 4179, 4360, 4509, 4656, 4814, 4968, 5139, 5305, 5481, 5656, 5817, 6032, 6131, 6294, 6466, 6560, 6703, 6780, 6894, 6983, 7067, 7206, 7456, 7556, 7678, 7816, 7905, 8000, 8138, 8282, 8373, 8518, 8619, 8761, 8861, 8956, 9108, 9259, 9364, 9470, 9617, 9774, 9866, 9945, 9997, 10000, 10000, 10000, 10000}, +{166, 177, 199, 213, 229, 243, 262, 282, 301, 324, 350, 377, 408, 440, 479, 506, 547, 598, 666, 711, 760, 874, 1023, 1243, 1498, 1731, 2018, 2167, 2320, 2600, 2724, 2991, 3415, 3752, 3983, 4168, 4358, 4528, 4687, 4822, 4951, 5092, 5232, 5390, 5543, 5700, 5865, 6028, 6243, 6342, 6507, 6666, 6754, 6892, 6964, 7078, 7166, 7247, 7382, 7620, 7719, 7840, 7977, 8062, 8154, 8287, 8428, 8523, 8664, 8766, 8907, 9007, 9099, 9251, 9407, 9510, 9618, 9762, 9902, 9961, 9992, 10000, 10000, 10000, 10000, 10000}, +{186, 196, 222, 236, 253, 268, 289, 308, 333, 358, 385, 416, 450, 494, 550, 595, 663, 749, 871, 940, 1025, 1203, 1385, 1594, 1842, 2092, 2426, 2594, 2764, 3074, 3204, 3470, 3850, 4144, 4347, 4510, 4680, 4832, 4975, 5099, 5219, 5353, 5474, 5620, 5758, 5913, 6075, 6239, 6450, 6543, 6699, 6856, 6939, 7075, 7150, 7254, 7336, 7416, 7550, 7782, 7878, 7996, 8128, 8214, 8306, 8437, 8578, 8671, 8806, 8909, 9050, 9151, 9246, 9399, 9551, 9657, 9759, 9888, 9976, 9995, 10000, 10000, 10000, 10000, 10000, 10000}, +{207, 220, 250, 265, 283, 303, 327, 352, 380, 408, 445, 487, 547, 626, 738, 824, 955, 1109, 1301, 1402, 1511, 1722, 1921, 2140, 2431, 2742, 3132, 3320, 3485, 3755, 3864, 4076, 4392, 4635, 4811, 4958, 5103, 5235, 5361, 5471, 5578, 5696, 5816, 5946, 6080, 6225, 6377, 6536, 6740, 6826, 6975, 7127, 7205, 7331, 7401, 7506, 7586, 7664, 7785, 8013, 8110, 8223, 8355, 8437, 8528, 8654, 8796, 8887, 9026, 9127, 9270, 9370, 9460, 9618, 9765, 9860, 9930, 9984, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000}, +{240, 252, 289, 308, 329, 354, 382, 410, 450, 497, 554, 627, 721, 855, 1044, 1179, 1362, 1568, 1817, 1943, 2065, 2312, 2540, 2814, 3142, 3455, 3797, 3945, 4080, 4305, 4399, 4578, 4842, 5058, 5216, 5352, 5484, 5604, 5726, 5824, 5918, 6028, 6136, 6254, 6377, 6523, 6664, 6815, 7008, 7090, 7238, 7380, 7455, 7583, 7647, 7745, 7822, 7899, 8022, 8242, 8332, 8447, 8579, 8657, 8744, 8877, 9013, 9107, 9242, 9340, 9485, 9586, 9682, 9825, 9930, 9971, 9989, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000}, +{263, 283, 317, 342, 365, 396, 431, 469, 517, 582, 662, 756, 892, 1077, 1308, 1457, 1700, 1948, 2227, 2360, 2496, 2770, 3017, 3298, 3597, 3873, 4170, 4298, 4414, 4621, 4707, 4872, 5127, 5328, 5473, 5597, 5720, 5836, 5940, 6034, 6133, 6231, 6335, 6459, 6580, 6708, 6852, 6993, 7179, 7262, 7400, 7536, 7620, 7738, 7806, 7900, 7977, 8053, 8173, 8397, 8484, 8593, 8728, 8802, 8893, 9021, 9157, 9250, 9393, 9493, 9631, 9728, 9812, 9922, 9981, 9996, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000}, +{346, 372, 428, 466, 507, 562, 622, 698, 794, 906, 1058, 1255, 1488, 1791, 2194, 2445, 2768, 3084, 3386, 3540, 3663, 3901, 4092, 4299, 4520, 4724, 4951, 5055, 5153, 5319, 5388, 5535, 5753, 5928, 6051, 6169, 6274, 6372, 6471, 6549, 6629, 6729, 6816, 6927, 7028, 7155, 7279, 7415, 7595, 7669, 7813, 7945, 8017, 8129, 8194, 8288, 8367, 8435, 8552, 8764, 8853, 8956, 9082, 9167, 9259, 9385, 9518, 9611, 9750, 9832, 9917, 9961, 9978, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000}, +{463, 505, 599, 657, 730, 817, 922, 1056, 1223, 1423, 1671, 1977, 2392, 2862, 3325, 3566, 3852, 4101, 4343, 4450, 4543, 4728, 4877, 5045, 5227, 5399, 5598, 5684, 5768, 5909, 5970, 6098, 6290, 6441, 6554, 6651, 6750, 6842, 6922, 6998, 7076, 7163, 7246, 7352, 7446, 7566, 7689, 7809, 7979, 8052, 8185, 8313, 8379, 8497, 8553, 8650, 8720, 8786, 8898, 9115, 9203, 9304, 9432, 9516, 9596, 9726, 9832, 9899, 9951, 9974, 9991, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000}, + +//temp = 60.0 ^C +{159, 167, 185, 196, 207, 220, 233, 248, 264, 281, 300, 320, 344, 368, 396, 412, 432, 454, 476, 488, 499, 521, 543, 566, 596, 631, 696, 761, 925, 1385, 1446, 1616, 1902, 2238, 2465, 2651, 2811, 2916, 3044, 3224, 3448, 3690, 3917, 4175, 4410, 4664, 4914, 5160, 5442, 5538, 5676, 5799, 5883, 6032, 6124, 6256, 6357, 6460, 6617, 6899, 7010, 7150, 7303, 7397, 7502, 7648, 7804, 7903, 8054, 8160, 8308, 8411, 8505, 8661, 8816, 8919, 9021, 9168, 9327, 9433, 9540, 9703, 9826, 9888, 9996, 10000}, +{264, 273, 293, 304, 317, 331, 345, 361, 379, 398, 419, 442, 468, 496, 525, 542, 567, 590, 617, 629, 642, 668, 694, 734, 821, 1011, 1452, 1570, 1678, 1872, 1968, 2201, 2570, 2831, 3006, 3165, 3387, 3623, 3845, 4030, 4208, 4396, 4579, 4780, 4972, 5185, 5398, 5589, 5790, 5871, 6022, 6190, 6287, 6442, 6528, 6650, 6748, 6840, 6989, 7255, 7359, 7488, 7633, 7725, 7824, 7966, 8118, 8212, 8359, 8465, 8610, 8713, 8804, 8959, 9112, 9214, 9321, 9469, 9633, 9736, 9842, 9970, 10000, 10000, 10000, 10000}, +{328, 338, 361, 375, 387, 403, 418, 439, 458, 480, 504, 530, 559, 589, 624, 644, 673, 704, 744, 768, 796, 873, 969, 1137, 1433, 1688, 1942, 2076, 2214, 2467, 2571, 2780, 3088, 3369, 3621, 3830, 4049, 4240, 4414, 4558, 4707, 4859, 5014, 5184, 5347, 5525, 5699, 5852, 6055, 6145, 6315, 6481, 6578, 6723, 6802, 6921, 7010, 7096, 7236, 7485, 7587, 7710, 7852, 7937, 8035, 8173, 8316, 8411, 8556, 8657, 8801, 8901, 8994, 9149, 9307, 9412, 9517, 9672, 9833, 9924, 9988, 10000, 10000, 10000, 10000, 10000}, +{370, 381, 405, 418, 436, 450, 471, 491, 509, 534, 560, 587, 619, 654, 696, 721, 761, 820, 899, 950, 1007, 1154, 1321, 1548, 1797, 2025, 2329, 2474, 2617, 2850, 2954, 3169, 3540, 3861, 4097, 4286, 4475, 4642, 4798, 4933, 5066, 5205, 5346, 5501, 5649, 5805, 5960, 6119, 6327, 6416, 6586, 6747, 6841, 6978, 7055, 7172, 7256, 7339, 7476, 7717, 7816, 7935, 8075, 8159, 8252, 8391, 8530, 8628, 8769, 8869, 9013, 9115, 9207, 9359, 9517, 9623, 9724, 9869, 9979, 10000, 10000, 10000, 10000, 10000, 10000, 10000}, +{383, 396, 421, 438, 454, 473, 493, 515, 539, 564, 593, 624, 657, 702, 762, 807, 885, 985, 1124, 1208, 1293, 1488, 1691, 1892, 2129, 2390, 2694, 2835, 2978, 3229, 3339, 3579, 3950, 4238, 4446, 4615, 4787, 4933, 5079, 5199, 5319, 5448, 5577, 5716, 5853, 6002, 6155, 6314, 6518, 6611, 6774, 6935, 7024, 7158, 7232, 7341, 7421, 7501, 7631, 7865, 7963, 8078, 8213, 8296, 8391, 8527, 8666, 8759, 8902, 9004, 9148, 9250, 9339, 9496, 9657, 9766, 9872, 9980, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000}, +{401, 413, 442, 461, 478, 499, 525, 550, 577, 610, 646, 685, 745, 829, 949, 1044, 1189, 1355, 1558, 1667, 1782, 2004, 2191, 2399, 2657, 2927, 3260, 3417, 3566, 3826, 3936, 4155, 4472, 4719, 4896, 5040, 5188, 5323, 5446, 5559, 5668, 5779, 5899, 6030, 6158, 6298, 6444, 6598, 6797, 6886, 7041, 7186, 7265, 7399, 7469, 7572, 7658, 7735, 7863, 8100, 8197, 8315, 8447, 8529, 8615, 8745, 8889, 8980, 9120, 9221, 9366, 9474, 9567, 9722, 9867, 9941, 9986, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000}, +{401, 413, 442, 461, 478, 499, 525, 550, 577, 610, 646, 685, 745, 829, 949, 1044, 1189, 1355, 1558, 1667, 1782, 2004, 2191, 2399, 2657, 2927, 3260, 3417, 3566, 3826, 3936, 4155, 4472, 4719, 4896, 5040, 5188, 5323, 5446, 5559, 5668, 5779, 5899, 6030, 6158, 6298, 6444, 6598, 6797, 6886, 7041, 7186, 7265, 7399, 7469, 7572, 7658, 7735, 7863, 8100, 8197, 8315, 8447, 8529, 8615, 8745, 8889, 8980, 9120, 9221, 9366, 9474, 9567, 9722, 9867, 9941, 9986, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000}, +{432, 445, 485, 511, 534, 560, 595, 635, 678, 744, 826, 932, 1067, 1256, 1486, 1652, 1893, 2142, 2399, 2526, 2642, 2877, 3085, 3335, 3610, 3877, 4177, 4314, 4432, 4638, 4721, 4893, 5138, 5334, 5474, 5597, 5717, 5837, 5946, 6039, 6133, 6239, 6351, 6472, 6590, 6722, 6867, 7008, 7195, 7273, 7412, 7553, 7625, 7748, 7809, 7910, 7987, 8058, 8183, 8407, 8499, 8614, 8746, 8826, 8915, 9044, 9186, 9277, 9415, 9519, 9666, 9762, 9842, 9954, 9992, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000}, +{420, 437, 487, 517, 550, 597, 656, 724, 806, 918, 1057, 1230, 1451, 1721, 2072, 2310, 2608, 2897, 3189, 3330, 3464, 3700, 3908, 4122, 4358, 4572, 4807, 4920, 5019, 5195, 5268, 5422, 5654, 5836, 5971, 6087, 6199, 6306, 6410, 6493, 6579, 6670, 6768, 6872, 6983, 7099, 7228, 7365, 7543, 7619, 7757, 7894, 7964, 8084, 8147, 8246, 8318, 8391, 8512, 8724, 8811, 8920, 9049, 9124, 9217, 9348, 9479, 9565, 9698, 9790, 9895, 9949, 9975, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000}, +{477, 511, 585, 641, 703, 780, 875, 1001, 1144, 1322, 1542, 1802, 2123, 2533, 2971, 3223, 3532, 3813, 4075, 4194, 4314, 4506, 4669, 4843, 5033, 5213, 5419, 5515, 5600, 5750, 5822, 5952, 6153, 6311, 6436, 6537, 6638, 6735, 6825, 6907, 6985, 7077, 7163, 7268, 7367, 7487, 7609, 7742, 7911, 7976, 8111, 8238, 8311, 8413, 8477, 8567, 8643, 8709, 8830, 9040, 9126, 9229, 9351, 9427, 9516, 9632, 9761, 9834, 9919, 9962, 9987, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000}, +}; diff --git a/drivers/power/sd77426_fg_mmi/table.h b/drivers/power/sd77426_fg_mmi/table.h index d89c59e6bc42..50fcf8f332e3 100644 --- a/drivers/power/sd77426_fg_mmi/table.h +++ b/drivers/power/sd77426_fg_mmi/table.h @@ -1,69 +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 - +/***************************************************************************** +* 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: ATL +* Battery Model: M1892 +* Absolute Max Capacity(mAhr): 3661 +* Limited Charge Voltage(mV): 4400 +* Cutoff Discharge Voltage(mV): 3200 +* Equipment: "JY1-5","JY1-5","JY1-5","JY1-5","JY1-5","JY1-5","JY1-5","JY1-5","JY1-5","JY1-5","JY1-5","JY1-5","JY2-5","JY2-5","JY2-5","JY2-6","JY2-6","JY2-6","JY2-6","JY2-6","JY2-6","JY2-6","JY2-5","JY2-5","JY2-5","JY2-5","JY2-5","JY2-5","JY2-5","JY2-5","JY2-5","JY2-5","JY2-6","JY2-6","JY2-6","JY2-6","JY2-6","JY2-6","JY2-6","JY2-6","JY2-6","JY2-5","JY1-6","JY1-6","JY1-6","JY1-6","JY1-6","JY1-6","JY1-8","JY1-8","JY1-8","JY1-8","JY1-6","JY1-6","JY1-6","JY1-6","JY1-6","JY1-6","JY1-6","JY1-6","JY1-6","JY1-6","JY1-6","JY1-8","JY1-7","JY1-7","JY1-7","JY1-7","JY1-7","JY1-7","JY1-3","JY1-3","JY1-3","JY1-5","JY1-5","JY2-5","JY2-5","JY2-5","JY2-5","JY2-5","JY2-5","JY2-5","JY2-5","JY2-5","JY2-5","JY1-8","JY1-8","JY1-2","JY1-2","JY1-2","JY2-6","JY2-6","JY2-6" +* 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","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: "M1892_1","M1892_1","M1892_1","M1892_1","M1892_1","M1892_1","M1892_1","M1892_1","M1892_1","M1892_1","M1892_1","M1892_1","M1892_1","M1892_1","M1892_1","M1892_1","M1892_1","M1892_1","M1892_1","M1892_1","M1892_1","M1892_1","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_2","M1892_3","M1892_3","M1892_3","M1892_3","M1892_3","M1892_3","M1892_3","M1892_3","M1892_3","M1892_3","M1892_3","M1892_3","M1892_3","M1892_3","M1892_3","M1892_3","M1892_3","M1892_4","M1892_4","M1892_4","M1892_2","M1892_2","M1892_2" +* Version = V00.8D.00 +* Date = 2018.3.26 +* Comment = +* +*****************************************************************************/ + +#ifndef _TABLE_H_ +#define _TABLE_H_ + + +#define OCV_DATA_NUM 65 +#define CHARGE_DATA_NUM 65 + + +#define XAxis 86 +#define YAxis 10 +#define ZAxis 9 + +#define BATTERY_ID_NUM 93 + + +/**************************************************************************** +* 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 +