From 44cdecabe69c8f42293595303cb219990734a460 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Artur=20=C5=9Aleszy=C5=84ski?= Date: Fri, 30 Jul 2021 11:11:35 +0200 Subject: [PATCH] [CP-266] Extend power management logging Make sure we print fuel gauge info needed by the electronics team. --- .../linux/battery-charger/battery_charger.cpp | 3 + .../bsp/battery-charger/battery_charger.cpp | 51 +++++++- .../bsp/battery-charger/battery_charger.hpp | 114 ++++++++++-------- .../service-evtmgr/WorkerEvent.cpp | 1 + 4 files changed, 115 insertions(+), 54 deletions(-) diff --git a/module-bsp/board/linux/battery-charger/battery_charger.cpp b/module-bsp/board/linux/battery-charger/battery_charger.cpp index a768e543c7a9f550a1834fb04648de49bcffd29b..64784597bcc14f17a13ae11edc5ed2bd649d92ce 100644 --- a/module-bsp/board/linux/battery-charger/battery_charger.cpp +++ b/module-bsp/board/linux/battery-charger/battery_charger.cpp @@ -191,6 +191,9 @@ namespace bsp::battery_charger return nominalVoltage; } + void printFuelGaugeInfo() + {} + BaseType_t INTB_IRQHandler() { return 1; diff --git a/module-bsp/board/rt1051/bsp/battery-charger/battery_charger.cpp b/module-bsp/board/rt1051/bsp/battery-charger/battery_charger.cpp index 8d44672f95c1ab4c859f75c4098ef8586051fd43..8cf847c3025049cc7ae62c1f2fc20c28f233841f 100644 --- a/module-bsp/board/rt1051/bsp/battery-charger/battery_charger.cpp +++ b/module-bsp/board/rt1051/bsp/battery-charger/battery_charger.cpp @@ -25,12 +25,12 @@ namespace bsp::battery_charger constexpr auto registersToStore = 0xFF + 1; constexpr std::uint16_t ENABLE_CHG_FG_IRQ_MASK = 0xFC; - constexpr std::uint8_t UNLOCK_CHARGER = 0x3 << 2; + constexpr std::uint8_t UNLOCK_CHARGER = 0x3 << 2; constexpr std::uint8_t CHG_ON_OTG_OFF_BUCK_ON = 0b00000101; constexpr std::uint8_t CHG_OFF_OTG_OFF_BUCK_ON = 0b00000100; - constexpr std::uint8_t VSYS_MIN = 0x80; // 3.6V + constexpr std::uint8_t VSYS_MIN = 0x80; // 3.6V constexpr std::uint16_t nominalCapacitymAh = 1600; @@ -42,6 +42,8 @@ namespace bsp::battery_charger constexpr auto currentSenseGain = 0.15625; // mA constexpr auto voltageSenseGain = 0.078125; // mV + constexpr std::uint16_t maxMinMilliVoltGain = 20; + // NTC calibration values constexpr std::uint16_t temperatureConversionGain = 0xEE56; constexpr std::uint16_t temperatureConversionOffset = 0x1DA4; @@ -468,7 +470,7 @@ namespace bsp::battery_charger int getCellTemperature() { - auto value = fuelGaugeRead(Registers::TEMP_REG); + auto value = fuelGaugeRead(Registers::TEMP_REG); // Round to integer by stripping fractions std::uint8_t temperatureInt = value.second >> 8; return utils::twosComplimentToInt(temperatureInt); @@ -733,11 +735,52 @@ namespace bsp::battery_charger int getVoltageFilteredMeasurement() { - auto [retCode, value] = fuelGaugeRead(Registers::AvgVCELL_REG); + const auto [_, value] = fuelGaugeRead(Registers::AvgVCELL_REG); int voltage = value * voltageSenseGain; return voltage; } + int getAvgCurrent() + { + const auto [_, value] = fuelGaugeRead(Registers::AvgCurrent_REG); + int current; + // 2's compliment into decimal + if (value & 0x8000) { + // negative numbers + std::bitset<16> currentBitset = std::bitset<16>(value - 1); + currentBitset.flip(); + current = static_cast((static_cast(currentBitset.to_ulong()) * -1) * currentSenseGain); + } + else { + // positive numbers + current = static_cast(value * currentSenseGain); + } + return current; + } + + MaxMinVolt getMaxMinVolt() + { + MaxMinVolt ret; + + const auto [_, value] = fuelGaugeRead(Registers::MaxMinVolt_REG); + ret.maxMilliVolt = ((value & 0xFF00) >> 8) * maxMinMilliVoltGain; + ret.minMilliVolt = (value & 0xFF) * maxMinMilliVoltGain; + + return ret; + } + + void printFuelGaugeInfo() + { + const auto maxMinVolt = getMaxMinVolt(); + + LOG_INFO("Fuel Gauge info:"); + LOG_INFO("\tAvgVCell: %dmV", getVoltageFilteredMeasurement()); + LOG_INFO("\tMaxVolt: %dmV", maxMinVolt.maxMilliVolt); + LOG_INFO("\tMinVolt: %dmV", maxMinVolt.minMilliVolt); + LOG_INFO("\tAvgCurrent: %dmA", getAvgCurrent()); + LOG_INFO("\tLevel: %d%%", getBatteryLevel()); + } + BaseType_t INTB_IRQHandler() { BaseType_t xHigherPriorityTaskWoken = pdFALSE; diff --git a/module-bsp/bsp/battery-charger/battery_charger.hpp b/module-bsp/bsp/battery-charger/battery_charger.hpp index ec16e3ed36c3569305ec00f55fbece6d0d95f90a..4d150678fea43d8ccd49edabd915609e936c96da 100644 --- a/module-bsp/bsp/battery-charger/battery_charger.hpp +++ b/module-bsp/bsp/battery-charger/battery_charger.hpp @@ -15,75 +15,89 @@ extern "C" namespace bsp::battery_charger { - using StateOfCharge = std::uint8_t; + using StateOfCharge = std::uint8_t; - enum class batteryRetval{ - OK, - ChargerError, - ChargerNotCharging, - ChargerCharging - }; + enum class batteryRetval + { + OK, + ChargerError, + ChargerNotCharging, + ChargerCharging + }; - enum class batteryIRQSource{ - INTB = 0x01, - INOKB = 0x02 - }; + enum class batteryIRQSource + { + INTB = 0x01, + INOKB = 0x02 + }; - enum class topControllerIRQsource{ - CHGR_INT = (1 << 0), - FG_INT = (1 << 1), - SYS_INT = (1 << 2) - }; + enum class topControllerIRQsource + { + CHGR_INT = (1 << 0), + FG_INT = (1 << 1), + SYS_INT = (1 << 2) + }; - enum class batteryINTBSource{ - maxTemp = 1 << 13, - minSOCAlert = 1 << 10, - minTemp = 1 << 9, - minVAlert = 1 << 8, - SOCOnePercentChange = 1 << 7, - all = 0xFFFF - }; + enum class batteryINTBSource + { + maxTemp = 1 << 13, + minSOCAlert = 1 << 10, + minTemp = 1 << 9, + minVAlert = 1 << 8, + SOCOnePercentChange = 1 << 7, + all = 0xFFFF + }; - enum class batteryChargerType{ - DcdTimeOut = 0x00U, /*!< Dcd detect result is timeout */ - DcdUnknownType, /*!< Dcd detect result is unknown type */ - DcdError, /*!< Dcd detect result is error*/ - DcdSDP, /*!< The SDP facility is detected */ - DcdCDP, /*!< The CDP facility is detected */ - DcdDCP, /*!< The DCP facility is detected */ - }; + enum class batteryChargerType + { + DcdTimeOut = 0x00U, /*!< Dcd detect result is timeout */ + DcdUnknownType, /*!< Dcd detect result is unknown type */ + DcdError, /*!< Dcd detect result is error*/ + DcdSDP, /*!< The SDP facility is detected */ + DcdCDP, /*!< The CDP facility is detected */ + DcdDCP, /*!< The DCP facility is detected */ + }; - int init(xQueueHandle irqQueueHandle, xQueueHandle dcdQueueHandle); + struct MaxMinVolt + { + unsigned minMilliVolt{0}; + unsigned maxMilliVolt{0}; + }; - void deinit(); + int init(xQueueHandle irqQueueHandle, xQueueHandle dcdQueueHandle); - StateOfCharge getBatteryLevel(); + void deinit(); - bool getChargeStatus(); + StateOfCharge getBatteryLevel(); - void clearAllChargerIRQs(); + bool getChargeStatus(); - void clearFuelGuageIRQ(std::uint16_t intToClear); + void clearAllChargerIRQs(); - std::uint16_t getStatusRegister(); + void clearFuelGuageIRQ(std::uint16_t intToClear); - void checkTemperatureRange(); + std::uint16_t getStatusRegister(); - std::uint8_t getTopControllerINTSource(); + void checkTemperatureRange(); - void setUSBCurrentLimit(batteryChargerType chargerType); + std::uint8_t getTopControllerINTSource(); - void actionIfChargerUnplugged(); + void setUSBCurrentLimit(batteryChargerType chargerType); - int getVoltageFilteredMeasurement(); + void actionIfChargerUnplugged(); - BaseType_t INTB_IRQHandler(); + int getVoltageFilteredMeasurement(); - extern "C" - { - void USB_ChargerDetectedCB(std::uint8_t detectedType); - } -} // bsp::battery_charger + int getAvgCurrent(); + MaxMinVolt getMaxMinVolt(); + void printFuelGaugeInfo(); + BaseType_t INTB_IRQHandler(); + + extern "C" + { + void USB_ChargerDetectedCB(std::uint8_t detectedType); + } +} // namespace bsp::battery_charger diff --git a/module-services/service-evtmgr/WorkerEvent.cpp b/module-services/service-evtmgr/WorkerEvent.cpp index a71961ca52ed597a4481b6b233f9a48343d8a0a1..499c23603a797f90446e941f3885cf93d0fc3eff 100644 --- a/module-services/service-evtmgr/WorkerEvent.cpp +++ b/module-services/service-evtmgr/WorkerEvent.cpp @@ -327,6 +327,7 @@ void WorkerEvent::checkBatteryChargerInterrupts() static_cast(bsp::battery_charger::batteryINTBSource::minVAlert)); } if (status & static_cast(bsp::battery_charger::batteryINTBSource::SOCOnePercentChange)) { + bsp::battery_charger::printFuelGaugeInfo(); bsp::battery_charger::clearFuelGuageIRQ( static_cast(bsp::battery_charger::batteryINTBSource::SOCOnePercentChange)); bsp::battery_charger::getBatteryLevel();