~aleteoryx/muditaos

44cdecabe69c8f42293595303cb219990734a460 — Artur Śleszyński 4 years ago 3228cf7
[CP-266] Extend power management logging

Make sure we print fuel gauge info needed by the electronics team.
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();