mirror of
https://github.com/mudita/MuditaOS.git
synced 2026-01-22 21:09:14 -05:00
A lack of timeout in I2C could cause the worker could get stuck in a loop if the communication has been broken somehow. The Harmony is unresponsive in this case. The only solution is just to perform a hardware reset using Frontlight and Back buttons simultaneously. There are also additional 5 attempts to read and write transactions if the bus error occurs in the Fuel Gauge driver. It should be sufficient but if it would still persists the system just will read 0% SOC and shutdown system.
46 lines
1.2 KiB
C++
46 lines
1.2 KiB
C++
// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved.
|
|
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md
|
|
|
|
#include "DriverI2C.hpp"
|
|
|
|
#include "critical.hpp"
|
|
|
|
#if defined(TARGET_RT1051)
|
|
#include "board/rt1051/drivers/RT1051DriverI2C.hpp"
|
|
#elif defined(TARGET_Linux)
|
|
|
|
#else
|
|
#error "Unsupported target"
|
|
#endif
|
|
|
|
namespace drivers
|
|
{
|
|
|
|
std::weak_ptr<DriverI2C> DriverI2C::singleton[static_cast<uint32_t>(I2CInstances::COUNT)];
|
|
|
|
std::shared_ptr<DriverI2C> DriverI2C::Create(const drivers::I2CInstances instance,
|
|
const drivers::DriverI2CParams ¶ms)
|
|
{
|
|
{
|
|
|
|
cpp_freertos::CriticalSection::Enter();
|
|
std::shared_ptr<DriverI2C> inst = singleton[static_cast<uint32_t>(instance)].lock();
|
|
|
|
if (!inst) {
|
|
#if defined(TARGET_RT1051)
|
|
inst = std::make_shared<RT1051DriverI2C>(instance, params);
|
|
#elif defined(TARGET_Linux)
|
|
#else
|
|
#error "Unsupported target"
|
|
#endif
|
|
|
|
singleton[static_cast<uint32_t>(instance)] = inst;
|
|
}
|
|
|
|
cpp_freertos::CriticalSection::Exit();
|
|
|
|
return inst;
|
|
}
|
|
}
|
|
|
|
} // namespace drivers
|