|
|
@ -5,23 +5,66 @@ |
|
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
|
|
|
|
|
#include "core/core.h"
|
|
|
#include "core/core.h"
|
|
|
|
|
|
#include "core/hle/result.h"
|
|
|
#include "core/hle/service/i2c/i2c.h"
|
|
|
#include "core/hle/service/i2c/i2c.h"
|
|
|
#include "core/hle/service/ipc_helpers.h"
|
|
|
#include "core/hle/service/ipc_helpers.h"
|
|
|
|
|
|
#include "core/hle/service/cmif_serialization.h"
|
|
|
|
|
|
#include "core/hle/service/cmif_types.h"
|
|
|
#include "core/hle/service/service.h"
|
|
|
#include "core/hle/service/service.h"
|
|
|
|
|
|
#include "core/hle/service/server_manager.h"
|
|
|
|
|
|
|
|
|
namespace Service::I2C { |
|
|
namespace Service::I2C { |
|
|
|
|
|
|
|
|
|
|
|
class I2CSession final : public ServiceFramework<I2CSession> { |
|
|
|
|
|
public: |
|
|
|
|
|
explicit I2CSession(Core::System& system_) |
|
|
|
|
|
: ServiceFramework{system_, "I2CSession"} |
|
|
|
|
|
{ |
|
|
|
|
|
static const FunctionInfo functions[] = { |
|
|
|
|
|
{0, nullptr, "SendOld"}, |
|
|
|
|
|
{1, nullptr, "ReceiveOld"}, |
|
|
|
|
|
{2, nullptr, "ExecuteCommandListOld"}, |
|
|
|
|
|
{10, C<&I2CSession::Send>, "Send"}, |
|
|
|
|
|
{11, nullptr, "Receive"}, |
|
|
|
|
|
{12, nullptr, "ExecuteCommandList"}, |
|
|
|
|
|
{13, nullptr, "SetRetryPolicy"}, |
|
|
|
|
|
}; |
|
|
|
|
|
RegisterHandlers(functions); |
|
|
|
|
|
} |
|
|
|
|
|
~I2CSession() override = default; |
|
|
|
|
|
|
|
|
|
|
|
Result Send(InBuffer<BufferAttr_HipcMapAlias> in_data, u32 transaction_option) { |
|
|
|
|
|
LOG_WARNING(Service, "(stubbed) topt={}", transaction_option); |
|
|
|
|
|
R_THROW(ResultUnknown); |
|
|
|
|
|
} |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
enum class I2CDevice : u32 { |
|
|
|
|
|
ClassicController, |
|
|
|
|
|
Ftm3bd56, |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
class I2C final : public ServiceFramework<I2C> { |
|
|
class I2C final : public ServiceFramework<I2C> { |
|
|
public: |
|
|
public: |
|
|
explicit I2C(Core::System& system_) |
|
|
explicit I2C(Core::System& system_) |
|
|
: ServiceFramework{system_, "i2c"} |
|
|
: ServiceFramework{system_, "i2c"} |
|
|
{ |
|
|
{ |
|
|
static const FunctionInfo functions[] = { |
|
|
static const FunctionInfo functions[] = { |
|
|
{0, nullptr, "Cmd0"}, |
|
|
|
|
|
|
|
|
{0, nullptr, "OpenSessionForDev"}, |
|
|
|
|
|
{1, C<&I2C::OpenSession>, "OpenSession"}, |
|
|
|
|
|
{2, nullptr, "HasDevice"}, |
|
|
|
|
|
{3, nullptr, "HasDeviceForDev"}, |
|
|
|
|
|
{4, nullptr, "OpenSession2"}, |
|
|
}; |
|
|
}; |
|
|
RegisterHandlers(functions); |
|
|
RegisterHandlers(functions); |
|
|
} |
|
|
} |
|
|
~I2C() override = default; |
|
|
~I2C() override = default; |
|
|
|
|
|
|
|
|
|
|
|
Result OpenSession(I2CDevice device, OutInterface<I2CSession> out_session) { |
|
|
|
|
|
LOG_DEBUG(Service, "(stubbed)"); |
|
|
|
|
|
*out_session = std::make_shared<I2CSession>(system); |
|
|
|
|
|
R_SUCCEED(); |
|
|
|
|
|
} |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
void LoopProcess(Core::System& system) { |
|
|
void LoopProcess(Core::System& system) { |
|
|
|