~aleteoryx/muditaos

7e568d3c95b98790bcb482681b1e9110ada50d13 — wojtekrzepecki 5 years ago 0ef0d61
[EGD-4175] keyboard backlight (#1082)

* [EGD-4483] fix for put_64 in libmtp

* [EGD-4175] Added cpp to cmake script

* [EGD-4175] Rename to keypad_backlight and first test

* [EGD-4175] First working setup

* [EGD-4175] Remaking the interface

* [EGD-4175] Added class to event manager

* [EGD-4175] Cleaning

* [EGD-4175] Added linux target file

* [EGD-4175] Added missing deinit

* [EGD-4175] cleanup

* [EGD-4175] Added check state function

* [EGD-4175] Simpler interface

* [EGD-4175] Linux target file adjustment

* [EGD-4175] Cleanup ..

* [EGD-4175] Style check fail repair

* [EGD-4175] Another style check fix

* [EGD-4175] Applying style branch fix

* [EGD-4175] Red<->Green exchange

* [EGD-4175] PR comments pt1

* [EGD-4175] PR comments pt2

* [EGD-4175] PR comments pt3

* [EGD-4175] Another style check fix

* [EGD-4175] next PR comments

* [EGD-4175] New cpp file for evm, namespaces fix

* [EGD-4175] Last pr cleaning

* [EGD-4175] Yet another style check fix...

* [EGD-4175] Final fixes from pr

Co-authored-by: Roman Kubiak <roman.kubiak@mudita.com>
Co-authored-by: Wojtek Rzepecki <wojtek.rzepecki@mudita.com>
A module-bsp/board/linux/keypad_backlight/keypad_backlight.cpp => module-bsp/board/linux/keypad_backlight/keypad_backlight.cpp +54 -0
@@ 0,0 1,54 @@
// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#include "bsp/keypad_backlight/keypad_backlight.hpp"
#include "bsp/BoardDefinitions.hpp"

using namespace drivers;

namespace bsp::keypad_backlight
{
    namespace
    {
        bool diodesState = false;
    }

    std::int32_t init()
    {
        return 0;
    }

    void deinit()
    {}

    bool turnOnAll()
    {
        diodesState = true;
        return true;
    }

    bool configureModule()
    {
        return true;
    }

    bool shutdown()
    {
        diodesState = false;
        return true;
    }

    void wakeup()
    {}

    bool reset()
    {
        return true;
    }

    bool checkState()
    {
        return diodesState;
    }

} // namespace bsp::keypad_backlight

A module-bsp/board/rt1051/bsp/keypad_backlight/LP55281.hpp => module-bsp/board/rt1051/bsp/keypad_backlight/LP55281.hpp +63 -0
@@ 0,0 1,63 @@
// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#pragma once

#include <algorithm>

namespace bsp::keypad_backlight
{
    constexpr inline auto LP55281_DEVICE_ADDR = 0x4C;

    enum class LP55281_Registers
    {
        RED1       = 0x00,
        GREEN1     = 0x01,
        BLUE1      = 0x02,
        RED2       = 0x03,
        GREEN2     = 0x04,
        BLUE2      = 0x05,
        RED3       = 0x06,
        GREEN3     = 0x07,
        BLUE3      = 0x08,
        RED4       = 0x09,
        GREEN4     = 0x0a,
        BLUE4      = 0x0b,
        ALED       = 0x0c,
        CTRL1      = 0x0d,
        CTRL2      = 0x0e,
        BOOST_CTRL = 0x0f,
        FREQ_SEL   = 0x10,
        ENABLES    = 0x11,
        LED_TEST   = 0x12,
        ADC_OUT    = 0x13,
        RESET      = 0x60,
    };

    struct Diode_Reg
    {
        std::uint8_t max_current : 2;
        std::uint8_t current : 6;
    };

    constexpr inline auto MAX_DIODE_CURRENT_LIMIT = 0b11;
    constexpr inline auto MAX_BRIGHTNESS_INT      = 63;

    constexpr inline auto BOOST_OUTPUT_4V = 0x00;

    constexpr inline auto NSTDBY       = 0b10000000;
    constexpr inline auto BOOST_EN     = 0b01000000;
    constexpr inline auto LED_PORTS_EN = 0b00001110; // Only ports 2-4 active on board
    constexpr inline auto WAKEUP       = NSTDBY | BOOST_EN | LED_PORTS_EN;

    constexpr inline auto LED_TEST_THRESHOLD = 3; // 0.18mA = (15mA/255) * 3
    constexpr inline auto EN_LED_TEST        = 0b00010000;

    constexpr std::uint8_t encode_diode_brightness_to_6bits(float normalized_brightness)
    {
        return std::clamp(static_cast<std::uint8_t>(MAX_BRIGHTNESS_INT * normalized_brightness),
                          static_cast<std::uint8_t>(0),
                          static_cast<std::uint8_t>(MAX_BRIGHTNESS_INT));
    }

} // namespace bsp::keypad_backlight

A module-bsp/board/rt1051/bsp/keypad_backlight/keypad_backlight.cpp => module-bsp/board/rt1051/bsp/keypad_backlight/keypad_backlight.cpp +156 -0
@@ 0,0 1,156 @@
// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#include "bsp/keypad_backlight/keypad_backlight.hpp"
#include "LP55281.hpp"

#include "bsp/BoardDefinitions.hpp"
#include "drivers/i2c/DriverI2C.hpp"

#include "fsl_common.h"
#include <array>

extern "C"
{
#include "FreeRTOS.h"
#include "task.h"
}

namespace bsp::keypad_backlight
{
    namespace
    {
        std::shared_ptr<drivers::DriverGPIO> gpio;

        std::shared_ptr<drivers::DriverI2C> i2c;

        drivers::I2CAddress addr = {.deviceAddress = static_cast<uint32_t>(LP55281_DEVICE_ADDR), .subAddressSize = 1};

        constexpr std::array<LP55281_Registers, 4> usedOutputs = {LP55281_Registers::RED2,    // Red right button
                                                                  LP55281_Registers::GREEN3,  // Green left button
                                                                  LP55281_Registers::RED4,    // Keypad right side
                                                                  LP55281_Registers::GREEN4}; // Keypad left side

        bool writeSingleRegister(std::uint32_t address, std::uint8_t *to_send)
        {
            addr.subAddress    = address;
            auto write_success = i2c->Write(addr, to_send, 1);

            return write_success == 1;
        }

        ssize_t readSingleRegister(std::uint32_t address, std::uint8_t *readout)
        {
            addr.subAddress = address;
            return i2c->Read(addr, readout, 1);
        }
    } // namespace

    std::int32_t init()
    {
        i2c = drivers::DriverI2C::Create(
            static_cast<drivers::I2CInstances>(BoardDefinitions::KEYPAD_BACKLIGHT_DRIVER_I2C),
            drivers::DriverI2CParams{
                .baudrate = static_cast<std::uint32_t>(BoardDefinitions::KEYPAD_BACKLIGHT_DRIVER_I2C_BAUDRATE)});

        gpio = drivers::DriverGPIO::Create(
            static_cast<drivers::GPIOInstances>(BoardDefinitions::KEYPAD_BACKLIGHT_DRIVER_GPIO),
            drivers::DriverGPIOParams{});

        gpio->ConfPin(drivers::DriverGPIOPinParams{
            .dir      = drivers::DriverGPIOPinParams::Direction::Output,
            .irqMode  = drivers::DriverGPIOPinParams::InterruptMode::NoIntmode,
            .defLogic = 1,
            .pin      = static_cast<std::uint32_t>(BoardDefinitions::KEYPAD_BACKLIGHT_DRIVER_NRST)});

        wakeup();
        bool status = reset();
        shutdown();

        return status ? kStatus_Success : kStatus_Fail;
    }

    void deinit()
    {
        shutdown();
    }

    bool turnOnAll()
    {
        constexpr DiodeIntensity intensity = 1.0f; // Maximum brightness
        Diode_Reg diode_reg                = {.max_current = MAX_DIODE_CURRENT_LIMIT,
                               .current     = encode_diode_brightness_to_6bits(intensity)};

        wakeup();
        configureModule();

        for (auto &diode : usedOutputs) {
            std::uint32_t address = static_cast<std::uint32_t>(diode);
            if (!writeSingleRegister(address, reinterpret_cast<std::uint8_t *>(&diode_reg))) {
                return false;
            }
        }
        return true;
    }

    bool configureModule()
    {
        std::uint8_t reg_val = BOOST_OUTPUT_4V;
        if (!writeSingleRegister(static_cast<std::uint32_t>(LP55281_Registers::BOOST_CTRL), &reg_val)) {
            return false;
        }

        reg_val = WAKEUP;
        if (!writeSingleRegister(static_cast<std::uint32_t>(LP55281_Registers::ENABLES), &reg_val)) {
            return false;
        }

        return true;
    }

    bool shutdown()
    {
        gpio->WritePin(static_cast<std::uint32_t>(BoardDefinitions::KEYPAD_BACKLIGHT_DRIVER_NRST), 0);
        return true;
    }

    void wakeup()
    {
        gpio->WritePin(static_cast<std::uint32_t>(BoardDefinitions::KEYPAD_BACKLIGHT_DRIVER_NRST), 1);
    }

    bool reset()
    {
        std::uint8_t reset_value = 0xff;
        return writeSingleRegister(static_cast<std::uint32_t>(LP55281_Registers::RESET), &reset_value);
    }

    // Must be run at least 20ms after leds startup
    bool checkState()
    {
        std::uint8_t value = 0;
        for (const auto diode : usedOutputs) {
            value = static_cast<std::uint8_t>(diode) | EN_LED_TEST;

            if (!writeSingleRegister(static_cast<std::uint32_t>(LP55281_Registers::LED_TEST), &value)) {
                return false;
            }

            vTaskDelay(pdMS_TO_TICKS(2));

            if (readSingleRegister(static_cast<std::uint32_t>(LP55281_Registers::ADC_OUT), &value) != 1) {
                return false;
            }

            if (value < LED_TEST_THRESHOLD) {
                return false;
            }
        }

        value = 0;
        writeSingleRegister(static_cast<std::uint32_t>(LP55281_Registers::LED_TEST), &value);

        return true;
    }

} // namespace bsp::keypad_backlight

M module-bsp/board/rt1051/common/pin_mux.c => module-bsp/board/rt1051/common/pin_mux.c +3 -4
@@ 1181,10 1181,9 @@ void PINMUX_InitLEDDRIVER(void)
    IOMUXC_SetPinMux(PINMUX_LEDDRIVER_NRST, /* GPIO_AD_B0_00 is configured as LPSPI1_SCK */
                     0U);                   /* Software Input On Field: Input Path is determined by functionality */

    IOMUXC_SetPinConfig(PINMUX_LEDDRIVER_NRST, /* GPIO_AD_B0_02 PAD functional properties : */
                        PAD_CONFIG_SLEW_RATE_SLOW | PAD_CONFIG_DRIVER_STRENGTH_LVL_1 | PAD_CONFIG_SPEED_SLOW_50MHz |
                            PAD_CONFIG_PULL_KEEPER_ENABLED | PAD_CONFIG_SELECT_PULL | PAD_CONFIG_PULL_UP_100kOhm |
                            PAD_CONFIG_HYSTERESIS_DISABLED);
    IOMUXC_SetPinConfig(PINMUX_LEDDRIVER_NRST, /* GPIO_AD_B0_03 PAD functional properties : */
                        PAD_CONFIG_PULL_UP_22kOhm | PAD_CONFIG_SELECT_PULL | PAD_CONFIG_PULL_KEEPER_DISABLED |
                            PAD_CONFIG_DRIVER_STRENGTH_LVL_4 | PAD_CONFIG_SLEW_RATE_SLOW | PAD_CONFIG_SPEED_SLOW_50MHz);
}

void PINMUX_InitCellular(void)

M module-bsp/bsp/BoardDefinitions.hpp => module-bsp/bsp/BoardDefinitions.hpp +5 -0
@@ 104,6 104,11 @@ enum class BoardDefinitions
    TORCH_DRIVER_GPIO = static_cast<int>(drivers::GPIOInstances::GPIO_1),
    TORCH_DRIVER_EN = 21, // GPIO_AD_B1_05 Active HIGH. Internal pulldown resistor of 300kΩ between HWEN and GND.

    KEYPAD_BACKLIGHT_DRIVER_I2C_BAUDRATE = AUDIOCODEC_I2C_BAUDRATE,
    KEYPAD_BACKLIGHT_DRIVER_I2C = AUDIOCODEC_I2C,
    KEYPAD_BACKLIGHT_DRIVER_GPIO = static_cast<int>(drivers::GPIOInstances::GPIO_1),
    KEYPAD_BACKLIGHT_DRIVER_NRST = 3, // GPIO_AD_B0_03 Active LOW. External pulldown resistor of 10Ω between NRST and GND.

};

#endif //PUREPHONE_BOARDDEFINITIONS_HPP

A module-bsp/bsp/keypad_backlight/keypad_backlight.hpp => module-bsp/bsp/keypad_backlight/keypad_backlight.hpp +35 -0
@@ 0,0 1,35 @@
// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#pragma once

#include <cstdint>

namespace bsp::keypad_backlight
{
    enum class Action
    {
        turnOn,
        turnOff,
        checkState,
    };

    using DiodeIntensity = float;

    std::int32_t init();

    void deinit();

    bool turnOnAll();

    bool configureModule();

    bool shutdown();

    void wakeup();

    bool reset();

    bool checkState();

} // namespace bsp::keypad_backlight

M module-bsp/targets/Target_Linux.cmake => module-bsp/targets/Target_Linux.cmake +2 -0
@@ 29,6 29,8 @@ set(BOARD_SOURCES

        "${CMAKE_CURRENT_SOURCE_DIR}/board/linux/torch/torch.cpp"

        "${CMAKE_CURRENT_SOURCE_DIR}/board/linux/keypad_backlight/keypad_backlight.cpp"

        "${CMAKE_CURRENT_SOURCE_DIR}/board/linux/watchdog/watchdog.cpp"

        CACHE INTERNAL "")

M module-bsp/targets/Target_RT1051.cmake => module-bsp/targets/Target_RT1051.cmake +5 -4
@@ 65,10 65,11 @@ set(BOARD_SOURCES ${BOARD_SOURCES}
	"${CMAKE_CURRENT_SOURCE_DIR}/board/rt1051/drivers/RT1051DriverDMAMux.cpp"
	"${CMAKE_CURRENT_SOURCE_DIR}/board/rt1051/drivers/RT1051DriverDMA.cpp"
	"${CMAKE_CURRENT_SOURCE_DIR}/board/rt1051/drivers/RT1051DriverGPIO.cpp"
    "${CMAKE_CURRENT_SOURCE_DIR}/board/rt1051/bsp/magnetometer/magnetometer.cpp"
    "${CMAKE_CURRENT_SOURCE_DIR}/board/rt1051/bsp/magnetometer/ALS31300.cpp"
    "${CMAKE_CURRENT_SOURCE_DIR}/board/rt1051/bsp/torch/torch.cpp"

   	"${CMAKE_CURRENT_SOURCE_DIR}/board/rt1051/bsp/magnetometer/magnetometer.cpp"
	"${CMAKE_CURRENT_SOURCE_DIR}/board/rt1051/bsp/magnetometer/ALS31300.cpp"
	"${CMAKE_CURRENT_SOURCE_DIR}/board/rt1051/bsp/torch/torch.cpp"
	"${CMAKE_CURRENT_SOURCE_DIR}/board/rt1051/bsp/keypad_backlight/keypad_backlight.cpp"
	
	CACHE INTERNAL ""
)


M module-services/service-evtmgr/CMakeLists.txt => module-services/service-evtmgr/CMakeLists.txt +1 -0
@@ 3,6 3,7 @@ message( "${PROJECT_NAME}  ${CMAKE_CURRENT_LIST_DIR}" )

set(SOURCES
        EventManager.cpp
        EVMessages.cpp
        WorkerEvent.cpp
        alarm/EventManagerAlarm.cpp
        api/EventManagerServiceAPI.cpp

A module-services/service-evtmgr/EVMessages.cpp => module-services/service-evtmgr/EVMessages.cpp +24 -0
@@ 0,0 1,24 @@
// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#include "service-evtmgr/EVMessages.hpp"

namespace sevm
{
    bool KeypadBacklightMessage::processAction(bsp::keypad_backlight::Action act)
    {
        bool response = false;
        switch (act) {
        case bsp::keypad_backlight::Action::turnOn:
            response = bsp::keypad_backlight::turnOnAll();
            break;
        case bsp::keypad_backlight::Action::turnOff:
            response = bsp::keypad_backlight::shutdown();
            break;
        case bsp::keypad_backlight::Action::checkState:
            response = bsp::keypad_backlight::checkState();
            break;
        }
        return response;
    }
} // namespace sevm

M module-services/service-evtmgr/EventManager.cpp => module-services/service-evtmgr/EventManager.cpp +8 -0
@@ 19,6 19,7 @@
#include <bsp/magnetometer/magnetometer.hpp>
#include <bsp/rtc/rtc.hpp>
#include <bsp/torch/torch.hpp>
#include <bsp/keypad_backlight/keypad_backlight.hpp>
#include <common_data/RawKey.hpp>
#include <log/log.hpp>
#include <module-utils/time/time_conversion.hpp>


@@ 272,6 273,13 @@ sys::ReturnCodes EventManager::InitHandler()
        return std::make_shared<sys::ResponseMessage>();
    });

    connect(sevm::KeypadBacklightMessage(), [&](sys::Message *msgl) {
        auto msg         = static_cast<sevm::KeypadBacklightMessage *>(msgl);
        auto message     = std::make_shared<sevm::KeypadBacklightMessage>();
        message->success = msg->processAction(msg->action);
        return message;
    });

    // initialize keyboard worker
    EventWorker = std::make_unique<WorkerEvent>(this);


M module-services/service-evtmgr/WorkerEvent.cpp => module-services/service-evtmgr/WorkerEvent.cpp +3 -0
@@ 17,6 17,7 @@
#include <bsp/magnetometer/magnetometer.hpp>
#include <bsp/rtc/rtc.hpp>
#include <bsp/torch/torch.hpp>
#include <bsp/keypad_backlight/keypad_backlight.hpp>
#include <bsp/vibrator/vibrator.hpp>
#include <common_data/EventStore.hpp>
#include <common_data/RawKey.hpp>


@@ 179,6 180,7 @@ bool WorkerEvent::init(std::list<sys::WorkerQueueInfo> queues)
    bsp::cellular::init(qhandles[static_cast<int32_t>(WorkerEventQueues::queueCellular)]);
    bsp::magnetometer::init(qhandles[static_cast<int32_t>(WorkerEventQueues::queueMagnetometerIRQ)]);
    bsp::torch::init(qhandles[static_cast<int32_t>(WorkerEventQueues::queueTorch)]);
    bsp::keypad_backlight::init();

    time_t timestamp;
    bsp::rtc_GetCurrentTimestamp(&timestamp);


@@ 194,6 196,7 @@ bool WorkerEvent::deinit(void)
    bsp::headset::Deinit();
    bsp::battery_Deinit();
    bsp::torch::deinit();
    bsp::keypad_backlight::deinit();

    return true;
}

M module-services/service-evtmgr/service-evtmgr/EVMessages.hpp => module-services/service-evtmgr/service-evtmgr/EVMessages.hpp +12 -0
@@ 14,6 14,7 @@
#include <bsp/common.hpp>
#include <bsp/keyboard/key_codes.hpp>
#include <bsp/torch/torch.hpp>
#include <bsp/keypad_backlight/keypad_backlight.hpp>

#include <string>



@@ 123,5 124,16 @@ namespace sevm
        {}
        bool success = false;
    };
    class KeypadBacklightMessage : public Message
    {
      public:
        explicit KeypadBacklightMessage() : Message(MessageType::EVMKeypadBacklightMessage)
        {}

        bool processAction(bsp::keypad_backlight::Action act);

        bsp::keypad_backlight::Action action;
        bool success;
    };

} /* namespace sevm*/

M source/MessageType.hpp => source/MessageType.hpp +2 -0
@@ 171,6 171,8 @@ enum class MessageType
    EVMTimeUpdated,   ///< This message is send on every time update.
    // Torch messages
    EVMTorchStateMessage,
    // Keypad backlight messages
    EVMKeypadBacklightMessage,

    // cellular messages
    EVMGetBoard,