static int max17040_check_restart( unsigned long avoltage, int soc ) { int i=0; unsigned long sky_low_soc=0; unsigned long sky_fuelgauge_ref_soc=0; unsigned long sky_high_soc=0; int high_soc=0; int low_soc=0; for( i = 0; i < COMPENSATION_MAX; i++ ) { if( avoltage >= sky_fuelgauge_linearlize_table[0][i].volt ) { mutex_lock(&max17040_data.quick_mutex); sky_high_soc = (avoltage - sky_fuelgauge_linearlize_table[0][i].offset)/sky_fuelgauge_linearlize_table[0][i].slop; sky_low_soc=(avoltage - sky_fuelgauge_linearlize_table[0][i].offset)%sky_fuelgauge_linearlize_table[0][i].slop; sky_fuelgauge_ref_soc = SKY_MULT_1000(sky_high_soc)+(SKY_MULT_1000(sky_low_soc)/sky_fuelgauge_linearlize_table[0][i].slop); high_soc=sky_fuelgauge_ref_soc + 30000; // tolerance +30% low_soc=sky_fuelgauge_ref_soc - 30000; // tolerance -30% mutex_unlock(&max17040_data.quick_mutex); if( (soc > high_soc) || (soc < low_soc)|| ( (soc <= 1000) && (sky_fuelgauge_ref_soc > 4000) ) ) { max17040_data.quick_data.quick_state=i; // sleep_dbg("[QUICK START] voltage : [%u]mv, soc : [%d], index [%d], sky_high_soc [%u] ,sky_low_soc [%u]\n",avoltage,soc,i,sky_high_soc,sky_low_soc); // sleep_dbg("[QUICK START] ref_soc : [%u], high_soc : [%u], low_soc : [%d]\n",sky_fuelgauge_ref_soc,high_soc,low_soc); return 1; } break; } } max17040_data.quick_data.quick_state=-1; // sleep_dbg("[QUICK DISABLE] voltage : [%u]mv, soc : [%d], index [%d], sky_high_soc [%u], sky_low_soc [%u] \n",avoltage,soc,i,sky_high_soc,sky_low_soc); // sleep_dbg("[QUICK DISABLE] ref_soc : [%u], high_soc : [%u], low_soc : [%d]\n",sky_fuelgauge_ref_soc,high_soc,low_soc); return 0; }
static void max17040_quick_get_soc(void) { u8 msb=0; u8 lsb=0; int avalue=0; //unsigned long quick_soc; int i=0; bool completed = false; dbg_func_in(); while (!completed) { msb = max17040_read_reg(MAX17040_SOC_MSB); lsb = max17040_read_reg(MAX17040_SOC_LSB); if(msb < 0 || lsb < 0) { for(i=0;i<MAX_READ;i++) { msb = max17040_read_reg(MAX17040_SOC_MSB); lsb = max17040_read_reg(MAX17040_SOC_LSB); if(msb < 0 || lsb <0) { continue; } else break; } } /*//description read i2c data [msb=20,lsb=10] avalue=20*1000+(10*1000)/256 */ avalue=SKY_MULT_1000(msb)+(SKY_MULT_1000(lsb)/SKY_SOC_LSB); //Ajdusted soc%=(SOC%-EMPTY)/(FULL-EMPTY)*100 //logic code sleep_dbg("MAX17040_QUICK Adjusted SOC MSB [%d] : LSB [%d] : Adjusted SOC [%d] :Try Count [%d]\n",msb,lsb,avalue,i); if(i>=MAX_READ-1 || msb < 0 || lsb <0 ) { //Battery Bug Fixing Coded by Illustrious by Proto printk("Re-running to check Battery SoC!!!\n"); i = 0; continue; } else { mutex_lock(&max17040_data.data_mutex); max17040_data.quick_data.soc_msb=msb; max17040_data.quick_data.soc_lsb=lsb; max17040_data.quick_data.quick_soc=avalue; mutex_unlock(&max17040_data.data_mutex); completed = true; break; } } dbg_func_out(); }
static void max17040_quick_get_soc(void) { u8 msb=0; u8 lsb=0; int avalue=0; //unsigned long quick_soc; int i=0; dbg_func_in(); msb = max17040_read_reg(MAX17040_SOC_MSB); lsb = max17040_read_reg(MAX17040_SOC_LSB); if(msb < 0 || lsb < 0) { for(i=0; i<MAX_READ; i++) { msb = max17040_read_reg(MAX17040_SOC_MSB); lsb = max17040_read_reg(MAX17040_SOC_LSB); if(msb < 0 || lsb <0) { continue; } else break; } } /*//description read i2c data [msb=20,lsb=10] avalue=20*1000+(10*1000)/256 */ avalue=SKY_MULT_1000(msb)+(SKY_MULT_1000(lsb)/SKY_SOC_LSB); //Ajdusted soc%=(SOC%-EMPTY)/(FULL-EMPTY)*100 //logic code sleep_dbg("MAX17040_QUICK Adjusted SOC MSB [%d] : LSB [%d] : Adjusted SOC [%d] :Try Count [%d]\n",msb,lsb,avalue,i); mutex_lock(&max17040_data.data_mutex); max17040_data.quick_data.soc_msb=msb; max17040_data.quick_data.soc_lsb=lsb; if(i==MAX_READ) max17040_data.quick_data.quick_soc=0; else max17040_data.quick_data.quick_soc=avalue; mutex_unlock(&max17040_data.data_mutex); dbg_func_out(); }
static int max17040_get_soc(void) { u8 msb; u8 lsb; int soc; msb = max17040_read_reg(MAX17040_SOC_MSB); lsb = max17040_read_reg(MAX17040_SOC_LSB); //check i2c error if(msb<0 ||lsb <0) { soc = max17040_data.soc; } else { soc = SKY_MULT_1000(msb)+(SKY_MULT_1000(lsb)/SKY_SOC_LSB); max17040_data.soc = soc; } return soc; }
static void max17040_get_soc(void) { u8 msb; u8 lsb; int avalue=0; int soc=0; #ifdef MAX17040_SLEEP_DEBUG int sky_state=0; #endif dbg_func_in(); msb = max17040_read_reg(MAX17040_SOC_MSB); lsb = max17040_read_reg(MAX17040_SOC_LSB); //check i2c error if(msb<0 ||lsb <0) { max17040_data.i2c_state =1; } else { max17040_data.i2c_state =0; max17040_data.prev_soc=max17040_data.soc; } #ifdef MAX17040_DEBUG_QUICK //quick start code soc=SKY_MULT_1000(msb)+(SKY_MULT_1000(lsb)/SKY_SOC_LSB); soc=soc/1000; #else /*//description read i2c data [msb=20,lsb=10] avalue=20*1000+(10*1000)/256 */ avalue=SKY_MULT_1000(msb)+(SKY_MULT_1000(lsb)/SKY_SOC_LSB); //Ajdusted soc%=(SOC%-EMPTY)/(FULL-EMPTY)*100 if(avalue>1200) soc=(((avalue-SKY_MULT_100(SKY_SOC_EMPTY))*100)/(SKY_MULT_100(SKY_SOC_FULL)-SKY_MULT_100(SKY_SOC_EMPTY))); else soc=0; if(avalue >1000 && avalue <1200) soc=1; #endif //logic code if(soc>100) //soc>100 soc=100; if(soc==100) charge_state=1; else charge_state=0; #ifdef CONFIG_SKY_CHARGING if(pm8058_chg_nobattery_factory_cable()) soc = 10; #endif if(max17040_data.event) // ps2 team shs : soc is changed { sleep_dbg("CONFIG CAPACITY [%d] : BATTERY STATS : [%d]\n",soc,sky_state); sleep_dbg("SOC MSB [%d] : LSB [%d] : Lower SOC [%d] : Adjusted SOC [%d] : charge_state [%d] \n",msb,lsb,avalue,soc,charge_state); } if(soc!=max17040_data.soc) max17040_data.event=Events; if(soc==0)//ps1 team shs : 0% persent is occured events max17040_data.event=Events; max17040_check_power(soc); mutex_lock(&max17040_data.data_mutex); max17040_data.soc = soc; mutex_unlock(&max17040_data.data_mutex); dbg_func_out(); }