From 58d12e5754fb95f8c01d0f368fe44a58e42834d2 Mon Sep 17 00:00:00 2001 From: CTCaer Date: Sun, 14 Jun 2020 02:01:26 +0300 Subject: [PATCH] power: Refactor bq24193 driver --- bootloader/power/bq24193.c | 35 +++++++++++++++++++---------------- nyx/nyx_gui/power/bq24193.c | 35 +++++++++++++++++++---------------- 2 files changed, 38 insertions(+), 32 deletions(-) diff --git a/bootloader/power/bq24193.c b/bootloader/power/bq24193.c index d95b322..36401f4 100644 --- a/bootloader/power/bq24193.c +++ b/bootloader/power/bq24193.c @@ -20,13 +20,18 @@ #include "../soc/i2c.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) { u8 data; switch (prop) { 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; *value = 0; *value += ((data >> 0) & 1) ? 80 : 0; @@ -36,7 +41,7 @@ int bq24193_get_property(enum BQ24193_reg_prop prop, int *value) *value += 3880; break; 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; switch (data) { @@ -67,13 +72,13 @@ int bq24193_get_property(enum BQ24193_reg_prop prop, int *value) } break; 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 *= 100; *value += 3000; break; 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; *value = 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 >> 5) & 1) ? 2048 : 0; *value += 512; - data = i2c_recv_byte(I2C_1, BQ24193_I2C_ADDR, BQ24193_ChrgCurr); + data = bq24193_get_reg(BQ24193_ChrgCurr); data &= BQ24193_CHRGCURR_20PCT_MASK; if (data) *value = *value * 20 / 100; // Fast charge current limit is 20%. break; 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; *value = 0; *value += ((data >> 0) & 1) ? 16 : 0; @@ -101,7 +106,7 @@ int bq24193_get_property(enum BQ24193_reg_prop prop, int *value) *value += 3504; break; 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; if (data) *value = 300; @@ -109,7 +114,7 @@ int bq24193_get_property(enum BQ24193_reg_prop prop, int *value) *value = 100; break; 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; switch (data) { @@ -128,19 +133,19 @@ int bq24193_get_property(enum BQ24193_reg_prop prop, int *value) } break; 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; break; 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; break; 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; break; 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; break; default: @@ -151,15 +156,13 @@ int bq24193_get_property(enum BQ24193_reg_prop prop, int *value) void bq24193_fake_battery_removal() { - u8 value; - // 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; i2c_send_byte(I2C_1, BQ24193_I2C_ADDR, BQ24193_ChrgTermTimer, value); // 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; i2c_send_byte(I2C_1, BQ24193_I2C_ADDR, BQ24193_Misc, value); } diff --git a/nyx/nyx_gui/power/bq24193.c b/nyx/nyx_gui/power/bq24193.c index d95b322..36401f4 100644 --- a/nyx/nyx_gui/power/bq24193.c +++ b/nyx/nyx_gui/power/bq24193.c @@ -20,13 +20,18 @@ #include "../soc/i2c.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) { u8 data; switch (prop) { 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; *value = 0; *value += ((data >> 0) & 1) ? 80 : 0; @@ -36,7 +41,7 @@ int bq24193_get_property(enum BQ24193_reg_prop prop, int *value) *value += 3880; break; 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; switch (data) { @@ -67,13 +72,13 @@ int bq24193_get_property(enum BQ24193_reg_prop prop, int *value) } break; 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 *= 100; *value += 3000; break; 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; *value = 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 >> 5) & 1) ? 2048 : 0; *value += 512; - data = i2c_recv_byte(I2C_1, BQ24193_I2C_ADDR, BQ24193_ChrgCurr); + data = bq24193_get_reg(BQ24193_ChrgCurr); data &= BQ24193_CHRGCURR_20PCT_MASK; if (data) *value = *value * 20 / 100; // Fast charge current limit is 20%. break; 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; *value = 0; *value += ((data >> 0) & 1) ? 16 : 0; @@ -101,7 +106,7 @@ int bq24193_get_property(enum BQ24193_reg_prop prop, int *value) *value += 3504; break; 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; if (data) *value = 300; @@ -109,7 +114,7 @@ int bq24193_get_property(enum BQ24193_reg_prop prop, int *value) *value = 100; break; 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; switch (data) { @@ -128,19 +133,19 @@ int bq24193_get_property(enum BQ24193_reg_prop prop, int *value) } break; 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; break; 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; break; 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; break; 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; break; default: @@ -151,15 +156,13 @@ int bq24193_get_property(enum BQ24193_reg_prop prop, int *value) void bq24193_fake_battery_removal() { - u8 value; - // 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; i2c_send_byte(I2C_1, BQ24193_I2C_ADDR, BQ24193_ChrgTermTimer, value); // 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; i2c_send_byte(I2C_1, BQ24193_I2C_ADDR, BQ24193_Misc, value); }