power: Refactor bq24193 driver

This commit is contained in:
CTCaer 2020-06-14 02:01:26 +03:00
parent bcda64a5df
commit 58d12e5754
2 changed files with 38 additions and 32 deletions

View file

@ -20,13 +20,18 @@
#include "../soc/i2c.h" #include "../soc/i2c.h"
#include "../utils/util.h" #include "../utils/util.h"
static u8 bq24193_get_reg(u8 reg)
{
return i2c_recv_byte(I2C_1, BQ24193_I2C_ADDR, reg);
}
int bq24193_get_property(enum BQ24193_reg_prop prop, int *value) int bq24193_get_property(enum BQ24193_reg_prop prop, int *value)
{ {
u8 data; u8 data;
switch (prop) { switch (prop) {
case BQ24193_InputVoltageLimit: // Input voltage limit (mV). case BQ24193_InputVoltageLimit: // Input voltage limit (mV).
data = i2c_recv_byte(I2C_1, BQ24193_I2C_ADDR, BQ24193_InputSource); data = bq24193_get_reg(BQ24193_InputSource);
data = (data & BQ24193_INCONFIG_VINDPM_MASK) >> 3; data = (data & BQ24193_INCONFIG_VINDPM_MASK) >> 3;
*value = 0; *value = 0;
*value += ((data >> 0) & 1) ? 80 : 0; *value += ((data >> 0) & 1) ? 80 : 0;
@ -36,7 +41,7 @@ int bq24193_get_property(enum BQ24193_reg_prop prop, int *value)
*value += 3880; *value += 3880;
break; break;
case BQ24193_InputCurrentLimit: // Input current limit (mA). case BQ24193_InputCurrentLimit: // Input current limit (mA).
data = i2c_recv_byte(I2C_1, BQ24193_I2C_ADDR, BQ24193_InputSource); data = bq24193_get_reg(BQ24193_InputSource);
data &= BQ24193_INCONFIG_INLIMIT_MASK; data &= BQ24193_INCONFIG_INLIMIT_MASK;
switch (data) switch (data)
{ {
@ -67,13 +72,13 @@ int bq24193_get_property(enum BQ24193_reg_prop prop, int *value)
} }
break; break;
case BQ24193_SystemMinimumVoltage: // Minimum system voltage limit (mV). case BQ24193_SystemMinimumVoltage: // Minimum system voltage limit (mV).
data = i2c_recv_byte(I2C_1, BQ24193_I2C_ADDR, BQ24193_PORConfig); data = bq24193_get_reg(BQ24193_PORConfig);
*value = (data & BQ24193_PORCONFIG_SYSMIN_MASK) >> 1; *value = (data & BQ24193_PORCONFIG_SYSMIN_MASK) >> 1;
*value *= 100; *value *= 100;
*value += 3000; *value += 3000;
break; break;
case BQ24193_FastChargeCurrentLimit: // Fast charge current limit (mA). case BQ24193_FastChargeCurrentLimit: // Fast charge current limit (mA).
data = i2c_recv_byte(I2C_1, BQ24193_I2C_ADDR, BQ24193_ChrgCurr); data = bq24193_get_reg(BQ24193_ChrgCurr);
data = (data & BQ24193_CHRGCURR_ICHG_MASK) >> 2; data = (data & BQ24193_CHRGCURR_ICHG_MASK) >> 2;
*value = 0; *value = 0;
*value += ((data >> 0) & 1) ? 64 : 0; *value += ((data >> 0) & 1) ? 64 : 0;
@ -83,13 +88,13 @@ int bq24193_get_property(enum BQ24193_reg_prop prop, int *value)
*value += ((data >> 4) & 1) ? 1024 : 0; *value += ((data >> 4) & 1) ? 1024 : 0;
*value += ((data >> 5) & 1) ? 2048 : 0; *value += ((data >> 5) & 1) ? 2048 : 0;
*value += 512; *value += 512;
data = i2c_recv_byte(I2C_1, BQ24193_I2C_ADDR, BQ24193_ChrgCurr); data = bq24193_get_reg(BQ24193_ChrgCurr);
data &= BQ24193_CHRGCURR_20PCT_MASK; data &= BQ24193_CHRGCURR_20PCT_MASK;
if (data) if (data)
*value = *value * 20 / 100; // Fast charge current limit is 20%. *value = *value * 20 / 100; // Fast charge current limit is 20%.
break; break;
case BQ24193_ChargeVoltageLimit: // Charge voltage limit (mV). case BQ24193_ChargeVoltageLimit: // Charge voltage limit (mV).
data = i2c_recv_byte(I2C_1, BQ24193_I2C_ADDR, BQ24193_ChrgVolt); data = bq24193_get_reg(BQ24193_ChrgVolt);
data = (data & BQ24193_CHRGVOLT_VREG) >> 2; data = (data & BQ24193_CHRGVOLT_VREG) >> 2;
*value = 0; *value = 0;
*value += ((data >> 0) & 1) ? 16 : 0; *value += ((data >> 0) & 1) ? 16 : 0;
@ -101,7 +106,7 @@ int bq24193_get_property(enum BQ24193_reg_prop prop, int *value)
*value += 3504; *value += 3504;
break; break;
case BQ24193_RechargeThreshold: // Recharge voltage threshold less than voltage limit (mV). case BQ24193_RechargeThreshold: // Recharge voltage threshold less than voltage limit (mV).
data = i2c_recv_byte(I2C_1, BQ24193_I2C_ADDR, BQ24193_ChrgVolt); data = bq24193_get_reg(BQ24193_ChrgVolt);
data &= BQ24193_IRTHERMAL_THERM_MASK; data &= BQ24193_IRTHERMAL_THERM_MASK;
if (data) if (data)
*value = 300; *value = 300;
@ -109,7 +114,7 @@ int bq24193_get_property(enum BQ24193_reg_prop prop, int *value)
*value = 100; *value = 100;
break; break;
case BQ24193_ThermalRegulation: // Thermal regulation threshold (oC). case BQ24193_ThermalRegulation: // Thermal regulation threshold (oC).
data = i2c_recv_byte(I2C_1, BQ24193_I2C_ADDR, BQ24193_IRCompThermal); data = bq24193_get_reg(BQ24193_IRCompThermal);
data &= BQ24193_IRTHERMAL_THERM_MASK; data &= BQ24193_IRTHERMAL_THERM_MASK;
switch (data) switch (data)
{ {
@ -128,19 +133,19 @@ int bq24193_get_property(enum BQ24193_reg_prop prop, int *value)
} }
break; break;
case BQ24193_ChargeStatus: // 0: Not charging, 1: Pre-charge, 2: Fast charging, 3: Charge termination done case BQ24193_ChargeStatus: // 0: Not charging, 1: Pre-charge, 2: Fast charging, 3: Charge termination done
data = i2c_recv_byte(I2C_1, BQ24193_I2C_ADDR, BQ24193_Status); data = bq24193_get_reg(BQ24193_Status);
*value = (data & BQ24193_STATUS_CHRG_MASK) >> 4; *value = (data & BQ24193_STATUS_CHRG_MASK) >> 4;
break; break;
case BQ24193_TempStatus: // 0: Normal, 2: Warm, 3: Cool, 5: Cold, 6: Hot. case BQ24193_TempStatus: // 0: Normal, 2: Warm, 3: Cool, 5: Cold, 6: Hot.
data = i2c_recv_byte(I2C_1, BQ24193_I2C_ADDR, BQ24193_FaultReg); data = bq24193_get_reg(BQ24193_FaultReg);
*value = data & BQ24193_FAULT_THERM_MASK; *value = data & BQ24193_FAULT_THERM_MASK;
break; break;
case BQ24193_DevID: // Dev ID. case BQ24193_DevID: // Dev ID.
data = i2c_recv_byte(I2C_1, BQ24193_I2C_ADDR, BQ24193_VendorPart); data = bq24193_get_reg(BQ24193_VendorPart);
*value = data & BQ24193_VENDORPART_DEV_MASK; *value = data & BQ24193_VENDORPART_DEV_MASK;
break; break;
case BQ24193_ProductNumber: // Product number. case BQ24193_ProductNumber: // Product number.
data = i2c_recv_byte(I2C_1, BQ24193_I2C_ADDR, BQ24193_VendorPart); data = bq24193_get_reg(BQ24193_VendorPart);
*value = (data & BQ24193_VENDORPART_PN_MASK) >> 3; *value = (data & BQ24193_VENDORPART_PN_MASK) >> 3;
break; break;
default: default:
@ -151,15 +156,13 @@ int bq24193_get_property(enum BQ24193_reg_prop prop, int *value)
void bq24193_fake_battery_removal() void bq24193_fake_battery_removal()
{ {
u8 value;
// Disable watchdog to keep BATFET disabled. // Disable watchdog to keep BATFET disabled.
value = i2c_recv_byte(I2C_1, BQ24193_I2C_ADDR, BQ24193_ChrgTermTimer); u8 value = bq24193_get_reg(BQ24193_ChrgTermTimer);
value &= ~BQ24193_CHRGTERM_WATCHDOG_MASK; value &= ~BQ24193_CHRGTERM_WATCHDOG_MASK;
i2c_send_byte(I2C_1, BQ24193_I2C_ADDR, BQ24193_ChrgTermTimer, value); i2c_send_byte(I2C_1, BQ24193_I2C_ADDR, BQ24193_ChrgTermTimer, value);
// Force BATFET to disabled state. This disconnects the battery from the system. // Force BATFET to disabled state. This disconnects the battery from the system.
value = i2c_recv_byte(I2C_1, BQ24193_I2C_ADDR, BQ24193_Misc); value = bq24193_get_reg(BQ24193_Misc);
value |= BQ24193_MISC_BATFET_DI_MASK; value |= BQ24193_MISC_BATFET_DI_MASK;
i2c_send_byte(I2C_1, BQ24193_I2C_ADDR, BQ24193_Misc, value); i2c_send_byte(I2C_1, BQ24193_I2C_ADDR, BQ24193_Misc, value);
} }

View file

@ -20,13 +20,18 @@
#include "../soc/i2c.h" #include "../soc/i2c.h"
#include "../utils/util.h" #include "../utils/util.h"
static u8 bq24193_get_reg(u8 reg)
{
return i2c_recv_byte(I2C_1, BQ24193_I2C_ADDR, reg);
}
int bq24193_get_property(enum BQ24193_reg_prop prop, int *value) int bq24193_get_property(enum BQ24193_reg_prop prop, int *value)
{ {
u8 data; u8 data;
switch (prop) { switch (prop) {
case BQ24193_InputVoltageLimit: // Input voltage limit (mV). case BQ24193_InputVoltageLimit: // Input voltage limit (mV).
data = i2c_recv_byte(I2C_1, BQ24193_I2C_ADDR, BQ24193_InputSource); data = bq24193_get_reg(BQ24193_InputSource);
data = (data & BQ24193_INCONFIG_VINDPM_MASK) >> 3; data = (data & BQ24193_INCONFIG_VINDPM_MASK) >> 3;
*value = 0; *value = 0;
*value += ((data >> 0) & 1) ? 80 : 0; *value += ((data >> 0) & 1) ? 80 : 0;
@ -36,7 +41,7 @@ int bq24193_get_property(enum BQ24193_reg_prop prop, int *value)
*value += 3880; *value += 3880;
break; break;
case BQ24193_InputCurrentLimit: // Input current limit (mA). case BQ24193_InputCurrentLimit: // Input current limit (mA).
data = i2c_recv_byte(I2C_1, BQ24193_I2C_ADDR, BQ24193_InputSource); data = bq24193_get_reg(BQ24193_InputSource);
data &= BQ24193_INCONFIG_INLIMIT_MASK; data &= BQ24193_INCONFIG_INLIMIT_MASK;
switch (data) switch (data)
{ {
@ -67,13 +72,13 @@ int bq24193_get_property(enum BQ24193_reg_prop prop, int *value)
} }
break; break;
case BQ24193_SystemMinimumVoltage: // Minimum system voltage limit (mV). case BQ24193_SystemMinimumVoltage: // Minimum system voltage limit (mV).
data = i2c_recv_byte(I2C_1, BQ24193_I2C_ADDR, BQ24193_PORConfig); data = bq24193_get_reg(BQ24193_PORConfig);
*value = (data & BQ24193_PORCONFIG_SYSMIN_MASK) >> 1; *value = (data & BQ24193_PORCONFIG_SYSMIN_MASK) >> 1;
*value *= 100; *value *= 100;
*value += 3000; *value += 3000;
break; break;
case BQ24193_FastChargeCurrentLimit: // Fast charge current limit (mA). case BQ24193_FastChargeCurrentLimit: // Fast charge current limit (mA).
data = i2c_recv_byte(I2C_1, BQ24193_I2C_ADDR, BQ24193_ChrgCurr); data = bq24193_get_reg(BQ24193_ChrgCurr);
data = (data & BQ24193_CHRGCURR_ICHG_MASK) >> 2; data = (data & BQ24193_CHRGCURR_ICHG_MASK) >> 2;
*value = 0; *value = 0;
*value += ((data >> 0) & 1) ? 64 : 0; *value += ((data >> 0) & 1) ? 64 : 0;
@ -83,13 +88,13 @@ int bq24193_get_property(enum BQ24193_reg_prop prop, int *value)
*value += ((data >> 4) & 1) ? 1024 : 0; *value += ((data >> 4) & 1) ? 1024 : 0;
*value += ((data >> 5) & 1) ? 2048 : 0; *value += ((data >> 5) & 1) ? 2048 : 0;
*value += 512; *value += 512;
data = i2c_recv_byte(I2C_1, BQ24193_I2C_ADDR, BQ24193_ChrgCurr); data = bq24193_get_reg(BQ24193_ChrgCurr);
data &= BQ24193_CHRGCURR_20PCT_MASK; data &= BQ24193_CHRGCURR_20PCT_MASK;
if (data) if (data)
*value = *value * 20 / 100; // Fast charge current limit is 20%. *value = *value * 20 / 100; // Fast charge current limit is 20%.
break; break;
case BQ24193_ChargeVoltageLimit: // Charge voltage limit (mV). case BQ24193_ChargeVoltageLimit: // Charge voltage limit (mV).
data = i2c_recv_byte(I2C_1, BQ24193_I2C_ADDR, BQ24193_ChrgVolt); data = bq24193_get_reg(BQ24193_ChrgVolt);
data = (data & BQ24193_CHRGVOLT_VREG) >> 2; data = (data & BQ24193_CHRGVOLT_VREG) >> 2;
*value = 0; *value = 0;
*value += ((data >> 0) & 1) ? 16 : 0; *value += ((data >> 0) & 1) ? 16 : 0;
@ -101,7 +106,7 @@ int bq24193_get_property(enum BQ24193_reg_prop prop, int *value)
*value += 3504; *value += 3504;
break; break;
case BQ24193_RechargeThreshold: // Recharge voltage threshold less than voltage limit (mV). case BQ24193_RechargeThreshold: // Recharge voltage threshold less than voltage limit (mV).
data = i2c_recv_byte(I2C_1, BQ24193_I2C_ADDR, BQ24193_ChrgVolt); data = bq24193_get_reg(BQ24193_ChrgVolt);
data &= BQ24193_IRTHERMAL_THERM_MASK; data &= BQ24193_IRTHERMAL_THERM_MASK;
if (data) if (data)
*value = 300; *value = 300;
@ -109,7 +114,7 @@ int bq24193_get_property(enum BQ24193_reg_prop prop, int *value)
*value = 100; *value = 100;
break; break;
case BQ24193_ThermalRegulation: // Thermal regulation threshold (oC). case BQ24193_ThermalRegulation: // Thermal regulation threshold (oC).
data = i2c_recv_byte(I2C_1, BQ24193_I2C_ADDR, BQ24193_IRCompThermal); data = bq24193_get_reg(BQ24193_IRCompThermal);
data &= BQ24193_IRTHERMAL_THERM_MASK; data &= BQ24193_IRTHERMAL_THERM_MASK;
switch (data) switch (data)
{ {
@ -128,19 +133,19 @@ int bq24193_get_property(enum BQ24193_reg_prop prop, int *value)
} }
break; break;
case BQ24193_ChargeStatus: // 0: Not charging, 1: Pre-charge, 2: Fast charging, 3: Charge termination done case BQ24193_ChargeStatus: // 0: Not charging, 1: Pre-charge, 2: Fast charging, 3: Charge termination done
data = i2c_recv_byte(I2C_1, BQ24193_I2C_ADDR, BQ24193_Status); data = bq24193_get_reg(BQ24193_Status);
*value = (data & BQ24193_STATUS_CHRG_MASK) >> 4; *value = (data & BQ24193_STATUS_CHRG_MASK) >> 4;
break; break;
case BQ24193_TempStatus: // 0: Normal, 2: Warm, 3: Cool, 5: Cold, 6: Hot. case BQ24193_TempStatus: // 0: Normal, 2: Warm, 3: Cool, 5: Cold, 6: Hot.
data = i2c_recv_byte(I2C_1, BQ24193_I2C_ADDR, BQ24193_FaultReg); data = bq24193_get_reg(BQ24193_FaultReg);
*value = data & BQ24193_FAULT_THERM_MASK; *value = data & BQ24193_FAULT_THERM_MASK;
break; break;
case BQ24193_DevID: // Dev ID. case BQ24193_DevID: // Dev ID.
data = i2c_recv_byte(I2C_1, BQ24193_I2C_ADDR, BQ24193_VendorPart); data = bq24193_get_reg(BQ24193_VendorPart);
*value = data & BQ24193_VENDORPART_DEV_MASK; *value = data & BQ24193_VENDORPART_DEV_MASK;
break; break;
case BQ24193_ProductNumber: // Product number. case BQ24193_ProductNumber: // Product number.
data = i2c_recv_byte(I2C_1, BQ24193_I2C_ADDR, BQ24193_VendorPart); data = bq24193_get_reg(BQ24193_VendorPart);
*value = (data & BQ24193_VENDORPART_PN_MASK) >> 3; *value = (data & BQ24193_VENDORPART_PN_MASK) >> 3;
break; break;
default: default:
@ -151,15 +156,13 @@ int bq24193_get_property(enum BQ24193_reg_prop prop, int *value)
void bq24193_fake_battery_removal() void bq24193_fake_battery_removal()
{ {
u8 value;
// Disable watchdog to keep BATFET disabled. // Disable watchdog to keep BATFET disabled.
value = i2c_recv_byte(I2C_1, BQ24193_I2C_ADDR, BQ24193_ChrgTermTimer); u8 value = bq24193_get_reg(BQ24193_ChrgTermTimer);
value &= ~BQ24193_CHRGTERM_WATCHDOG_MASK; value &= ~BQ24193_CHRGTERM_WATCHDOG_MASK;
i2c_send_byte(I2C_1, BQ24193_I2C_ADDR, BQ24193_ChrgTermTimer, value); i2c_send_byte(I2C_1, BQ24193_I2C_ADDR, BQ24193_ChrgTermTimer, value);
// Force BATFET to disabled state. This disconnects the battery from the system. // Force BATFET to disabled state. This disconnects the battery from the system.
value = i2c_recv_byte(I2C_1, BQ24193_I2C_ADDR, BQ24193_Misc); value = bq24193_get_reg(BQ24193_Misc);
value |= BQ24193_MISC_BATFET_DI_MASK; value |= BQ24193_MISC_BATFET_DI_MASK;
i2c_send_byte(I2C_1, BQ24193_I2C_ADDR, BQ24193_Misc, value); i2c_send_byte(I2C_1, BQ24193_I2C_ADDR, BQ24193_Misc, value);
} }