/* * Return battery voltage * Or < 0 on failure. */ static int twl4030battery_voltage(void) { int ret, volt; u8 hwsts; struct twl4030_madc_request req; twl4030_i2c_read_u8(TWL4030_MODULE_PM_MASTER, &hwsts, REG_STS_HW_CONDITIONS); if ((hwsts & STS_CHG) || (hwsts & STS_VBUS)) { /* AC or USB charger connected */ volt = read_bci_val(T2_BATTERY_VOLT); return (volt * VOLT_STEP_SIZE) / VOLT_PSR_R; } else { /* Use madc conversion */ req.channels = (1 << 12); req.do_avg = 0; req.method = TWL4030_MADC_SW1; req.active = 0; req.func_cb = NULL; twl4030_madc_conversion(&req); volt = (u16)req.rbuf[12]; return (volt * VOLT_STEP_SIZE) / VOLT_PSR_R; } }
/* * Return battery voltage * Or < 0 on failure. */ static int twl4030battery_voltage(void) { int volt; if(system_rev >= 2){ // B-Project Rev.D (AP Fuel Gauge) return max17043_get_voltage(); } else { volt = read_bci_val(T2_BATTERY_VOLT); return (volt * VOLT_STEP_SIZE) / VOLT_PSR_R; } }
/* * Return the battery current * Or < 0 on failure. */ static int twl4030battery_current(void) { int ret, curr = read_bci_val(T2_BATTERY_CUR); u8 uninitialized_var(val); ret = twl4030_i2c_read_u8(TWL4030_MODULE_MAIN_CHARGE, &val, REG_BCICTL1); if (ret) return ret; if (val & CGAIN) /* slope of 0.44 mV/mA */ return (curr * CURR_STEP_SIZE) / CURR_PSR_R1; else /* slope of 0.88 mV/mA */ return (curr * CURR_STEP_SIZE) / CURR_PSR_R2; }
/* * Return battery temperature * Or < 0 on failure. */ static int twl4030battery_temperature(void) { u8 uninitialized_var(val); int temp, curr, volt, res, ret; /* Getting and calculating the thermistor voltage */ ret = read_bci_val(T2_BATTERY_TEMP); if (ret < 0) return ret; volt = (ret * TEMP_STEP_SIZE) / TEMP_PSR_R; /* Getting and calculating the supply current in micro ampers */ ret = twl4030_i2c_read_u8(TWL4030_MODULE_MAIN_CHARGE, &val, REG_BCICTL2); if (ret) return 0; curr = ((val & ITHSENS) + 1) * 10; /* Getting and calculating the thermistor resistance in ohms*/ res = volt * 1000 / curr; /*calculating temperature*/ for (temp = 58; temp >= 0; temp--) { int actual = therm_tbl[temp]; if ((actual - res) >= 0) break; } /* Negative temperature */ if (temp < 3) { if (temp == 2) temp = -1; else if (temp == 1) temp = -2; else temp = -3; } return temp + 1; }