M module-bsp/board/linux/battery-charger/battery_charger.cpp => module-bsp/board/linux/battery-charger/battery_charger.cpp +3 -0
@@ 191,6 191,9 @@ namespace bsp::battery_charger
return nominalVoltage;
}
+ void printFuelGaugeInfo()
+ {}
+
BaseType_t INTB_IRQHandler()
{
return 1;
M module-bsp/board/rt1051/bsp/battery-charger/battery_charger.cpp => module-bsp/board/rt1051/bsp/battery-charger/battery_charger.cpp +47 -4
@@ 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<int>((static_cast<std::uint16_t>(currentBitset.to_ulong()) * -1) * currentSenseGain);
+ }
+ else {
+ // positive numbers
+ current = static_cast<int>(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;
M module-bsp/bsp/battery-charger/battery_charger.hpp => module-bsp/bsp/battery-charger/battery_charger.hpp +64 -50
@@ 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
M module-services/service-evtmgr/WorkerEvent.cpp => module-services/service-evtmgr/WorkerEvent.cpp +1 -0
@@ 327,6 327,7 @@ void WorkerEvent::checkBatteryChargerInterrupts()
static_cast<std::uint16_t>(bsp::battery_charger::batteryINTBSource::minVAlert));
}
if (status & static_cast<std::uint16_t>(bsp::battery_charger::batteryINTBSource::SOCOnePercentChange)) {
+ bsp::battery_charger::printFuelGaugeInfo();
bsp::battery_charger::clearFuelGuageIRQ(
static_cast<std::uint16_t>(bsp::battery_charger::batteryINTBSource::SOCOnePercentChange));
bsp::battery_charger::getBatteryLevel();