~aleteoryx/muditaos

7e157e83a2088ad285fc40049409d0a59c0151ea — Wojtek Rzepecki 5 years ago 17a8053
[EGD-5050] Add brownout detection

Brownout detectection realized through charger driver
M changelog.md => changelog.md +4 -0
@@ 1,5 1,9 @@
# MuditaOS changelog

## Latest Changes
### Added

* Battery Brownout detection
## [0.52.1 2020-12-23]

### Added

M module-bsp/board/linux/battery-charger/battery_charger.cpp => module-bsp/board/linux/battery-charger/battery_charger.cpp +6 -0
@@ 127,4 127,10 @@ namespace bsp
            vTaskDelay(50);
        }
    }

    std::uint16_t battery_getStatusRegister()
    {
        return static_cast<std::uint16_t>(batteryINTBSource::SOCOnePercentChange);
    }

} // namespace bsp

M module-bsp/board/rt1051/bsp/battery-charger/battery_charger.cpp => module-bsp/board/rt1051/bsp/battery-charger/battery_charger.cpp +31 -10
@@ 55,8 55,8 @@ static const uint8_t battery_DischargedPercent   = 15;
static const uint8_t battery_maxTemperatureDegrees = 50;
static const uint8_t battery_minTemperatureDegrees = 5;

static const uint16_t battery_maxVoltagemV = 4200;
static const uint16_t battery_minVoltagemV = 3700;
static constexpr inline uint16_t battery_maxVoltagemV = 4200;
static constexpr inline uint16_t battery_minVoltagemV = 3600;

using namespace drivers;



@@ 97,7 97,7 @@ static bsp::batteryRetval battery_enableFuelGuageIRQs(void);

static bsp::batteryRetval battery_enableTopIRQs(void);

static bsp::batteryRetval battery_disableAlerts(void);
static bsp::batteryRetval battery_configureAlerts();

static void s_BSP_BatteryChargerIrqPinsInit();



@@ 140,7 140,27 @@ namespace bsp
        AICL_I  = (1 << 7),
    };

    uint16_t battery_get_STATUS();
    // CONFIG register bits
    enum class B_CONFIG
    {
        Ber    = 1 << 0,
        Bei    = 1 << 1,
        Aen    = 1 << 2,
        FTHRM  = 1 << 3,
        ETHRM  = 1 << 4,
        SPR_5  = 1 << 5,
        I2CSH  = 1 << 6,
        SHDN   = 1 << 7,
        Tex    = 1 << 8,
        Ten    = 1 << 9,
        AINSH  = 1 << 10,
        SPR_11 = 1 << 11,
        Vs     = 1 << 12,
        Ts     = 1 << 13,
        Ss     = 1 << 14,
        SPR_15 = 1 << 15
    };

    uint16_t battery_get_CHG_INT_OK();

    int battery_Init(xQueueHandle qHandle)


@@ 166,7 186,7 @@ namespace bsp
            battery_setServiceVoltageThresholds(battery_maxVoltagemV, battery_minVoltagemV);
        }

        battery_disableAlerts();
        battery_configureAlerts();
        battery_enableFuelGuageIRQs();

        uint8_t level = 0;


@@ 223,7 243,7 @@ namespace bsp
        }
    }

    uint16_t battery_get_STATUS()
    std::uint16_t battery_getStatusRegister()
    {
        uint16_t status = 0;
        battery_fuelGaugeRead(bsp::batteryChargerRegisters::STATUS_REG, &status);


@@ 239,7 259,7 @@ namespace bsp
            battery_chargerWrite(bsp::batteryChargerRegisters::CHG_INT_REG, 0);
        }

        uint16_t status = battery_get_STATUS();
        uint16_t status = battery_getStatusRegister();
        if (status != 0) {
            // write zero to clear irq source
            battery_fuelGaugeWrite(bsp::batteryChargerRegisters::STATUS_REG, 0);


@@ 251,6 271,7 @@ namespace bsp
        // write zero to clear interrupt source
        battery_fuelGaugeWrite(bsp::batteryChargerRegisters::STATUS_REG, 0x0000);
    }

} // namespace bsp

static int battery_fuelGaugeWrite(bsp::batteryChargerRegisters registerAddress, uint16_t value)


@@ 493,12 514,12 @@ static bsp::batteryRetval battery_enableFuelGuageIRQs(void)
    return bsp::batteryRetval::battery_OK;
}

static bsp::batteryRetval battery_disableAlerts(void)
static bsp::batteryRetval battery_configureAlerts()
{
    uint16_t regVal = 0;
    auto regVal = static_cast<std::uint16_t>(bsp::B_CONFIG::Aen); // Enable alerts

    if (battery_fuelGaugeWrite(bsp::batteryChargerRegisters::CONFIG_REG, regVal) != kStatus_Success) {
        LOG_ERROR("battery_disableAlerts failed.");
        LOG_ERROR("battery_configureAlerts failed.");
        return bsp::batteryRetval::battery_ChargerError;
    }


M module-bsp/bsp/battery-charger/battery_charger.hpp => module-bsp/bsp/battery-charger/battery_charger.hpp +9 -0
@@ 8,6 8,7 @@
#ifndef MODULE_BSP_BSP_BATTERY_CHARGER_BATTERY_CHARGER_HPP_
#define MODULE_BSP_BSP_BATTERY_CHARGER_BATTERY_CHARGER_HPP_

#include <cstdint>
namespace bsp{

	enum class batteryChargerRegisters{


@@ 100,6 101,12 @@ namespace bsp{
		INOKB = 0x02
	};

	enum class batteryINTBSource{
		minSOCAlert = 1 << 10,
		minVAlert = 1 << 8,
		SOCOnePercentChange = 1 << 7
	};

	int battery_Init(xQueueHandle qHandle);

	void battery_Deinit(void);


@@ 111,6 118,8 @@ namespace bsp{
	void battery_ClearAllIRQs(void);

	void battery_clearFuelGuageIRQ(void);

	std::uint16_t battery_getStatusRegister();
}

BaseType_t BSP_BatteryChargerINOKB_IRQHandler();

M module-services/service-evtmgr/EventManager.cpp => module-services/service-evtmgr/EventManager.cpp +1 -3
@@ 123,9 123,7 @@ sys::MessagePointer EventManager::DataReceivedHandler(sys::DataMessage *msgl, sy
    else if (msgl->messageType == MessageType::EVMBatteryLevel && msgl->sender == this->GetName()) {
        auto *msg = static_cast<sevm::BatteryLevelMessage *>(msgl);

        auto message           = std::make_shared<sevm::BatteryLevelMessage>();
        message->levelPercents = msg->levelPercents;
        message->fullyCharged  = msg->fullyCharged;
        auto message = std::make_shared<sevm::BatteryLevelMessage>(msg->levelPercents, msg->fullyCharged);

        if (!targetApplication.empty()) {
            sys::Bus::SendUnicast(message, targetApplication, this);

M module-services/service-evtmgr/WorkerEvent.cpp => module-services/service-evtmgr/WorkerEvent.cpp +13 -7
@@ 92,14 92,20 @@ bool WorkerEvent::handleMessage(uint32_t queueID)
            return false;
        }
        if (notification == static_cast<uint8_t>(bsp::batteryIRQSource::INTB)) {
            uint8_t battLevel = 0;
            bsp::battery_getBatteryLevel(battLevel);
            LOG_DEBUG("Battery INTB");
            const auto status = bsp::battery_getStatusRegister();
            if (status & static_cast<std::uint16_t>(bsp::batteryINTBSource::minVAlert)) {
                auto messageBrownout = std::make_shared<sevm::BatteryBrownoutMessage>();
                sys::Bus::SendUnicast(messageBrownout, service::name::system_manager, this->service);
            }
            if (status & static_cast<std::uint16_t>(bsp::batteryINTBSource::SOCOnePercentChange)) {
                std::uint8_t battLevel = 0;
                bsp::battery_getBatteryLevel(battLevel);
                auto message = std::make_shared<sevm::BatteryLevelMessage>(battLevel, false);
                sys::Bus::SendUnicast(message, service::name::evt_manager, this->service);
                battery_level_check::checkBatteryLevelCritical();
            }
            bsp::battery_ClearAllIRQs();
            auto message           = std::make_shared<sevm::BatteryLevelMessage>();
            message->levelPercents = battLevel;
            message->fullyCharged  = false;
            sys::Bus::SendUnicast(message, service::name::evt_manager, this->service);
            battery_level_check::checkBatteryLevelCritical();
        }
        if (notification == static_cast<uint8_t>(bsp::batteryIRQSource::INOKB)) {
            bool status;

M module-services/service-evtmgr/service-evtmgr/BatteryMessages.hpp => module-services/service-evtmgr/service-evtmgr/BatteryMessages.hpp +10 -1
@@ 12,7 12,8 @@ namespace sevm
    class BatteryLevelMessage : public Message
    {
      public:
        BatteryLevelMessage() : Message(MessageType::EVMBatteryLevel)
        BatteryLevelMessage(uint8_t levelPercents, bool fullyCharged)
            : Message(MessageType::EVMBatteryLevel), levelPercents(levelPercents), fullyCharged(fullyCharged)
        {
            type = Type::Data;
        }


@@ 44,4 45,12 @@ namespace sevm
        BatteryLevelCriticalMessage() : Message(MessageType::EVMBatteryLevelCritical)
        {}
    };

    class BatteryBrownoutMessage : public Message
    {
      public:
        BatteryBrownoutMessage() : Message(MessageType::EVMBatteryBrownout)
        {}
    };

} // namespace sevm

M module-sys/SystemManager/SystemManager.cpp => module-sys/SystemManager/SystemManager.cpp +6 -1
@@ 256,7 256,12 @@ namespace sys
        });

        connect(sevm::BatteryLevelCriticalMessage(), [&](Message *) {
            LOG_INFO("Battery Critical Level reached!");
            LOG_INFO("Battery Critical SOC Level reached!");
            return MessageNone{};
        });

        connect(sevm::BatteryBrownoutMessage(), [&](Message *) {
            LOG_INFO("Battery Brownout voltage level reached!");
            return MessageNone{};
        });


M source/MessageType.hpp => source/MessageType.hpp +1 -0
@@ 168,6 168,7 @@ enum class MessageType
    EVMChargerPlugged,
    EVMBatterySetCriticalLevel,
    EVMBatteryLevelCritical,
    EVMBatteryBrownout,
    // rtc messages
    EVMMinuteUpdated, ///< This message is send to current focused application on every minute time change.
    EVMTimeUpdated,   ///< This message is send on every time update.